0920 函数参数与定义域
目录
1.可变长参数
*+形参
调用函数时,有多少个位置实参,就接收多少个参数。
- *args(约定俗成的),用元组接受多余的位置实参。
def f1(*args):
print(args)
f1() #空元组
f1(1) # (1,)
f1(1,2) # (1,2)
f1(1,2,3,4,5,6,4,7,5,2) #(1,2,3,4,5,6,4,7,5,2)
** + 形参
** kwargs 用字典接受多余的关键字实参
def f1(**kwargs):
print(kwargs)
f1(x=1) # 空字典
仅做了解
*+实参
打散列表,然后以位置实参传给位置形参
def f1(a, b, c, e, d, f, g):
print(a, b, c, e, d, f, g)
lt = [1, 2, 3, 4, 5, 6, 7]
# f1(lt[0],lt[1],lt[2],lt[3],lt[4],lt[5],lt[6])
f1(*lt) # *lt把列表中的元素打散成位置实参依次传给位置形参
**+实参
打散字典,然后以关键字实参传给位置形参
def f1(z, b):
print(z, b)
dic = {'z': 1, 'b': 2} # a=1,b=2
f1(**dic) # **dic把字典打散成关键字实参然后传给函数f1
2.函数对象
python中一切皆对象
s = 10
print(s)
# 10
1.引用
s1 = s
# 10
2.容器元素
lt = [s]
3.作为函数的实参
def f1(ssadfsadf):
print(ssadfsadf)
f1(s)
4.作为函数的返回值
def f1(s):
return s
s2 = f1(s)
字典/列表/元组/集合/布尔值,所有对象都可以做以上四件事情
函数对象 == 函数名
函数名+()实在调用函数。
def f1():
print('from f1')
1.引用
func = f1
print('f1:', f1)
print('func:', func)
func()
# 可以直接调用函数
2.容器元素
lt = [f1, 1, 2, 3]
print('lt[0]', lt[0])
print('f1', f1)
lt[0]()
# 此时 lt[0] 既是 f1函数
3.作为函数的实参
def f1():
print('from f1')
def f2(s):
print('s',s)
s()
# s就是f1 函数 所以可以直接调用
f2(f1)
# f1 做了f2的实参
print('f1', f1)
4.作为函数的返回值
def f1():
print('from f1')
def f2(f2_f1):
return f2_f1
res = f2(f1)
print('res', res)
print('f1', f1)
res()
3.函数嵌套
函数里面有函数
函数内部定义的函数,外部不能用。
def f1():
print('from f1')
def f2():
print('from f2')
return f2
res = f1()
print(res)
res()
'''
from f1
<function f1.<locals>.f2 at 0x000002451C9BCBF8>
from f2
'''
4.名称空间与定义域
名称空间
存储了内置方法的名称
python解释器自带内置方法(print/len/list/str/dict
)
局部名称空间
函数内部定义的都叫局部
def f1():
x = 10
# x 就是局部
全局名称空间
除了内置和局部都叫全局
def f1():
x = 10
def f2():
z = 20
y = 10
lt = [1, 2, 3]
# f1 y lt 都是全局
名称空间的执行顺序
1.内置名称空间:python解释器启动时就有了
2.全局名称空间:执行文件代码的时候才会有全局
3.局部名称空间:函数调用的时候才会有局部
搜索顺序
先从当前所在位置寻找 ,找不到再按照 局部 =》全局=》内置 =》
作用域
全局作用域
内置名称空间 + 全局名称空间 ==》全局作用域
# 全局作用域的变量与局部作用域的变量没有任何关系
def f1():
y = 2
print(1, y) # 1 2
y = 10
f1()
print(2, y) # 2 10
print(y) # 10
'''
'''
局部作用域
局部作用域1的x和局部作用域2 的x没有任何关系
即使局部作用域1和局部作用域2再同一个局部作用域下
def f1():
def f2():
def f3():
x = 1
print(x)
x = 2
f3()
f2()
f1()
# 结果为1
仅做了解
global
可以修改全局作用域中的变量,让global以下的局部的x变成全局的x
x = 10
def f1():
global x # 让global以下的局部的x变成全局的x
x = 20
f1()
print(x)
# 20
nonlocal
nonlocal让x成为顶层函数的局部,不是让他成为全局
压根没有应用情景,尽量不要嵌套函数
x = 10
def f1():
def f2():
def f3():
nonlocal x # nonlocal让x成为顶层函数的局部,不是让他成为全局 # 压根没有应用情景,尽量不要嵌套函数
x = 1
x = 2
f3()
print(1, x) # 1 1
f2()
def f0():
x = 3 # f1的nonlocal无法修改
f1()
f1()
print(2, x) # 2 10
可变数据类型均可打破以上规则
lt = [10,11]
def f1():
lt[0] = 22
f1()
print(lt)
# 输出结果为 [22, 11]