一.迭代器
1.1 可迭代对象:
含有__iter__()方法的对象是可迭代对象 -- 可迭代协议
2.2 迭代器
执行了__iter__()方法返回的就是迭代器,增加了__next__()方法,可以用next取值
迭代器优点:
取值一个一个取,不会一次性取出所有的值,内存占用少
二.生成器
2.1 生成器函数
2.2 生成器表达式
2.3 生成器函数的另一种用法:中途可以传值,首先要用__next__方法激活
def generator():
print(111)
recv = yield 1
print(recv)
recv= yield 2
print(recv)
recv = yield 3
print(recv)
g = generator()
ret = g.__next__()
print(ret)
ret = g.send('first send')
print(ret)
ret = g.send('second send')
print(ret)
# python3 新用法
# def generator():
# a = [1,2,3,4,5]
# b = [6,7,8,9,10]
# yield from a
# yield from b
# g = generator()
# for i in g:
# print(i)
三.生成器函数
只要含有yield关键字的函数都是生成器函数,yield不能和return共用且需要写在函数内部
# def generator():
# print('第一个生成器函数')
# yield 2
# ret = generator()
# print(ret)
# <generator object generator at 0x0000020B84512EB8> 返回一个生成器对象
# print(dir(ret))
# ['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']
# 有__iter__,和__next__方法,说明生成器也是迭代器
# def generator():
# yield '第一个yield'
# yield '第二个yield'
# yield '第三个yield'
# yield '第四个yield'
# yield '第五个yield'
# g = generator()
# print(g.__next__())
# print('-' * 20)
# print(g.__next__())
# print('-' * 20)
# print(g.__next__())
# print('-' * 20)
# print(g.__next__())
# print('-' * 20)
# print(g.__next__())
# print('-' * 20)
# print(g.__next__()) # 所有值取完报错:StopIteration
# print('-' * 20)
# 遇到一个yield即停止,下一次调用从上一个yield后开始,在处理大数据的时候优势明显,每次处理一部分,下一次从上一次结束的地方接着向下执行
二.装饰器进阶
# def wraper(fun):
# def expendFunc():
# print("sourceFunc前执行的代码")
# fun()
# print("sourceFunc后执行的代码")
# return expendFunc
# @wraper
# def sourceFunc():
# '''
# sourcFunc的文档注释
# '''
# print("装饰器补充...")
# sourceFunc()
# print(sourceFunc.__name__) # 输出的是expendFfunc
# print(sourceFunc.__doc__) # 输出的是None
# 原函数的名字和文档注释都被改变了
# from functools import wraps
#
# def wraper(fun):
# @wraps(fun)
# def expendFunc():
# print("sourceFunc前执行的代码")
# fun()
# print("sourceFunc后执行的代码")
# return expendFunc
# @wraper
# def sourceFunc():
# '''
# sourcFunc的文档注释
# '''
# print("装饰器补充...")
# sourceFunc()
# print(sourceFunc.__name__) # 输出的是sourceFunc
# print(sourceFunc.__doc__) # 输出的是"sourcFunc的文档注释"
# 多个装饰器装饰一个函数
# from functools import wraps
#
# def wraper1(fun):
# @wraps(fun)
# def expendFunc1():
# print("执行fun前执行wraper1中的代码...")
# fun()
# print("执行完fun后执行wraper1中的代码...")
# return expendFunc1
#
# def wraper2(fun):
# @wraps(fun)
# def expendFunc2():
# print("执行fun前执行wraper2中的代码...")
# fun()
# print("执行完fun后执行wraper2中的代码...")
# return expendFunc2
# @wraper1
# @wraper2
# def func():
# print("这是一个被wraper1和wraper2一起装饰的函数")
# func()
# 执行fun前执行wraper1中的代码...
# 执行fun前执行wraper2中的代码...
# 这是一个被wraper1和wraper2一起装饰的函数
# 执行完fun后执行wraper2中的代码...
# 执行完fun后执行wraper1中的代码...
# @wraper2
# @wraper1
# def func():
# print("这是一个被wraper1和wraper2一起装饰的函数")
# func()
# 执行fun前执行wraper2中的代码...
# 执行fun前执行wraper1中的代码...
# 这是一个被wraper1和wraper2一起装饰的函数
# 执行完fun后执行wraper1中的代码...
# 执行完fun后执行wraper2中的代码...
# 多个函数取消装饰器的效果--带参数的装饰器:FLAG设置为False则扩展功能
# from functools import wraps
#
# FLAG = True
# def wraperOut(flag):
# def wraper(fun):
# @wraps(fun)
# def expendFunc():
# if flag:
# print("执行fun前执行的代码...")
# fun()
# print("执行fun后执行的代码...")
# else:fun()
# return expendFunc
# return wraper
#
# @wraperOut(FLAG)
# def func1():
# print(func1.__name__)
#
# @wraperOut(FLAG)
# def func2():
# print(func2.__name__)
#
# func1()
# func2()
Python之迭代器,生成器与装饰器进阶
猜你喜欢
转载自blog.csdn.net/qq_40199698/article/details/87897170
今日推荐
周排行