一、多参数解析
使用*args(元组)和**kwargs(字典)来调用函数
def res (arg1,arg2,arg3):
print("arg1:",arg1)
print("arg2:",arg2)
print("arg3:",arg3)
使用普通参数方法:
res(1,2,3)
使用*args非关键字可变参数方式:
# 以元组方式传递
nums = (1,2,3)
使用**kwargs关键字可变参数方式:
# 以字典方式传递
kwargs = {
"arg1":1,
"arg2":2,
"arg3":3,
}
res(**kwargs)
如果你想在函数里同时使用这三种参数,顺序是这样的:
func(fargs,*args,**kwargs)
二、闭包
在一个外涵数中定义了一个内函数,内涵数里运用了外涵数中声明的参数或变量,并且外涵数的返回值是内涵数的引用。这样就构成了一个闭包。
def outer(a):
def inner(b):
return a+b
return inner
函数inner就被包括在函数outer内部,这时outer内部的所有局部变量,对inner都是可见的。但是反过来就不行,inner内部的局部变量,对outer就是不可见的。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
# 获取最外层的outer方法的返回值:inner
res = outer(5)
print(res(6))
注意:外层函数的变量将持久地保存在内存中。
# 闭包应用于:数据共享
def counter(initial_value=0):
count = [initial_value] # 使用列表来存储计数值,以便在内部函数中修改 count[0]=10def increment():
# 增加计数
count[0] += 1
return count[0]def decrement():
# 减少计数
count[0] -= 1
return count[0]# 返回两个内部函数
return increment, decrement
# 创建闭包实例
inc, dec = counter(10)# 使用闭包
print(inc()) # 输出: 11
print(inc()) # 输出: 10
三、装饰品
装饰器是闭包的一种应用。装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
# 开启事务 核心业务处理 # 提交/回滚事务
可以理解为Spring中的AOP。
示例一:初识装饰器
def Transaction(func): def wrapper(): print("开启事务处理") func() print("提交事务处理") return wrapper @Transaction def hello(): print("hello python") hello() print(hello.__name__)
注意:当使用装饰器@Transaction修饰方法时,
hello.__name__
返回的方法名称就不是当前hello方法了,而是被装饰器中的wrapper方法所取代。
@wraps(func)
的作用: 不改变使用装饰器原有函数的结构
from functools import wraps def Transaction(func): @wraps(func) def wrapper(): print("开启事务处理") func() print("提交事务处理") return wrapper @Transaction def hello(): print("hello python") hello() print(hello.__name__)
示例二:带参数的装饰器
装饰器中可以传入参数,先形成一个完整的装饰器,然后再来装饰函数,当然函数如果需要传入参数也 是可以的,用不定长参数符号就可以接收。
def logging(level='debug'): print(level) def outer_wrapper(func): def inner_wrapper(*args, **kwargs): print(f"{level}: enter {func.__name__}()") return func(*args, **kwargs) return inner_wrapper return outer_wrapper @logging("info") def hello(): print("hello python") hello()
注意:@logging装饰器带括号和不带括号的区别。
@logging不带括号,hello方法名作为参数传入,则在level参数接收到的是hello方法;
@logging()带括号,则使用logging中的level默认参数或者传入参数覆盖level默认参数;
def logging(logfile='out.txt'): def decorator(func): def wrapped_function(*args, **kwargs): log_string = func.__name__ + "被调用了" # 打开logfile,并写⼊内容 with open(logfile, 'a') as opened_file: # 现在将⽇志打到指定的logfile opened_file.write(log_string + '\n') return wrapped_function return decorator @logging() def hello(): pass hello()
实战案例:电影管理系统
movies = [{"no": "1292052", "name": "肖申克的救赎", "rating": 9.7, "inq": "希望让人自由。"}, {"no": "1291546", "name": "霸王别姬", "rating": 9.6, "inq": "风华绝代。"}, {"no": "1292720", "name": "阿甘正传", "rating": 9.5, "inq": "一部美国近现代史。"}, {"no": "1295644", "name": "这个杀手不太冷", "rating": 9.4, "inq": "怪蜀黍和小萝莉不得不说的故事。"}, {"no": "1292722", "name": "泰坦尼克号", "rating": 9.4, "inq": "失去的才是永恒的。"}, {"no": "1292063", "name": "美丽人生", "rating": 9.6, "inq": "最美的谎言。"}, {"no": "1291561", "name": "千与千寻", "rating": 9.4, "inq": "最好的宫崎骏,最好的久石让。"}, {"no": "1295124", "name": "辛德勒的名单", "rating": 9.5, "inq": "拯救一个人,就是拯救整个世界。"}, {"no": "3541415", "name": "盗梦空间", "rating": 9.3, "inq": "诺兰给了我们一场无法盗取的梦。"}, {"no": "3011091", "name": "忠犬八公的故事", "rating": 9.4, "inq": "永远都不能忘记你所爱的人。"}]
查询显示所有的电影方法
增加电影的方法
电影集合排序,默认根据评分排序
删除电影的方法,如果没有则默认删除最后一个
修改电影的方法
查询分页的方法(可以完成评分筛选)