迭代器
# 双下方法# print([1].__add__([2]))# print([1]+[2]) # 迭代器# l = [1,2,3]# 索引# 循环 for# for i in l:# i## for k in dic:# pass # list# dic# str# set# tuple# f = open()# range()# enumerate# print(dir([])) #告诉我列表拥有的所有方法# ret = set(dir([]))&set(dir({}))&set(dir(‘‘))&set(dir(range(10)))# print(ret) #iterable# print(‘__iter__‘ in dir(int))# print(‘__iter__‘ in dir(bool))# print(‘__iter__‘ in dir(list))# print(‘__iter__‘ in dir(dict))# print(‘__iter__‘ in dir(set))# print(‘__iter__‘ in dir(tuple))# print(‘__iter__‘ in dir(enumerate([])))# print(‘__iter__‘ in dir(range(1))) # 只要是能被for循环的数据类型 就一定拥有__iter__方法# print([].__iter__())# 一个列表执行了__iter__()之后的返回值就是一个迭代器# print(dir([]))# print(dir([].__iter__()))# print(set(dir([].__iter__())) - set(dir([])))# print([1,‘a‘,‘bbb‘].__iter__().__length_hint__()) #元素个数# l = [1,2,3]# iterator = l.__iter__()# print(iterator.__next__())# print(iterator.__next__())# print(iterator.__next__())# print(iterator.__next__()) # Iterable 可迭代的 -- > __iter__ #只要含有__iter__方法的都是可迭代的# [].__iter__() 迭代器 -- > __next__ #通过next就可以从迭代器中一个一个的取值 # 只要含有__iter__方法的都是可迭代的 —— 可迭代协议 # print(‘__iter__‘ in dir( [].__iter__()))# print(‘__next__‘ in dir( [].__iter__()))from collections import Iterablefrom collections import Iterator# print(isinstance([],Iterator))# print(isinstance([],Iterable)) # class A:# # def __iter__(self):pass# def __next__(self):pass## a = A()# print(isinstance(a,Iterator))# print(isinstance(a,Iterable)) # l = [1,2,3,4]# for i in l.__iter__():# print(i) # 迭代器的概念# 迭代器协议 —— 内部含有__next__和__iter__方法的就是迭代器 # 迭代器协议和可迭代协议# 可以被for循环的都是可迭代的# 可迭代的内部都有__iter__方法# 只要是迭代器 一定可迭代# 可迭代的.__iter__()方法就可以得到一个迭代器# 迭代器中的__next__()方法可以一个一个的获取值 # for循环其实就是在使用迭代器# iterator# 可迭代对象# 直接给你内存地址# print([].__iter__())# print(range(10)) #for#只有 是可迭代对象的时候 才能用for#当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代 # for i in l:# pass#iterator = l.__iter__()#iterator.__next__() #迭代器的好处: # 从容器类型中一个一个的取值,会把所有的值都取到。 # 节省内存空间 #迭代器并不会在内存中再占用一大块内存, # 而是随着循环 每次生成一个 # 每次next每次给我一个# range# f# l = [1,2,3,45]# iterator = l.__iter__()# while True:# print(iterator.__next__()) # print(range(100000000000000))# print(range(3))# print(list(range(3)))# def func():# for i in range(2000000):# i = ‘wahaha%s‘%i# return i # 生成器 —— 迭代器# 生成器函数 —— 本质上就是我们自己写得函数# 生成器表达式l = [1,2,3,4,5]for i in l: print(i) if i == 2: break for i in l: print(i)
生成器
本质是迭代器
生成器函数 : 执行之后会得到一个生成器作为返回值
只要含有yield关键字的函数都是生成器函数 yield不能和return共用且需要写在函数内从生成器中取值的几个方法: __next__ for 数据类型的强制转换
def generator(): print(1) yield ‘a‘ ret = generator() print(ret) print(ret.__next__()) # <generator object generator at 0x00000271D5CBBE60> # 1 # a def generator(): print(1) yield ‘a‘ print(2) yield ‘b‘ g = generator() print(g.__next__()) print(g.__next__()) # 1 # a # 2 # b
def wa(): for i in range(2000000): yield ‘hh%s‘%ig = wa()count = 0for i in g: count += 1 print(i) if count >50: breakfor i in g: count += 1 print(i) if count >100: breaksend 的获取下一个值的效果和next基本一致只是在获取下一个值的时候,给上一个yield的位置传递一个数据
def generator(): print(123) num = yield 1 print(‘3333‘,num) print(456) yield 2 print(789) g = generator() ret = g.__next__() print(‘***‘,ret) # ret = g.__next__() ret = g.send(‘hello‘) #send的效果和next一样 print(‘***‘,ret)
· 第一次使用生成器的时候 使用next获取下一个值
最后一个yield不能接受外部的值
def average(): sum = 0 count = 0 avg = 0 num = yield sum += num count += 1 avg = sum/count yield avg avg_g = average() avg_g.__next__() avg1 = avg_g.send(10) print(avg1)#10
def average(): sum = 0 count = 0 avg = 0 while True: # num = yield num = yield avg sum += num count += 1 avg = sum/count avg_g = average() avg_g.__next__() avg1 = avg_g.send(10) avg1 = avg_g.send(20) print(avg1)
带装饰器
def init(func): def inner(*args,**kwargs): g = func(*args,**kwargs) g.__next__() return g return inner @init def average(): sum = 0 count = 0 avg = 0 while True: # num = yield num = yield avg sum += num count += 1 avg = sum/count avg_g = average() avg1 = avg_g.send(10) print(avg1)
yield from
def generator(): a = ‘abcde‘ b = ‘12345‘ yield from a yield from b g = generator() for i in g: print(i)
生成器表达式
g = (i for i in range(10))#生成器print(g)for i in g: print(i) #括号不一样,返回的值不一样== 几乎不占用内存
原文地址:https://www.cnblogs.com/rssblogs/p/10932634.html
时间: 2024-12-15 18:24:25