据我所知,我们不能迭代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。
答案 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__)
答案 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