1. 程式人生 > >迭代器,生成器基礎

迭代器,生成器基礎

  1 # 雙下方法
  2 # print([1].__add__([2]))
  3 # print([1]+[2])
  4 
  5 # 迭代器
  6 # l = [1,2,3]
  7 # 索引
  8 # 迴圈 for
  9 # for i in l:
 10 #     i
 11 #
 12 # for k in dic:
 13 #     pass
 14 
 15 
 16 # list
 17 # dic
 18 # str
 19 # set
 20 # tuple
 21 # f = open()
 22 # range()
 23 # enumerate
 24 print
(dir([])) #告訴我列表擁有的所有方法 25 ret = set(dir([]))&set(dir({}))&set(dir(''))&set(dir(range(10))) 26 print(ret) #iterable 27 print('__iter__' in dir(int)) 28 print('__iter__' in dir(bool)) 29 print('__iter__' in dir(list)) 30 print('__iter__' in dir(dict)) 31 print('__iter__' in dir(set))
32 print('__iter__' in dir(tuple)) 33 print('__iter__' in dir(enumerate([]))) 34 print('__iter__' in dir(range(1))) 35 36 # 只要是能被for迴圈的資料型別 就一定擁有__iter__方法 37 print([].__iter__()) 38 #一個列表執行了__iter__()之後的返回值就是一個迭代器 39 print(dir([])) 40 print(dir([].__iter__())) 41 print(set(dir([].__iter__
())) - set(dir([]))) 42 print([1,'a','bbb'].__iter__().__length_hint__()) #元素個數 43 l = [1,2,3] 44 iterator = l.__iter__() 45 print(iterator.__next__()) 46 print(iterator.__next__()) 47 print(iterator.__next__()) 48 print(iterator.__next__()) 49 50 # Iterable 可迭代的 -- > __iter__ #只要含有__iter__方法的都是可迭代的 51 # [].__iter__() 迭代器 -- > __next__ #通過next就可以從迭代器中一個一個的取值 52 53 # 只要含有__iter__方法的都是可迭代的 —— 可迭代協議 54 55 print('__iter__' in dir( [].__iter__())) 56 print('__next__' in dir( [].__iter__())) 57 from collections import Iterable 58 from collections import Iterator 59 print(isinstance([],Iterator)) #可迭代的 60 print(isinstance([],Iterable)) #迭代器 61 62 class A: 63 # def __iter__(self):pass 64 def __next__(self):pass 65 66 a = A() 67 print(isinstance(a,Iterator)) 68 print(isinstance(a,Iterable)) 69 70 71 l = [1,2,3,4] 72 for i in l.__iter__(): 73 print(i) 74 75 # 迭代器的概念 76 # 迭代器協議 —— 內部含有__next__和__iter__方法的就是迭代器 77 78 # 迭代器協議和可迭代協議 79 # 可以被for迴圈的都是可迭代的 80 # 可迭代的內部都有__iter__方法 81 # 只要是迭代器 一定可迭代 82 # 可迭代的.__iter__()方法就可以得到一個迭代器 83 # 迭代器中的__next__()方法可以一個一個的獲取值 84 85 # for迴圈其實就是在使用迭代器 86 # iterator 87 # 可迭代物件 88 # 直接給你記憶體地址 89 # print([].__iter__()) 90 # print(range(10)) 91 92 #for 93 #只有 是可迭代物件的時候 才能用for 94 #當我們遇到一個新的變數,不確定能不能for迴圈的時候,就判斷它是否可迭代 95 96 for i in l: 97 pass 98 iterator = l.__iter__() 99 iterator.__next__() 100 101 #迭代器的好處: 102 # 從容器型別中一個一個的取值,會把所有的值都取到。 103 # 節省記憶體空間 104 #迭代器並不會在記憶體中再佔用一大塊記憶體, 105 # 而是隨著迴圈 每次生成一個 106 # 每次next每次給我一個 107 # range 108 # f 109 l = [1,2,3,45] 110 iterator = l.__iter__() 111 while True: 112 print(iterator.__next__()) 113 114 print(range(100000000000000)) 115 print(range(3)) 116 print(list(range(3))) 117 def func(): 118 for i in range(2000000): 119 i = 'wahaha%s'%i 120 return i 121 122 # 生成器 —— 迭代器 123 # 生成器函式 —— 本質上就是我們自己寫得函式 124 # 生成器表示式 125 l = [1,2,3,4,5] 126 for i in l: 127 print(i) 128 if i == 2: 129 break 130 131 for i in l: 132 print(i)