Python-the Collatz Sequence

în primul rând, rețineți modul în care duplicarea calcule:

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

acest lucru nu poate cauza probleme cu acest cod specific, dar nu este o practică bună. Faceți de două ori mai multă muncă decât aveți nevoie, ceea ce poate provoca probleme de performanță odată ce începeți să scrieți un cod mai complicat. Faceți calculul o dată și salvați rezultatul. În acest caz, totuși, tot ce trebuie să faceți este să inversați aceste linii și să utilizați num:

num = num // 2print(num)

de asemenea, asigurați-vă că aveți spațiu adecvat în jurul operatorilor și fiți consecvenți.

cazurile dvs. if și elif sunt exclusive unul de celălalt, iar else dvs. nu ar trebui să se întâmple niciodată. Dacă prima condiție este adevărată, atunci cealaltă trebuie să fie falsă și invers. Nu e nevoie de a doua verificare. Odată rescris, veți vedea că imprimarea în fiecare caz nu este necesară. Puteți imprima doar după:

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

din moment ce reassinging doar num una dintre cele două opțiuni bazate pe o condiție, o expresie condiționată poate fi folosit aici curat, de asemenea:

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

bretelele nu sunt necesare, dar cred că sunt utile aici datorită numărului de operatori implicați.

imprimarea numerelor nu este ideală aici. În majoritatea codurilor, trebuie să puteți utiliza datele pe care le produceți. Dacă doriți să analizați secvența produsă, ar trebui să faceți ceva interceptați stdout-ul, care este scump și prea complicat. Faceți din aceasta o funcție care acumulează și returnează o listă. În exemplele următoare, am adăugat și câteva sugestii de tip pentru a clarifica care este tipul datelor:

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

sau, o abordare mult mai curat este de a face un generator care produce numerele:

# 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))

există câteva lucruri notabile despre getNum:

Python folosește” snake_case”, nu”camelCase”.

utilizarea dvs. de global num aici este inutilă și confuză. La fel ca înainte, Explicit return orice date pe care funcția le produce:

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

rețineți Cum, în loc să realocați un global num, doar returnăm numărul. De asemenea, am distanțat puțin lucrurile și am folosit câteva nume mai potrivite. Conceptual, aș spune că num = input("> ") este greșit. În momentul în care rulează, num nu conține un număr (conține un șir).

aceasta nu este o bună utilizare a recursivității. Probabil că nu vă va provoca probleme, dar dacă utilizatorul dvs. este într-adevăr prost și introduce date greșite de ~1000 de ori, programul dvs. se va prăbuși. Folosiți doar o buclă:

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

în limbi precum Python, aveți grijă să utilizați recursivitatea în cazurile în care nu aveți garanții cu privire la câte ori va reapărea funcția.

aș numi, probabil, acest lucru ceva mai aproape de ask_for_num. “get” nu face foarte clar de unde provin datele.

luate cu totul, vei sfârși cu:

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')

care poate fi folosit ca:

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

Lasă un răspuns

Adresa ta de email nu va fi publicată.