list
可变参数
关键字参数
匿名函数
闭包
偏导函数
装饰器
可变参数
函数的参数个数名字 无法确定 但是又要参与到函数的代码逻辑里
可变参数声明:
def fun(*args):
这个args在函数里 就变成了一个元组
使用
方式1 fun(1,2,3,4,5,53,3)
方式2 my_data = (1,2,3,4,5,53,3)
fun(*my_data)
求N个数的和
def sum_n(*args):
print(args)
sum = 0
# 遍历参数元组
for i in args:
# 累计求和
sum += i
return sum
关键字参数
他也是可变参数的一种形式 只不过 他可以指定具体参数的名字, 在函数内 去调用
定义:
def fun(**kwgs):
print(type(kwgs))
使用场景
当我们的函数 不确定有多少参数的时候
当我们不关注可变参数的名字的时候的使用 *
当我们关注这些可变参数的参数名字的时候 使用两个*
匿名函数
没有名字的函数
不用考虑函数命名,针对于那些 逻辑简单 并且只是用一次的函数
写法:
fun = lambda 参数1, 参数2, 参数N: 逻辑
冒号后面的相当于普通函数的return
偏导函数
作用:帮我们’冻结‘函数的参数,然后得到新的函数 在调用得到的新的函数时 之需要写剩余的参数就可以
使用:
partial(函数名,*args, **kwargs)
from functools import partial
以int()函数为例 将int函数参数base变成2
int2 = partial(int, base=2) #int 是我们需要处理的函数 base=2是该函数 我们想默认值的
int2("1011")
练习
print_new = partial(print, end="!", sep="+")
print_new("sjs", "jj")
print_new("sjs")
闭包
在函数A声明的时候 又在其内部声明了函数B 并且A的返回值是B
def fun():
print("执行中")
def inner():
print("内部函数")
return inner
调用:
res = fun()
此时的res是inner函数
所以 我们还可以继续去调用res
res()
变量:局部变量 全局变量
global 关键字
在函数内用global修饰的变量是全局变量
a = 10
def fun1():
global a
a=6
fun1()
print(a) ---》打印的结果就变成6了
nonlocal 关键字
在闭包中 如果内部函数想去修改外部函数的变量,那我们就需要使用nonlocal来修饰我们想要修改的变量
例子如下:
def fun3():
b = 10
def inner():
nonlocal b
b = 5
inner()
print(b)
return inner
装饰器(非常非常非常重要)
在原有函数的基础上 在不动原函数代码的情况下增加额外的功能
装饰器写法:
def my_time(函数参数):
def inner():
原有函数之前的逻辑
fun()
原有函数之后的逻辑代码
return inner
调用
在函数声明上面使用@装饰器函数名
@my_time
def t1():
time.sleep(1)
print("特别牛的代码")
那么此时t1已经被指向到了装饰器的内部函数inner
那么再调用t1的时候 就变成了调用inner
被装饰的函数有参数
def decorator_one(fun):
def my_fun(a, *args, **kwargs):
fun(a)
return my_fun
@decorator_one
def test1(a):
print("a is %s" % a)
test1("s")
被装饰的函数有参数 有返回值
def decorator_one(fun):
def inner(a, *args, **kwargs):
res = fun(a)
print("我在这", res)
return res
return inner
装饰器带参数(选修)
def out(装饰器需要的参数):
def dec_two(fun):
def inner(*args):
if 装饰器参数 写一些逻辑:
fun(*args)
else:
print("权限不够")
return inner
return dec_two
多装饰器调用(选修)
多个装饰器装饰一个函数的时候是从内向外进行装饰的
练习
假设现在又一个用户
users = {"tom": {"pwd":"000000", "per":1}, "bob":{"pwd": "666666", "per":3}}
修改密码:需要先验证老密码是否正确 如果不正确不能改
网友评论