函数
关键字def
1.写法格式
函数名 ():
函数体
#例子如下
func():
函数体
2.函数返回值
关键字return
return的内容返回函数的调用
return下方代码不执行,可以终止函数,不可以终止终止循环
return 返回多个内容的时候是元祖形式
return 没有写返回值的时候是None 不写返回值时也是None
3.参数
形参:是指函数定义中括号里面的参数
实参:函数的调用括号里的是实参
传参:是将实参传递给形参的过程
混合参数:位置参数和关键字参数在一起的
优先级
位置参数>关键字参数
4.三元运算符
变量=条件成立 条件判断 条件不成立 结果
def a(a,b):
return a if a>b else b
print(a(1,2))
5.动态参数
*args是万能位置参数
def func(a,b,*args):
print(a,b,args) #args传递的参数是元祖类型
func(1,2,3,45,['SkyRabbit'])
#结果如下
1 2 (3, 45, ['SkyRabbit'])
def func(a,b,**kwargs,):
print(a,b,kwargs) #args传递的参数是字典类型
func(3,4,args=16,cs=5)
#结果如下
3 4 {'args': 16, 'cs': 5}
位置参数>动态参数>默认参数(关键字参数)>动态关键字参数
万能传参:动态位置参数,动态关键字参数
6.空间
内置空间 例子print() input()
全局空间 在当前py文件需要开辟的空间存放在全局空间
局部空间 函数中开辟的空间就是局部空间
加载顺序
内置空间>全局空间>局部空间
取值顺序
局部空间>全局空间>内置空间
7.作用域
全局作用域:内置空间+全局空间
局部作用域: 局部空间
8.函数嵌套
不管子啊什么位置,只要函数名+()就是调用此函数
函数调用执行后,函数体中开辟的空间就自动销毁了
9.修改变量
global关键字 声明修改,全局变量
nonlocal 关键字 在外层函数中,在修改局部空间的变量值,空间不涉及全局空间,只修改距离它最近一层,直到找到最外层函数.
10函数注释
查看函数的注释
格式如下
函数名 : doc
查看函数的名字
格式如下
函数名: name
第一类对象-特点
1.可以当做值被赋值给变量
2.当做元素,存放在容器中
3.函数名可以当做函数的参数
4.函数名可以当做函数的返回值
格式化用途
1.支持F
2.表达式
3.函数调用
4.数字计算
字典取值
匿名函数
匿名函数 lambda
lambda 形参:返回值 - lambda x:x
形参可以不写,返回值必须写 返回值只能是一个数据类型
匿名函数的名字叫做 lambda
函数参数-动态参数
形参的第三种:动态参数
动态参数分为两种:
形参的顺序: 位置参数 , 动态参数 , 默认参数
位置参数 > *args(动态位置参数) > 默认值参数 > **kwargs(动态默认参数)
这四种参数可以任意的使用
加载顺序:
- 内置命名空间
- 全局命名空间
- 局部命名空间(函数被执行的时候)
取值顺序:
- 局部命名空间
- 全局命名空间
- 内置命名空间
我们给存放名字和值的关系的空间起一个名字叫: 命名空间. 我们的变量在存储的时候就 是存储在这片空间中的.
命名空间分类:
- 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
- 全局命名空间--> 我们直接在py文件中, 函数外声明的变量都属于全局命名空间
- 局部命名空间--> 在函数中声明的变量会放在局部命名空间
1.动态接受位置参数
首先我们来回顾下位置参数
def eat(a,b,c):
print('我想吃%s%s%s'%(a,b,c))
eat('大米饭','中米饭','小米饭')
2.在参数位置用*表示接受任意参数
def eat(a,b,c):
print('我想吃%s%s%s'%(a,b,c))
eat('大米饭','中米饭','小米饭')
3.动态接收参数的时候要注意: 动态参数必须在位置参数后面
def eat(*args,a,b):
print('我想吃',args,a,b)
eat('大米饭','中米饭','小米饭')
结果:
TypeError: eat() missing 2 required keyword-only arguments: 'a' and 'b'
# eat函数在调用的时候发现缺少俩个位置参数没有进行传递
#正确操作
def eat(a,b,*args):
print('我想吃',args,a,b)
eat('大米饭','中米饭','小米饭')
结果:
我想吃 ('小米饭',) 大米饭 中米饭
动态接收参数的时候要注意:动态参数必须在位置参数后面
4.默认值参数呢?
def eat(a,b,c='白菜',*args):
print('我想吃',a,b,c,args)
eat('豆腐','粉条','猪肉','大葱')
结果:
我想吃 豆腐 粉条 猪肉 ('大葱',) # 我们定义好的白菜没有生效,被猪肉给覆盖了
我们发现默认值参数写在动态参数前面,默认值的参数是不会生效的
def eat(a,b,*args,c='白菜'):
print('我想吃',a,b,args,c)
eat('猪肉','粉条','豆腐','大葱')
结果:
我想吃 猪肉 粉条 ('豆腐', '大葱') 白菜 # 这样默认参数就生效了
5.动态接收关键字参数
def func(**kwargs):
print(kwargs)
func(a=1, b=2, c=3)
结果:
{'a': 1, 'b': 2, 'c': 3}
动态关键字参数最后获取的是一个dict字典形式
顺序的问题, 在函数调用的时候, 如果先给出关键字参数, 则整个参数列表会报错.
def func(a,b,c,d):
print(a,b,c,d)
func(1,2,c=3,4)
结果:
File "D:/python_object/path2/test.py", line 806
func(1,2,c=3,4)
SyntaxError: positional argument follows keyword argument
关键参数必须要放在位置参数后边,由于实参是这个顺序,所以形参接收的时候也是这个顺序.
也就是说位置参数必须在关键字参数前面.动态接收关键字参数也要在后面
6.如果想接收所有的参数:
def func(*args,**kwargs):
print(args,kwargs)
func(1,23,5,a=1,b=6)
#动态参数还可以这样传参:
lst = [1,4,7]
# 方法一
def func(*args):
print(args)
func(lst[0],lst[1],lst[2])
# 方法二
def func(*args):
print(args)
func(*lst)
# 在实参的位置上用*将lst(可迭代对象)按照顺序打散
# 在形参的位置上用*把收到的参数组合成一个元祖
7.字典也可以进行打散,不过需要**
dic = {'a':1,'b':2}
def func(**kwargs):
print(kwargs)
func(**dic)
gloabal、nonlocal
global 表示. 不再使用局部作用域中的内容了. 而改用全局作用域中的变量
nonlocal 表示在局部作用域中, 调用父级命名空间中的变量.
如果父级命名空间中没有这个变量名,就继续向上查找.最多找到最外成的函数就结束了