# l = [1,2,3] # 索引 # 循环 for # list # dic # str # set # tuple # f = open() # range() # enumerate ''' print(dir([])) # 告诉我列表的所有方法 print(dir({})) # 告诉我字典的所有方法 print(dir('')) # 告诉我字符串的所有方法 # 求以上三个方法的交集 ret = set(dir([]))&set(dir({}))&set(dir('')) print(ret) # 双下方法 print([1].__add__(([2]))) print([1]+ [2]) # 判断是否可迭代 print('__iter__' in dir(int)) print('__iter__' in dir(bool)) print('__iter__' in dir(list)) print('__iter__' in dir(dict)) print('__iter__' in dir(str)) print('__iter__' in dir(set)) print('__iter__' in dir(tuple)) print('__iter__' in dir(enumerate([],1))) ''' # 只要是能被for循环的数据类型就一定有__iter__方法 # print([].__iter__()) # 一个列表执行了__iter__()之后的返回值就是一个迭代器 # print(dir([])) # print(set(dir([].__iter__()))-set(dir([]))) # {'__next__', '__length_hint__', '__setstate__'} # print([1,2,'aa'].__iter__().__length_hint__()) # 元素个数 # l = [1,2,3] # iterator = l.__iter__() # print(iterator.__next__()) # print(iterator.__next__()) # print(iterator.__next__()) # 只要含有__iter__方法的都是可迭代的 # [].__iter__() 迭代器 --> __next__() # 通过next就可以从迭代器中一个一个的取值 # 只要含有__iter__方法的都是可迭代的 --> 可迭代协议 # 迭代器协议 --> 内部含有__next__和__iter__方法的就是迭代器 # print('__iter__' in dir([].__iter__())) # print('__next__' in dir([].__iter__())) # from collections import Iterable # iterable 可迭代的 # from collections import Iterator # iterator 迭代器 # print(isinstance([],Iterable)) # True 列表是可迭代的 # print(isinstance([],Iterator)) # False 列表不是迭代器 # 迭代器协议和可迭代协议 # 可以被for循环的都是可迭代的 # 可迭代的和迭代器都是什么样子的 # 可迭代的内部都有__iter__方法 # 迭代器一定是可迭代的,可迭代的不一定是迭代器 # 可迭代的.__iter__() 方法就可以得到一个迭代器 # 迭代器中的__next__()方法可以一个一个的获取值 # for 循环其实就是在使用迭代器 # iterator # 可迭代对象 # 直接给你内存地址 # 判断是不是迭代器,其实是为了使用for循环 # 当我们遇到一个新的变量,不确定能不能for循环时,就判断它是否可迭代 # 迭代器的好处: # 从容器类型中一个一个的取值,会把所有的值都取到 # 可以节省内存空间 --> range(1000000000) # 迭代器并不会在内存中再占用一大块内存,而是随着循环,每次生成一个 # 每次next,就给我一个 # range # f = open() # l = [1,2,3,4,5] # iterator = l.__iter__() # while 1: # print(iterator.__next__()) # 生成器 # 生成器函数 --> 本质上就是我们自己写的函数 # 生成器表达式
# 普通函数 # def generator(): # print(123) # return 'a' # ret = generator() # print(ret) #----------------------------------------------------------------------------------------# # 生成器函数 # 只要含有yield关键字的函数都是生成器函数,yield只能在函数里,且yield不能与return同时出现 # def generator(): # print(123) # yield 'a' # # 生成器函数:执行之后会得到一个生成器作为返回值 # ret = generator() # print(ret) # print(ret.__next__()) # def generator(): # print(123) # yield 'a' # print(222) # yield 'b' # print(333) # yield [7,8,9] # ret = generator() # for i in ret: # print(i) # print(ret) # print(ret.__next__()) # print(ret.__next__()) # print(ret.__next__()) def wahaha(): for i in range(2000000): yield '娃哈哈%s'%i g = wahaha() count = 0 for i in g: count += 1 print(i) if count > 50: break print('*',g.__next__()) print('**',g.__next__()) print('***',g.__next__()) print('***',g.__next__())