首页 > 其他 > 详细

装饰器、迭代器、生成器

时间:2021-03-30 16:24:34      阅读:13      评论:0      收藏:0      [点我收藏+]

装饰器、迭代器、生成器

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编程范式

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

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

 

装饰器、迭代器、生成器

原文:https://www.cnblogs.com/yuxinplus/p/14596830.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!