为什么int对象在str进入python时不可迭代

时间:2013-12-03 10:59:40

标签: python

据我所知,我们不能迭代int值,而我们可以在python中迭代字符串 我想知道它为什么的确切原因。 ?

#Example
>>> p = 12
>>> for i in p:
...     print i
... 
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'int' object is not iterable
>>> p = "abctest"
>>> for i in p:
...     print i
... 
a
b
c
t
e
s
t
>>> 

编辑: 我需要确切的理由。请不要说你可以使用range,loop。

7 个答案:

答案 0 :(得分:2)

字符串是一个字符列表。 int不可迭代。

您是否考虑打印0到11之间的数字

for i in range(12):
    print(i)

或打印数字

for digit in str(12):
    print(digit)

此外,

>>> list('hello')
['h', 'e', 'l', 'l', 'o']
>>> list(12)
TypeError: 'int' object is not iterable

答案 1 :(得分:1)

Strings只是字符列表。 Int只是整数值。我无法想象如何迭代整数值。

如果你想迭代例如从0到n你可以做

n = 10
for i in range(n):
    print i

答案 2 :(得分:1)

对于从range(p)0的整数,您应该使用p,现在这是可迭代的,因为这是一系列数字,而不是数字。

你的意思是:

p = 12
for i in range(p):
    print(i)

如果你真的想要迭代一个数字,你可以使用它:

iterable = '{0:064b}'.format

所以你可以这样做:

p = 12
for i in iterable(p):
    print(i)

PD:无法迭代整数的正确原因是因为它 可迭代。如果您有兴趣找到哪种东西 iterable 以及为什么那么您应该检查问题:“In Python, how do I determine if an object is iterable?”。尝试运行dir("16")dir(16)

答案 3 :(得分:1)

1)在pythopn中,所有字符串都是Unicode字符序列。没有用UTF-8编码的Python字符串,或编码为CP-1252的Python字符串 2)str是字符序列,所以我们可以迭代,而int是一个唯一的数字,我们不能把它作为对象。

答案 4 :(得分:1)

最后我找到了正确的答案。

原因:

具有__iter__的对象,它们是可迭代的 我们可以看到

>>> dir(16)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
>>> 

没有__iter__因此int不可迭代 我们可以检查其他类型。

hasattr(["a"], '__iter__')
True
hasattr(("a",), '__iter__')
True
hasattr(u"12", '__iter__')
False

对于字符串没有 _ iter _ 所以我们怎么能说string是Iterable ??? 说明:
字符串有__getitem__

>>> dir('1')
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>>

我们可以找到__getitem__所以我们可以说字符串是可迭代的 iter内置检查__iter__方法,如果是字符串__getitem__方法

答案 5 :(得分:0)

改述: “str类的哪些属性使其可迭代?”

既然你回答了自己的问题(__getitem__),我就投了赞成票。 (试试repr(str.__getitem__)

另见: What's the difference between __iter__ and __getitem__?

https://docs.python.org/2/glossary.html#term-iterable

答案 6 :(得分:0)

您的建议是PEP-276,因为

而遭到拒绝
  

该PEP于2005年6月17日被拒绝,并附有对python-dev的说明。

     

许多原始需求都是由Python 2.3接受的enumerate()函数满足的。

     

此外,该提案既允许也允许滥用,例如:

     

>>> for in in 3:print i

     

0

     

1

     

2

     

同样,提案会在语句中禁用语法错误没有帮助,例如:

     

x,= 1