Python,最大奇数
Posted
技术标签:
【中文标题】Python,最大奇数【英文标题】:Python, largest odd integer 【发布时间】:2015-01-16 07:08:57 【问题描述】:我是编码新手,现在已经学习了几天。我用 Python 编写了这个程序,同时跟随了一些 MIT OpenCourseware 讲座和几本书。有没有更容易表达程序的方法?
手指练习:编写一个程序,要求用户输入 10 个整数,然后打印输入的最大奇数。如果没有输入奇数,它应该打印一条消息。
a = int(raw_input('Enter your first integer: '))
b = int(raw_input('Enter your second integer: '))
c = int(raw_input('Enter your third integer: '))
d = int(raw_input('Enter your fourth integer: '))
e = int(raw_input('Enter your fifth integer: '))
f = int(raw_input('Enter your sixth integer: '))
g = int(raw_input('Enter your seventh integer: '))
h = int(raw_input('Enter your eighth integer: '))
i = int(raw_input('Enter your ninth integer: '))
j = int(raw_input('Enter your tenth integer: '))
if a%2 ==0:
a = 0
else:
a = a
if b%2 ==0:
b = 0
else:
b = b
if c%2 ==0:
c = 0
else:
c = c
if d%2 ==0:
d = 0
else:
d = d
if e%2 ==0:
e = 0
else:
e = e
if f%2 ==0:
f = 0
else:
f = f
if g%2 ==0:
g = 0
else:
g = g
if h%2 ==0:
h = 0
else:
h = h
if i%2 ==0:
i = 0
else:
i = i
if j%2 ==0:
j = 0
else:
j = j
value = a, b, c, d, e, f, g, h, i, j
max = max(value)
if max ==0:
print 'There are no odd numbers.'
else:
print max, 'is the largest odd integer.'
【问题讨论】:
请忽略 a 和 b 的 if 语句中的间距。原始代码有适当的间距。 是的,非常重要;研究循环和列表。 基本上你想要做的是将输入读入一个数组,然后循环遍历它,在每次迭代中设置一个顶部变量,然后返回顶部。 你可以开始查找循环。 其他人关于循环和列表的cmets是正确的。此外,您在此处获得的代码实际上在某些输入上失败 - 如果我输入十个负数,其中至少一个偶数和一个奇数,最大值将为0
,但正确答案将是负赔率之一.
【参考方案1】:
更紧凑的形式是:
from __future__ import print_function
try: # Python 2
raw_input
except NameError: # Python 3 compatibility
raw_input = input
largest = None
for i in range(1, 11):
number = int(raw_input('Enter integer #%d: ' % i))
if number % 2 != 0 and (not largest or number > largest):
largest = number
if largest is None:
print("You didn't enter any odd numbers")
else:
print("Your largest odd number was:", largest)
这使用一个简单的循环来跟踪输入了多少整数,但只存储迄今为止遇到的最大奇数。
【讨论】:
【参考方案2】:numbers = [input('Enter a number: ') for i in range(10)]
odds = [x for x in numbers if x % 2 == 1]
if odds:
print max(odds)
else:
print 'No odd numbers input'
解释:
numbers = [input('Enter a number: ') for i in range(10)]
此行使用list comprehension 向用户询问 10 个号码。这些数字将在列表对象numbers
odds = [x for x in numbers if x % 2 == 1]
接下来,我们使用另一个列表推导来过滤掉numbers
中所有非奇数的数字。由于奇数 modulo 2 总是等于 1,因此我们得到了一个仅包含奇数的新列表 (odd
)。
if odds:
这是使用python的truthy的测试方式。特别是,如果列表为空,则为False
。如果列表不为空,则为True
。
print max(odds)
最后,如果上面是True
,我们打印odds
列表中的max
值
else:
print 'No odd numbers input'
如果if
语句是False
(没有几率)我们告诉用户
运行中的副本如下所示:
Enter a number: 10
Enter a number: 12
Enter a number: 14
Enter a number: 15
Enter a number: 16
Enter a number: 17
Enter a number: 1
Enter a number: 2
Enter a number: 19
Enter a number: 2
19
【讨论】:
【参考方案3】:建议列表和循环的其他答案和 cmets 要好得多,但它们不是更改和缩短代码的唯一方法。
在您的测试中,else: a = a
部分什么都不做,将a
分配给自身并没有改变,因此它们都可以被删除,并且if
测试各放在一行:
a = int(raw_input('Enter your first integer: '))
b = int(raw_input('Enter your second integer: '))
c = int(raw_input('Enter your third integer: '))
d = int(raw_input('Enter your fourth integer: '))
e = int(raw_input('Enter your fifth integer: '))
f = int(raw_input('Enter your sixth integer: '))
g = int(raw_input('Enter your seventh integer: '))
h = int(raw_input('Enter your eighth integer: '))
i = int(raw_input('Enter your ninth integer: '))
j = int(raw_input('Enter your tenth integer: '))
if a%2 == 0: a = 0
if b%2 == 0: b = 0
if c%2 == 0: c = 0
if d%2 == 0: d = 0
if e%2 == 0: e = 0
if f%2 == 0: f = 0
if g%2 == 0: g = 0
if h%2 == 0: h = 0
if i%2 == 0: i = 0
if j%2 == 0: j = 0
value = a, b, c, d, e, f, g, h, i, j
max = max(value)
if max ==0:
print 'There are no odd numbers.'
这是最明显的变化,它使您更容易遵循,而不会从根本上改变您正在做的事情的模式。
之后,您可以通过多种方式重写它 - 例如,仅使用数学运算,偶数除以 2 余数为 0,奇数数余数为 1。因此,(x % 2) * x
会将偶数更改为 0,但是保持奇数不变。
所以你可以替换所有的 if 测试,没有测试,只是一个赋值:
a = (a % 2) * a
b = (b % 2) * b
c = (c % 2) * c
...
if e%2 == 0: e = 0
if f%2 == 0: f = 0
这些行会稍微短一些,如果您对它的工作方式感到满意,您可以将它们合并到 value
行中,然后将其直接放入 max
以获得:
a = int(raw_input('Enter your first integer: '))
b = int(raw_input('Enter your second integer: '))
c = int(raw_input('Enter your third integer: '))
d = int(raw_input('Enter your fourth integer: '))
e = int(raw_input('Enter your fifth integer: '))
f = int(raw_input('Enter your sixth integer: '))
g = int(raw_input('Enter your seventh integer: '))
h = int(raw_input('Enter your eighth integer: '))
i = int(raw_input('Enter your ninth integer: '))
j = int(raw_input('Enter your tenth integer: '))
largest = max(a%2*a, b%2*b, c%2*c, d%2*d, e%2*e, f%2*f, g%2*g, h%2*h, i%2*i, j%2*j)
if largest == 0:
print 'There are no odd numbers.'
else:
print largest, 'is the largest odd integer.'
实际上没有办法在没有某种循环的情况下缩短分配 10 个变量的时间,这是否“更容易表达程序”是有争议的,但它确实需要 58 行到 17 行,删除 10 个条件测试、10 个 else/no-op 分配和 1 个变量,同时保持大致相同的结构/工作原理。
PS。我更改了max = max()
,因为以与函数相同的名称调用您的变量是一个坏主意 - 您不能再次使用该函数,并且如果其他 Python 程序员阅读您的代码,他们已经知道“max”的作用,那么这会让他们感到困惑您已将该名称用于其他用途。
编辑:评论员建议负数很重要。上面的写作回答“这是我的代码,我怎样才能更容易地表达它?”没有引入任何新的 Python 或改变行为,但它不能处理负奇数; max()
总是会选择零而不是负奇数,程序会错误地回答“没有奇数”。
如果不引入任何新概念,我认为这是无法解决的。如果要引入新概念,使用列表和循环。 Andy 建议构建一个仅包含奇数的列表,然后取其中的最大值。
但是,在不使用列表的情况下处理它们——还有另一种方法几乎不会改变代码的形状,它引入了布尔OR
操作,它比较两个真/假值,如果它们是则返回假都为假,否则为真。
Python 会在后台进行大量自动转换为真/假,以使逻辑运算符正常工作。没有值的变量(零、空容器、空字符串)都是“假”,而有一些值的变量都是“真”。
从早些时候开始,我们有一个位可以将偶数击倒为零 (a%2*a
),现在我们想要将数字轴上的零完全击倒:
-3 or None -> -3
-1 or None -> -1
0 or None -> None
1 or None -> 1
3 or None -> 3
5 or None -> 5
介绍:a%2*a or None
。它神奇、丑陋、难以理解,但却是有效的 Python —— 我很高兴,因为它就像解决一个难题,而且它有效,你知道吗?将最大线和测试更改为:
largest = max(a%2*a or None, b%2*b or None, c%2*c or None, d%2*d or None, e%2*e or None,
f%2*f or None, g%2*g or None, h%2*h or None, i%2*i or None, j%2*j or None)
if largest == None:
偶数被压成零,零被压成零,赔率不变。 Max
现在只能使用奇数,因此它现在可以选择负奇数作为答案。结案。顺便提一句。使用列表。
【讨论】:
负输入怎么办? @emodendroket :然后它失败了,选择 0 作为 max() 并说没有奇数。 我知道;如果不解决这个问题,我认为这不是一个完整的答案。 @emodendroket :好的,我已经更新了我的答案以考虑负数。 由于n or None
而投反对票,这在 Python 3 中绝对行不通。【参考方案4】:
此代码也应该可以正常工作。针对 python 2.7 测试的语法
def tenX(): #define function
ten = [] #empty list for user input
odds = [] #empty list for odd numbers only
counter = 10
ui = 0
while counter > 0 :
ui = raw_input('Enter a number: ')
ten.append(int(ui)) #add every user input to list after int conversion
counter -= 1
for i in ten:
if i % 2 != 0:
odds.append(i)
print "The highest number is", max(odds) #max() returns highest value in a list
>>> tenX() #call function
【讨论】:
【参考方案5】:Python 有名为 list
和 tuple
的对象,它们表示数字序列——它们的用途与其他编程语言中的“数组”有许多相同的用途。 list
的示例是 [1,2,3,4,5]
与大多数流行的编程语言一样,Python 也有 for
循环的概念。
myList = [1,2,3,4,5]
for x in myList:
print(x)
Python 还有一个有点不寻常但非常有用的结构,称为“列表推导式”,它结合了for
循环、list
和一个可选的条件,以一种简洁的语法——看看这些例子,看看你是否能理解结果与代码有关
myNewList = [x+1 for x in myList]
myNewSelectiveList = [x+1 for x in myList if x >= 3]
下面是一个对你的练习特别有用的例子:
userInputs = [int(raw_input('Enter a number:')) for i in range(10)]
最后,有一个函数max
可以将list
作为其参数,并返回列表中最大的项目。一旦你在一个列表中有 10 个输入,你应该能够使用这些成分在一个非常短的行中找到最大的奇数(max
在列表推导中,其中包含 if
条件)。
【讨论】:
【参考方案6】:比较 10 个输入并打印最大的奇数
y = 0
for counter in range(10):
x = int(input("Enter a number: "))
if (x%2 == 1 and x > y):
y = x
if (y == 0):
print("All are even")
else:
print(y, "is the largest odd number")
【讨论】:
请考虑在您的帖子中添加有关代码的更多详细信息!感谢您加入 Stack Overflow!【参考方案7】:我也在从头开始研究 Guttag 的书。我提出了以下解决方案:
list = []
odds = False
print('You will be asked to enter 10 integer numbers, one at a time.')
for i in range(1,11):
i = int(input('Number: '))
list.append(i)
list = sorted(list, reverse = True)
for j in list:
if j%2 == 1:
print('The largest odd number is', j, 'from', list)
odds = True
break
if odds == False:
print('There is no odd number from', list)
我经历了一个类似于 OP 的长(er)版本,但由于 MIT 6.00x 的阅读清单明确建议在第 2 章旁边学习主题 3.2,我认为这些清单是一个可以接受的答案。
上面的代码应该允许负数和零。
【讨论】:
【参考方案8】:我也在研究 Guttag 的书,这个解决方案使用了上面的一些代码,但可能会有不同的想法。我立即过滤掉了用户输入,只包含奇整数输入。如果所有输入都是偶数,则列表为空,代码检查是否有空列表,然后对剩下的内容(奇数)进行排序并返回最后一个。请让我知道这是否有任何隐藏的问题(我对编写算法也很陌生)。
arr = []
max = 0
while max < 10:
userNum = int(input('enter an int: '))
if userNum %2 != 0:
arr.append(userNum)
max = max + 1
if len(arr) == 0:
print('all are even')
oddArr = sorted(arr)
print(oddArr[-1])
【讨论】:
【参考方案9】:试试下面的 -
def largest_odd():
q = int(input('Please enter a number: '))
w = int(input('Please enter a number: '))
e = int(input('Please enter a number: '))
lis = []
if q%2 != 0:
lis.insert (q,q)
if w%2 != 0:
lis.insert (w,w)
if e%2 != 0:
lis.insert (e,e)
Great = max(lis)
print(Great)
【讨论】:
【参考方案10】:我刚才也在做同样的练习,并提出了以下解决方案,它似乎工作得很好,并且与迄今为止书中教授的主题一致(变量赋值、条件和 while 循环):
锻炼: 编写一个程序,要求用户输入 10 个整数,然后 然后打印输入的最大奇数。如果没有输入奇数,它应该打印一条消息。
from __future__ import print_function
try: # Python 2
raw_input
except NameError: # Python 3 compatibility
raw_input = input
numbers_count = 0
next_input = 0
max_odd_number = None
while numbers_count < 10:
numbers_count += 1
next_input = raw_input("Please enter a number: " + str(numbers_count) +
" of 10\n")
if int(next_input)%2 != 0:
# on the entry of first number, we check max_odd_number - if it is of
# type None, it means no value has been assigned to it so far thus the
# first odd number entry becomes the first maximum odd number, be it
# positive or negative.
if max_odd_number == None:
max_odd_number = int(next_input)
if int(next_input) > max_odd_number:
max_odd_number = int(next_input)
if max_odd_number == None:
print ("None of the numbers entered were odd!")
else:
print ("Maximum odd number you entered is: " + str(max_odd_number))
任何 cmets 将不胜感激。
谢谢, 一个
【讨论】:
【参考方案11】:一个简单的答案是:
x = 0
result = None;
while(x < 10):
inputx = raw_input('Enter integer #%d: ' % x)
inputx = int(inputx)
if (inputx % 2 == 1):
if(inputx > result):
result = inputx
x += 1
if result is None:
print 'no odd number was entered'
else:
print result
注意:如果输入像'3f'这样的字符串,会抛出ValueError:
invalid literal for int() with base 10: '3f'
所以最后,最好的答案是
result = None
x = 0
while(x < 10):
inputx = raw_input('Enter integer #%d: ' % x)
try:
inputx = int(inputx)
except ValueError:
print'you enter value ',inputx,' is not a Integer. please try again!'
continue
if (inputx % 2 == 1):
if(inputx > result):
result = inputx
x+=1
if result is None:
print 'no odd number was entered'
else:
print 'the largest odd number is: ',result
【讨论】:
【参考方案12】:在 if 条件 和 while 迭代 语句提供知识之后在书中引入的问题。
虽然有很多数据类型可以在 python 中使用以获得简单的解决方案,但我们只需要使用非常基础的原语。
下面的代码接受 10 个用户输入(只有奇数)并输出 10 个数字中最大的一个。
问题答案:(代码)
a1= int(input("Enter the number1: "))
while a1%2 ==0:
print("Entered number is not an odd number.")
a1= int(input("Enter the number1: "))
a2= int(input("Enter the number2: "))
while a2%2 ==0:
print("Entered number is not an odd number.")
a2= int(input("Enter the number2: "))
a3= int(input("Enter the number3: "))
while a3%2 ==0:
print("Entered number is not an odd number.")
a3= int(input("Enter the number3: "))
a4= int(input("Enter the number4: "))
while a4%2 ==0:
print("Entered number is not an odd number.")
a4= int(input("Enter the number4: "))
a5= int(input("Enter the number5: "))
while a5%2 ==0:
print("Entered number is not an odd number.")
a5= int(input("Enter the number5: "))
a6= int(input("Enter the number6: "))
while a6%2 ==0:
print("Entered number is not an odd number.")
a6= int(input("Enter the number6: "))
a7= int(input("Enter the number7: "))
while a7%2 ==0:
print("Entered number is not an odd number.")
a7= int(input("Enter the number7: "))
a8= int(input("Enter the number8: "))
while a8%2 ==0:
print("Entered number is not an odd number.")
a8= int(input("Enter the number8: "))
a9= int(input("Enter the number9: "))
while a9%2 ==0:
print("Entered number is not an odd number.")
a9= int(input("Enter the number9: "))
a10= int(input("Enter the number10: "))
while a10%2 ==0:
print("Entered number is not an odd number.")
a10= int(input("Enter the number10: "))
if a1>a2 and a1>a3 and a1>a4 and a1>a5 and a1>a6 and a1>a7 and a1>a8 and a1>a9 and a1>a10:
print(str(a1) +" is the largest odd number.")
elif a2>a1 and a2>a3 and a2>a4 and a2>a5 and a2>a6 and a2>a7 and a2>a8 and a2>a9 and a2>a10:
print(str(a2) +" is the largest odd number.")
elif a3>a1 and a3>a2 and a3>a4 and a3>a5 and a3>a6 and a3>a7 and a3>a8 and a3>a9 and a3>a10:
print(str(a3) +" is the largest odd number.")
elif a4>a1 and a4>a2 and a4>a3 and a4>a5 and a4>a6 and a4>a7 and a4>a8 and a4>a9 and a4>a10:
print(str(a4) +" is the largest odd number.")
elif a5>a1 and a5>a2 and a5>a3 and a5>a4 and a5>a6 and a5>a7 and a5>a8 and a5>a9 and a5>a10:
print(str(a5) +" is the largest odd number.")
elif a6>a1 and a6>a2 and a6>a3 and a6>a4 and a6>a5 and a6>a7 and a6>a8 and a6>a9 and a6>a10:
print(str(a6) +" is the largest odd number.")
elif a7>a1 and a7>a2 and a7>a3 and a7>a4 and a7>a5 and a7>a6 and a7>a8 and a7>a9 and a7>a10:
print(str(a7) +" is the largest odd number.")
elif a8>a1 and a8>a2 and a8>a3 and a8>a4 and a8>a5 and a8>a6 and a8>a7 and a8>a9 and a8>a10:
print(str(a8) +" is the largest odd number.")
elif a9>a1 and a9>a2 and a9>a3 and a9>a4 and a9>a5 and a9>a6 and a9>a7 and a9>a8 and a9>a10:
print(str(a9) +" is the largest odd number.")
else:
print(str(a10) +" is the largest odd number.")
希望这会有所帮助。
【讨论】:
【参考方案13】:我只是在寻找替代答案时发现了这个问题,这是我的代码:
注意:我稍微更改了代码,以便我可以决定要输入多少个数字
alist=[]
olist=[]
num=int(input("how many numbers ? : "))
for n in range(num):
numbers=int(input())
alist.append(numbers)
for n in range(len(alist)):
while alist[n]%2 != 0 :
olist.append(alist[n])
break
else:
n +=1
olist.sort()
if len(olist) != 0:
print("biggest odd number: ",olist[-1])
else:
print("there is no odd number ")
【讨论】:
【参考方案14】:根据我的经验,更容易表达程序的方法是使用函数。 这将是我在为 Python 3.7.6 测试的语法中的答案:
'''
Finger exercise:
Write a program that asks the user to input 10 integers,
and then prints the largest odd number that was entered.
If no odd number was entered, it should print a message to that effect.
'''
def LargestOdd(numbers=[]):
'''
Parameters
----------
numbers : list, whcih should contain 10 integers.
DESCRIPTION. The default is [].
Returns
-------
The largest odd integer in the list number.
'''
odd_numbers=[]
if len(numbers)==10:
for n in numbers:
if n%2 != 0:
odd_numbers.append(n)
max_numb=max(odd_numbers)
print('The largest odd number is '+str(max_numb))
else:
print('Please, enter 10 numbers')
LargestOdd([1,2,3,7,45,8,9,10,30,33])
输出:最大奇数是45
【讨论】:
【参考方案15】:n = int(input("Enter the no of integers:"))
lst = []
count = 1
while count <=n:
no = int(input("Enter an integer:"))
count = count +1
if (no%2!=0):
lst.append(no)
print ("The list of odd numbers",lst)
print("The maximum number from the list of odd number is:",max(lst))
【讨论】:
【参考方案16】:这是我的解决方案:
def max_odd():
"""Returns largest odd number from given 10 numbers by the use.
if the input is not valid, the message is displayed to enter valid numbers"""
x = [input('Enter a value: ') for i in range(10)]
x = [int(i) for i in x if i]
if x:
try:
x = [i for i in x if i%2 != 0]
return(max(x))
except:
return('All even numbers provided.')
else:
return('Please enter a valid input')
【讨论】:
【参考方案17】:我从 Guttag 的书中开始学习编码。由于这是在第 2 章中,因此解决方案仅遵循基本的if
条件和while
循环
#input 10 integers
n1 = int(input('Enter 1st integer: '))
n2 = int(input('Enter 2nd integer: '))
n3 = int(input('Enter 3rd integer: '))
n4 = int(input('Enter 4th integer: '))
n5 = int(input('Enter 5th integer: '))
n6 = int(input('Enter 6th integer: '))
n7 = int(input('Enter 7th integer: '))
n8 = int(input('Enter 8th integer: '))
n9 = int(input('Enter 9th integer: '))
n10 = int(input('Enter 10th integer: '))
#create list from input
list = [n1,n2,n3,n4,n5,n6,n7,n8,n9,n10]
largest = list[0] #Assign largest to the first integer
x = 1 #index starts at 1
while x < len(list):
if list[x]%2 != 0:
if list[x] > largest:
largest = list[x]
x += 1
if largest%2 == 0:
print('All numbers are even')
else:
print('Largest odd number is', largest)
【讨论】:
【参考方案18】:这个问题在本书中很早,并且假设不了解列表,或者实际上是 Nonetype(它已经提到它但没有解释它是如何使用的)。此外,如果最高奇数为负数,这里的某些解决方案将不起作用,因为它们在循环之前初始化了最大 = 0。
这行得通:
iters = 10
largest = "spam"
while iters != 0:
user_num = int(input("Enter an integer: "))
if user_num % 2 != 0:
if largest == "spam" or user_num > largest:
largest = user_num
iters -= 1
if largest == "spam":
print("You did not enter an odd integer")
else:
print("The largest odd integer was", largest)
【讨论】:
以上是关于Python,最大奇数的主要内容,如果未能解决你的问题,请参考以下文章
python练习:编写一个程序,要求用户输入10个整数,然后输出其中最大的奇数,如果用户没有输入奇数,则输出一个消息进行说明。