-1

私はPythonコーディングクラスの第5章に入ったばかりなので、Pythonコーディングはまだ非常に新しいことに注意してください。そのことを念頭に置いて、ユーザーが正の数ではなく負の数を入力するまで続行する「while ループ」を使用して合計計算機を作成しようとしています。

質問の説明が完全に明確でない場合は、正確な宿題の問題をここに投稿します。

第 5 章、200 ページ、#8 数の合計

ユーザーに一連の正の数を入力するよう求める while ループを含むプログラムを作成します。ユーザーはシリーズの終わりを知らせるために負の数を入力する必要があります。すべての正の数値が入力されると、プログラムはそれらの合計を表示する必要があります。

これまでに書いたコードについては、次のとおりです。

def main():
    number = float(input('Please enter in a positive number: '))
    while number > 0:
        positiveNumber()
    while number < 0:
        calculateTotal()
        printTotal()

def positiveNumber():
    number = float(input('If you are finished please enter a negative number.' + \ 'Otherwise, enter another positive number: '))
    while number > 0:
        positiveNumber()
    while number < 0:
        calculateTotal()
        printTotal()

def calculateTotal():
    total = 0 + number

def printTotal():
    print('The sum of your numbers is: ', total)

main()
  • 11行目には、テキストをきれいに見せるためにスペースを入力したかったので、そこに「+ \」記号がありますが、うまくいかないようです。

この質問が「面倒くさい」と思われる場合は申し訳ありませんが、よりクリーンな/実用的な合計計算機を作成するのに助けが必要です. 誰かがこのコードを見て、うまくいけば私がそれを改善するのを手伝ってくれるなら、私は非常に感謝しています. ありがとうございました!

最終編集:

有益な回答をありがとうございました!私はたくさんのことを学びました(「初心者」=])。電卓には Talon876 の回答を使用しました。みんなありがとう!

4

5 に答える 5

3

単一の文字列を複数行に出力したい場合は\n、文字列に a を入れます。例えば、

print "This is on the first line\nThis is on the second line"

出力します

This is on the first line
This is on the second line

while ループと再帰を混在させているようです (それ自体からメソッドを呼び出しています)。単一の while ループと入力変数を使用して、ブレーク条件をチェックすることをお勧めします (入力が < 0)。

次のようになります。

sum = 0
number = float(input('Please enter in a positive number: '))
while number > 0:
    sum = sum + number
    number = float(input('If you are finished please enter a negative number.' + \ 'Otherwise, enter another positive number: ')) #fix this line using the information from the first part of the answer

これは、ユーザーが負の数または 0 を入力するまでループします。0 を正の数として受け入れたい場合は、while 条件を次のように変更します。number > -1

于 2012-07-16T18:18:42.063 に答える
1

明示的にグローバルとして宣言しない限り、Python 関数でグローバル変数を更新することはできません。観察:

a = 1
def foo():
    a = a + 6  #creates a new variable (a) that is confined to the "foo" namespace.
           #Note that it still uses a from the global namespace on the Right hand side
           #This is because python looks for a in the "foo" namespace first.  When
           #it isn't found there, it looks in the global namespace.  However, python
           #WON'T ASSIGN to something in the global namespace without being told 
           #to explicitly
    print (a)

foo() # 7
print (a)  # 1

def foo():
    global a #Tell python that it is OK to assign to variable "a" in the global namespace.
    a = a + 6
    print (a)

foo()   # 7
print (a) # 7

しかし、この大きな力には大きな責任が伴います。多くの人が、グローバル変数を決して使用しないように言うでしょう。多くの点で、それらは正しいです。なぜなら、グローバル変数で達成できるほとんどのことは、他の方法を使用してよりきれいに達成できるからです。これを書いている私の望みは、グローバルを使用するよう説得することではなく、コード内のエラーの 1 つを理解するのに役立つことです。

試してみたいことの 1 つは、関数に入力数値を引数として、この時点までの合計とreturn新しい合計を受け入れるようにすることです。

幸運を!

于 2012-07-16T18:35:19.557 に答える
0

問題は1です。関数で使用している変数をグローバルとして宣言していないため、変更が加えられていることに注意してください。

2.関数を再帰的に呼び出して実装する場合は、whileループは必要ありません。条件のような「if&else」をチェックする必要があります。ここでは、whileループの問題を簡単に実装できます。

def main():
total=0
number = float(input('Please enter in a positive number: '))
while(number>0):
    total=total+number
    number = float(input('Please enter in a positive number to continue or a negative no. to stop: '))
print('The sum of your numbers is: %d'% total)
main()
于 2012-07-16T18:42:20.880 に答える
0

このようなものをお探しですか?しかし、どのスタイル制約を使用する必要があるのか​​わかりません。

number = float(input('Please enter in a positive number: '))
to_sum = []
while number > 0:
    to_sum.append(number)
    number = float(input('If you are finished please enter a negative number.\n' +
                         'Otherwise, enter another positive number: '))
print('The sume of your numbers is: ', sum(to_sum))

複数行に分割しようとしているステートメントはすでに()内にあるため、は必要ないことに注意してください。あなたはただ線を切ることができます。

割り当てでは、非常に多くのクレイジーな関数を使用する必要がありましたか?また、どのバージョンのPythonを使用していますか?

于 2012-07-16T18:42:50.400 に答える
0

学ぶ必要があることの 1 つは、プログラムを関数に分割する方法です。問題によっては、コードを分割するよりも 1 つのコード ブロックで処理したほうがよい場合があり、これもその 1 つだと思います。

単一の合計を計算する必要があります。これは、ユーザーが入力する数値を追加する単一の変数で処理できます。コードは、この変数を中心に設計する必要があります。コードを関数に分割しようとする場合は、グローバル変数を使用するか (推奨されません!)、関数間で変数を渡す必要があります。あるいは、変数をオブジェクトに入れてから make することもできます。関数は、オブジェクトの「メソッド」関数です。しかし、最も簡単なのは、変数を使用するコードを書き、そのすべてのコードを 1 つのコード ブロック (1 つの関数、または Python プログラムのコードだけ) にすることです。

ここに解決策があります:

sum = 0.0  # initial value; we will add values to this
print('Welcome to this program')
while True:
    s = input('User: enter data value or a negative number to stop')
    x = float(s)
    if x < 0:
        break
    sum += x  # add this value to update the sum
print('Here is your sum: {}'.format(sum))

では、上記のコードの良いところは次のとおりです。変数を操作する必要があるすべての場所sumはすべて近くにあり、それらを見ることができます。グローバルを宣言する必要はありませんsum。なぜなら、複数の関数がすべてそれを使用しようとしているわけではないからです。

そのコードを見て、自分自身に問いかけてみてください: 複数の関数に分割した方が、より単純または簡潔になるでしょうか? そうでない場合は、それをしないでください。

ここで唯一注意が必要なのはwhile True:、ループに使用したことです。これは、何かを実行し (入力を取得)、その結果に基づいて、ループから抜け出すか続行するかを決定し、その決定に基づいて最終的に別のことを実行する (合計を更新する) ためです。

「フラグ」変数を使用するようにこれを書き直してループを作成するwhile flag:ことは可能ですが、よりクリーンではないと思います。

sum = 0.0  # initial value; we will add values to this
print('Welcome to this program')
continue_loop = True
while continue_loop:
    s = input('User: enter data value or a negative number to stop')
    x = float(s)
    if x < 0:
        continue_loop = False
    else:
        sum += x  # add this value to update the sum
print('Here is your sum: {}'.format(sum))

continue_loopフラグ変数を使用する方が明確だと思いますか? break一部の教科書では、ループを途中で終了するために使用するのは罪であると考えているため、この方法でコードを作成する必要があると述べています。彼らは、ループは通常の場所 (whileループの場合は一番上) からのみ終了する必要があると考えています。

本当に関数を使いたい場合はどうしますか? 可能ですが、それでもグローバル変数は使用しないでください。実際、「機能的な」ソリューションを作成している場合、sum変数はまったく必要ありません。

これが機能的なソリューションです。

def ask_and_sum():
    s = input('Hey dude enter a value or a negative to stop')
    x = float(s)
    if x < 0:
        return 0
    else:
        return x + ask_and_sum()

print('Welcome to this program')
print('Your sum is: {}'.format(ask_and_sum()))

明示的なループの代わりに、これは関数がそれ自体への別の呼び出しで終了する「末尾再帰」を使用します。この場合、私は個人的に明示的なループを好みます。どう思いますか?

PS この問題は非常に単純であるため、完全な回答を提供せずに議論することは困難でした。申し訳ありません。しかし、コードをコピーするだけでも、それを見て、考えて、理解してください。

于 2012-07-16T19:38:38.697 に答える