0
点赞
收藏
分享

微信扫一扫

python 迭代器与生成器,装饰器

君心浅语 2022-02-09 阅读 107
python

python 迭代器与生成器,装饰器

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:

list1=[1,2,3]
s=iter(list1) # 创建迭代器对象
print(next(s)) # 输出迭代器的下一个元素
print(next(s))
print(next(s))

在这里插入图片描述
直到计算出最后一个元素,没有更多的元素时,抛出StopIteration的错误
在这里插入图片描述
迭代器对象可以使用常规for语句进行遍历:

list2=[1,2,3,4,5]
s2 = iter(list2)    # 创建迭代器对象
for h in s2:
    print (h, end="-")

在这里插入图片描述
生成器
带有 yield 的函数在 Python 中被称之为 generator(生成器)
(自己制作迭代器可以看做是生成器)

#注意括号
#列表生成式
lis = [x+x for x in range(5)]
print(lis)
#生成器
gen= (x+x for x in range(5))
print(gen)
# gen = (x+x for x in range(5))
# print(next(gen))
# print(next(gen))
# print(next(gen))
# print(next(gen))
# print(next(gen))
generator_ex = (x+x for x in range(5))
for i in generator_ex:
    print(i)

在这里插入图片描述
自己产生一个支持小数的range生成器(即带yield的迭代器)

def frange(star,stop,step):
    x=star
    while x<stop:
        yield x
        x+=step
for i in frange(10,20,0.5):
    print(i)

在这里插入图片描述
下图最直观得可以看出yield的作用

def foo():
    print("starting...")
    while True:
        print("yield前")
        res = yield 4
        print("yield后")
        print("res:", res)


g = foo()
print(next(g))
print("*" * 20)
print(next(g))

在这里插入图片描述
装饰器https://www.cnblogs.com/ellisonzhang/p/11196390.html

# 这是装饰函数
def logger(func):
    def wrapper(*args, **kw):
        print('我准备开始计算:{} 函数了:'.format(func.__name__))

        # 真正执行的是这行。
        func(*args, **kw)

        print('啊哈,我计算完啦。给自己加个鸡腿!!')
    return wrapper

@logger
def add(x, y):
    print('{} + {} = {}'.format(x, y, x+y))
add(200, 50)

在这里插入图片描述

# 这是装饰函数
def timer(func):
    def wrapper(*args, **kw):
        t1=time.time()
        # 这是函数真正执行的地方
        func(*args, **kw)
        t2=time.time()

        # 计算下时长
        cost_time = t2-t1
        print("花费时间:{}秒".format(cost_time))
    return wrapper

import time

@timer
def want_sleep(sleep_time):
    time.sleep(sleep_time)

want_sleep(10)

在这里插入图片描述

def american():
    print("我来自中国。")


def chinese():
    print("I am from America.")


def say_hello(contry):
    def wrapper(func):
        def deco(*args, **kwargs):
            if contry == "china":
                print("你好!")
            elif contry == "america":
                print('hello.')
            else:
                return

            # 真正执行函数的地方
            func(*args, **kwargs)

        return deco

    return wrapper


@say_hello("china")
def american():
    print("我来自中国。")


@say_hello("america")
def chinese():
    print("I am from America.")

在这里插入图片描述
装饰器例子来源:https://www.cnblogs.com/ellisonzhang/p/11196390.html

举报

相关推荐

0 条评论