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 有名为 listtuple 的对象,它们表示数字序列——它们的用途与其他编程语言中的“数组”有许多相同的用途。 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 - 简单表达式,用于查找n以下的最大奇数

python练习:编写一个程序,要求用户输入10个整数,然后输出其中最大的奇数,如果用户没有输入奇数,则输出一个消息进行说明。

找到最大奇数的最佳方法

最大奇数与最小偶数之差的绝对值

编程题#4:最大奇数与最小偶数之差的绝对值

Java 数组 定义一个数组,获取数组中的最大值和最小值,奇数个数和偶数个数