Python中函数的高级使用

582 阅读5分钟

1. 默认参数

1.1默认参数概念

默认参数指函数/方法在定义时为形参赋值,对应的形参称为默认参数。

默认参数是一个参数定义期的概念,与调用无关。

1.2默认参数作用

如果参数定义默认参数,在调用函数方法时,未对该参数进行传值,则使用默认值作为该参数的值。

1.3默认参数基本语法

定义格式:

def 函数名(形参1 = 值1,…):

函数体

……

调用格式一(同普通参数,无特殊):

函数名(实参)  使用实参作为形参的值,不使用默认值

调用格式二:

函数名() 使用默认值作为形参的值
def test(a,b=100):
    pass​
test(5)

1.4注意事项

1.默认参数的定义必须在位置参数的右侧

def test(b=100,a): # 位置参数在默认参数右边,报错
    pass

2.默认参数在调用传值时,按照位置参数进行对待,从左至右依次赋值,不能跳过左侧的某个参数直接为后面的参数赋值

def test(a,b=100,c=5):
    pass​
test(5,6,7)

2. 关键字参数

2.1关键字参数概念


2.2关键字参数作用

按名称确认实参为指定的形参赋值,调用函数时使用。

2.3关键字参数基本语法

定义格式(同普通参数定义,无特殊):
def 函数名(形参 ,…):
    函数体
调用格式:    函数名( 形参名 = 实参)
def test(a=5,b=100):
    pass
test(b=7)
#  a=5 b=7

2.4注意事项

1.关键字参数必须出现在位置参数的后面

2.不允许使用关键字参数对同一个形参进行多次赋值

3.关键字参数既可以为位置参数赋值,也可以为默认参数赋值。通常使用关键字参数解决默认参数选择性赋值问题。

3. 可变参数

3.1可变参数概念


3.2可变参数作用


3.3可变参数基本语法

定义格式
def 函数名(*args ,…):
    函数体
调用格式(同普通参数,无特殊):函数名( 实参1,…… )
def sum(*args):
    sums = 0
    for num in args:
        sums += num
    print(sums)
​sum(1,2,3,4,5)

3.4注意事项


def test( a , b , *args , c = 1 ):
    pass

4. 字典参数

4.1字典参数概念

函数/方法在定义时,定义一个特殊的形参,用于接收未定义直接使用的关键字参数,对应的形参称为字典参数。

4.2字典参数作用


4.3字典参数基本语法

定义格式:
def 函数名(**kwargs ,…):
    函数体 
调用格式:   函数名( 未定义的变量名1 = 实参1,未定义的变量名2 = 实参2,…… )
def test(**kwargs):
    test(a=1,b=2)   
def test(m,**kwargs):
    print(m)
    print(kwargs)
​test(x=1,y=2,m=1)
# 输出 1
#     {'x': 1, 'y': 2}

4.4注意事项

1.字典参数在一个函数/方法定义中只能出现一个。

2.定义函数的参数时,先定义位置参数,再定义可变参数,然后定义默认参数,最后定义字典参数

def test( a , b , *args , c = 1 ,**kwargs):
    pass ​test(1,2)# 输出 a = 1 b = 2
    args = () 
    c = 1
    kwargs = {}
    test(1,2,c=5)# 输出 a = 1 b = 2 args = () c = 3 kwargs = {}
    test(1, 2, 3, 'a', 'b')  # 输出 a = 1 b = 2 args = (3, 'a', 'b') c = 0 kwargs = {}
    test(1, 2, 3, 'a', 'b', x=55)
    # 输出 a = 1 b = 2 args = (3, 'a', 'b') c = 0 kwargs = {'x':55}

3.对于任意函数,都可以通过类似func(*args, **kwargs)的形式调用它,无论它的参数是如何定义的。

使用*args**kwargs是Python的习惯写法,当然也可以用其他参数名。

*args是可变参数,*args接收的是一个tuple

**kwargs是关键字参数,**kwargs接收的是一个dict

4.5其他

所有的容器都支持解包操作。

def test(a, b, c):
    print(a, b, c)​
    list1 = [1, 2, 3]
    dict1 ={'a': 1, 'b': 2, 'c': 3}
    test(*list1) # 1 2 3
    test(**dict1) # 1 2 3

如果要强制传入的参数为关键字参数,之后的参数必须以关键字参数的形式传递,称之为参数槽。以一个*表示。参数槽通常和默认参数搭配使用。

def test(a, b, *, x, y):
     print(a, b)
     print(x, y) # TypeError: test() takes 2 positional arguments but 4 were given
     test(1, 2, x=3, y=4)   # 输出 1 2 3 4    

5. 递归函数

5.1递归函数概念

函数/方法在执行过程中出现了对自身函数/方法的调用,称该过程为递归调用,称这样的函数为递归函数。

5.2递归函数基本语法

同普通函数

5.3递归函数定义要求

1.函数体中具有对自身函数的调用

2.函数体中具有明确的函数执行结束判定条件

"""使用递归的方法打印出前n个斐波那契数列1,1,2,3,5,8,13...."""
def fb(n):
    if n == 1 or n == 2:
        return 1
    return fb(n - 1) + fb(n - 2)
    s = fb(4)
    print(s)

5.4递归函数调用要求

Python语言中函数调用最大层级为1000层,超过该层级,程序将报错,递归的效率很低,实际开发很少用。

# 如果需要设置递归深度,可以使用sys模块中的setrecursionlimit()函数修改默认的最大深度限制。
import sys
sys.setrecursionlimit(2000)

6. 匿名函数

6.1匿名函数概念

匿名函数即没有名称的函数,在python语言中,匿名函数是使用lambda关键字定义的一个特殊表达式,也称为lambda表达式。

6.2匿名函数基本语法

# 格式一:
# 定义:   函数名 = lambda 形参 : 返回值
# 调用:   结果 = 函数名(实参)
add = lambda a,b : a + b
c = (2,3)
# 格式二:
# 定义并调用:    #结果 = (lambda 形参 : 返回值)(实参)
c=(lambda a,b : a + b)(2,3) 

6.3匿名函数特殊语法

无参格式:

结果 = (lambda :返回值)()
 f1 = (lambda : 100)() 

多返回值格式:可使用数据存储模型返回多个数据

f2, f3 = (lambda: (3, 4))()
print(f2)
print(f3)
f4 = (lambda: [a ** 2 for a in range(5) if a % 2 == 0])()
print(f4)  #输出 [0, 4, 16]

无返回值格式:必须有具体值或结果为None

x = (lambda: (print("hello"), print("python")))()print(x)