Python-Collatz Sequence

まず、計算をどのように複製しているかに注意してください:

print(num//2)num = num //2

これはこの特定のコードで問題を引き起こさないかもしれませんが、それは良い習慣ではありません。 これは、より複雑なコードを書き始めると、パフォーマンスの問題を引き起こす可能性があります。 計算を一度行い、結果を保存します。 しかし、この場合、あなたがする必要があるのは、それらの行を逆にしてnumを使うことだけです:

num = num // 2print(num)

また、演算子の周りに適切な間隔があることを確認し、一貫性があることを確認してください。

あなたのifelifのケースはお互いに排他的であり、あなたのelseは決して起こるべきではありません。 最初の条件がtrueの場合、otherはfalseでなければならず、その逆も同様です。 第二のチェックの必要はありません。 書き換えると、すべての場合に印刷が必要ではないことがわかります。 あなただけの後に印刷することができます:

while num > 1: if num % 2 == 0: num = num // 2 else: num = 3 * num + 1 print(num)

条件に基づいて2つのオプションの1つをnum再割り当てしているだけなので、条件式もここできれいに使用できます:

while num > 1: num = (num // 2) if num % 2 == 0 else (3 * num + 1) print(num)

中括弧は必要ありませんが、関係する演算子の数のためにここでは便利だと思います。

ここでは数字を印刷するのは理想的ではありません。 ほとんどのコードでは、生成したデータを使用できる必要があります。 生成されたシーケンスを分析したい場合は、stdoutを傍受する必要がありますが、これは高価で複雑すぎます。 リストを蓄積して返す関数にします。 次の例では、データの型が何であるかを明確にするために、いくつかの型ヒントも追加しました:

from typing import Listdef collatz(starting_num: int) -> List: nums = num = starting_num while num > 1: num = (num // 2) if num % 2 == 0 else (3 * num + 1) nums.append(num) return nums

または、はるかにクリーンなアプローチは、それを数値を生成するジェネレータにすることです:

# Calling this function returns a generator that produces ints# Ignore the two Nones, as they aren't needed for this kind of generatordef collatz_gen(starting_num: int) -> Generator: yield starting_num num = starting_num while num > 1: num = (num // 2) if num % 2 == 0 else (3 * num + 1) yield num>>> list(collatz_gen(5))

いくつかの注目すべきことがありますgetNum:

Pythonは”camelCase”ではなく”snake_case”を使用します。

ここでのglobal numの使用は不要で混乱します。 前と同じように、関数が生成するすべてのデータを明示的にreturn:

def get_num() -> int: raw_num = input("> ") try: return int(raw_num) except ValueError: print('Please enter a number') return get_num()

グローバルnumを再割り当てする代わりに、番号を返すだけです。 私はまた、物事を少し間隔をあけて、いくつかのより適切な名前を使用しました。 概念的には、私はnum = input("> ")が間違っていると言うでしょう。 それが実行された時点で、numには数値が含まれていません(文字列が含まれています)。

これは再帰の良い使い方ではありません。 問題は発生しない可能性がありますが、ユーザーが本当に愚かで、間違ったデータを1000回入力すると、プログラムがクラッシュします。 ループを使用するだけです:

def get_num() -> int: while True: raw_num = input("> ") try: return int(raw_num) except ValueError: print('Please enter a number')

Pythonのような言語では、関数が何回再帰するかについて保証されていない場合は、再帰を使用するように注意してください。

私はおそらくこれをask_for_numに近い名前にしたいと思います。 「取得」は、データがどこから来ているのかを非常に明確にしません。

完全に取られて、あなたはで終わるでしょう:

from typing import Generatordef collatz_gen(starting_num: int) -> Generator: yield starting_num num = starting_num while num > 1: num = (num // 2) if num % 2 == 0 else (3 * num + 1) yield numdef ask_for_num() -> int: while True: raw_num = input("> ") try: return int(raw_num) except ValueError: print('Please enter a number')

次のように使用できます:

num = ask_for_num()for n in collatz_gen(num): print(n)

コメントを残す

メールアドレスが公開されることはありません。