Lua стиль в Python - PullRequest
       0

Lua стиль в Python

2 голосов
/ 11 апреля 2020

Переменная a не существует

Я могу писать на Lua языке:

a = (a or 0) + 1

Теперь a = 1

это позволяет мне не объявлять переменная "а" заранее. Это аналог

a = 0
a = a + 1

Как я могу сделать то же самое в Python?

a = (a or 0) + 1

PS Почему это важно? Чтобы избежать присвоения нулю переменных:

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

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

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

Где Lua передаст вам значение перед or, если оно равно truthy, python передаст вам значение перед if, когда последующее утверждение будет true, и значение после else, когда оно равно false.

Чтобы безопасно оценить, был ли ключ в словаре, мы можем использовать in.

Это в основном для демонстрации троичной операции вы использовали в Lua и как это сделать в Python, но это не значит, что это правильный инструмент для этой проблемы.


Более чистое решение, которое я бы предложил:

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

Это меньше кода и легче рассуждать. get вернет total_volume[ticker] или, если ключ отсутствует в словаре, он вернет значение по умолчанию, 0.

1 голос
/ 11 апреля 2020

Для вашего случая использования я бы предложил использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...