[notes]chap14 Iterator Generator-expression 生成器表达式
来源:互联网 发布:农业普查数据 编辑:程序博客网 时间:2024/06/05 00:10
generator-expression生成器表达式
the differences between list comprehension and generator expression
def gen_AB(): print("start") yield 'A' print("continue") yield 'B' print("end.")res1 = [x*3 for x in gen_AB()]
执行结果为:
start
continue
end.
说明列表推导式会析取yield返回的结果,并存储于列表中,其他的便不会存储到列表中。
for i in res1: print("-->",i)
执行结果为:
–> AAA
–> BBB
但是,生成器表达式却不是这样的。
res2 = (x*3 for x in gen_AB())
这时,输入res2,会返回:
<generator object <genexpr> at 0x10063c20>
for i in res2: print("-->", i)
执行结果为:
start
–> AAA
continue
–> BBB
end.
**only when the for loop iterates over res2, the body of gen_AB actually executes.
Each iteration of the for loop implicitly calls the next(res2), advancing gen_AB to the next yield.
Note the output of gen_AB with the output of the print in the for loop**
import reimport reprlibRE_WORD = re.compile("\w+")class Sentence(object): def __init__(self, text): self.text = text def __repr__(self): return "Sentence({})".format(reprlib.repr(self.text)) def __iter__(self): return (match.group() for match in RE_WORD.finditer(self.text))
when to use generator expression?
if the generator expression spans more than a couple of lines, I prefer to code a generator function for the sake of readability.
Also, because generator function have a name, they can be reused.
You can always name a generator expression and use it later by assigning it to a variable, of course, but that is stretching its intended usage as a one-off generator.
Syntax Tip
when a generator expression is passed as the single argument to a function or constructor, you don’t need to
write a set of parentheses for the function call and another to enclose the generator expression.
def __mul__(self, scalar): if isinstance(scalar, numbers.Real): return Vector(n*scalar for n in self)# the parentheses is omitted else: return NotImplemented
look at the generator expression power!
def gen_Arithmetic(start, step, end=None): start = type(start+step)(start) index = 0 result = start foever = end is None while foever or result < end: yield result index += 1 result = start + index*step
there is a standard library that can be used.
import itertoolsgen = itertools.count(1, 0.5)
next(gen)
1
next(gen)
1.5
however, itertools.count never stops.
tertools.takewhile function : it produces a generator that consumer another generator and stop when a given
predicate evaluates to False.
gen = itertools.takewhile(lambda n:n<3, itertools.count(1,0.5))
list(gen)
[1,1.5,2.0,2.5]
def gen_Arithmetic(start, step, end=None): start = type(start + step)(start) gen = itertools.count(start,step) if end is None: return gen return itertools.takewhile(lambda v:v<end, gen)
Note that gen_Arithmetic function is not a generator function;
it has no yield in its body.
But it returns a generator, so it operates as a generator factory, just as a generator function does.
- [notes]chap14 Iterator Generator-expression 生成器表达式
- 生成器表达式(Generator expression)和列表表达式
- python iterable与iterator,generator,generator expression
- 【Python】迭代器(iterator) vs 生成器(generator)
- ES6中的迭代器(Iterator)和生成器(Generator)
- Python生成器详解(从Iterable,Iterator知Generator,Yield)
- Python学习笔记(10)-生成器generator和迭代器Iterator
- 我所理解的生成器(关键词:生成器对象/生成器/生成器表达式/生成器函数/生成器类/generator/yield/__iter__)
- 生成器 generator
- 生成器generator
- 生成器generator
- 生成器generator
- 说说Python中的iterator,yield表达式及generator,coroutine
- python的迭代器iterator和生成器generator(关键字yield)的简单理解
- Python笔记-列表生成式、生成器generator(包括斐波拉契数列)、迭代器Iterator
- Python中iteration(迭代)、iterator(迭代器)、generator(生成器)等相关概念的理解
- Python中iteration(迭代)、iterator(迭代器)、generator(生成器)等相关概念的理解
- my regular expression notes
- view,SurfaceView,GLSurfaceView的关系和区别
- 复习最小生成树问题
- Android清除本地数据缓存代码
- linux
- java : 包装类 缓冲机制的使用
- [notes]chap14 Iterator Generator-expression 生成器表达式
- 博弈论小结
- Netty中的ByteBuf原理分析
- [DP 容斥原理] BZOJ3622 已经没有什么好害怕的了 && BZOJ 2024 [SHOI2009] 舞会
- 项目1:个人所得税计算器
- uvalive3667 ruler
- linux搭建jenkins
- Linux下创建Oracle的OEM
- 第3周项目3(1) 输出星号图