【问题标题】:Lua-style in PythonPython 中的 Lua 风格
【发布时间】:2020-07-24 01:42:18
【问题描述】:

变量 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

【问题讨论】:

  • 我想a = (None or 0) + 1会做你想做的事,但我看不到用例。
  • 这样做有什么好处,而不是你定义a=0的第一种方法?
  • @DeveshKumarSingh 亲爱的朋友,它节省了很多代码行
  • @LydiavanDyke 我已经编辑了问题来回答你
  • @IgorK.: "亲爱的朋友,它节省了很多行代码" 它只节省了一行代码。您可以轻松地在循环中声明一个局部变量,该变量包含该值或如果该值为无则为 0,然后将 1 添加到局部变量。

标签: python lua


【解决方案1】:

Python 确实有一个三元运算符,就像 Lua 和许多其他语言一样

但与 Lua 不同,Python 不会将未定义的变量作为“假”值处理,如果您尝试评估未定义的变量,它将引发错误。特别是在您的情况下,您将收到密钥 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

如果是truthy,Lua会将or之前的值传递给你,当后面的语句是true时,python会将if之前的值传递给你,@987654328之后的值@当它是false时。

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

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


我建议的更清洁的解决方案:

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

它的代码更少,更容易推理。 get 将返回 total_volume[ticker] 或者如果字典中不存在该键,它将返回默认值 0

【讨论】:

  • 谢谢!哪个更快?这对我很重要,因为我在数百万行数据文件中使用它。
【解决方案2】:

对于您的用例,我建议使用defaultdict:

from collections import defaultdict

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

但是 -

我认为这不是一个好习惯,但您可以使用 locals()globals() 在所需范围内动态访问变量:

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

c = locals().get("c", 2) + 1 
print(c) # output 3

【讨论】:

  • 也有可能使用标准字典:d["counter"] = d.get("counter", 0) + 5
猜你喜欢
  • 2014-03-10
  • 2019-06-16
  • 1970-01-01
  • 2015-12-02
  • 2016-03-27
  • 2016-08-29
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多