Re: Я воно працює?!?
Ну майже. А чого так і не зрозумів.
Чого воно не витиає з пам'яті? Аргумент не передано, значить треба використати за змовчуванням: (
[]
). А ні.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Python → Я воно працює?!?
Для відправлення відповіді ви повинні увійти або зареєструватися
Ну майже. А чого так і не зрозумів.
Чого воно не витиає з пам'яті? Аргумент не передано, значить треба використати за змовчуванням: (
[]
). А ні.
Init відбувається тільки перший раз.
далі працює посилання на створений об'єкт - список
Буду чесним: вирішив, що False, True. А насправді
це я до чергової тех співбесіди готуюся )
Ну майже. А чого так і не зрозумів.
Чого воно не витиає з пам'яті? Аргумент не передано, значить треба використати за змовчуванням: (
[]
). А ні.
Насправді воно й бере значення за замовчуванням, але особливість у тому, що цим значенням є один і той же список. Замовчувальний список не створюється наново при кожному виклику, а зберігається між викликами, тому його вміст на початку роботи функції буде таким же, як наприкінці попереднього виклику з цим же замовчувальним значенням.
написано:
setdefault(key[, default])
If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.
https://docs.python.org/3/library/stdty … types-dict
пробую:
def f():
print('func work')
return 33
d = {}
key = 'key'
print(d.setdefault(key,f()), ' - key not in dict')
print(d.setdefault(key,f()), ' - key in dict, but method "setdefault" not return value, instead it run func again')
> func work
> 33 - key not in dict
> func work
> 33 - key in dict, but method "setdefault" not return value, instead it run func again
чому при другому виклику просто не повернуло значення, а запустило функцію?
бо вважало що я хочу змінити значення? але по документації такого не передбачено - мало просто повернути існуюче значення.
п.с.
нарешті допер!
проблема в тому, що до моменту перевірки чи є ключ в словнику, інтерпретатор вираховує всі параметри, в т.ч f()
а був би він розумний - то спершу б дивися - чи варто рахувати.
бо згідно документації - якщо ключ уже є в словнику - треба просто повернути значення.
Єдиний випадок, коли обчислюються не всі параметри - це and та or:
f() and g() #якщо f() повертає щось, що зводиться до False, то g() не буде викликано
f() or g() #якщо f() повертає щось, що зводиться до True, то g() не буде викликано
В усіх інших випадках будуть обчислені обидва аргументи:
0*f() #f() обчислюється
Єдиний випадок, коли обчислюються не всі параметри - це and та or:
f() and g() #якщо f() повертає щось, що зводиться до False, то g() не буде викликано f() or g() #якщо f() повертає щось, що зводиться до True, то g() не буде викликано
В усіх інших випадках будуть обчислені обидва аргументи:
0*f() #f() обчислюється
саме на таку поведінку я розраховував, коли через setdefault хотів скороти час виконання програми - якщо f() від конкретного аргумента вже обчислена - не обчислювати ще раз.
замінив на :
...
if key not in d.keys():
d[key] = f(key)
return d[key]
...
Python-way тут має бути такий:
try:
return d[key]
except:
d[key] = func(param)
return d[key]
До речі, in d працює так само, як і in d.keys():
if key not in d:
Python-way тут має бути такий:
try: return d[key] except: d[key] = func(param) return d[key]
До речі, in d працює так само, як і in d.keys():
if key not in d:
читав що :
try
...
except
...
працює довго, особливо, якщо except
а стояло завдання максимально скоротити час виконання програми
Протестуйте - в Python різниці нема.
Підказка: не тому, що Python якийсь надшвидкий try-except використовує.
Для відправлення відповіді ви повинні увійти або зареєструватися