首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写一个程序,要求用户输入10个整数,然后打印输入的最大奇数。

编写一个程序,要求用户输入10个整数,然后打印输入的最大奇数。
EN

Code Review用户
提问于 2023-05-02 18:23:07
回答 5查看 3.5K关注 0票数 16

我是一名机械工程师,已经开始从JohnV.Guttag的一本书“使用Python的计算和编程入门”中学习Python。这是其中一个例子。我知道这里有几个类似的问题,但我认为我的程序太简单了。以下是代码:

代码语言:javascript
复制
#Program to enter 10 numbers and finding the greatest odd number 

x = 0
counter = 1
while counter < 11:
    num = int(input('enter number'))
    if num%2 != 0 and num > x:
        x = num
    counter = counter + 1    
print(x)

它产生所需的输出。然而,由于我在这方面是一个完全的新手,我不知道这是否会引起任何进一步的问题。请分享你的反馈。

EN

回答 5

Code Review用户

发布于 2023-05-02 18:54:49

好吧,就像你说的,很管用。不过,我们还是可以挑一些大麻。

代码语言:javascript
复制
x = 0

这是可以的,但它可能不是最好的标识符选择。考虑将名称重命名为maximummax_val。另外,见下文,因为负数是有效的输入。

代码语言:javascript
复制
while counter < 11:

这是正确的。但是,对于第一次阅读这篇文章的人来说,可能不太明显,因为1的起始值,在CS圈中,这个值比0的起始值要少一些。

考虑一下把它重新定义为for counter in range(10),人类读者会立即将其识别为“哦,我们要这样做十次”(不是十一次)。如果counter的值在循环中是有意义的,那么range(1, 11)就相当于OP所做的事情。

代码语言:javascript
复制
    if num%2 != 0 and num > x:

黑色这样的实用程序可以使您的代码更加清晰。

代码语言:javascript
复制
    counter = counter + 1    

通常,我们更喜欢在递增某物时使用更简洁的符号:

代码语言:javascript
复制
    counter += 1    

这是干的的事。对于简单的标识符来说,这并不重要。对于多个单词标识符来说,只提及一次实际上是有帮助的。因此,+=操作符的效果是鼓励使用更长、更多的描述性标识符,而不是其他方便的方法。

代码语言:javascript
复制
print(x)

这是正确的,但没有可能那么有帮助。请随意给输出贴上标签,这样任何人都可以正确地解释输出,而无需阅读源代码:print("The maximum odd value entered was:", x)

注释给出了这个用例的规范:“输入10个数字.”。

人们可能会对“数字”一词吹毛求疵,因为进入3.14后,ValueError就会爆炸。我们会用“整数”,好吧。

但是事实证明,用户应该只提供非负整数。考虑找到-3-9的最大值。如果我们将“迄今看到的最大数字”初始化为零,那么-3将如何被报道为赢家?

要么初始化为“负无穷大”(这对于python来说有点困难,因为整数可能有超过64位,因此我们使用float('-inf') FP比较),或者限制有效输入的范围,或者初始化为像None这样的哨兵值。第一次通过循环,注意哨兵并复制用户的输入(如-9)。循环的其余部分的工作方式与OP描述的相同。

Python有一些您想要研究的更高级的概念。

函数

将此代码包装在def中是逻辑的下一步。

发生器

yield关键字对于您目前所处的位置有点高级。但是对这个问题进行编码的一种自然方法是def odd_number_filter(numbers):,它丢弃所有的偶数输入。

列出

我们不需要为每个输入号码分配存储空间,因为我们可以在一个时间内对它们进行操作。但是,将此任务分为三个顺序步骤可能比较方便:

  1. 提示用户输入所有数字
  2. 只过滤奇数
  3. return max(odd_numbers)

最后一步将利用python的一个内置函数:最大值。例如:

代码语言:javascript
复制
>>> max([5, 27, 11])
27
票数 18
EN

Code Review用户

发布于 2023-05-03 05:46:22

您的代码很好,但可能需要一些改进:

while循环

只需使用for循环即可:

代码语言:javascript
复制
for i in range(10):
    ...

查找最大(奇数)数

的方法

这是不实际的,而且它不适用于负数(如果所有的数字都是负数,那么它只会输出0)。

相反,我会:

代码语言:javascript
复制
nums = []
...
nums = [x for x in nums if x % 2 == 1]
max_num = max(nums)

print("Highest odd number:", str(max_num))

现在,您甚至可以使用列表理解来找到以下十个数字:

代码语言:javascript
复制
nums = [int(input("Enter a number: ")) for i in range(10)]

虽然这可能会妨碍你的可读性。

函数

如果计划多次运行此代码,则可能需要将代码放入函数中:

代码语言:javascript
复制
def greatest_odd_num():
    ...

完整代码:

代码语言:javascript
复制
def greatest_odd_num():
    nums = []

    for i in range(10):
        nums.append(int(input("Enter a number: ")))

    nums = [x for x in nums if x % 2 == 1]
    return max(nums)

greatest_num = greatest_odd_number()
print("Greatest Odd Number:", str(greatest_num))
票数 6
EN

Code Review用户

发布于 2023-05-03 01:01:20

负数呢?

如果用户输入十个负数(它们是有效整数),它们都不会大于0,因此程序将不接受一个奇数负数作为有效输入。因此,给出的值-10到-1将不会像它应该返回的-1。

在Python3中,int没有最大或最小大小,因此没有保证初始int值小于任何有效输入。您可以使用初始化为NoneOptional[int],将floatfloat('-inf')的初始值进行比较,或者使用另一个变量来记住是否见过任何奇怪的整数。

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/284768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档