函数2
函数2
1.命名关键字参数
def func(x,n=3,*,m=333,y): print(x) print(y) print(m) print(args) print(kwargs) func(1,2,3,4,y=4,m=5555)
*之后的叫命名关键字参数,必须要用关键字实参为其传值。
2.type hinting
def register(name:str,age:int)->str: print(name,age) return 'ok' res = register(111111111,"aaaaa")
可以在形参之后为其加上数据类型,但是和没加一样,只是有一个提示的效果,python是一个动态类型的语言,这就有一点向静态类型靠近的意思,所以用不用就见仁见智了,提示写在文档里也是可以的。
3.函数对象
函数对象:函数是第一类对象,函数是第一等公民
简单的说就是函数可以被当成变量去用
定义一个函数。函数名绑定的就是函数体代码的内存地址,和变量一样,如果print()的话就是一个内存地址
1.可以被赋值
函数可以赋值给一个变量,赋值之后变量也是函数的内存地址,变量也可以用来运行函数体代码
y = x f = func print(f is func) f()
2.可以当作参数传给另一个函数
函数可以作为一个参数为其他函数传值
def foo(a): print(a) a() foo(func)
3、可以当做函数的返回值
def foo(f): return f res = foo(func) print(res) res()
4.可以当作容器类型的元素
这样,我们就可以把登陆之类的操作变得简洁
def login(): print('登录'.center(50,'*')) def register(): print('注册'.center(50,'*')) def transfer(): print('转账'.center(50,'*')) def withdraw(): print('提现'.center(50,'*')) func_dic = { "1":["登录",login], "2":["注册",register], "3":["转账",transfer], "4":["提现",withdraw], } while True: print("0 退出") for k in func_dic: print(k,func_dic[k][0]) choice = input("请输入您的命令编号:").strip() if choice == "0": break if choice in func_dic: func_dic[choice][1]() else: print("输入命令错误")
4.函数嵌套
1.函数的嵌套定义
函数体代码中也可以定义一个函数
下面是算圆的周长和面积
from math import pi def circle(radius,mode=0): def perimiter(radius): return 2 * pi * radius def area(radius): return pi * (radius ** 2) if mode == 0: return perimiter(radius) elif mode == 1: return area(radius) circle(3,1)
2、函数的嵌套调用
通过比较2个值大小的函数,调用在4个参数的函数中,可以为4个值比较大小
def max2(x,y): if x > y: return x else: return y def max4(a,b,c,d): res1 = max2(a,b,) res2 = max2(res1,c) res3 = max2(res2,d) return res3 res = max4(1,2,3,4) print(res)
5.名称空间和作用域
名称空间Namespaces:存放名字与其对应的内存地址的地方
名称空间分为三大类:
1.内置名称空间:存放的是python解释器自带的名字
生命周期:python解释器启动则产生,解释器关闭则销毁
2.全局名称空间:存放的是顶级的名字
生命周期:py程序刚开始运行则立即产生,py程序结束就销毁
3.局部名称空间:存放的是函数内的名字
生命周期:函数调用则产生,函数调用结束则销毁
一 、名字的访问优先级
基于自己所在的位置向外一层一层查找,L-E-G-B
L是本身空间,E是外层函数空间,G是全局空间,B是内置空间
二、名称空间的‘嵌套’关系是在函数定义阶段、扫描语法是生成的,与调用位置无关

浙公网安备 33010602011771号