21 Востаннє редагувалося Q-bart (28.07.2017 16:26:51)

Re: Я воно працює?!?

Ну майже. А чого так і не зрозумів.

Чого воно не витиає з пам'яті? Аргумент не передано, значить треба використати за змовчуванням: (

[]

). А ні.

22

Re: Я воно працює?!?

Init відбувається тільки перший раз.
далі працює посилання на створений об'єкт - список

23

Re: Я воно працює?!?

Буду чесним: вирішив, що False, True. А насправді

Прихований текст

True, False. В першому рядку створюється екземпляр списку [], який потім передається за посиланням в усі виклики foo без параметра, і він же за посиланням повертається з foo; при першому виклику в нього пхається один 'baz', в s1 записується рядок з одним 'baz', при другому - в нього дописується ще один 'baz', в s2 вже два 'baz'-и.
Ну і виходить, що f1==f2, бо це той самий [], а s1!=s2.

24 Востаннє редагувалося ping (28.07.2017 17:50:46)

Re: Я воно працює?!?

це я до чергової тех співбесіди готуюся )

https://www.toptal.com/python/top-10-mi … mmers-make

25

Re: Я воно працює?!?

Q-bart написав:

Ну майже. А чого так і не зрозумів.

Чого воно не витиає з пам'яті? Аргумент не передано, значить треба використати за змовчуванням: (

[]

). А ні.

Насправді воно й бере значення за замовчуванням, але особливість у тому, що цим значенням є один і той же список. Замовчувальний список не створюється наново при кожному виклику, а зберігається між викликами, тому його вміст на початку роботи функції буде таким же, як наприкінці попереднього виклику з цим же замовчувальним значенням.

Подякували: ping, Q-bart, leofun013

26 Востаннє редагувалося ping (07.09.2017 23:22:28)

Re: Я воно працює?!?

написано:

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()
а був би він розумний - то спершу б дивися - чи варто  рахувати.
бо згідно документації - якщо  ключ уже є в словнику - треба просто повернути значення.

Подякували: koala1

27

Re: Я воно працює?!?

Єдиний випадок, коли обчислюються не всі параметри - це and та or:

f() and g() #якщо f() повертає щось, що зводиться до False, то g() не буде викликано
f() or g() #якщо f() повертає щось, що зводиться до True, то g() не буде викликано

В усіх інших випадках будуть обчислені обидва аргументи:

0*f() #f() обчислюється
Подякували: ping1

28

Re: Я воно працює?!?

koala написав:

Єдиний випадок, коли обчислюються не всі параметри - це 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]
...

29 Востаннє редагувалося koala (08.09.2017 10:14:50)

Re: Я воно працює?!?

Python-way тут має бути такий:

    try:
        return d[key]
    except:
        d[key] = func(param)
        return d[key]

До речі, in d працює так само, як і in d.keys():

if key not in d:

30

Re: Я воно працює?!?

koala написав:

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
а стояло завдання максимально скоротити час виконання програми

31

Re: Я воно працює?!?

Протестуйте - в Python різниці нема.
Підказка: не тому, що Python якийсь надшвидкий try-except використовує.

Подякували: ping1