Python-Collatsekvensen

bemærk først, hvordan du duplikerer beregninger:

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

dette kan ikke forårsage problemer med denne specifikke kode, men det er ikke en god praksis. Du laver dobbelt så meget arbejde, som du har brug for, hvilket kan forårsage ydelsesproblemer, når du begynder at skrive mere kompliceret kode. Gør beregningen en gang, og gem resultatet. I dette tilfælde er alt hvad du skal gøre, at vende disse linjer og bruge num:

num = num // 2print(num)

sørg også for, at du har korrekt afstand omkring operatører, og vær konsekvent.

dine if og elif sager er eksklusive for hinanden, og dine else bør aldrig ske. Hvis den første betingelse er sand, skal Andre være falske og omvendt. Der er ikke behov for den anden check. Når du er omskrevet, vil du se, at udskrivning i alle tilfælde ikke er nødvendig. Du kan bare udskrive efter:

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

da du bare gentager num en af to muligheder baseret på en betingelse, kan et betinget udtryk også bruges her rent:

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

bøjlerne er ikke nødvendige, men jeg tror, de er nyttige her på grund af antallet af involverede operatører.

udskrivning af numrene er ikke ideel her. I de fleste kode skal du kunne bruge de data, du producerer. Hvis du ville analysere den producerede sekvens, skulle du gøre noget aflytte stdout, hvilket er dyrt og alt for kompliceret. Gør det til en funktion, der akkumulerer og returnerer en liste. I de følgende eksempler tilføjede jeg også nogle typetips for at gøre det tydeligere, hvad datatypen er:

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

eller en meget renere tilgang er at gøre det til en generator, der giver tallene:

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

der er et par bemærkelsesværdige ting om getNum:

Python bruger” snake_case”, ikke”camelCase”.

din brug af global num her er unødvendig og forvirrende. Ligesom før, eksplicit return alle data, som funktionen producerer:

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

Bemærk, at i stedet for at omfordele en global num, returnerer vi bare nummeret. Jeg fordelte også tingene lidt ud, og brugte nogle mere passende navne. Jeg vil sige, at num ikke et tal (det indeholder en streng).

dette er ikke en god brug af rekursion. Det vil sandsynligvis ikke give dig nogen problemer, men hvis din bruger er virkelig dum og indtaster forkerte data ~1000 gange, vil dit program gå ned. Brug bare en løkke:

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

på sprog som Python skal du være forsigtig med at bruge rekursion i tilfælde, hvor du ikke har nogen garantier for, hvor mange gange funktionen vil gentage sig.

jeg vil også nok nævne dette noget tættere på ask_for_num. “get” gør det ikke meget klart, hvor dataene kommer fra.

taget helt, vil du ende med:

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

som kan bruges som:

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.