81

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

Memoization with Function Decorators

def memoize(f):
    memo = {}
    print(locals())
    def helper(x):
        print('x=',x)
        if x not in memo:            
            memo[x] = f(x)
        return memo[x]
    return helper
    

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

fib = memoize(fib)

print(fib(2))

результат:

Python 3.5.2 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
   
{'f': <function fib at 0x7fd181eea950>, 'memo': {}}
x= 2
x= 1
x= 0
1
=> None
   

питання = звідки helper отримав 'x' ? ми ж нічого змінній "х" не присвоювали - отже її нема

82 Востаннє редагувалося P.Y. (01.11.2016 18:30:40)

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

x передається як параметр функції helper(). У самій memoise() локальної змінної з таким ім'ям нема, тому в print(locals()), викликаному з memoise, її не видно (хоча, якщо цей же рядок вставити у тіло helper(), ми побачимо там x).

83

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

вроді зрозумів:

def f(x):
    print(locals())
    def g(y):
        print(locals())
        return y + x + 3 
    return g

print(f(4)(6))

nf2 = f(3)
print(nf2(1))
Python 3.5.2 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
   
{'x': 4}
{'y': 6, 'x': 4}
13
{'x': 3}
{'y': 1, 'x': 3}
7
=> None
  

84

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

ping написав:
>>> x = ["a","b","c"]
>>> y = [x] * 4
>>> y
[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
>>> y[0][0] = "p"
>>> y
[['p', 'b', 'c'], ['p', 'b', 'c'], ['p', 'b', 'c'], ['p', 'b', 'c']]
>>> 

чому - то зрозуміло, але навіщо?
маючи список доведеться пам’ятати  як він створений, або довго ловити помилки
в чому тут такий "+" що це перекриває?

Є хоч одна мова, де динамічні масиви поводяться по іншому? І для чого таке робити взагалі? Хочете матрицю — використайте numpy.

85 Востаннє редагувалося ping (07.11.2016 18:18:55)

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

def f(x,l=[]):
    for i in range(x):
        l.append(i*i)
    print(l) 

f(2)
f(3,[3,2,1])
f(3)

результат:

[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]

чому не обнулилося [0, 1] коли функція закінчила виконання коду?

86

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

Тому що списки передаються в функції в Python за посиланням. Ваш код еквівалентний

mylist = []
def f(x,l=mylist):
...

і це саме очікувана поведінка. Хочете створювати новий список кожного разу - робіть

def f(x,l=None):
    if l==None:
        l=[]
    ...

87

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

koala написав:

Тому що списки передаються в функції в Python за посиланням. Ваш код еквівалентний

mylist = []
def f(x,l=mylist):
...

і це саме очікувана поведінка. Хочете створювати новий список кожного разу - робіть

def f(x,l=None):
    if l==None:
        l=[]
    ...
def f(l=list()):
  <...>

88 Востаннє редагувалося ping (08.11.2016 06:45:23)

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

ADR написав:
Прихований текст
koala написав:

Тому що списки передаються в функції в Python за посиланням. Ваш код еквівалентний

mylist = []
def f(x,l=mylist):
...

і це саме очікувана поведінка. Хочете створювати новий список кожного разу - робіть

def f(x,l=None):
    if l==None:
        l=[]
    ...
def f(l=list()):
  <...>

це не працює:

def f(x,l=list()):
    for i in range(x):
        l.append(i*i)
    print(l) 
 
f(2)
f(3,[3,2,1])
f(3)

дає:

Python 2.7.10 (default, Jul 14 2015, 19:46:27)
[GCC 4.8.2] on linux
   
[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]
=> None
   
Подякували: ADR1

89

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

list() буде виконано, коли виконується рядок

def f(x,l=list()):

і його значення буде зафіксовано.

90 Востаннє редагувалося P.Y. (08.11.2016 13:50:55)

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

def f(*args, **kwargs):
    def inner_f(x,l=[]):
        for i in range(x):
            l.append(i*i)
        print(l) 
    inner_f(*args, **kwargs)

Ніби має працювати.
Або для сумісності із старішими версіями, можна так:

def f(*args):
    def inner_f(x,l=[]):
        for i in range(x):
            l.append(i*i)
        print(l) 
    inner_f(*args)

(чогось думав, **kwargs у python2 не підтримується. Де я таке вичитав?...)

91

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

А я просто хочу висловити свою думку стосовно цієї мови програмування. Я з нього також починав, взагалі досить простий синтаксис і по мінімуму якихось дуже складних виразів. Мені здається, що Пайтон - це те що треба для початківців. З одногу боку він функціональний, з іншого об'єктно-орієнтовний, що дозволяє вивчити основні концепції і того і іншого програмування. Пайтон інтерпритований і це досить зручно, оскільки після кожної строчки коду можна відразу ж проводити редагування :) ну це я так. Зараз мені подобається Java, оскільки ця МП цілком ООП і тільки вивчаючи подібну мову можна з головою поринути у світ об'єктно орієнтованої реалізації