我可以在Python中重置迭代器/生成器吗?我正在使用DictReader并希望将其重置(从csv模块)到文件的开头.
string.split()返回一个列表实例.是否有返回生成器的版本?是否有任何理由反对拥有发电机版本?
是否存在可以产生无限元素的直接生成器表达式?
这是一个纯粹的理论问题.这里不需要"实用"的答案:)
例如,很容易制作一个有限的发电机:
my_gen = (0 for i in xrange(42))
Run Code Online (Sandbox Code Playgroud)
但是,要创建一个无限的,我需要使用伪造的函数"污染"我的命名空间:
def _my_gen():
while True:
yield 0
my_gen = _my_gen()
Run Code Online (Sandbox Code Playgroud)
在单独的文件中执行操作并在import以后执行操作不计算在内.
我也知道这就是itertools.repeat这个.我很好奇是否有一个没有它的单线解决方案.
我有一些示例Python代码,我需要在C++中模仿它.我不需要任何特定的解决方案(例如基于协同例程的产量解决方案,尽管它们也是可接受的答案),我只需要以某种方式重现语义.
这是一个基本的序列生成器,显然太大而无法存储物化版本.
def pair_sequence():
for i in range(2**32):
for j in range(2**32):
yield (i, j)
Run Code Online (Sandbox Code Playgroud)
目标是维护上面序列的两个实例,并以半锁步方式迭代它们,但是以块为单位.在下面的示例中,first_pass使用对序列来初始化缓冲区,并second_pass重新生成相同的精确序列并再次处理缓冲区.
def run():
seq1 = pair_sequence()
seq2 = pair_sequence()
buffer = [0] * 1000
first_pass(seq1, buffer)
second_pass(seq2, buffer)
... repeat ...
Run Code Online (Sandbox Code Playgroud)
我在C++中找到解决方案的唯一方法就是模仿yieldC++协同程序,但我没有找到关于如何做到这一点的任何好的参考.我也对这个问题的替代(非一般)解决方案感兴趣.我没有足够的内存预算来保存传递之间序列的副本.
最近我写了一个函数来生成具有非平凡约束的某些序列.这个问题伴随着一种自然的递归解决方案.现在碰巧,即使对于相对较小的输入,序列也是几千个,因此我宁愿使用我的算法作为生成器而不是使用它来填充具有所有序列的列表.
这是一个例子.假设我们想用递归函数计算字符串的所有排列.以下天真算法需要额外的参数'storage',并在找到时添加一个置换:
def getPermutations(string, storage, prefix=""):
if len(string) == 1:
storage.append(prefix + string) # <-----
else:
for i in range(len(string)):
getPermutations(string[:i]+string[i+1:], storage, prefix+string[i])
storage = []
getPermutations("abcd", storage)
for permutation in storage: print permutation
Run Code Online (Sandbox Code Playgroud)
(请不要关心效率低下,这只是一个例子.)
现在我想将我的函数转换为生成器,即生成排列而不是将其附加到存储列表:
def getPermutations(string, prefix=""):
if len(string) == 1:
yield prefix + string # <-----
else:
for i in range(len(string)):
getPermutations(string[:i]+string[i+1:], prefix+string[i])
for permutation in getPermutations("abcd"):
print permutation
Run Code Online (Sandbox Code Playgroud)
此代码不能正常工作(该函数的行为像一个空发生器).
我错过了什么吗?有没有办法将上述递归算法转换为生成器而不用迭代算法替换它?
非常基本的问题 - 如何从Python中的生成器获取一个值?
到目前为止,我发现我可以写一个gen.next().我只是想确保这是正确的方法?
当我使用IPython在Python中进行调试时,我有时会遇到一个断点,我想检查一个当前是生成器的变量.我能想到的最简单的方法就是将它转换为一个列表,但我不清楚在一行中这样做的简单方法是什么ipdb,因为我对Python很新.
在python中,可以通过将yield关键字放在函数体中来轻松定义迭代器函数,例如:
def gen():
for i in range(100):
yield i
Run Code Online (Sandbox Code Playgroud)
如何定义不产生值的生成器函数(生成0值),以下代码不起作用,因为python不能知道它应该是生成器而不是正常函数:
def empty():
pass
Run Code Online (Sandbox Code Playgroud)
我可以做点什么
def empty():
if False:
yield None
Run Code Online (Sandbox Code Playgroud)
但那会非常难看.有没有很好的方法来实现一个空的迭代器函数?
在Python中,通过生成器表达式创建生成器对象与使用yield语句之间有什么区别吗?
使用产量:
def Generator(x, y):
for i in xrange(x):
for j in xrange(y):
yield(i, j)
Run Code Online (Sandbox Code Playgroud)
使用生成器表达:
def Generator(x, y):
return ((i, j) for i in xrange(x) for j in xrange(y))
Run Code Online (Sandbox Code Playgroud)
这两个函数都返回生成元组的生成器对象,例如(0,0),(0,1)等.
一个或另一个的任何优点?思考?
谢谢大家!这些答案中有很多很棒的信息和进一步的参考资料!
我阅读了帮助并尝试了以下命令来跳过测试,资产和帮助文件的生成
$ bin/rails generate controller home index --helper false --assets false --controller-specs false --view-specs false
create- app/controllers/home_controller.rb
route get "home/index"
invoke erb
create app/views/home
create app/views/home/index.html.erb
invoke rspec
error false [not found]
error false [not found]
Run Code Online (Sandbox Code Playgroud)
正如您在上面的输出中所注意到的那样,只有controller, routes&views生成了.但最后两行很有意思:
error false [not found]
error false [not found]
Run Code Online (Sandbox Code Playgroud)
显然rails似乎不喜欢--option-name false语法.所以这个错误因为我使用了错误的语法?如果是,那么正确的方法是什么?谢谢