Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:调用方法返回<;[指针处的[对象]>;而不是对象_Python_Import_Module_Python 2.x - Fatal编程技术网

Python:调用方法返回<;[指针处的[对象]>;而不是对象

Python:调用方法返回<;[指针处的[对象]>;而不是对象,python,import,module,python-2.x,Python,Import,Module,Python 2.x,我是一个非常新手的程序员。我正在尝试使用itertools模块中的compositions工具。所以我试着: from itertools import * print combinations('12345', 3) 但是我得到的不是预期的('123','124','125',[…])而是。我非常困惑,因为在其他模块中调用方法会返回预期结果,例如: import random print random.randrange(10) >>> 9 itertools模块有什么问

我是一个非常新手的程序员。我正在尝试使用
itertools
模块中的
compositions
工具。所以我试着:

from itertools import *
print combinations('12345', 3)
但是我得到的不是预期的
('123','124','125',[…])
而是
。我非常困惑,因为在其他模块中调用方法会返回预期结果,例如:

import random
print random.randrange(10)
>>> 9

itertools模块有什么问题吗?

itertools.combines
返回一个iterable(您可以在Python文档中看到在给定的示例中使用
yield
关键字)。如果要打印完整序列,可以使用
列表(组合(…)

>>> print list(combinations('12345', 3))
[('1', '2', '3'), ('1', '2', '4'), ('1', '2', '5'), ('1', '3', '4'), ('1', '3', '5' ('2', '3', '5'), ('2', '4', '5'), ('3', '4', '5')]

itertools.composition
是一个类;因此,调用
itertools.combinations()
将返回该类实例的一个实例,可以对该实例进行迭代以获取值:

for combo in combinations('12345', 3):
    print combo

没什么。结果应该是这样的。您显然没有考虑的是,结果是一个迭代器,而不是一个经过充分计算的结果列表/元组。您看到的输出是该对象的
repr()
(它不是返回字符串)。通过将其传递给
列表
构造函数,可以将前者转换为后者:

import itertools
print list(itertools.combinations('12345', 3))

但是,当您不需要这些数据时,只需对这些值进行迭代,就可以通过不同时存储所有结果来节省大量内存。它还允许通过不使用整个迭代器来避免工作(例如,找到满足某些条件的第一个组合,然后返回)。

这是一个迭代器。您可以使用
列表(组合('12345',3))
元组(组合('12345',3))
将其转换为
列表
元组

通过你的问题,我想你可能对什么是序列、iterables和迭代器有些困惑。我认为完全理解它们对于能够编写和/或理解python代码是非常有用的,因此我将尝试对这一问题进行解释

列表
元组
对象是序列。序列是支持某些特定操作的对象。也就是说,它们是可编辑的(您可以对序列中的元素执行
),它们支持“项目访问”(
sequence[key]
有效),它们有一个“长度”(
len(sequence)
有效),您可以检查项目是否在序列中(
elem-in-sequence
有效)。 [sequence protocol(序列协议)由一系列操作组成。唉,这是针对C-API的。尽管如此,这些函数的名称和解释应该让您了解它们支持的一整套操作]

在python中,还有两种在某些情况下可以用来代替序列的对象:iterables和迭代器

iterable是支持迭代的对象。说到python,如果一个对象有一个返回迭代器的
\uuuuuuuuuuuuuuuu
方法,那么它是可迭代的

迭代器是一个对象,它在一个iterable上迭代一次,并逐个生成值。在python中,迭代器是一个实现
\uuuuu iter\uuuuuuu
\uuuuuuuuuuuuu
方法的对象(python2中的
next
)<代码>\uuuu iter\uuuu
通常“什么都不做”,只返回对象本身。
next
方法返回iterable中的下一个值

现在,
combinations('12345',3)
是一个iterable,这意味着您可以在它上面循环,但是您不能使用
iterable[key]
语法访问它的项,也不能使用
len
获取它的长度

为什么要使用迭代器?在某些情况下,可以避免将整个值序列放入内存中进行迭代。例如,如果要在编号
1
100
之间循环,则不必创建一个长度
100
列表,并在其上迭代。给出一个可以计算下一次添加
1
的值

因此,基本上,iterables是一种减少内存使用的方法,一般来说,它是对“循环某个东西”所需功能的抽象。如果您想要一个序列,您可以按照前面的说明转换它们

一种特殊的迭代器是所谓的生成器。生成器只是可以使用函数语法编写的迭代器,特别是它们使用
yield
关键字:

>>> def numbers(n):
...     while n > 0:
...             yield n
...             n -= 1
... 
>>> numbers(5)
<generator object numbers at 0xb744a93c>
>>> for elem in numbers(5):
...     print elem
... 
5
4
3
2
1

你可能有兴趣阅读他们在其中提出的建议。实际上,它们已经被扩展以提供协同程序功能,但我认为这就足够了。

从技术上讲,它不是生成器,只是一个iterable(手写类)。但是,是的,它也可以作为生成器来实现。[凤凰社]谢谢,我在问了这个问题几分钟后就自己解决了这个问题。我没有意识到,
组合
返回的是一个迭代器,而不是实际的列表。我还发现在迭代器上调用
list()
将返回一个实际的列表。谢谢谢谢然而,我对面向对象编程知之甚少,所以我仍然不清楚类实例的行为。
>>> def flow():
...     yield 'Execution stopped here'
...     yield 'Execution continues'
...     yield 'Execution ended'
... 
>>> generator = flow()
>>> next(generator)   #same as generator.__next__()
'Execution stopped here'
>>> next(generator)
'Execution continues'
>>> next(generator)
'Execution ended'
>>> next(generator)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration