2013-11-16 8 views
1

Я пытаюсь вычислить postfix expresion с помощью python, но это не сработает. Я думаю, что это может быть проблема, связанная с python, любое предложение?Почему list.append return None?

expression = [12, 23, 3, '*', '+', 4, '-', 86, 2, '/', '+'] 

def add(a,b): 
    return a + b 
def multi(a,b): 
    return a* b 
def sub(a,b): 
    return a - b 
def div(a,b): 
    return a/ b 


def calc(opt,x,y): 
    calculation = {'+':lambda:add(x,y), 
        '*':lambda:multi(x,y), 
        '-':lambda:sub(x,y), 
        '/':lambda:div(x,y)} 
    return calculation[opt]() 



def eval_postfix(expression): 
    a_list = [] 
    for one in expression: 
     if type(one)==int: 
      a_list.append(one) 
     else: 
      y=a_list.pop() 
      x= a_list.pop() 
      r = calc(one,x,y) 
      a_list = a_list.append(r) 
    return content 

print eval_postfix(expression) 

Надеюсь, кто-то может мне помочь! любое предложение будет appriated

+1

совершенно не связан с вашим вопросом, но 1/Вы можете прочитать документ для 'operator' модуля, и в вашей' функции calc' вам не нужны лямбды вообще 2/- просто карта в функции оператора и передать аргументы во время вызова, то есть: '{" + ": add," - ": sub,} [opt] (x, y)'. Это также позволит вам определять глобальное отображение, поэтому избегая его создания снова и снова при каждом вызове 'calc'. –

+0

@brunodesthuilliers, спасибо, это wondeful !!! – newlife

ответ

4

Просто замените a_list = a_list.append(r) с a_list.append(r).

Большинство функции, методы, которые изменяют пункты последовательности/отображения делает возвращение None: list.sort, list.append, dict.clear ...

Не напрямую связаны, но видеть Why doesn’t list.sort() return the sorted list?.

+0

Я не согласен с 'sorted'. Он возвращает отсортированный список. –

+1

@Maxime, Спасибо за комментарий. Ты прав. исправлено. – falsetru

+0

Ваша ссылка на часто задаваемые вопросы о методе 'list.sort()' очень важна. Мы можем легко понять, почему append не возвращает новый список, но напрямую модифицирует аргумент. (+1) –

5

метод append не возвращает ничего:

>>> l=[] 
>>> print l.append(2) 
None 

Вы не должны написать:

l = l.append(2) 

Но просто:

l.append(2) 

В вашем примере, заменить:

a_list = a_list.append(r) 

в

a_list.append(r) 
+0

Большое спасибо за ваш быстрый ответ и смежную дискуссию. Есть только одна кривая V, которую я могу щелкнуть ,,, – newlife

1

append Функция мутирует список и возвращает None. Это кусок кода, который делает что http://hg.python.org/cpython/file/aa3a7d5e0478/Objects/listobject.c#l791

listappend(PyListObject *self, PyObject *v) 
{ 
    if (app1(self, v) == 0) 
     Py_RETURN_NONE; 
    return NULL; 
} 

Итак, когда вы говорите

a_list = a_list.append(r) 

вы фактически присваивая a_list с None. Итак, в следующий раз, когда вы ссылаетесь на a_list, он не указывает на список, а на None. Так что, как другие полагают, изменить

a_list = a_list.append(r) 

в

a_list.append(r) 
+0

спасибо, что по глубокой причине вопрос, замечательный !! – newlife

+0

@newlife Добро пожаловать :) – thefourtheye

0

функции как list.append(), list.sort() ничего не вернуть. например

def list_append(p): 
    p+=[4] 

функция list_append не имеет возврата statement.so при запуске следующих утверждений:

a=[1,2,3] 
a=list_append(a) 
print a 
>>>None 

, но при выполнении следующих операторов:

a=[1,2,3] 
list_append(a) 
print a 
>>>[1,2,3,4] 

Вот так. поэтому, надеясь, что это может вам помочь.

0

Методы списка можно разделить на два типа тех, кто мутирует списки на месте и возвращает None (буквально), а также тех, кто оставляет списки неповрежденными и возвращает некоторое значение, связанное с этим списком.

Первая категория:

append 
extend 
insert 
remove 
sort 
reverse 

Вторая категория:

count 
index 

Следующий пример объясняет различия.

lstb=list('Albert') 
lstc=list('Einstein') 

lstd=lstb+lstc 
lstb.extend(lstc) 
# Now lstd and lstb are same 
print(lstd) 
print(lstb) 

lstd.insert(6,'|') 
# These list-methods modify the lists in place. But the returned 
# value is None if successful except for methods like count, pop. 
print(lstd) 
lstd.remove('|') 
print(lstd) 

# The following return the None value 
lstf=lstd.insert(6,'|') 
# Here lstf is not a list. 
# Such assignment is incorrect in practice. 
# Instead use lstd itself which is what you want. 
print(lstf) 

lstb.reverse() 
print(lstb) 

lstb.sort() 
print(lstb) 

c=lstb.count('n') 
print(c) 

i=lstb.index('r') 
print(i) 

pop способ. Он изменяет список, а также возвращает значение.

popped_up=lstc.pop() 
print(popped_up) 
print(lstc) 
Смежные вопросы