0

これがばかげているように思われる場合は申し訳ありませんが、LPTH の演習 33 に問題があります。

http://www.learnpythonthehardway.org/book/ex33.html

代わりに for ループと範囲を使用するように演習を書き直してください。中間のインクリメンタはもう必要ですか? 取り除かないとどうなりますか?

これは私がしました:

numbers = []


def NumbersLoop(x):
    """
   This function will loop as long as x is less than the limit,
   at the same time it will print the numbers list
   """

    limit = int(input('Limit: '))
    increment = int(input('Increment: '))

    for i in (x, limit):
        print('At the top x is : {}'.format(x))
        numbers.append(x)

        x += increment
        print('Numbers now: ', numbers)
        print('At the bottom x is {}'.format(x))

NumbersLoop(1)

print('The numbers: ')

for num in numbers:
    print(num)

しかし、なぜ3までしかループしないのかわかりません。また、途中でインクリメンタを取り除くことは可能ですか? どうしようもない...

4

6 に答える 6

2

まず、そのコードにはいくつか問題があります。

for i in (x, limit):

rangeあなたは呼び出しを逃しており、x実際には開始点であり、範囲呼び出しによって変更されません。

次:

print('At the top x is : {}'.format(x))
numbers.append(x)

x += increment

xrange呼び出しやループの影響を受けません。使用したいのは ですi。これは、範囲が現在ある数値です。

また、range関数は次の引数を取ります。

range(start, stop, increment)

また、 をインクリメントする必要はありませんx。さまざまな引数を使用して次のことを試してください。

start = 0
stop = 10
inc = 2
for i in range(start, stop, inc):
    print(i)

Python で何か問題が発生した場合、最初に行うべきことは、Python のドキュメントにアクセスすることです。ほとんどの場合、必要な答えが見つかります。

于 2013-03-28T02:43:16.343 に答える
1

これは良い学習実験でした。生徒は、手の届くところに置いたまま、答えを求めて伸びます。余分なクレジットのステップ 5 の後、これが私が最終的に得た場所です。

#!/usr/bin/env python
# -*- coding: utf-8 -*-


# FUNCTIONS
def genNos(noMin, noMax, noIncrement):
    """Returns numbers 0 through i in an array"""
    numbers = []
    for myNum in range(noMin, noMax, noIncrement):
        # print "At the top noMin is %d" % noMin
        numbers.append(myNum)
        # print "Numbers now: ", numbers
        # print "At the bottom noMin is %d" % noMin
    return numbers


# MAIN PROGRAM
print "The numbers: "
myVal = genNos(7, 21, 2)
print "%r" % myVal

for num in myVal:
    print num 

追加クレジット:

この while ループを呼び出し可能な関数に変換します。

  1. 機能: genNos
  2. テストの 6 (i < 6) を変数に置き換えます。
  3. 注: 関数の外での i の初期化は機能しなくなりました。「i = 0」を関数に移動します。

次に、この関数を使用してスクリプトを書き直して、さまざまな数値を試します。

  1. 数値を変数に置き換える
  2. 関数の引数に範囲を渡します。
  3. 注: これは、最小値が最大値より小さく、最大値が noMin+(2*noIncrement) 以上である限り機能します。

渡すことができる関数の引数に別の変数を追加して、8 行目の + 1 を変更できるようにします。

  1. ADD: noIncrement(カウントをインクリメントする数) を関数の引数に追加し、関数に 3 番目の値を渡します。

この関数を使用するようにスクリプトをもう一度書き直して、その効果を確認してください。

  1. 上記のすべてをテストするためにこれを行いました。それはこの時点まで機能します。

ここで、代わりに for ループと範囲を使用するように記述します。途中のインクリメンターはもう必要ですか?取り除かないとどうなりますか?

  1. OK、range(); で for を使用します。range関数はすべての引数を取ります - 問題ありません。

注: ループ内の変数を表すために 'i' や 'x' を使用することは決してありません。一意の名前を使用しない限り、vim で検索/置換を行うことはできません。例: :%s/myNo/MyVal/g; しかし、これはどのプログラムの検索と置換にも当てはまります。

また、for-loopは よりもコンパイラにとって大きなコストのようwhile-loopです。生徒に到達させるという文脈では、これは良い実験です。ただし、実際のプログラムでは使用しません。while ループ万歳!

于 2014-06-22T17:26:31.313 に答える
1
for i in (x, limit):

これは、「ループを 2 回実行する: で 1 回i = x、 で 1回」を意味しますi = limit

割り当て仕様をもう一度見てください。それは言います:

その演習を書き直して、range代わりに for ループを使用します。

range関数です。現在、どこでも使用していません。ここで使用する必要があります。

range概念的に数値の範囲を作成します。これは、これらの数値をループできることを意味しますfor i in。詳細については、その関数のドキュメントを参照してください。

途中でインクリメンタを取り除くことは可能ですか? どうしようもない...

最初にrange呼び出しを機能させてから、試してみてください

于 2013-03-28T04:07:17.937 に答える
0

これは古い質問だと思いますが、この問題を終えたばかりなので、何か追加したいと思います。

OPが考えていたかもしれないこと(彼が範囲を使用していた場合)は次のようなものです:

numbers = []


def NumbersLoop(x):
    limit = int(input('Limit: '))
    increment = int(input('Increment: '))

    for i in range(x, limit):
        numbers.append(i) #The i would be the newly incremented x on next iteration. != True

        x += increment

このコードは正しく機能しません。

x+= incrementその理由は、新しくインクリメントされたものが次の反復で範囲の開始点を変更することを期待しているかもしれませんが、そうではなくi、インクリメントされた量だけジャンプアップするからです。

範囲関数が使用する は、x基本的に最初に呼び出したときから固定されているため、値を変更した場合でも

x = 50

次の数値iは、元の x に基づく制限範囲に向けた次のステップになります。

多分これは次の人を救うでしょう。を使用しますrange(start, end, increment)

于 2014-10-18T13:20:02.100 に答える