在python中,是否可以在访问列表中的项目时进行重复发生的字符串格式化操作?
例如:
>>>from random import randint
>>>a = ["The random number is: {0}".format(randint(0,10))]
>>>print a[0]
The random number is: 3
>>>print a[0]
The random number is: 3
显然它正在获取一个随机整数,格式化字符串并在首次定义列表时将其保存在列表中。性能不受欢迎,我想知道是否可以覆盖此行为。
我知道如果我看到这个问题,我会回复“你做错了”这样的事情,并会提供类似于以下答案的内容......
>>>a = ["The random number is: {0}"]
>>>print a[0].format(randint(0,10))
但我们假设这不是这个问题的解决方案。我非常希望定义格式并在列表中进行(如果可能的话)。
另一个例子:
a = ["The some sweet string: {0}".format(someFunction),
"Another {0} different string {1}".format(someFunctionTwo, someFunctionThree)]
其中someFunction *在每次调用时提供“随机”结果。
我知道它有点拉伸,我可能不得不依赖已经提供的方法(感谢您的反馈)但是,我想我会试一试。
再次感谢。
答案 0 :(得分:4)
最好使用一个函数:
In [1]: from random import randint
In [2]: def func():
...: return "The random number is: {0}".format(randint(0,10))
...:
In [3]: func()
Out[3]: 'The random number is: 7'
In [4]: func()
Out[4]: 'The random number is: 2'
In [5]: func()
Out[5]: 'The random number is: 3'
答案 1 :(得分:4)
您可以创建一个类并覆盖__str__
:
>>> from random import randint
>>> class Foo(object):
... def __str__(self):
... return "The random number is: {0}".format(randint(0,10))
...
>>> a = [Foo()]
>>> print a[0]
The random number is: 8
>>> print a[0]
The random number is: 10
>>> print a[0]
The random number is: 5
但你是对的,我的第一个倾向是说你可能做错了......
这是另一个想法 - 让你的列表中包含格式字符串:
a = ["The some sweet string: {func1}",
"Another {func2} different string {func3}"]
for item in a:
print item.format(func1=func1(),func2=func2(),func3=func3())
显然这效率不高(当你不一定需要它时调用函数......),但它可以工作。