Py002-01-04函数
函数
- 解决代码重复问题(给一坨代码起个名字法)
- 方便程序扩展
- 使程序变得易维护
1 | def 发邮件(内容): |
形参实参的问题不写了。写的实在太多了
默认参数
就记住一个规则:默认参数必须在位置参数后面
1 | def userInfo(name,age,gender,city='USA'): |
关键参数
铁律:位置参数不能放在关键字参数后面
1 | def userInfo(name,age,gender='man',city='USA'): |
非固定参数
场景:以前小公司只有一个维护人员,功能出现问题就给维护人员报警提示
1 | def send_msg(msg,user): |
后来公司壮大了,10个运维人员,如何发给10个人呢
1 | # 多个人你肯定不能这样 |
传参的两种方式
1 | def send_msg(msg,*users): |
如果有奇葩队友这样写参数咋办?
1 | def send_msg(msg,*users,age): |
非固定参数二
1 | def func(name,*args,**kwargs): |
你觉得写每个关键字参数太麻烦,于是改进了下
1 | d = {"phone":"1323123123","add":"北京"} |
返回值
1 | def fn(): |
- 能不能返回多个值? 不能 肯定是被包裹在一个容器里
1 | def fn(): |
局部变量
- 定义在函数外部的一级代码的变量叫全局变量
- 在函数内定义的变量就是局部变量
- 函数内部可以引用全局变量,如果函数内外都有一个name变量,函数查找是由内而外的
- 局部可以引用全局变量,但不能修改 如name = ‘xx’实际是函数内部声明了一个局部变量name
1 | # 全局 |
如果内部没有定义name 能直接打印吗? 可以
1 | # 全局 |
我就是要修改全局变量
- global声明一下你就可以改了
1 | # 全局 |
让你诧异的问题
如果全局变量是个列表呢!而且也不进行global声明可以修改吗?
可以
1 | names = ['a','b','c','d'] |
嵌套函数
1 | age = 19 |
来看各种恶心的调用版本
1 | age = 19 |
闭包
1 | def wrapper(): |
匿名函数
声明一个匿名函数
1 | # 传统方式 |
注意:
lambda返回值不支持复杂的条件判断,只支持三元运算,不像js的箭头函数可以用{}包含起来
1 | func = lambda x,y:x*y if x<y else x/y |
匿名函数的用途
1 | def fn(n): |
匿名函数总结:
- 节省代码量
- 看着高大上
高阶函数
只要满足以下任意条件就是高阶函数
- 把函数当作参数
- return 返回另一个函数
1 | def xx(a): |