我注意到 for 循环在 Python 字符串上迭代有一些奇怪的地方。对于字符字符串,您将获得每个包含单个字符的字符串。
>>> for c in 'Hello':
print(type(c), repr(c))
<class 'str'> 'H'
<class 'str'> 'e'
<class 'str'> 'l'
<class 'str'> 'l'
<class 'str'> 'o'
对于字节字符串,您会得到整数。
>>> for c in b'Hello':
print(type(c), repr(c))
<class 'int'> 72
<class 'int'> 101
<class 'int'> 108
<class 'int'> 108
<class 'int'> 111
我为什么关心?我想编写一个函数,它接受文件或字符串作为输入。对于文本文件/字符串,这很容易;你只需要使用两个循环。对于字符串输入,第二个循环是多余的,但它仍然有效。
def process_chars(string_or_file):
for chunk in string_or_file:
for char in chunk:
# do something with char
您无法对二进制文件和字节字符串执行相同的操作,因为对于字节字符串,第一个循环的结果是不可迭代的。
为什么不检查类型并使用
str
或 decode
(如果是字节字符串或文件)?