Python-迭代器、修饰器、生成器

Python-迭代器、生成器、修饰器

迭代器

在python中几乎所有的容器都会有一个__iter__的内置方法,用来返回一个迭代器。迭代器其实可以理解成for循环的一个下层组成部分,for就是利用不断的迭代直到报错退出for循环实现list或者其他容器中元素遍历的。

迭代器的使用主要包含两部分,首先利用iter()函数构建容器的迭代器,在利用next()函数使用迭代器进行迭代,当迭代器已经完成了所有元素的迭代之后就会报错StopIteration。在理解上迭代器可以看成是一个指针,初始状态下指向容器的第0个元素,每next一次就向后移动一个元素。

list1 = [1,2]
for each in list1:
    print(each)
    
# 作用和1-3行相同
list1_iter = iter(list1)
print(next(list1_iter)) # 1
print(next(list1_iter)) # 2
print(next(list1_iter)) # ERROR:StopIteration

生成器

生成器是一种特殊的迭代器,只能够使用一个,通过def函数实现生成器,每一次yield都是一次阶段性的return,等到下一次实例对象进行next()的时候才会执行到下一个yield

def test():
    yield 1
    yield 2
    yield 3


if __name__ == '__main__':
    t = test()	# 构建一个函数的实例对象
    print(next(t)) # 1
    print(next(t)) # 2
    print(next(t)) # 3
    print(next(t)) # ERROR:StopIteration
    
    print(list(test())) # [1,2,3]

yield from是生成器的另一种用法,其作用相当于一个循环迭代生成。

def test(*iterable):
    for each in iterable:
        yield from each

# 效果相当
def test_demo(*iterable):
    for each in iterable:
        for i in each:
            yield i

if __name__ == '__main__':
    t = test('123', 'asd')
    print(next(t)) # 1
    print(next(t)) # 2

Tips:当生成器被强制转换为list(),tuple()等容器中时,就会遍历完所有数据

def test(*iterable):
    for each in iterable:
        yield from each


if __name__ == '__main__':
    t = test('123', 'asd')
    print(tuple(t))	# ('1', '2', '3', 'a', 's', 'd')

修饰器

修饰器以函数作为输入参数,将输入的函数作为其中的一部分,返回包含了输入函数的一个新的函数(被修饰过的函数),可以理解成在原来函数的技术上增加了一部分处理(重载)。包含两种不同的类型

不带参数的修饰器

def test(func):
    def wrapper():
        func()
        print('wrapper')

    return wrapper


@test
def be_test():
    print('be test')


if __name__ == '__main__':
    be_test()

# 等价于
	test(be_test)

带有参数的修饰器

def level_1(var=0):
    def level_2(func):
        def level_3(a, b):
            func(a, b)
            print(var, a, b)

        return level_3

    return level_2


@level_1(111)  # 这个参数传给var
def test(b, c):  # test传给level_2; 里面的参数传给level_3
    pass


if __name__ == '__main__':
    test(2, 3)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值