2016-02-12 24 views
12

私が書いた小さなスクリプトでは、.append()関数は入力された項目をリストの末尾ではなくリストの先頭に追加します。Pythonリストの順序

list.append(x)
は、リストの末尾に項目を追加します(あなたが明確に理解できるとおり、Pythonのに非常に新しいですので、私に簡単に行きます)。 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ので、私は、ここで何かを誤解AM(私は入力に入った順番がa,b,cある)

+2

FWIW、Pythonで再帰を使用することはほとんどあなたが再帰的なデータ構造を処理していない限り、良いアイデアではありません..私は思いますPythonは再帰呼び出しの深さを制限し、[tail call](https://en.wikipedia.org/wiki/Tail_call)を削除することはできないため、(例えば、ツリー) –

+5

もしあなたがPythonを初めて使う人なら、なぜ5年以上前のバージョンのpython2.7を使っていますか?今すぐpython3を学んでください。そして、結局、oyuがレガシーシステムを扱う必要があれば、python2との違いを学びます。 – Bakuriu

+0

最高のオンラインツール(いくつかの友人に尋ねた後に決定)は、2.7を使用するコーデックアカデミーでした。また、私は多くの違いがないと言われており、私は簡単に3.xに切り替えることができます。私はまたUdemyのような3.xコースのいくつかに登録しましたが、まだ開始していません。私が快適に感じるとき私はおそらく3.xに切り替えるでしょう:) – firko

答えて

28

[OK]を、この起こっていることです。

テキストが"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'] 

は注意print文ラインを2


ですから、これをどのように修正するのですか?シンプル:再帰的に呼び出す前にリストに追加します。リストにentered_textを追加する前に、自分自身を呼び出すgetting_text

>>> 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

あなたの再帰関数。内側の呼び出しの効果は、外側の呼び出しの効果に先行します。

あなたは

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

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

の周りに入れ替える場合、user_inputの内容は逆の順番になります。

5

スクリプトに再帰があります。スクリプトは、リストに追加する前にgetting_textに進みます。したがって、再帰関数が最後に返ったときにappendが実行されます。このようにして、逆順で実行を待つ呼び出しappend()を実行しているリターンパス上でスタックを下に歩いています。

多分このようにunterstandする方が簡単です:あなたが「正しい」順序getting_text()コールの前に、ラインアップにappendを移動するには、結果を持っているしたい場合は

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

3

順序が原因getting_textの再帰に後方で予想通り、それはあなたが前に再帰呼び出しにentered_textを追加するか、この1

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

再帰呼び出しの前にappendを実行することで、(他の回答のいくつかが示すように)望む順序を得ることができます。しかし、ここでは再帰の代わりに単純なwhileループを使用するほうが良いことに確信しています。 –

+0

それも正しいです、助けてくれてありがとう – firko

3

のように反復機能を使用する場合は、いくつかの厄介な再帰を行っている動作するはずですここに物事:あなたは関数を呼び出します:

getting_text(entered_text) 

それ自身からです。私はあなたが望むものであると証明していません。

私はあまりにも醜いあるいくつかの事を作成したが、あなたは何をしたいんいる -

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()'を呼び出すのはちょっとです。普通のテキストが入力されたときに 'True'を返すのではなく、「done」が入力されたときに' False'を返すのはなぜですか?ところで、あなたがexitする必要があるときに 'sys.exit()'より簡単な方法があります:あなたは 'exit()'を実行するだけです。 –

+0

ええ、それは私が欲しいものを正確に行います – firko

+0

PM 2リング:そうです... –

関連する問題