首页 文章

Python,最大的奇数

提问于
浏览
3

我是编码的新手,现在已经学习了几天 . 我在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.'

9 回答

  • 5

    更紧凑的形式是:

    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
    

    这使用一个简单的循环来跟踪输入的整数,但只存储到目前为止遇到的最大奇数 .

  • 1

    Python有一些名为 listtuple 的对象,它们代表一系列数字 - 它们与其他编程语言中的"arrays"具有许多相同的用途 . 一个 list 的例子是 [1,2,3,4,5]

    像大多数流行的编程语言一样,Python也有 for 循环的概念 .

    myList = [1,2,3,4,5]
    for x in myList:
        print(x)
    

    Python也有一个有点不寻常但非常有用的结构,称为"list comprehension",它将 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 条件) .

  • 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
    
  • 0

    我也是从零开始学习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的长版本,但由于麻省理工学院6.00x的阅读清单明确建议在第2章学习主题3.2,我认为列表是可接受的答案 .

    上面的代码应该允许负数和零 .

  • -1

    我也正在研究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])
    
  • 0

    其他答案和评论表明列表和循环更好,但它们不是改变和缩短代码的唯一方法 .

    在你的测试中, 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个其他/无操作分配和1个变量,同时保持大致相同的结构/工作 .

    PS . 我改变了 max = max() 因为调用你的变量与函数同名是一个坏主意 - 你可以让其他Python程序员阅读你已经知道'max'代码的代码而感到困惑,如果你重复使用那个名字的话 .

    Edit :评论员认为负数很重要 . 上面的内容在没有引入任何新的Python或改变行为的情况下回答了"here's my code, how could I express it more easily?",但它无法处理负奇数; max() 将始终在负奇数上选择零,程序将错误地回答"there are no odd numbers" .

    在没有引入任何新概念的情况下,我无法修复 . 如果正在引入新概念,请使用列表和循环 . Andy的建议是 Build 一个只包含奇数的列表,然后取其最大值 .

    但是,做一些没有列表处理它们的东西 - 还有另一种方法几乎不改变代码的形状,引入了布尔 OR 操作,它比较了两个真/假值,如果它们都是假的则返回false,否则为true .

    Python做了很多自动化的幕后转换为true / false,使逻辑运算符运行良好 . 没有值的变量(零,空容器,空字符串)都是“假”,具有某些值的变量都是“真” .

    从早些时候开始,我们有一位将偶数数字调到零( 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 . 它充实了,因为它就像解决一个谜题一样有效,你知道吗?将最大行和测试更改为:

    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:
    

    Evens被压扁为零,零被压扁为零,几率不变 . Max 现在只有奇数可以使用,所以它现在可以选择一个负奇数作为答案 . 案件结案 . 顺便说一句 . 使用清单 .

  • 1

    比较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")
    
  • 0

    尝试以下方法 -

    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)
    
  • 1

    此代码也可以正常工作 . 语法测试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
    

相关问题