10.函数
#函数
def test():
for i in range(10):
print(i)
test()
print('----------------')
a=test()
a#函数赋给一个变量,这个变量可以像函数一样去调用
'''
注:同名函数后边会覆盖前边的
一个函数中可以调用其他函数
调用函数时,参数数量保持一致,且按正确顺序
当使用关键字参数时就可以顺序不一样
默认参数:def demo1(age=18) 不传实参会默认18,当有多个默认参数是,默认参数只能放在最后
不定长参数(可变参数):
*args 用来接收多个位置参数,得到一个元组,且需要放在最后
**kwargs用来接收多个关键字参数得到一个字典,需要以kv形式传参,且需要放在最后
匿名函数:定义函数时不使用def,而是使用lambda表达式(简单函数,一般书写一行,且常用变量接收)
回调函数:把一个函数(a)作为一个参数传入函数(b)中,那么a就是回调函数
闭包(主要用于装饰器):如果函数内部定义了一个函数那就是外函数和内函数的关系,
如果这个外部函数的返回值还是内部函数且内部函数引用了外部函数的变量那就构成闭包
装饰器: 在代码运行期间,可以给原函数新增功能,被成为装饰器(使用闭包函数实现)(一般在原函数上边调用)
装饰器传入不定长参数:这里和上边的不定长参数差不多,只是传入的参数为函数名,且使用@调用。可以理解为一个装饰器可以修饰多个函数
同样,多个修饰器也可以修饰一个函数,直接加多个@调用即可,谁在上先执行谁
'''
def demo(name,age):
print(name,age)
demo(age=18,name='zhang')#关键字参数
a=lambda n:print(n)#匿名函数
a(1)
def add(a,b):
print(a+b)
def x(a,b,func):
func(a,b)
x(1,2,add)
def outer():
def inner():
print('inner')
return inner
fn=outer()#fn等于outer,同时相当于inner
fn()#相当于调用inner
def demo2():
print('原有功能')
def outer1(fn):
def inner():
fn()
print('补充功能')
return inner
demo2=outer1(demo2)
demo2()
def common(fn):#为加减函数新增一个功能
def inner(*args):
print('运算结果为:',end='')
fn(*args)
return inner
@common#一个装饰器修饰多个函数
def jia(a,b):
print(a+b)
@common
def jian(a,b):
print(a-b)
def cheng(a,b):
print(a*b)
jia(2,3)
jian(5,3)
cheng=common(cheng)#这里用的普通调用
cheng(5,6)
#global和nonlocal
'''
因为存在作用域,函数内部定义的变量会和外部分隔开,
若想在函数的内部修改函数外部变量的值,使用global关键字(glabal a)
内部函数想修改或使用外部函数变量使用nonlocal
'''
#递归函数:函数自己调用自己
def demo3(n):#n的阶乘
if n==1:
return 1
return n*demo3(n-1)
print(demo3(5))