가장 큰 홀수

Aug 19 2020

사용자에게 10 개의 정수를 입력하도록 요청한 다음 입력 된 가장 큰 홀수를 인쇄합니다. 홀수를 입력하지 않은 경우 해당 효과에 대한 메시지를 인쇄합니다.

저는이 문제를 파이썬으로 해결하려고 노력해 왔고 홀수의 수학적 정의를 고려할 때 가능한 모든 경우를 다루는 방법을 알아 냈다고 생각합니다. 확실히하기 위해 귀하의 기준에 따라 내 코드가 올바른지 확인하고 싶습니다.

counter = 0
odd = []

while counter < 10:
    x = int(input("Enter a number: "))
    if abs(x)%2 != 0:
        odd.append(x)
    counter += 1

if len(odd) == 0:
    print("No odd number was entered")
else:
    print("The largest odd number is:", max(odd))

답변

19 MarioIshac Aug 19 2020 at 07:14

현재 프로그램에 대해 몇 가지를 개선 할 수 있습니다.

  1. 이므로 이름 odd을 변경 합니다 .oddslist
  2. not odds대신 사용하십시오 len(odds) == 0( 이 옵션이 선호되는 이유 는 목록이 비어 있는지 어떻게 확인합니까? 를 참조하십시오 ).
  3. 삭제 counter. 우리는 단지 사용하기 때문에 counterwhile조건, 우리가 실제로 전체 대체 할 수있는 while과를 for _ in range(10).
  4. PEP 8을 따릅니다 . 예를 들어 각 들여 쓰기 수준에 4 개의 공백을 사용합니다.

이러한 모든 변경 사항을 고려하면 다음과 같은 이점이 있습니다.

odds = []

for _ in range(10):
    x = int(input("Enter a number: "))
    if abs(x) % 2 != 0:
        odds.append(x)

if not odds:
    print("No odd number was entered")
else:
    print("The largest odd number is:", max(odds))

그러나 우리는 또한이 프로그램의 효율성을 향상시킬 수 있습니다. 지금 우리는 최대 값을 선택하기 전에 모든 홀수를 추적합니다. 이것은 공간 복잡성이 O (N)임을 의미합니다. 다음과 같이 가장 큰 홀수를 추적하여이를 O (1)로 변경할 수 있습니다.

max_odd = None

for _ in range(10):
    x = int(input("Enter a number: "))

    if abs(x) % 2 != 0:
        max_odd = x if max_odd is None else max(max_odd, x)

if max_odd is None:
    print("No odd number was entered")
else:
    print("The largest odd number is: ", max_odd)

None지금까지 홀수를 입력하지 않았 음을 나타 내기 위해 사용 합니다.이 경우 홀수를 입력 max_odd하면 x직접 설정 합니다 . 그렇지 않으면로 설정 max_odd합니다 max(max_odd, x).

이러한 유형의 프로그램의 경우 공간 복잡성 감소로 인한 효율성 증가를 알 수 없습니다. 그러나 이러한 감소가 가능한 곳을 인식하는 방법을 배우면 중요한 프로그램에서 동일한 패턴을 볼 수 있습니다.

드디어 할 수있는 일이 하나 더 있습니다. 이 프로그램은이하는 경우에 숫자를 축적 유지할 수 있도록하려면 str숫자 (예로서 구문 분석 할 수없는 실수로 입력 한 ""), 우리가 사용할 수 있습니다 try/ exceptA의 포장 while과 같이 :

while True:
    try:
        x = int(input("Enter a number: "))
        break
    except ValueError:
        continue

이것은 다음을 대체합니다.

x = int(input("Enter a number: "))

원래 코드에서. 그러면 사용자가 입력 strint때까지 로 구문 분석 할 수있는 a를 입력하라는 메시지가 계속 표시됩니다. 이 모든 것이 동일한 반복에서 발생하기 때문에 for입력하는 숫자의 수 (이 경우 10)는 줄어들지 않습니다.

6 GZ0 Aug 19 2020 at 08:58

이전 리뷰에 추가 :

  • When xis an integer, abs(x) % 2is equal to x % 2in Python. 모듈로 연산자의 출력은 %두 번째 피연산자와 동일한 부호를 갖습니다.
  • 메서드 / 클래스 외부에서 코드를 실행할 때 코드를 메인 가드 안에 넣는 것이 좋습니다 . 자세한 설명 은 여기 를 참조 하십시오 .

Python 3.8에서는 함수 :=와 함께 할당 연산자를 사용하여 코드를 줄일 수 있습니다 max.

if __name__ == "__main__":
    # Number generator
    num_gen = (o for _ in range(10) if (o := int(input("Enter a number: "))) % 2 != 0)
    max_odd = max(num_gen, default=None)
    if max_odd is None:
        print("No odd number was entered")
    else:
        print(f"The largest odd number is: {max_odd}")

int(input("Enter a number: "))함수로 래핑 하면 가독성이 향상됩니다.

def read_input() -> int:
    return int(input("Enter a number: "))

if __name__ == "__main__":
    num_gen = (o for _ in range(10) if (o := read_input()) % 2 != 0)
    max_odd = max(num_gen, default=None)
    if max_odd is None:
        print("No odd number was entered")
    else:
        print(f"The largest odd number is: {max_odd}")

잘못된 사용자 입력을 처리하는 또 다른 변형은 다음과 같습니다.

def read_input() -> int:
    while True:
        try:
            return int(input("Enter a number: "))
        except ValueError:
            continue

if __name__ == "__main__":
    try:
        max_odd = max(o for _ in range(10) if (o := read_input()) % 2 != 0)
        print(f"The largest odd number is: {max_odd}")
    except ValueError:
        # Since read_input() no longer raises ValueError, the except
        # statement here only handles the cases where max() gets no inputs
        print("No odd number was entered")
3 AlexeyBurdin Aug 19 2020 at 12:56

파이썬 이전에 어떤 프로그래밍 언어를 연습했는지 물어봐도 될까요?
이것에 대해 한 줄짜리를 언급하고 싶습니다.

max(l,key=lambda x:(x%2,x))

이미 l어떻게 든 입력 했다고 가정합니다.

s='Enter a number: '
l=[int(input(s)) for i in range(10)]

코드는 어떻게 작동합니까? 최대의 key(x)for xin을 찾고 l그러한 x. 여기서 핵심은 (1,x)홀수 x및 짝수 에 (0,x)대해 튜플 을 반환하는 람다 함수입니다 x. 튜플은 왼쪽에서 오른쪽으로 비교됩니다 (예 : (1,x)>(0,y)every xy. 그래서 우리는 " l홀수는 항상 짝수보다 크다고 가정 하여 최대 값을 줘"라고 말하는 것입니다.

따라서 모든 프로그램은 다음과 같습니다.

s='Enter a number: '
l=[int(input(s)) for i in range(10)]
m=max(l,key=lambda x:(x%2,x))
if m%2:
    print('The largest odd number is: %d'%m)
else: #the greatest is even, therefore no odd numbers
    print('No odd number was entered')

파이썬처럼 짧고 멋지고 쉽습니다.

그러나 나는 int(input())홀수 값의 전체 목록을 미리 저장하지 않고 수락 된 답변을 둘러싼 try-except 블록 이 유용하다는 데 동의합니다.

저는 파이썬에서 함수형 프로그래밍의 패러다임을 보여주고 싶었습니다. 여러분이 파이썬에게 '나는 그것을 원합니다 (예 : 최대 값)'라고 말하고 그것이 여러분을 위해 해줄 때, 어떻게해야하는지 설명 할 필요가 없습니다.

읽어 주셔서 감사합니다.

3 EmilioMBumachar Aug 19 2020 at 21:36

나는 받아 들여진 대답의 마지막 제안을 토대로 노력할 것이다.

while True:
    try:
        x = int(input("Enter a number: "))
        break
    except ValueError:
        continue

나는 확실히이 제안을지지한다. 그것은 당신의 프로그램이 단지 충돌하는 대신에 유효하지 않은 입력을 처리 할 수 ​​있도록한다.

그러나 사용성 문제가 발생합니다. 숫자에 문자를 입력 한 사용자는 아마 눈치 채지 못했을 것입니다. 그들은 그들이 의도 한 번호를 얻었다 고 생각하고, 다음 번호를 진행 한 다음, 그들이 모든 번호를 입력 했다고 생각할 때 결국 혼란 스러울 입니다. 그러나 컴퓨터는 여전히 다음 번호를 요구하고 있습니다.

피드백을 제공하는 것이 좋습니다.

while True:
    try:
        x = int(input("Enter a number: "))
        break
    except ValueError:
        print("Invalid number will be ignored.")
        continue

... 또는 더 좋은 방법은 입력 한 번호를 다시 인쇄하십시오.

while True:
    try:
        inputString = input("Enter a number: ")
        x = int(inputString)
        break
    except ValueError:
        print("Invalid number will be ignored: {}".format(inputString))
        continue

또한 입력 한 유효한 숫자의 전체 목록을 홀수뿐 아니라 결과 전에 사용자에게 다시 인쇄하여 오타를 발견 할 수있는 마지막 기회를 제공하는 것도 고려할 것입니다. 결국 그들은 유효하지만 의도하지 않은 번호를 잘못 입력했을 수 있습니다. 이로 인해 메모리 사용량이 증가하고 일부는 과도한 통신으로 간주합니다.

print("Numbers provided are: {}".format(all_valid_numbers_inputted))
if not odds:
    print("No odd number was entered")
else:
    print("The largest odd number is:", max(odds))

이렇게하면 다음 단계는 "odds"변수를 제거하고 전체 목록에서 직접 가장 큰 홀수를 알아내는 것입니다.

1 FMc Aug 25 2020 at 12:23

여기서 요점은 프로세스의 각 단계가 한 가지 간단한 작업을 수행한다는 것입니다. 그런 식으로 프로그램을 빌드합니다. 한 번에 하나씩 엄격하게 정의 된 단계입니다. 모든 것을 뒤죽박죽으로 섞지 마십시오. 예를 들어 사용자와 상호 작용하면서 나중에 필요한 변환 및 계산을 수행하는 루프가 있습니다.

def as_int(s):
    try:
        return int(s)
    except Exception:
        return 0

N = 3
MSG = 'Enter number: '

replies = [input(MSG) for _ in range(N)]  # Interact.
nums = [as_int(r) for r in replies]       # Convert.
odds = [n for n in nums if n % 2]         # Compute.

if odds:                                  # Report.
    print(max(odds))