3

ループについて非常に基本的な質問があります。私はプログラミングを始めようとしていて、現在「Learn Python The Hard Way」という本を読んでいて、例33の学習ドリル番号5で立ち往生しています:http: //learnpythonthehardway.org/book/ex33.html

これは私のコードがどのように見えるかです:

i = 0
numbers = []

def main(i, numbers):
    userloop = int(raw_input("Type in max value for the loop > "))
    while i < userloop:

        print "At the top i is %d" % i
        numbers.append(i)
        userincrease = int(raw_input("Increase > "))
        i += userincrease

        print "Numbers now: ", numbers
        print "At the bottom i is %d" % i


    print "The numbers: "
    print numbers
    for num in numbers:
    print num       


main(i, numbers)

事は私がwhileループの代わりにforループを使いたいということです。それも可能ですか、それではどうすればよいですか?単に交換してみました

while i < userloop:

for i in range(userloop)

しかし、その後、i値は、ループの「トップ」に到達するたびにリセットされます。

私はこれに非常に慣れていないので、私が明白な何かを逃したとしても、あまり意味をなさないでください。

ちなみに、この本がそもそも良いものなのか、それとも時間を無駄にしているのか、誰か知っていますか?

4

5 に答える 5

4

Pythonのforループは、。の後の式によって提供される一連の値をループしますin。Pythonでは、iterableこのようなシリーズを作成できるものすべてにこの用語を使用します。それはである可能range()性がありますが、反復(ループ)できるものであれば何でもかまいません。ループ変数iは、以前の値に関係なく、各反復で次の値を受け取ります。

したがって、以下は合法です。

for i in ('foo', 'bar', 'baz'):
    print i
    i = 'spam'

しかし、i = 'spam'本質的には何もしません。

別の方法でアプローチする必要があります。代わりにそれらの値をスキップしてください:

print_at = 0
for i in range(userloop):
    if i >= print_at:
        print "At the top i is %d" % i
        numbers.append(i)
        userincrease = int(raw_input("Increase > "))
        print_at = i + userincrease

        print "Numbers now: ", numbers
        print "At the bottom i is %d" % i

ユーザーに増加を要求するたびprint_atに、現在の値にその増加を加えた値の合計になるように値を更新し、に追いつくiまでループ本体のほとんどを無視します。iprint_at

于 2013-01-15T21:27:54.773 に答える
2

forループとwhileループには重要な違いがあります。

forループ:ループ本体を固定回数実行し、反復をカウントします。

whileループ:ループの条件が真である限り、ループ本体を繰り返し実行します。

通常、ゼロから開始して特定の数(などuserloop)で停止する場合は、forループが最も適切であることを意味します。ただし、このプログラムは「0からuserloopまでカウントし、毎回このようなことを行う」とは言っていません。「私はゼロから始めて、その値が条件(> userloop)を満たすまで、ユーザー入力に従って値を変更して、このようなことをするつもりです」と言っています。

ユーザーが0を何度も入力したり、負の数を入力したりすると、ループから抜け出せなくなる可能性があります。

于 2013-01-15T21:31:06.453 に答える
1

だから私はあなたがリンクしたPythontheHardWayのウェブサイトで質問をチェックしました...彼は実際にはforループと範囲を使用して元のスクリプトを書き直すようにあなたに頼んでいたと思いますその場合あなたはこのようなことをすることができます:

numbers = []

for i in range(6):
    print "at the top i is", i
    numbers.append(i)
    print "numbers now", numbers

print "finally numbers is:"
for num in numbers:
    print num

これを実行すると、次のような出力が得られます。

$ python loops.py 
at the top i is 0
numbers now [0]
at the top i is 1
numbers now [0, 1]
at the top i is 2
numbers now [0, 1, 2]
at the top i is 3
numbers now [0, 1, 2, 3]
at the top i is 4
numbers now [0, 1, 2, 3, 4]
at the top i is 5
numbers now [0, 1, 2, 3, 4, 5]
finally numbers is:
0
1
2
3
4
5

インクリメントステートメントに関する質問に答えるには、必要に応じて、次のことを試してください。

for i in range(6):
    print "at the top i is", i
    numbers.append(i)

    i += 2
    print "numbers now", numbers
    print "at the bottom i is", i

print "finally numbers is:"
for num in numbers:
    print num

そして、出力として次のようなものが得られます。

$ python loops.py
at the top i is 0
numbers now [0]
at the bottom i is 2
at the top i is 1
numbers now [0, 1]
at the bottom i is 3
at the top i is 2
numbers now [0, 1, 2]
at the bottom i is 4
at the top i is 3
numbers now [0, 1, 2, 3]
at the bottom i is 5
at the top i is 4
numbers now [0, 1, 2, 3, 4]
at the bottom i is 6
at the top i is 5
numbers now [0, 1, 2, 3, 4, 5]
at the bottom i is 7
finally numbers is:
0
1
2
3
4
5

ここで何が起こっているのか分かりますか?範囲関数は次のようなリストを生成することに注意してください:
range(6)-> [0、1、2、3、4、5]。
これは、Pythonのforステートメントが反復する方法を知っているものです(これらのタイプのものを反復可能と呼びます)。とにかく、変数iは、反復ごとにrange(6)内の1つの項目(つまり、リスト[0、1、2、3、4、5])にバインドされます。forループ内でiに何かを行っても、iterableの次の項目にリバウンドされます。したがって、incrementステートメントは絶対に必要ありません。この場合、iが何であれ2を追加するだけですが、反復ごとに通常のようにリバウンドされます。

さて、これが、whileループの使用から範囲付きのforループの使用に毎回イテレータを変更するオプションを使用して、特定のコードを変更する際の私の亀裂です。

リンクしたオンラインブックの前の章を一瞥するだけで機能をカバーできたと思いますが、少し混乱する前に再帰を見たことがない場合は。関数を再度呼び出す前のifステートメントは、現在の値が範囲内の値を超えないようにすることです。これにより、最大再帰深度を超えたというエラーが発生します(Pythonは、スタックオーバーフローエラーを防ぐためにこれを行います。 )。

範囲を使用して次のようなことを実行できる最後のポイント:
range(0、10、2)-> [0、2、4、6、8]
これを以下で使用します。

def my_loop(max, current=0, increment=1, numbers=[]):
    for x in range(current, max, increment):
        print "at the top, current is %d" % current
        numbers.append(current)

        increment = int(raw_input("Increase > "))
        current += increment

        print "numbers is now: ", numbers
        print "at the bottom current is %d" % current
        break

    if current < max:
        my_loop(max, current, increment, numbers)
    else:
        print "no more iterating!"


max = int(raw_input("Type in max value for the loop > "))    

my_loop(max)

私は実際にこのようにすることはないと思いますが、少なくとも興味深いテイクです。

于 2013-01-16T02:05:43.703 に答える
1

私はこのコードを使用してそれを行いました。ここで、pは関数呼び出しnumba(p)で設定した引数です。

i = 0
elements = [ ]

def numba(p):
    for i in range(0, p):
        print "At the top i is %r" % i
        elements.append(i)
        print "Numbers now: ", elements
        print "At the bottom i is %r" % (i + 1)

numba(3)
于 2013-12-02T04:48:18.553 に答える
0

さて、動的に制御されるループのジェネレーターの方向を掘り下げてみることができると思いますfor

于 2013-01-15T22:16:34.787 に答える