我想知道当我将生成器函数的结果传递给python的enumerate()时会发生什么.例:
def veryBigHello():
i = 0
while i < 10000000:
i += 1
yield "hello"
numbered = enumerate(veryBigHello())
for i, word in numbered:
print i, word
Run Code Online (Sandbox Code Playgroud)
枚举是否是懒惰地迭代,还是将所有内容都插入第一个?我99.999%肯定它很懒,所以我可以把它当作生成器功能完全相同,还是我需要注意什么?
在Python中,该enumerate函数允许您迭代一系列(索引,值)对.例如:
>>> numbers = ["zero", "one", "two"]
>>> for i, s in enumerate(numbers):
... print i, s
...
0 zero
1 one
2 two
Run Code Online (Sandbox Code Playgroud)
有没有办法在Java中这样做?
可能重复:
为什么Java的迭代器不是Iterable?
据我所知,foreach循环是Java 5中添加的语法糖.所以
Iterable<O> iterable;
for(O o : iterable) {
// Do something
}
Run Code Online (Sandbox Code Playgroud)
将基本上产生相同的字节码
Iterable<O> iterable;
for(Iterator<O> iter = iterable.iterator(); iter.hasNext(); /* NOOP */) {
O o = iter.next();
// Do something
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我首先没有迭代,但只有一个迭代器(比如,因为一个类提供了两个不同的迭代器),我不能使用语法sugar foreach循环.显然我仍然可以做普通的旧式迭代.但是,我其实想做:
Iterator<O> iter;
for(O o : iter /* Iterator<O>, not Iterable<O>! */) {
// Do something
}
Run Code Online (Sandbox Code Playgroud)
当然我可以做假的Iterable:
class Adapter<O> implements Iterable<O> {
Iterator<O> iter;
public Adapter(Iterator<O> iter) {
this.iter = iter;
}
@Override
public Iterator<O> iterator() {
return iter; …Run Code Online (Sandbox Code Playgroud) 也许我已经成为网络上错误信息的牺牲品,但我认为这更可能只是因为我误解了某些东西.根据我到目前为止所学到的,range()是一个生成器,生成器可以用作迭代器.但是,这段代码:
myrange = range(10)
print(next(myrange))
Run Code Online (Sandbox Code Playgroud)
给我这个错误:
TypeError: 'range' object is not an iterator
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?我期待这个打印0,并进入下一个值myrange.我是Python的新手,所以请接受我对这个相当基本的问题的道歉,但我无法在其他任何地方找到一个好的解释.
有很多使用python读取csv数据的例子,如下所示:
import csv
with open('some.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
Run Code Online (Sandbox Code Playgroud)
我只想读取一行数据并将其输入各种变量.我怎么做?我到处寻找一个有效的例子.
我的代码只检索i的值,而不检索其他值
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
i = int(row[0])
a1 = int(row[1])
b1 = int(row[2])
c1 = int(row[2])
x1 = int(row[2])
y1 = int(row[2])
z1 = int(row[2])
Run Code Online (Sandbox Code Playgroud) 我意识到我正在写很多类似于这个的代码:
<% unless @messages.blank? %>
<% @messages.each do |message| %>
<%# code or partial to display the message %>
<% end %>
<% else %>
You have no messages.
<% end %>
Run Code Online (Sandbox Code Playgroud)
Ruby和/或Rails中是否有任何构造可以让我跳过第一个条件?所以当迭代器/循环不会进入一次时会执行?例如:
<% @messages.each do |message| %>
<%# code or partial to display the message %>
<% and_if_it_was_blank %>
You have no messages.
<% end %>
Run Code Online (Sandbox Code Playgroud) 我不知道是否有一个原因,有没有first(iterable)在Python内置的功能,有点类似于any(iterable)和all(iterable)(可能一STDLIB模块中夹着地方,但我没有看到它itertools).first将执行短路发生器评估,以便可以避免不必要的(和可能无限数量的)操作; 即
def identity(item):
return item
def first(iterable, predicate=identity):
for item in iterable:
if predicate(item):
return item
raise ValueError('No satisfactory value found')
Run Code Online (Sandbox Code Playgroud)
这样你可以表达如下内容:
denominators = (2, 3, 4, 5)
lcd = first(i for i in itertools.count(1)
if all(i % denominators == 0 for denominator in denominators))
Run Code Online (Sandbox Code Playgroud)
很明显,list(generator)[0]在这种情况下你不能这样做,因为发生器不会终止.
或者,如果你有一堆正则表达式匹配(当它们都具有相同的groupdict接口时很有用):
match = first(regex.match(big_text) for regex in regexes)
Run Code Online (Sandbox Code Playgroud)
通过避免list(generator)[0]和短路匹配来节省大量不必要的处理.
我有这个代码:
int main()
{
vector<int> res;
res.push_back(1);
vector<int>::iterator it = res.begin();
for( ; it != res.end(); it++)
{
it = res.erase(it);
//if(it == res.end())
// return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
"一个随机访问迭代器,指向函数调用擦除的最后一个元素之后的元素的新位置,如果操作擦除了序列中的最后一个元素,则为向量结束."
此代码崩溃,但如果我使用if(it == res.end())然后返回它的工作原理.怎么会?for循环是否兑现了res.end(),因此不相等的运算符失败了?
如果我有一个迭代到载体a,然后我布展构建体或移动指派矢量b从a,是否仍迭代器指向同一元件(现在矢量b)?这就是我在代码中的意思:
#include <vector>
#include <iostream>
int main(int argc, char *argv[])
{
std::vector<int>::iterator a_iter;
std::vector<int> b;
{
std::vector<int> a{1, 2, 3, 4, 5};
a_iter = a.begin() + 2;
b = std::move(a);
}
std::cout << *a_iter << std::endl; // Is a_iter valid here?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是否a_iter仍然有效的,因为a已移入b,或者是通过招无效的迭代器?作为参考,std::vector::swap 不会使迭代器无效.
我有一个非常漫长而复杂的json对象,但我只想获得第一级的项目/键!
例:
{
"1": "a",
"3": "b",
"8": {
"12": "c",
"25": "d"
}
}
Run Code Online (Sandbox Code Playgroud)
我希望得到1,3,8!
我找到了这段代码:
for key, value in data.iteritems():
print key, value
Run Code Online (Sandbox Code Playgroud)
但它打印所有键(也是12和25)