我写了一些代码来创建一个迭代器。
我希望迭代器:
有时会产生整数
有时会产生字符串。
在python中,
int
和python
都是object
类的实例,所以迭代器总是产生object
的实例,但它有时应该是一个字符串,有时又是一个字符串.
相反,我们只有整数。
输入 | 预期回报率 | 实际返回值 |
---|---|---|
串
|
|
|
但是,我的迭代器只产生整数。为什么只有整数?
class StringViewer:
"""
"""
@classmethod
def imp(cls, istring:str):
"""
INPUT:
GENERAL:
Input is a string
EXAMPLE:
"h\ne\rl\tl\no"
--------------------------------
OUTPUT:
GENERAL:
return value is an iterator to ints and strings
EXAMPLE:
iter(['h', 10, 'e', 13, 'l', 9, 'l', 10, 'o'])
iterator yields:
* strings of length one if printable
* integers if not printable
"""
# The ASCII printables are 32 through 128
r = range(32, 128)
for ch in istring:
assert isinstance(ch, str)
if ch in r:
assert isinstance(ch, str)
# `ch` is printable
yield ch
else:
# `ch` is not printable
assert isinstance(ord(ch), int)
yield ord(ch)
return
it1 = StringViewer.imp("h\ne\rl\tl\no")
it2 = StringViewer.imp("h\ne\rl\tl\no")
it3 = StringViewer.imp("h\ne\rl\tl\no")
#######################################################
print(*iter([type(x).__name__ for x in it1]), sep=", ")
print(*iter([repr(x) for x in it2]), sep=", ")
print(*iter([repr(x if isinstance(x, str) else chr(x)) for x in it3]), sep=", ")
实际打印输出
# ACTUAL CONSOLE PRINT-OUT
int, int, int, int, int, int, int, int, int
104, 10, 101, 13, 108, 9, 108, 10, 111
'h', '\n', 'e', '\r', 'l', '\t', 'l', '\n', 'o'
预计打印出来
# EXPECTED CONSOLE PRINT-OUT
str, int, str, int, str, int, str, int, str
'h', 10, 'e', 13, 'l', 9, 'l', 10, 'o'
'h', '\n', 'e', '\r', 'l', '\t', 'l', '\n', 'o'
下面两件事似乎有区别:
返回整数。if ch in r
导致返回字符串。if ord(ch) in r
不要重新发明轮子。
.isprintable()
是 str
上的一个方法:
class StringViewer:
@staticmethod
def imp(istring: str):
for ch in istring:
yield ch if ch.isprintable() else ord(ch)
print(list(StringViewer.imp("h\ne\rl\tl\no")))
输出:
['h', 10, 'e', 13, 'l', 9, 'l', 10, 'o']
ch in r
永远不会是真的。字符不是数字,永远不会出现在range
.中