рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк, рд▓реЗрдХрд┐рди рдХреЙрд░рдЯрд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЬрдЧрд░ рдХреА рдХрдо рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред
рдЕрдЬрдЧрд░ рдореЗрдВ рдХреЛрд░рд╛рдЯрд╛рдЗрди рдЬрдирд░реЗрдЯрд░ (рд╡реЗ, рд╡реЗ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣реИрдВ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдЕрд░реНрде рдореЗрдВ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдлрд┐рд░ рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрд░рдЯрд╛рдЗрди рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВред
рдЬрдирд░реЗрдЯрд░
рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╕рднреНрдп рдкрд╛рдпрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рдЕрджреНрднреБрдд рдЪреАрдЬ рд╣реИред рдЙрдирдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЙрд▓ рдХреЗ рдмреАрдЪ рд░рд╛рдЬреНрдп рдХрд╛ рд╕рдВрд░рдХреНрд╖рдг рд╣реИред
рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдЖрдЗрдП рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ:
def read_file_line_by_line(file_name): with open(file_name, 'r') as f: while True: line = f.readline() if not line: break yield line
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдмрд┐рдирд╛ рд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЗрди рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рдЖрд▓рд╕реА рдкрдврд╝рдирд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ "рдХрд╛рдо" рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
In [78]: lines_generator = read_file_line_by_line("data.csv") In [79]: type(lines_generator) Out[79]: generator In [83]: lines_generator.next() Out[83]: 'time,host,event\n' In [84]: lines_generator.next() Out[84]: '1374039728,localhost,reboot\n' In [85]: lines_generator.next() Out[85]: '1374039730,localhost,start\n' In [86]: lines_generator.next() --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-86-65df1a2cb71b> in <module>() ----> 1 lines_generator.next() StopIteration:
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣рдо рдЬрдирд░реЗрдЯрд░ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реВрдк рдореЗрдВ рдкрдврд╝рддреЗ рд╣реИрдВ, рдФрд░ рд▓рд╛рдЗрди рд╕реЗ рд▓рд╛рдЗрди рдирд╣реАрдВред
рдЗрд╕ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ, рд╣рдо рд╕рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
uniq = [] for line in lines_generator: if line not in uniq: uniq.append(line)
рдЬрдирд░реЗрдЯрд░ рдХреА рдПрдХ рдЫреЛрдЯреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рднреА рд╕рдВрднрд╡ рд╣реИ:
In [92]: gen = (x for x in xrange(0, 100*10000)) In [93]: gen.next() Out[93]: 0 In [94]: gen.next() Out[94]: 1 In [95]: gen.next() Out[95]: 2 In [96]: gen.next() Out[96]: 3 In [97]: gen.next() Out[97]: 4
рд╕реВрдЪреА рдХреЗ рднрд╛рд╡ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрдореЛрд░реА рдореЗрдВ рдкреВрд░реА
range(0, 100*10000)
рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд░ рдмрд╛рд░ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдкрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ "рдЧрдгрдирд╛" рдХреА рдЬрд╛рддреА рд╣реИред
рдЬрдирд░реЗрдЯрд░ рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрд░рд╛рдЯрд╛рдЗрди
рдФрд░ рдЕрдм рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпреЛрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рди рдХреЗрд╡рд▓ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрдирдкреБрдЯ рдкрд░ рднреА рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЖрдк рдпрд╣рд╛рдБ
PEP 342 рдХреЗ рдорд╛рдирдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред рд╣рдо рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рджреЛ рддрд░реНрдХ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрддрд┐рд╣рд╛рд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
def calc(): history = [] while True: x, y = (yield) if x == 'h': print history continue result = x + y print result history.append(result) c = calc() print type(c)
рдпрд╛рдиреА рд╣рдордиреЗ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рдпрд╛, рдЗрд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдЦрд┐рд▓рд╛рдпрд╛ред
рдмрджрд▓реЗ рдореЗрдВ, рд╡рд╣ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░
рдХреЙрд▓ рдХреЗ рдмреАрдЪ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдмрдВрдж рдирд╣реАрдВ рдХрд░рддреЗ ред рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рдмрд╛рдж, рдЬреЗрдирд░реЗрдЯрд░
рдХрдВрдЯреНрд░реЛрд▓ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдХрд╣рд╛рдВ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рдпрд╣ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЬрдирд░реЗрдЯрд░ рдХреА рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдкрддреНрддрд┐ рд╣реИред
рддреЛ, рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓рдЧрддрд╛ рд╣реИред
рдЕрдм рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд╣рд░ рдмрд╛рд░ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЦреБрдж рдХреЛ рдмрдЪрд╛рдПрдВред
рд╣рдо рдПрдХ рдбреИрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░реЗрдВрдЧреЗред
def coroutine(f): def wrap(*args,**kwargs): gen = f(*args,**kwargs) gen.send(None) return gen return wrap @coroutine def calc(): history = [] while True: x, y = (yield) if x == 'h': print history continue result = x + y print result history.append(result)
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдкрдиреЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ (рдФрд░ рдЙрдкрдпреЛрдЧреА) рдХреЛрд░рд╛рдЙрдЯреАрди рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВред
рдирд┐рд╖реНрдХрд░реНрд╖ред
рдпрджреНрдпрдкрд┐ рдЗрд╕ рдЯреВрд▓ рд╕реЗ рд╣рд▓ рдХреА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ (рдЬреИрд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ) рдХреЛ рдХрд╡рд░ рдХрд░рддреА рд╣реИрдВ, рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рдУрдУрдкреА рдЯреВрд▓ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХреЛрд░рдЯрд╛рдЗрди рдЖрдкрдХреЗ рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрд╛рдлреА рджреГрд╢реНрдп рд╣реИрдВ, рдФрд░ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛ рдПрдХ рд╕рд╕реНрддрд╛ рдСрдкрд░реЗрд╢рди рд╣реИред
рдФрд░ рд╡реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╢реИрдХреНрд╖рдгрд┐рдХ рд╣рд┐рдд рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╣реИред
рдпреБрдкреАрдбреА:xrange
рдкрд░
range
рдЬрдирд░реЗрдЯрд░ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рд╣реА рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЕрдЬрдЧрд░
range()
рдПрдХ рд╕рд╛рде рдкреВрд░реА рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИ, рдЬрдирд░реЗрдЯрд░ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ
xrange()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, 3 рдЬреА рд╕рдВрд╕реНрдХрд░рдг
range
==
xrange
(рдпрд╛рдиреА рдЬрдирд░реЗрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ)ред