파이썬-콜라 츠 시퀀스
먼저 계산을 복제하는 방법에 유의하십시오:
print(num//2)num = num //2
이 특정 코드에 문제가 발생하지 않을 수 있지만 좋은 방법은 아닙니다. 필요한 것보다 두 배나 많은 작업을 수행하므로 더 복잡한 코드를 작성하기 시작하면 성능 문제가 발생할 수 있습니다. 계산을 한 번 수행하고 결과를 저장하십시오. 이 경우,당신이해야 할 일은 그 줄을 뒤집고num
을 사용하는 것입니다.:
num = num // 2print(num)
또한 연산자 주위에 적절한 간격이 있는지 확인하고 일관성을 유지하십시오.
if
과elif
의 경우는 서로 배타적이며else
은 절대로 발생하지 않아야합니다. 첫 번째 조건이 참이면 다른 조건이 거짓이어야하며 그 반대도 마찬가지입니다. 두 번째 점검은 필요하지 않습니다. 일단 다시,당신은 모든 경우에 인쇄가 필요하지 않습니다 것을 볼 수 있습니다. 당신은 후 인쇄 할 수 있습니다:
while num > 1: if num % 2 == 0: num = num // 2 else: num = 3 * num + 1 print(num)
조건을 기반으로 두 가지 옵션 중 하나를num
다시 지정하기 때문에 조건식도 여기에서 깨끗하게 사용할 수 있습니다:
while num > 1: num = (num // 2) if num % 2 == 0 else (3 * num + 1) print(num)
중괄호는 필요하지 않지만 관련된 연산자 수 때문에 여기에서 유용하다고 생각합니다.
숫자를 인쇄하는 것은 여기에 적합하지 않습니다. 대부분의 코드에서 생성한 데이터를 사용할 수 있어야 합니다. 생성 된 시퀀스를 분석하려는 경우 표준 출력을 가로 채고 비용이 많이 들고 지나치게 복잡한 작업을 수행해야합니다. 목록을 누적하고 반환하는 함수로 만듭니다. 다음 예제에서는 데이터 형식을 명확히 하기 위해 몇 가지 형식 힌트도 추가했습니다:
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
:
파이썬은”낙타 케이스”가 아니라”뱀 케이스”를 사용합니다.
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')
파이썬과 같은 언어에서는 함수가 재귀 할 횟수에 대한 보장이없는 경우 재귀를 사용하도록주의하십시오.
나는 아마도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)