为了给装饰器再传参数,而且还要用语法糖,那就只能用函数把装饰器包器来,这就是有参装饰器。
def outter2(mode): def outter(func): # func = index def wrapper(*args ,**kwargs): inp_user = input(‘Username: ‘).strip() inp_pwd = input(‘Password: ‘).strip() if mode == ‘file‘: if inp_user == "egon" and inp_pwd == "123": res = func(*args ,**kwargs) return res else: print(‘login failed‘) elif mode == ‘mysql‘: print("基于mysql数据库的认证") elif mode == ‘ldap‘: print("基于ldap数据库的认证") else: print(‘未知的认证来源‘) return wrapper return outter @outter2(‘ldap‘) def home(name): print(‘hello %s‘ %name) home(‘egon‘)
wraps装饰器是functools模块中的一个装饰器,能把被装饰函数的所有属性都赋值给wrapper。
1.无参装饰器
def outter(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) return res return wrapper @outter def index(): pass
2.有参装饰器
def outter2(xxx): def outter(func): def wrapper(*args,**kwargs): xxx res = func(*args,**kwargs) return res return wrapper return outter @outter2(xxx=111) def index(): pass
1.什么是迭代器
迭代是一个重复的过程,但是每次重复都是基于上一次的结果而来。
2.为什么要用迭代器
(1)为了找到一种新的、统一的取值方式(可以不依赖余索引和key值)
(2)惰性计算,不耗费内存
3.如何用迭代器
(1)可迭代的对象iterable
1.内置有_iter_方法
(2)迭代器对象iterator
1.内置有_iter_方法
2.内置有__next__方法
调用可迭代对象返回的是一个迭代器对象;调用迭代器对象,返回下一个值。
迭代器对象的缺点:
(1)取值不灵活
(2)一次性的,只能往后取,无法预知数据的个数
函数内但凡出现yield关键字,再调用函数不会执行函数体代码,会得到一个生成器对象
生成器就是一种自定义的迭代器
yiled和return比较:
相同点:返回值层面都一样
不同点:return只能返回一次值函数就立即结束,而yield可以返回多次值
在函数内可以采用表达式形式的yield,可以拿到函数的生成器对象持续为函数体send值
>>> g=eater() # 得到生成器对象 >>> g <generator object eater at 0x101b6e2b0> >>> next(e) # 需要事先”初始化”一次,让函数挂起在food=yield,等待调用g.send()方法为其传值 Ready to eat >>> g.send(‘包子‘) get the food: 包子, and start to eat >>> g.send(‘鸡腿‘) get the food: 鸡腿, and start to eat
针对表达式形式的yield,生成器对象必须事先被初始化一次,让函数挂起在food=yield的位置,等待调用g.send()方法为函数体传值,g.send(None)等同于next(g)。
1.列表生成式
names = [‘egon_nb‘,"lxx_sb","hxx_sb"] new_l = [] for name in names: if name.endswith("_sb"): new_l.append(name) new_l = [name for name in names if name.endswith("_sb")] print(new_l)
2.字典生成式
items = [(‘k1‘,111),(‘k2‘,222)] print({k:v for k,v in items})
3.集合生成成式
res = {i for i in range(5)} print(res,type(res))
4.生成器生成式
res = (i for i in range(5)) print(res,type(res))
面向过程编程是一种编写思想or编程范式
面向过程核心是“过程”二字,过程就是流程,流程指的就是先干什么、再干什么、后干什么
基于面向过程编写程序就好比在设计一条条流水线
优点:复杂的问题流程化、进而简单化
缺点:牵一发而动全身,扩展性差
原文:https://www.cnblogs.com/yuxinplus/p/14596830.html