가장 큰 홀수
사용자에게 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))
답변
현재 프로그램에 대해 몇 가지를 개선 할 수 있습니다.
- 이므로 이름
odd
을 변경 합니다 .odds
list
not odds
대신 사용하십시오len(odds) == 0
( 이 옵션이 선호되는 이유 는 목록이 비어 있는지 어떻게 확인합니까? 를 참조하십시오 ).- 삭제
counter
. 우리는 단지 사용하기 때문에counter
의while
조건, 우리가 실제로 전체 대체 할 수있는while
과를for _ in range(10)
. - 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
/ except
A의 포장 while
과 같이 :
while True:
try:
x = int(input("Enter a number: "))
break
except ValueError:
continue
이것은 다음을 대체합니다.
x = int(input("Enter a number: "))
원래 코드에서. 그러면 사용자가 입력 str
할 int
때까지 로 구문 분석 할 수있는 a를 입력하라는 메시지가 계속 표시됩니다. 이 모든 것이 동일한 반복에서 발생하기 때문에 for
입력하는 숫자의 수 (이 경우 10)는 줄어들지 않습니다.
이전 리뷰에 추가 :
- When
x
is an integer,abs(x) % 2
is equal tox % 2
in 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")
파이썬 이전에 어떤 프로그래밍 언어를 연습했는지 물어봐도 될까요?
이것에 대해 한 줄짜리를 언급하고 싶습니다.
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 x
in을 찾고 l
그러한 x
. 여기서 핵심은 (1,x)
홀수 x
및 짝수 에 (0,x)
대해 튜플 을 반환하는 람다 함수입니다 x
. 튜플은 왼쪽에서 오른쪽으로 비교됩니다 (예 : (1,x)>(0,y)
every x
및 y
. 그래서 우리는 " 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 블록 이 유용하다는 데 동의합니다.
저는 파이썬에서 함수형 프로그래밍의 패러다임을 보여주고 싶었습니다. 여러분이 파이썬에게 '나는 그것을 원합니다 (예 : 최대 값)'라고 말하고 그것이 여러분을 위해 해줄 때, 어떻게해야하는지 설명 할 필요가 없습니다.
읽어 주셔서 감사합니다.
나는 받아 들여진 대답의 마지막 제안을 토대로 노력할 것이다.
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"변수를 제거하고 전체 목록에서 직접 가장 큰 홀수를 알아내는 것입니다.
여기서 요점은 프로세스의 각 단계가 한 가지 간단한 작업을 수행한다는 것입니다. 그런 식으로 프로그램을 빌드합니다. 한 번에 하나씩 엄격하게 정의 된 단계입니다. 모든 것을 뒤죽박죽으로 섞지 마십시오. 예를 들어 사용자와 상호 작용하면서 나중에 필요한 변환 및 계산을 수행하는 루프가 있습니다.
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))