Python "Iterator builder list Derivation"
One, iterator
1. iterators
How to take a value from a list or dictionary
Index, key
For loop
All the values that can be used for a loop are iterated
Iterative protocols: Internally containing __iter__ methods are iterative
Iterator protocol: Internally containing the __iter__ method and the __next__ method are iterators
Print (dir ([+])) Lst_iter = [1,2,3].__iter__ () Print (lst_iter.__next__ ()) print (lst_iter.__next__ ()) Print (Lst_ ITER.__NEXT__ ()) for i in []: # [1,2,3].__iter__ () print (i) L = [1,2,3]lst_iter = iter (l) # l.__ ITER__ () while True: try: print (Next (lst_iter)) # lst_iter.__next__ () except stopiteration: break
2. What is an iterative
What is an iterator = = = "iterator = iter (iterative), with a __next__ method
Maximize the benefits of iteration to save memory
From collections Import Iterable,iteratorprint (range (100000000)) print (Isinstance (range (100000000), iterable)) # Determines whether the current is an iterative print (Isinstance (range 100000000), Iterator) #是不是一个迭代器py2 range #不管range多少 generates a list that will be used to store all the values Py3 Range #不管range多少 does not actually generate any one value
3, the advantages of iterators
A, save memory
b, take a value can carry on the next calculation, and do not have to wait until all the values are calculated to start the next operation--fast
4, the characteristics of iterators: lazy operation
Second, generator Generator
The iterator you write is a generator
Two mechanisms for writing your own generator (iterator): Generator function Builder expression
1. Generator function---A function with yield is a generator function
def func (): print (' * * * *) yield 1 print (' ^^ ^^ ') yield 2 # Record the current position, wait for next next to trigger the function's state G = func () Print ('---', Next (g)) print ('--', Next (g)) # The Call of the generator function does not trigger the execution of the code, but instead returns a generator (iterator) # want the generator function to execute with nextdef cloth_g (num): For i in range (num): yield ' cloth%s '%ig = Cloth_g (() print (Next (g)) print (Next (g)) print (next)
2. Example of using generator to listen for file input
Import Timedef Listen_file (): With open (' userinfo ') as F: When True: line = F.readline () #readline does not automatically stop the C10/>if Line.strip (): yield Line.strip () Time.sleep (0.1) G = Listen_file () for line in G: print (line)
3. Send keyword
def func (): print (11111) Ret1 = yield 1 print (22222, ' Ret1: ') Ret2 = yield 2 print (33333, ' Ret2: ', RET2) Yield 3g = func () ret = next (g) print (ret) print (G.send (' Alex ')) # Pass a parameter to the internal print of the generator function during next execution (g.send (' King boss ') # to pass a value in a generator there is an activation process that must be triggered with next for the first time.
Build instance: Calculate moving Average
#月度 Day Average income def average (): Sum_money = 0 Days = 0 avg = 0 while True: money = yield avg Sum_money + = Money Day + = 1 avg = SUM_MONEY/DAYG = average () Next (g) print (g.send) print (g.send) print (G.send ( 600))
5. Pre-excitation generator
Def init (func): def Inner (*args,**kwargs): ret = func (*args,**kwargs) next (ret) # Pre-activate return ret return Inner@initdef average (): Sum_money = 0 Day = 0 avg = 0 and True: money = yield avg
sum_money + = Money Day + = 1 avg = SUM_MONEY/DAYG = average () print (G.send ()) print (g.send) print ( G.send (600))
6. Yield from
Def generator_func (): yield from range (5) yield from ' hello ' to I in range (5): yield I for J in ' Hello ': yield JG = Generator_func () for I in Generator_func (): print (i) G1 = Generator_func () g2 = Generator_fun C () Next (Generator_func ()) Next (Generator_func ())
6. How to take a value from the generator
The first: Next can stop at any time for the last error
Print (Next (g))
Print (Next (g))
Second: The For loop is traversed from beginning to end without encountering a break, and return does not stop
For I in G:
Print (i)
Third: A strong transfer of the list tuple data type to load all the data into memory. Very wasted memory
Print (g)
Print (List (g))
7. Summary:
Generator functions are a means for our Python programmers to implement iterators
The main feature is that the yield is included in the function
Calling a generator function does not execute the code in this function just to get a generator (iterator)
The code inside the function is executed only when the value is taken from the generator, and each fetch of data is executed to get that data.
The way to get data includes the following: Forced conversions for next send loop data types
A convenient way to yield the return value, if it is an iterative iteration of the loop, and to return each element in the iterated data can be used yield from
When using send, pre-excitation is required after the generator is created, which can be done using adorners
Generator features: Save memory lazy operations
Generators are used to solve the decoupling between memory problems and program functions
8. List Deduction formula
New_lst = []for i in range ]: new_lst.append (i**2) print (new_lst) print ([i**2-I in range]) L = [1,2,3,-5,6,20, -7]print ([i%2 for I in range]) L = [1,2,3,-5,6,20,-7]print ([Num for num in L if num%2 = = 1]) #30以内所有能被3整除的数print ([I for I in range (if i%3 ==0]) #30以内所有能被3整除的数的平方print ([i**2-I in range] if i%3 ==0]) #找到嵌套列表中名字含有两个 all names of ' e ' names = [[' To M ', ' Billy ', ' Jefferson ', ' Andrew ', ' Wesley ', ' Steven ', ' Joe ', [' Alice ', ' Jill ', ' Ana ', ' Wendy ', ' Jennifer ', ' Sherry ', ' Eva ']]print ([name for name_lst in names for name in Name_lst if Name.count (' e ') = = 2])
9. Generator expression
L = [I for I in range] if i%3 ==0] # list down sort when g = (I for I in range () if i%3 ==0) # Generator expression using generator expression when large amount of data Type print (l) print (g) for I in G:print (i)
10. Interview questions
Def demo (): For I in range (4): yield Ig=demo () g1= (i-I in G) g2= (I-I in G1) print (list (G1)) (list (G2)) def Add (n,i): return N+idef test (): For I in range (4): yield ig=test () for n in [1,3,10]: g= (Add (n,i) for I in g) Print (List (g)) #一个生成器 can only be taken once # The generator never executes when it does not find its value # when he executes, the value of all variables at the time of execution will prevail.
Python "Iterator builder list Derivation"