我在Nutshell中研究Alex Marteli的Python,书中暗示任何具有next()方法的对象(或者至少可以用作迭代器).它还表明大多数迭代器是通过对被调用方法的隐式或显式调用构建的iter.
在书中读到这篇文章后,我感受到了尝试它的冲动.我启动了一个python 2.7.3解释器,并做到了这一点:
>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for number in range(0, 10):
... print x.next()
Run Code Online (Sandbox Code Playgroud)
但结果如下:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: 'list' object has no attribute 'next'
Run Code Online (Sandbox Code Playgroud)
在混乱中,我试图研究x对象的结构,dir(x)我注意到它有一个__iter__函数对象.所以我发现它可以用作迭代器,只要它支持那种类型的接口.
所以当我再次尝试时,这一次略有不同,尝试这样做:
>>> _temp_iter = next(x)
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list object …Run Code Online (Sandbox Code Playgroud) 我理解函数如何在for循环中使用range()和zip()可以使用.但是我希望range()输出一个列表 - 就像seq在unix shell中一样.如果我运行以下代码:
a=range(10)
print(a)
Run Code Online (Sandbox Code Playgroud)
输出是range(10),表明它不是列表而是不同类型的对象.zip()打印时有类似的行为,输出类似的东西
<zip object at "hexadecimal number">
Run Code Online (Sandbox Code Playgroud)
所以我的问题是它们是什么,有什么优势使它们成为现实,如何在没有循环的情况下将它们的输出发送到列表?
我写了这个并且期望0:
>>> x = range(20)
>>> next(x)
Run Code Online (Sandbox Code Playgroud)
相反,我得到了:
TypeError:'range'对象不是迭代器
但我以为这是一个发电机?
最初的答案产生了我最初对自己说的同样的事情:它是一个可迭代的,而不是一个交互者.但是,如果两者都是简单的生成器,那么这就无法解释为什么会这样做:
>>> x = (i for i in range(30))
>>> next(x)
0
Run Code Online (Sandbox Code Playgroud) 我有 Matlab 背景,我发现很难在 Python 中理解生成器的概念。
有人可以回答我以下问题吗:
我正在做一个 Hackerrank python 问题,任务是在不使用任何字符串函数的情况下打印123...N(N输入在哪里)。
有人评论了一个解决方案:
print(*range(1, int(input())+1), sep='')
Run Code Online (Sandbox Code Playgroud)
我的问题是: