Python 中的 Lua 风格

变量 a 不存在

我可以用 Lua 语言写出:

a = (a or 0) + 1

现在 a = 1

这使我不需要提前声明变量 "a"。这相当于

a = 0
a = a + 1

我该如何在 Python 中做同样的事情?

a = (a or 0) + 1

附注。为什么这很重要?为避免将零分配给变量:

python(4 行代码):

for ticker in ticker_list:
    total_volume[ticker] = 0

for a in range(1,10):
    total_volume[ticker] = total_volume[ticker] + a

lua(2 行代码):

for a=1,9 do:
    total_volume[ticker] = (total_volume[ticker] or 0) + a
点赞
用户12400214
用户12400214

针对你的使用情况,我建议使用 defaultdict

from collections import defaultdict

d = defaultdict(int)
d["counter"] += 5
print(d.items()) # 输出: dict_items([('counter', 5)])

但是

我不认为这是一个好做法,但是你可以使用 locals()globals() 来动态访问所需范围内的变量:

a = 1
print(locals().get("a")) # 输出: 1

c = locals().get("c", 2) + 1
print(c) # 输出:3
2020-04-11 10:45:34
用户7396148
用户7396148

Python 有三元操作符,像 Lua 和许多其他语言一样。

但与 Lua 不同的是,Python 不会将未定义的变量处理为“false”值,如果您尝试评估未定义的变量,它会抛出一个错误。特别是在您的情况下,当键 ticker 不存在时,您会得到一个键错误。

Lua 三元操作符:

    total_volume[ticker] = (total_volume[ticker] or 0) + a

Python 等效:

    total_volume[ticker] = (total_volume[ticker] if ticker in total_volume else 0) + a

在 Lua 中,如果值在 or 前为“真”,它将传递给您,而在 Python 中只有在声明为true时,它将传递给您并在声明为false时传递给 else 后面的值。

为了安全地评估字典中是否存在键,我们可以使用 in

这主要是为了演示您在 Lua 中使用的三元操作符以及如何在 Python 中进行操作,但这并不意味着它是解决此问题的正确工具。


我建议的更干净的解决方案:

   total_volume[ticker] = total_volume.get(ticker, 0) + 1

代码更少,更易于理解。 get 将返回 total_volume[ticker],如果字典中不存在该键,则返回默认值 0

2020-04-13 21:28:52