目录
可变长参数 可变长形参: *args 可变长实参: *容器类 可变长形参: **kwargs 可变长实参: **字典 函数对象 引用 当做容器类型元素 当做参数传给一个函数 当做函数的返回值 函数对象应用 名称空间和作用域 名称空间 内置名称空间 局部名称空间 全局名称空间 空间名称的生成顺序 名称空间搜索顺序 作用域 全局作用域 局部作用域 注意事项 补充可变长参数
可变长形参: *args
形参中的* 会将溢出的 位置实参 全部接收, 然后以元祖的形式存储, 并将元祖赋值给*后面的args
# 我们习惯把*后面的形参叫做args def func(a, *args): print(args) func(1, 2, 3, 4) # (2, 3, 4)
可变长实参: *容器类
实参中的*会将其后面的 容器类型的元素 (列表, 集合, 元祖, 字典)依次取出, 变成位置实参
def func(a, b, c, d): print(a, b, c, d) tup = (2, 3) func(1, *tup, 4) # 1 2 3 4
可变长形参: **kwargs
形参中的**会将溢出的关键字实参全部接收, 然后以字典的形式存储, 并赋值给后面的kwargs
# 我们习惯把**后面的形参叫做kwargs def func(a, **kwargs): print(kwargs) func(1, b=2, c=3) # {'b': 2, 'c': 3}
可变长实参: **字典
实参中的**会将其后面的字典类型key:value取出, 转化为关键字实参(key=value)
def func(a, b, **kwargs): print(**kwargs) dic = {'c':3, 'd':4} func(1, 2, **dic) # {'c': 3, 'd': 4}
函数对象
我们可以把函数看做一种数据类型, 函数名就是这个函数的函数对象
引用
def func(): print('from func') print(func) # <function func at 0x00000000024C1E18> f = func f() # from func
当做容器类型元素
def func(): print('from func') lis = [func, 1, 2, 3] lis[0]() # from func
当做参数传给一个函数
def func1(): print('from func1') def func2(x): x() func2(func1) # from func1
当做函数的返回值
def func(): print('from func1') def func2(x): return x res = func2(func1) res() # from func1
函数对象应用
# 简易购物系统 def register(): print('注册') def login(): print('登录') def shopping(): print('购物') func_dict = { '1': register, '2': login, '3': shopping } while True: print(''' 1 注册 2 登录 3 购物 ''') choice_inp = input('请选择你需要的功能(输入q退出): ') if choice_inp == 'q': break func_dict[choice_inp]()
名称空间和作用域
名称空间
用来存储名称的空间(变量名/函数名等)
内置名称空间
存储了Python内置方法的名称
局部名称空间
存储了函数内部定义的名称
全局名称空间
除了内置和局部的名称都存储在全局名称空间
空间名称的生成顺序
内置名称空间: Python解释器启动时 全局名称空间: 执行文件代码时 局部名称空间: 函数调用的时名称空间搜索顺序
比如我们现在要 print(x) , Python解释器就会在各个名称空间搜索我们有没有定义过 x
搜索顺序: 先从当前名称空间开始寻找, 找不到会按着 局部-->全局-->内置-->报错 顺序寻找
作用域
全局作用域
全局有效, 全局存活, 包含内置名称空间+全局名称空间
局部作用域
局部有效, 临时存储, 只包含局部名称空间
注意事项
全局作用域和局部作用域之间是相互独立的def func(): x = 1 print(f'局部作用域x: {x}') x = 2 func() # x = 1 print(f'全局作用域x: {x}') ''' 局部作用域x: 1 全局作用域x: 2 '''局部作用域1和局部作用域2之间也是相互独立的
def func1(): x = 1 def func2(): x = 2 print(f'局部作用域2中x: {x}') func2() # x = 2 print(f'局部作用域1中x: {x}') func1() ''' 局部作用域2中x: 2 局部作用域1中x: 1 '''
补充
globalx = 1 def func(): global x # global声明x为全局变量 x = 2 func() print(x) # 2nonlocal
def func1(): x = 1 def func2(): nonlocal x # nonlocal声明x为顶层函数的局部作用域变量 x = 2 f2() print(x) func1() # 2在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。
lis = [] def func(): lis.append(1) print(f"调用函数前: {lis}") func() print(f"调用函数后: {lis}") ''' 调用函数前: [] 调用函数后: [1] '''
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did171504