Подтвердить что ты не робот

Список списка Python

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

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)

4b9b3361

Ответ 1

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

Если ваш текст не соответствует "done", вы запрограммировали его так, чтобы немедленно снова вызывал функцию (т.е. рекурсивно вызывал ее). Обратите внимание, как вы на самом деле установили его для добавления элемента в список ПОСЛЕ того, как вы делаете строку 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']

Ответ 2

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

Может быть, легче убрать это:

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

Если вы хотите, чтобы результат в "правильном" порядке переместил append в строке вверх, перед вызовом getting_text().

Ответ 3

Рекурсивная функция 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 будет в обратном порядке.

Ответ 4

Порядок обратный из-за рекурсивности 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

Ответ 5

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

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: "))