为什么使用 yield 语句的函数只产生整数而不是字符串和整数的混合?

问题描述 投票:0回答:2

短篇小说(英文单词)

我写了一些代码来创建一个迭代器。

我希望迭代器:

  • 有时会产生整数

  • 有时会产生字符串。

python中,

int
python
都是
object
类的实例,所以迭代器总是产生
object
的实例,但它有时应该是一个字符串,有时又是一个字符串.

相反,我们只有整数。


预期输入/输出

输入 预期回报率 实际返回值
"h\ne\rl\tl\no"
iter(['h', 10, 'e', 13, 'l', 9, 'l', 10, 'o'])
iter([104, 10, 101, 13, 108, 9, 108, 10, 111])

但是,我的迭代器只产生整数。为什么只有整数?

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
    导致返回字符串。

python python-3.x iterator yield
2个回答
2
投票

不要重新发明轮子。

.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']

1
投票

ch in r
永远不会是真的。字符不是数字,永远不会出现在
range
.

© www.soinside.com 2019 - 2024. All rights reserved.