• ベストアンサー

下記のpython の動きが分かりません。

asciizの回答

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6643/9411)
回答No.1

こちらのプログラムは、「再起呼び出し」というテクニックを使っています。 再起呼び出しは、関数自身を呼び出すコードが書かれていて、条件によって再度自分自身を呼び出したり、元の段階に戻ったりします。 ご質問のプログラムの場合、 関数 print_list は、配列要素とインデックス番号を持って呼び出される。 ・インデックス番号が配列要素数と等しければ、何もしないで戻る ←ここちょっと意訳 ・配列の、index番目をprint ※indexが0の時、1番目の要素を指す。pythonのお約束 ・plint_list関数を、配列と index+1 インデックスで呼び出す。 こうなっていますね。 メインプログラムの print_list(some_list, 0) が呼び出されたとき、print_list は次の状態で実行開始します。 print_list([1,2,3,4,5], 0) index=0 は、要素数5と等しくないので、次のprintが実行されます。 print 1 そしてさらに、print_list を呼び出しますが、パラメータが少々変化しています。 print_list([1,2,3,4,5], 1) index=1 は、要素数5と等しくないので、次のprintが実行されます。 print 2 そしてさらに、print_list を呼び出しますが、パラメータが少々変化している…と。 最終的に、index=5 でprint_list 呼び出しが行われたとき、何もせずに戻ります。 積み重なった関数呼び出しは、これをもって順々にreturnしていきます。 print_list([1,2,3,4,5], 0) print 1 __ print_list([1,2,3,4,5], 1) __ print 2 __ __ print_list([1,2,3,4,5], 2) __ __ print 3 __ __ __ print_list([1,2,3,4,5], 3) __ __ __ print 4 __ __ __ __ print_list([1,2,3,4,5], 4) __ __ __ __ print 5 __ __ __ __ __ print_list([1,2,3,4,5], 5) __ __ __ __ __ return __ __ __ __ return __ __ __ return __ __ return __ return return この動作の結果、 1 2 3 4 5 という実行結果になりました。 まあ正直、このプログラムは再起呼び出しの原理を説明するためだけに組まれたものであるので、「こんな処理わざわざ再起で書くことないじゃん?」と思われるでしょうけど。 再起呼び出しは本来、「再起呼び出しを使う方が、スッキリ書ける」という場合に、使います。 例えば、あるディレクトリ以下から条件に一致するファイルのみを探したり、右手法で迷路を脱出するプログラムだったり…とか? 動作の様子を理解しておけば、いつか応用できる問題に当たるかもしれません。

Maltese2020
質問者

お礼

貴重なお時間頂きありがとうございました。

関連するQ&A

  • python ですが下記のプログラムがエラーになり

    python ですが下記のプログラムがエラーになります。どうしてでしょうか。よろしくお願い致します。 def revers(data): for index in range(len (data)-1,-1,-1): yield data[index] some_list = [‘a’, ‘b’, ‘c’, ‘d’] for e in revers(some_list): print(e) 実行結果をd      c      b      a にしたいのですがエラーがでます。

  • python

    pythonについての質問です。 def S_sa(k=1) for step in xrange(k) : if step == 0 : print 'a' else print 'b' というコードがあって、なぜかprint aが実行されるのはなぜでしょうか? xrangeのreturnは1ではないのでしょうか?

  • Pythonのリストで

    Pythonのリストで質問があります list = [] if list and list[-1]: print("OK") if文をlist[-1]だけにするとindex out of rangeになるのに (これはわかります) if list and list[-1]:にするとIndexErrorにならないのでしょうか? プログラミング初心者です よろしくお願いします

  • pythonのエラーについて教えて下さい。

    pythonの勉強をおこなっている超初心者です。 ネットでみた。以下のサンプルコードを実行しようとしました。 # -*- coding: utf-8 -*- print u'モジュールのロード' def test(): print u'関数:testを呼び出しました' if __name__ == '__main__': print 'python-izm' # print 'パイソンイズム' test() しかし、以下の様なエラーとなってしまいます。 File ”test02.py"、line 9 print ’python-izm'  ^ indentionError:expected an indented block ネット調べてみたとことpythonのインデントのエラーだとわかりました。 pythonはインデントで実行範囲を認識するので、 そこがうまく記述できていないであろうとは思うのですが、何回か試したのですが うまく動いてくれません。 どなたか御指南下さい。

  • pythonの文字コードについて

    pythonの各文字コードにおける日本語の扱われ方について分からないことがあります。 日本語1文字の長さはユニコード文字列では1、8ビット文字列では3という説明が参考書には書いてありました。しかし、実際に実行してみると私の環境では結果が異なりました。さらに文字化けまで起きてしまいました。なぜなのでしょうか?回答お願いいたします。 windowsを使用しており、バージョンはpython2.7です。 以下、私の環境下での実行結果です。 >>> ustr=u"あいうえお" >>> len(ustr) 10 >>> len(ustr.encode("utf-8")) 20 >>> print ustr ‚ ‚¢‚¤‚¦‚¨ >>> print ustr.encode("utf-8") ツつツつ「ツつ、ツつヲツつィ >>> ustr2="あいうえお" >>> len(ustr2) 10 >>> print ustr2 あいうえお

  • pythonで、if文の内容がなぜか無視されます。

    下記のコードはファイルの内容を手動で修正するためのコードです。 間違えて入力せずにボタンを押してしまった時のために、入力文の長さが一定以下の時に書き込みを自動停止するようプログラムしたいのですが、実行した際になぜかif文の内容が無視され、うまくいきません。 これは仕様ですか? pythonのコードは上から下に向けて実行されるんじゃないんですか? def manual_set(): frw_w = open("weight.txt", "w+") w = frw_w.read() print(w) w_next = input("set the w") if len(w_next) <10: #誤作動防止 print(len(w_next),"Alart") frw_w.close() else: print(len(w_next)) frw_w.write(w_next) frw_w.close()

  • python プログラミング

    pythonで、 def CircleArea(): a=r*r*3.14 print(r,a) というプログラムをunixのvimでcircle.pyで保存しました。 今度はこれをpythonで実行したいと思って, ターミナルに, circle.pyと入力しましたが, 実行しません。どうすればよろしいでしょうか? よろしくお願いします。

  • Pythonについて

    Pythonで〇〇から〇〇の時に実行、 ということはできますか? if文を使うと if a <= 100: このように100以下のみ実行となりますが、 if a <= 100: if a >= 90: print("〇") else: print("×") else: print("×") aが90以上100以下の時、「◯」、それ以外の時「×」を出力するには上のような構文にすればいいですか? この構文より簡単な構文、もしくはより良い構文がある場合は教えてください。

  • pythonについて

    pythonについて質問があります。 下記の組み合わせプログラムで、comb'(n,m)のn.mをループさせて、m=1から5、n=1から5のようにループさせたいと思っています。 どなたかご教授ください。 def comb(n, m, a = []): if m == 0: print a elif n == m: print range(1, m + 1) + a else: comb(n - 1, m, a) comb(n - 1, m - 1, [n] + a) よろしくお願いします。

  • VBAからPythonを動かしたいのですが…

    いつもお世話になっております。 icevainと申します。 python超初心者です。 【質問】 『VBAでPythonを動かす』という興味のあるサイトを見つけました。 https://qiita.com/O_LUPAN/items/1ceb5c950ff40f3558ab サイトのpythonコード #ここから import sys def sum(suji1, suji2): return suji1 + suji2 if __name__ == "__main__": argv = sys.argv suji1 = str(argv[1]) suji2 = str(argv[2]) total = sum(suji1, suji2) print(total) #ここまで サイトのpythonコードを無理やり変更して、 #ここから import sys def sum(suji1, suji2): rst="OK" return rst if __name__ == "__main__": argv = sys.argv suji1 = str(argv[1]) suji2 = str(argv[2]) total = sum(suji1, suji2) print(total) #ここまで OKがかえってくると思ったのですが、 0がかえってきてしまいます。 OKをかえすにはどうすればよいのかわかりません。 お分かりの方おりましたらご協力お願い致します。