python基础 day13 迭代器生成器

#双下方法
# print([1].__add__([2]))
#循环 for
#可for循环的类型:str,list,tuple,dic,set,file,range,enumerate
# print(dir([])) #dir告诉我列表可用的所有方法
# print(dir({}))

# ret=set(dir([]))&set(dir({}))&set(dir(''))&set(dir(range(10)))
# print(ret)
# print('__iter__' in dir(int))
# print('__iter__' in dir(list))
# print('__iter__' in dir(tuple))
# print('__iter__' in dir(set))
# print('__iter__' in dir(enumerate([])))
# print('__iter__' in dir(bool))
# print(list.__iter__([])) #迭代器 iterator
#一个列表执行了__iter__方法之后的返回值,就是一个迭代器
#print(set(dir([].__iter__()))-set(dir([]))) #迭代器和所有方法的差集
# l=[1,2,3]
# print(l.__iter__().__length_hint__()) #元素个数
# iterator=l.__iter__()
# print(iterator.__next__())
# print(iterator.__next__())
# print(iterator.__next__())
#只要拥有__ iter__方法的都是可迭代的,通过__next__()可以从迭代器中一个一个取值
#只要拥有__ iter__方法的都是可迭代的---->可迭代协议


#迭代器的概念:
##迭代器协议:内部含有__iter__方法和__next__方法的就是迭代器
#可迭代协议:只要拥有__ iter__方法的都是可迭代的,都可以被for 循环
#可迭代对象使用__iter__方法就生成了一个迭代器

#for 循环其实就是在使用迭代器

#迭代器的好处:
#可以从容器中一个一个的取值,所有的值都能够取到
#节省内存空间:迭代器并不会在内存中占用一大块内存,而是通过next每次给我一个

# print(range(1000000000000))
# print(list(range(1000000)))
# l=[1,2,3,4,5] #通过next方法一个一个取值
# iterator=l.__iter__()
# while True:
# ret=iterator.__next__()
# print(ret)

#生成器:
#生成器函数:本质上就是我们自己编写的函数
#生成器表达式

# def get():
# for i in range(2000000):
      yield 'wahaha%s'%i
#生成器函数
# def gennerator():
# print(1)
# return 'a'
# ret=gennerator()
# print(ret)

#只要含有yield关键字的函数都是生成器
#yield不能与return共用且只需要写在函数内
# def gennerator(): #生成器函数返回的是一个生成器
# print(1)
# yield 'a'
# print(2)
# yield 'b'
# ret=gennerator()
# # print(ret)
# # print(ret.__next__())
# # print(ret.__next__())
def wahaha():
for i in range(2000000):
yield 'whahaha%s'%i
g=wahaha()
count=0
for i in g:
count+=1
print(i)
if count>50:
break
print('********',g.__next__())

#生成器:就是一个迭代器
#生成器函数:我们自己写的函数
#生成器表达式
posted @ 2019-04-03 22:49  遗忘天际  阅读(134)  评论(0编辑  收藏  举报