我可以在Python中重置迭代器/生成器吗?我正在使用DictReader并希望将其重置(从csv模块)到文件的开头.
我无法弄清楚如何在Python生成器中展望一个元素.一看,它就消失了.
这就是我的意思:
gen = iter([1,2,3])
next_value = gen.next() # okay, I looked forward and see that next_value = 1
# but now:
list(gen) # is [2, 3] -- the first value is gone!
Run Code Online (Sandbox Code Playgroud)
这是一个更实际的例子:
gen = element_generator()
if gen.next_value() == 'STOP':
quit_application()
else:
process(gen.next())
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我写一个发电机,你可以看一个元素前进吗?
考虑这种情况:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
walk = os.walk('/home')
for root, dirs, files in walk:
for pathname in dirs+files:
print os.path.join(root, pathname)
for root, dirs, files in walk:
for pathname in dirs+files:
print os.path.join(root, pathname)
我知道这个例子有点多余,但您应该考虑我们需要walk多次使用相同的数据.我有一个基准测试场景,必须使用相同的walk数据才能获得有用的结果.
我试图walk2 = walk在第二次迭代中克隆并使用,但它没有用.问题是......我怎么能复制它?它有可能吗?
先感谢您.
老实说,我在这里有点困惑,为什么我不能在相同的数据上迭代两次?
def _view(self,dbName):
db = self.dictDatabases[dbName]
data = db[3]
for row in data:
print("doing this one time")
for row in data:
print("doing this two times")
Run Code Online (Sandbox Code Playgroud)
这将打印出"一次这样做"几次(因为数据有几行),但它根本不会打印出"这样做两次"......
我第一次迭代数据工作正常,但第二次当我运行最后一个列表"for data in data"时,这没有返回...所以执行它一次工作但不是两次......?
仅供参考 - 数据是一个csv.reader对象(如果是这样的原因)......
假设我有以下函数:
def print_twice(x):
for i in x: print(i)
for i in x: print(i)
Run Code Online (Sandbox Code Playgroud)
当我跑步时:
print_twice([1,2,3])
Run Code Online (Sandbox Code Playgroud)
或者:
print_twice((1,2,3))
Run Code Online (Sandbox Code Playgroud)
我得到了预期的结果:数字 1,2,3 被打印两次。
但是当我跑步时:
print_twice(zip([1,2,3],[4,5,6]))
Run Code Online (Sandbox Code Playgroud)
(1,4),(2,5),(3,6) 对仅打印一次。可能这是因为zip返回一个在一次传递后终止的生成器。
如何修改该函数print_twice以使其正确处理所有输入?
我可以在函数的开头插入一行:x = list(x)。但如果 x 已经是列表、元组、范围或任何其他可以迭代多次的迭代器,这可能会效率低下。有更有效的解决方案吗?
我正在尝试做这样的事情:
import asyncio
from itertools import islice
async def generate_numbers(n):
for x in range(n):
yield x
async def consume_numbers(n):
async for x in generate_numbers(n):
print(x)
async def consume_some_numbers(n,m):
async for x in islice(generate_numbers(n),m): #<-- This doesn't work. islice doesn't recognize async iterators as iterators.
print(x)
loop = asyncio.get_event_loop()
loop.run_until_complete(consume_numbers(10))
loop.run_until_complete(consume_some_numbers(10,5))
Run Code Online (Sandbox Code Playgroud)
有没有办法让这个工作,或者至少获得类似的功能?
我正在练习发电机,我想知道为什么以下代码不打印16对但只有4对.
def range_generator_function(my_range):
for i in my_range:
yield i
gen1=range_generator_function(range(1,5))
gen2=range_generator_function(range(1,5))
def pairs_generator_function(gen1,gen2):
for it1 in gen1:
for it2 in gen2:
yield [it1,it2]
my_gen = pairs_generator_function(gen1,gen2)
for it in my_gen:
print(it)
Run Code Online (Sandbox Code Playgroud)
输出是
[1, 1]
[1, 2]
[1, 3]
[1, 4]
Run Code Online (Sandbox Code Playgroud)
虽然我期望的输出是
[1, 1]
[1, 2]
[1, 3]
[1, 4]
[2, 1]
[2, 2]
[2, 3]
[2, 4]
[3, 1]
[3, 2]
[3, 3]
[3, 4]
[4, 1]
[4, 2]
[4, 3]
[4, 4]
Run Code Online (Sandbox Code Playgroud) 我是python的新手,我正在学习lambda和map,但是当我尝试一些东西时,我发现一个循环没有执行,我想知道原因.
我知道这样做是没用的,但是当我迭代同一个列表两次时,第二次没有被执行.
salarios = map(lambda emp: emp.salario, empleados)
print("------SALARIO-------")
for salario in salarios:
print(salario)
print("-----SALARIO2--------")
for salario in salarios:
print(salario)
Run Code Online (Sandbox Code Playgroud)
我明白了
------SALARIO------- 6700 7500 2100 2150 1800 -----SALARIO2--------
我希望得到
------SALARIO------- 6700 7500 2100 2150 1800 -----SALARIO2-------- 6700 7500 2100 2150 1800
它为什么会发生?这是一些lenguaje优化?
对于像 的列表['A', 'B', 'C'],我试图构建或找到一个函数,该函数将在每次调用时返回列表的下一个元素。在这种情况下,如果它被调用超过 3 次,A则将被返回。在那之后B等等。
我有一个['A', 'B', 'C']要应用于不同对象的颜色列表。每次运行代码时,对象的数量可能会有所不同。如果列表中的对象多于颜色,我希望第四个对象具有 color 'A'。所以,正如标题所说,我想遍历一个列表 by 和 index 并从头开始 if index > len(list)。以下自定义函数looper将做到这一点。
def looper(lst, runs):
j = 0
for i in range(0, (len(lst)+(runs-(len(lst))))):
if i < len(lst):
print(lst[i])
else:
print(lst[j])
j +=1
Run Code Online (Sandbox Code Playgroud)
# input:
runs = 2
looper(['A', 'B', 'C'], runs)
# output:
A
B
Run Code Online (Sandbox Code Playgroud)
#input :
runs = 5
looper(['A', 'B', 'C'], runs)
#output …Run Code Online (Sandbox Code Playgroud) 发电机一旦使用过一次,就无法再次使用。为什么是这样?
考虑以下代码:
def generator(n):
a = 1
for _ in range(n):
yield a
a += 1
def run_generator(generator):
for a in generator:
print(a, end = " ")
Run Code Online (Sandbox Code Playgroud)
如果我要执行这个:
count_generator = generator(10)
run_generator(count_generator)
run_generator(count_generator)
Run Code Online (Sandbox Code Playgroud)
它只会打印:
1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)
基本上,生成器在执行一次后就会死亡。
我知道生成器只能使用一次这一事实是 Python 内置的东西,但为什么会这样呢?是否有特定原因只允许生成器对象执行一次?
python ×9
generator ×5
iterator ×2
arrays ×1
clone ×1
for-loop ×1
object ×1
peek ×1
python-3.6 ×1
python-3.x ×1