2016-02-12 6 views
12

В маленьком скрипте, который я написал, функция .append() добавляет введенный элемент в начало списка, а не конец этого списка. (Как вы можете четко понимать, я совсем новичок в Python, так легко идти на меня)Python list order

list.append(x)
Добавить элемент в конец списка; эквивалентно a[len(a):] = [x].

Это то, что говорится в https://docs.python.org/2/tutorial/datastructures.html.

Вы можете увидеть мой код ниже:

user_input = [] 
def getting_text(entered_text): 
    if entered_text == "done": 
     print "entering the texts are done!" 
    else: 
     getting_text(raw_input("Enter the text or write done to finish entering ")) 
     user_input.append(entered_text) 

getting_text(raw_input("Enter the first text ")) 
print user_input 

ли я непонимание что-то здесь, потому что печать функция печатает c,b,a вместо a,b,c (порядок я вошел вход a,b,c)

+2

FWIW, используя рекурсию в Python редко является хорошей идеей, если вы не обрабатывать рекурсивные структуры данных (например, дерево), поскольку Python ограничивает глубину рекурсивных вызовов и не может выполнить [tail call] (https://en.wikipedia.org/wiki/Tail_call) устранение. –

+5

Если вы новичок в python ... почему вы используете python2.7, который имеет 5-летнюю версию? Просто изучите python3 сейчас и, в конце концов, если oyu нужно обработать устаревшие системы, вы узнаете о различиях с python2. – Bakuriu

+0

Лучший онлайн-инструмент (решенный после того, как спросил некоторых друзей), был Codecademy, который использует 2.7. Плюс мне сказали, что не так много различий, и я могу легко переключиться на 3.x. Я также поступил на некоторые из курсов 3.x, например, в Удэми, но еще не начался. Я, вероятно, переключится на 3.x, когда мне будет комфортно :) – firko

ответ

28

Хорошо, это это то, что происходит.

Когда ваш текст не "done", вы запрограммировали его так, чтобы сразу10 снова вызвал функцию (т. Обратите внимание, как вы на самом деле установили его для добавления элемента в список ПОСЛЕ того, как вы делаете линию getting_text(raw_input("Enter the text or write done to finish entering ")).

Так что, когда вы добавляете переменные, они будут добавлять все переменные ПОСЛЕ того, как это делается с помощью рекурсивной функции.

Следовательно, когда вы вводите a, он снова вызывает эту функцию (пока ничего не внесен в список). Затем вы вводите b, затем c. Когда вы вводите done, рекурсивный бит завершается. СЕЙЧАС, это user_input.append(.... ОДНАКО, порядок отменен, потому что он имеет дело с c с тех пор, как это было последним.

Это можно показать при печати списка внутри функции:

>>> def getting_text(entered_text): 
...  print user_input 
...  if entered_text == "done": 
...   print "entering the texts are done!" 
...  else: 
...    getting_text(raw_input("Enter the text or write done to finish entering ")) 
...    user_input.append(entered_text) 
... 
>>> 
>>> getting_text(raw_input("Enter the first text ")) 
Enter the first text a 
[] 
Enter the text or write done to finish entering b 
[] 
Enter the text or write done to finish entering c 
[] 
Enter the text or write done to finish entering done 
[] 
entering the texts are done! 
>>> user_input 
['c', 'b', 'a'] 

Обратите внимание на оператор печати линия 2.


Так как же это исправить? Просто: добавьте в список, прежде чем вы будете рекурсивно звонить.

>>> user_input = [] 
>>> def getting_text(entered_text): 
...  if entered_text == "done": 
...   print "entering the texts are done!" 
...  else: 
...    user_input.append(entered_text) 
...    getting_text(raw_input("Enter the text or write done to finish entering ")) 
... 
>>> user_input = [] 
>>> getting_text(raw_input("Enter the first text ")) 
Enter the first text a 
Enter the text or write done to finish entering b 
Enter the text or write done to finish entering c 
Enter the text or write done to finish entering done 
entering the texts are done! 
>>> user_input 
['a', 'b', 'c'] 
+0

Действительно, нуто и аккуратное объяснение. Спасибо.! –

4

Ваша рекурсивная функция getting_text называет себя перед добавлением entered_text в список. Таким образом, эффект внутренних вызовов предшествует эффекту внешних вызовов.

Если поменять местами вокруг

getting_text(raw_input("Enter the text or write done to finish entering ")) 
user_input.append(entered_text) 

в

user_input.append(entered_text) 
getting_text(raw_input("Enter the text or write done to finish entering ")) 

затем содержимое user_input будет в обратном порядке.

5

У вас есть рекурсия в вашем скрипте. Сценарий переходит к getting_text перед добавлением в список. Таким образом, добавление выполняется, когда функция рекурсии возвращается окончательно.Таким образом, вы идете по стеку вниз по обратному пути, выполняя вызов append(), ожидающий выполнения в обратном порядке.

Может быть, это проще unterstand так:

getting_text() 
    getting_text() 
     getting_text() 
     append() 
    append() 
append() 

Если вы хотите иметь результат в «правильном» порядке перемещения append на линию, перед getting_text() вызова.

3

Заказ назад из-за рекурсивность getting_text, он должен работать как ожидается, если вы добавите entered_text перед рекурсивным вызовом или использовать итеративную функцию как этого

user_input = [] 
def getting_text(entered_text): 
    while (entered_text != 'done'): 
     user_input.append(entered_text) 
     entered_text = raw_input("Enter the text or write done to finish entering ") 
    print "entering the texts are done!" 
getting_text(raw_input("Enter the first text ")) 
print user_input 
+0

Ну, это _possible_, чтобы получить желаемый заказ, выполнив добавление перед рекурсивным вызовом (как показывают некоторые другие ответы). Но я, конечно, согласен с тем, что вместо рекурсии лучше использовать простой цикл while. –

+0

, что тоже правильно, спасибо за помощь – firko

3

вы делаете некоторые неприятные рекурсивным здесь: Вы вызываете функцию:

getting_text(entered_text) 

из внутри сам. Я не certan, это то, что вы хотите.

Я создал некоторую вещь, которая некрасиво тоже, но делает то, что вы хотите - я думаю ..

import sys 

user_input = [] 
def getting_text(entered_text): 
    if entered_text == "done": 
     print user_input 
     sys.exit(0) 
    else: 
     user_input.append(entered_text) 

while(1): 
    getting_text(raw_input("Enter the text or write done to finish entering: "))  
+1

Вызов 'sys.exit()' внутри функции немного резкий. Почему бы просто не возвратить «Истинный», когда вводится нормальный текст, и «False», когда вводится «done». BTW, когда вам нужно выйти, есть более простой способ, чем 'sys.exit()': вы можете просто выполнить 'exit()'. –

+0

yep, он делает именно то, что я хочу – firko

+0

PM 2 Ring: Вы правы ... –