正在初始化用于比较的整数变量



我正在学习麻省理工学院开放式课件课程《Python计算机科学与编程导论》,我花了大量令人尴尬的时间试图理解课本上的"手指练习":

编写一个程序,检查三个变量——x、y和z——以及打印其中最大的奇数。如果它们都不奇怪,那应该打印一条这样的消息。

我写了几个解决方案,但都不太奏效,如果有更大的偶数,就会缺少奇数。我终于认输了,在这里寻找其他在这门课上工作的人提出的解决方案。AFDev的这个解决方案对我来说似乎是最简单的(从练习的意图和解决方案的简洁程度来看(

x=int(input('Enter your first number:'))
y=int(input('Enter your second number:'))
z=int(input('Enter your third number:'))
largest = None
if x%2:
largest = x
if y%2:
if y > largest:
largest = y
if z%2:
if z > largest:
largest = z
if largest:
print ('The largest odd number is', largest)
else:
print ('There are no odd numbers.')

只要x是一个奇数,这就非常有效。如果x是零或偶数,我会得到以下错误:

TypeError: '>' not supported between instances of 'int' and 'NoneType'

我在谷歌上搜索的一点点内容表明,Python 2在允许NoneType和整数之间进行比较方面更为自由。我更改了行以初始化largest = 0,但后来意识到,如果用户输入负数,这将给出无效的结果。

我调整了代码如下:

x=int(input('Enter your first number:'))
y=int(input('Enter your second number:'))
z=int(input('Enter your third number:'))
largest = None
if x%2:
largest = x
if y%2:
if largest == None:
largest = y
if y > largest:
largest = y
if z%2:
if largest == None:
largest = z
if z > largest:
largest = z
if largest:
print ('The largest odd number is', largest)
else:
print ('There are no odd numbers.')

有没有更好的方法初始化(因为没有更好的术语("最大",这样我就可以将其与整数进行比较,或者我这样做的方式足够好?

我知道有更好的方法可以比较数字来找到最大的(我在谷歌上搜索时发现了max(。我正试着慢慢地通过这些东西。

None如果你打算用这种方式来做的话似乎没问题。(我认为这比使用大负数更安全。(你可以用None来绕过代码重复,例如

if largest is None or y > largest:
largest = y

Noneis进行比较。其次,如果or的第一部分为True,则不会执行第二部分(称为短路(,因此在尝试使用>比较None时不会出现错误。

或者根本不初始化它——只保留一个布尔值来跟踪是否找到了奇数。

still_looking = True
if x % 2:
largest, still_looking = x, False
if y % 2 and (still_looking or y > largest):
largest, still_looking = y, False
if z % 2 and (still_looking or z > largest):
largest, still_looking = z, False
if still_looking:
print('There are no odd numbers.')
else:
print('The largest odd number is', largest)

开始时重复的代码尖叫着被一个统一的循环取代:

still_looking = True
for val in x, y, z:
if val % 2 and (still_looking or val > largest):
largest, still_looking = val, False

我想用一个很大的负数来确保你很好。做一些类似的事情:

largest = -float('inf')

最后检查:

if largest == -float('inf'):
print("There are no odd numbers")
else:
print(largest)

我会这么做:

x=int(input('Enter your first number:'))
y=int(input('Enter your second number:'))
z=int(input('Enter your third number:'))
li=[e for e in (x,y,z) if e % 2]   # find all odd numbers from x,y,z
print('{} is largest odd number'.format(max(li)) if li else 'all input even')

这是因为Python中的空容器是False,如果没有奇数,则列表li将为空。如果有,可以使用max找到最大奇数,并且[if true clause] if [boolean test] else [what do do otherwise]的Python三进制

你可以用这种方式做同样的事情:

li=[e for e in (x,y,z) if e % 2]
if li:
print ('The largest odd number is', max(li))
else:
print ('There are no odd numbers.') 

如果您不想使用max函数,您可以编写自己的:

def mymax(li):
max_=None 
if li:
max_=li[0]
for e in li:
if e>max_: max_=e
return max_     

而不是放入:

largest = None

你应该放:

largest = -1 * sys.maxsize + 1

最新更新