装饰器、迭代器、生成器

装饰器、迭代器、生成器

1.有参装饰器

为了给装饰器再传参数,而且还要用语法糖,那就只能用函数把装饰器包器来,这就是有参装饰器。

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')

2.wraps装饰器

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

3.迭代器

1.什么是迭代器

  迭代是一个重复的过程,但是每次重复都是基于上一次的结果而来。

2.为什么要用迭代器

(1)为了找到一种新的、统一的取值方式(可以不依赖余索引和key值)

(2)惰性计算,不耗费内存

3.如何用迭代器

(1)可迭代的对象iterable

  1.内置有_iter_方法

(2)迭代器对象iterator

  1.内置有_iter_方法

  2.内置有__next__方法

调用可迭代对象返回的是一个迭代器对象;调用迭代器对象,返回下一个值。

迭代器对象的缺点:

(1)取值不灵活

(2)一次性的,只能往后取,无法预知数据的个数

4.自定义迭代器——生成器

函数内但凡出现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))

 

5.面向过程编程

面向过程编程是一种编写思想or编程范式

面向过程核心是“过程”二字,过程就是流程,流程指的就是先干什么、再干什么、后干什么
基于面向过程编写程序就好比在设计一条条流水线

优点:复杂的问题流程化、进而简单化
缺点:牵一发而动全身,扩展性差

 

posted @ 2021-03-30 15:00  余鑫  阅读(81)  评论(0)    收藏  举报