Python中的“Lazy”列表项求值

2024-04-18 16:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

因为没有更好的词,我选择了这个标题。在

我想要的是能够做这样的事情:

>>> from random import randint
>>> fruits = [
...     "Orange",
...     "Banana",
...     f"{randint(2,5)} Cherries",
... ]

>>> fruits[2]
'3 Cherries'

>>> fruits[2]
'5 Cherries'

>>> fruits[2]
'2 Cherries'

但是,字符串中的文字表达式在创建列表时会被计算一次,每次访问它时都会得到相同的结果。在

我在想,除了编写一些复杂的边缘案例处理(毕竟我们是程序员,谁不喜欢编写漂亮的代码和优雅别致的代码?)。 我谈到边缘案例处理是因为我的49个字符串中只有6个需要这种“特殊”行为。在

到目前为止,我尝试的是从randint调用中生成一个lambda函数,但这没有帮助;结果是一样的。 也许这是一个懒惰评估的例子,但我需要一点关于如何(或是否)的指导与列表一起使用。在


Tags: 字符串代码fromimport标题列表random事情
3条回答

把lambda放在一个列表中一开始听起来不错,但是之后你必须调用列表的这个特殊(或全部)索引。你不能重复列表,你不能对列表排序。。。在

创建一个为您提供列表的函数更加容易:

from random import randint

def gimme_fruits ():
    return [ "Orange", "Banana", f"{randint(2,5)} Cherries",]

print(gimme_fruits())

输出:

^{pr2}$

每一张单子上的樱桃数量都是“固定的”,但你可以这样做:

for f in gimme_fruits() + gimme_fruits() + gimme_fruits():
    print(f)

获取维生素:

Orange
Banana
3 Cherries
Orange
Banana
3 Cherries
Orange
Banana
3 Cherries

如果您希望某些项的是文本的,但有些是可调用的,则可以创建您自己的list版本:

from random import randint

class LazyList(list):
    'Like a list, but invokes callables'
    def __getitem__(self, key):
        item = super().__getitem__(key)
        if callable(item):
            item = item()
        return item

fruits = LazyList([
    "Orange",
    "Banana",
    lambda: f"{randint(2,5)} Cherries",
])

print(fruits[2])
print(fruits[2])

你在正确的轨道上,想要一辆lambda:

from random import randint

fruits = [
        lambda: "Orange",
        lambda: "Banana",
        lambda: f"{randint(2, 5)} Cherries",
]

print(fruits[2]())
print(fruits[2]())
print(fruits[2]())

有很多方法可以省去(),但这可能不值得。在

相关问题 更多 >