1.修改形参的值,实参变化?

大多数情况,修改形参的值,实参不变:(结合第7点)

def fun(a):
    a += 1
    print("形参为:",a)

a = 3
fun(a)
print("调用后实参为:",a)

结果:

如果形参传的是可变序列,并且函数内使用下标或其他方式修改,实参也会对应修改

def fun(a):
    a[0] += 1
    print("形参为:", a)

a = [1,10]
fun(a)
print("调用后实参为:", a)

结果:

2.默认值参数

def (...,参数名=默认值)

def fun(a, b=2):
    print(a, b)

print(fun(1, 3))

注意:默认值参数必须在最右端

a放在b=2后面:报错

3.函数名.__defaults__

查看函数所有默认值参数的当前值。其返回值是一个元组

def fun(a, b=2,c=4):
    pass

print(fun.__defaults__)

4.不给默认参数传值,且多次调用

默认参数只会在第一次调用时进行解释(也就是说,如果默认参数的是空列表,那么多次调用也不赋予默认值时,只会在第一次调用时创建列表,多次调用操作的都是同一个列表)

5.可变长度参数

*接受任意多个实参 并放在一个元组中,**接受类似于关键字参数一样的多个实参,放入字典中。

def fun(a, *b,**c):
    print(a)
    print(b)
    print(c)

fun(1,2,3,4,5,6,7,x=1,y=2,b=3)

注:一般自己不要用可变长度参数,因为如果一个函数需要接受很多个参数,说明函数设计得不好,可能因为功能过多,建议进行拆分。

6.参数传递时的序列解包

上面可变长度参数是在定义形参时用*,而这里讲的是在调用函数传递实参时用*。

需要传进多个变量的参数时,可以使用列表、元组、集合、字典等可迭代对象做实参,并在实参前加*,python解释器会自动进行解包,然后传进多个单变量形参。如果用字典作为实参,默认使用字典的键,如果要用键值对,需要使用items()方法,要用值,需要使用values()方法。

需要保证实参元素个数和形参个数相等

def fun(a,b,c):
    print(a,b,c)

fun(*[1,2,3])
fun(*{'a':1,'b':2,'c':3})
fun(*{'a':1,'b':2,'c':3}.items())
fun(*{'a':1,'b':2,'c':3}.values())

7.变量作用域

函数内定义的变量一般为局部变量,不属于任何函数的变量一般为全局变量。

局部变量的引用比全局变量速度快,且全局变量会降低代码可读性,应尽量避免使用全局变量。

如果想在函数内部修改一个定义在函数外的变量值,那么函数内这个变量作用域就必须是全局的,用global来声明或定义。(结合第1点)

如果局部变量和全局变量名字相同,作用域内优先用局部变量。

8.不同模块间共享全局变量

不同模块间共享全局变量 ,比如: import A后,用A.变量名来调用

9.lambda表达式

lambda表达式用来声明没有名字的临时使用的小函数。

lambda表达式只可以包含一个表达式,不能包含其他复杂语句,但在表达式中可以调用其他函数,并且支持默认值参数和关键参数。

语法:lambda 变量1,变量2...... :操作 ,表达式的计算结果就是函数的返回值

例如: