函数是对功能或动作的封装
1.函数声明
def 函数名(形参):
def yue(): #只是声明 print("dfsfds") yue() #调用
2.返回值
return :在函数执行的时候,如果遇到return,直接返回
1.如果函数里面什么都不写,不写return,返回值为none
2.如果在函数的中间或末尾写return,返回值为none
3.如果在函数中写return 值,返回一个值
4.在函数中可以返回多个值,return 值1,值2,值3,值4·····,接收的是元组
3.参数
形参: 函数声明的位置的变量
实参:函数调用的时候给的具体的值
传参:实参交给形参的过程
1.实参
1.位置参数,按照位置进行,需要记住顺序
2.关键字参数,要记住关键字
3.混合参数,先顺序后关键字
2.形参
1.位置参数
2.默认值参数,先位置后默认
3.动态参数
*args接收位置动态参数,接收的是一个元组,**kwargs 接收关键字动态参数,接收的是一个字典
顺序:位置参数——*args——默认值——**kwargs
可进行随意搭配使用
4.函数注释(文档注释)
def j(a,b): ''' :param a: :param b: :return: ''' return a+b 查看文档 print(j.__doc__)document文档 print(str.__doc__)
5.接收所有参数(未知参数)
def fc(*arys,**kwarys): *arys相当于一个聚合作用
print(arys,kwarys)
def func(*args,**kwargs): # 聚合作用 args是动态位置参数接收的是元组 kwargs是动态关键字参数 接收的是字典 print(args,kwargs) <<<< ('火锅', '水果', '甜点') {'names': 'leis', 'age': '14'} func("火锅","水果","甜点",names ="leis",age="14")
6.打散
当要传一个列表的每个元素到函数的时候
li = [1,2,3,4,5,6] def func(*arys): #聚合 print(arys) func(*li) #打散,将列表打散为元素进行传入 <<<<(1, 2, 3, 4, 5, 6)
字典也一样
dic = {'1':12,'2':22,'3':33} def func(**kwarys): #聚合 print(kwarys) func(**dic) #打散 <<<<{'1': 12, '2': 22, '3': 33}
7.命名空间
1.内置名称命名空间
2.全局名称命名空间
3.局部名称命名空间
作用域
1.全局作用域:内置 + 全局
2.局部作用域:局部(函数被调用 )
globals() 查看全局作用域的内容
locals() 查看当前作用域的内容
8.函数嵌套
函数可以互相嵌套
9.global(),nonlocal()
1.global():在局部访问全局中的内容
a = 10 def func(): a = 20 # 这里要改变全局变量a,但是没有加global改变不了 print(a) func() <<<<20 print(a) <<<<10 def func1(): global a # 这里加了后就可以了,要在函数里改变全局变量就要加global a = 30 print(a) func1() <<<<30 print(a) <<<<30
nonlocal(): 在局部寻找外层函数离它最近的那个变量
def func(): a = 10 def f1(): nonlocal a # 如果局部函数要调用外层局部的变量的时候要加 nonlocal,要不然会报错 a = a + 1 print(a) f1() <<<<11 return a # 返回f1函数名 re = func() print(re) # 打印返回值 <<<<11
10.函数名的命名
函数就是变量
函数名的命名跟变量的命名是一样的
11.函数名可以作为参数传递给函数
def my(): print("哈哈") def proxy(fn): fn() proxy(my) <<<<哈哈
12.闭包:
在内层函数中访问外层函数的变量
闭包的作用:
1.可以保护你的变量不受侵害
2.可以让一个变量常驻内存
def func(): a = 10 # 常驻内存 def func1(): # 当局部调用了外面局部的变量的时候就叫闭包 print(a) return func1 # 返回函数的内存地址,返回函数名 ri = func() ri() <<<<10 print(ri.__closure__) # __closure__ 查看是否是闭包,如果打印为none就不是闭包,如果是一个内存地址就是闭包 <<<<(<cell at 0x000001A37F1C1918: int object at 0x00007FFDF62A63B0>,)