我是编码的新手,现在已经学习了几天 . 我在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 回答
更紧凑的形式是:
这使用一个简单的循环来跟踪输入的整数,但只存储到目前为止遇到的最大奇数 .
Python有一些名为
list
和tuple
的对象,它们代表一系列数字 - 它们与其他编程语言中的"arrays"具有许多相同的用途 . 一个list
的例子是[1,2,3,4,5]
像大多数流行的编程语言一样,Python也有
for
循环的概念 .Python也有一个有点不寻常但非常有用的结构,称为"list comprehension",它将
for
循环,list
和一个可选的条件组合在一个简洁的语法中 - 查看这些示例,看看你是否能理解结果与代码的关系这是一个在练习中特别有用的例子:
最后,有一个函数
max
,它可以将list
作为其参数,并返回列表中的最大项 . 一旦你在列表中有10个输入,你应该能够使用这些成分在一条相当短的行中找到最高的奇数(在列表理解中max
,其中包含if
条件) .说明:
此行使用list comprehension向用户询问10个号码 . 这些数字将在列表对象
numbers
中接下来我们使用另一个列表推导来过滤掉
numbers
中不奇怪的所有数字 . 由于奇数modulo 2总是等于1,因此我们给出了一个仅包含奇数的新列表(odd
) .这是使用python的truthy测试方式 . 特别是,如果列表为空,则为
False
. 如果列表不为空,则为True
.最后,如果以上是
True
,我们在odds
列表中打印max值如果
if
语句是False
(没有赔率),我们会告诉用户正在运行的副本如下所示:
我也是从零开始学习Guttag的书 . 我带来了以下解决方案:
我经历了一个类似于OP的长版本,但由于麻省理工学院6.00x的阅读清单明确建议在第2章学习主题3.2,我认为列表是可接受的答案 .
上面的代码应该允许负数和零 .
我也正在研究Guttag的书,这个解决方案使用了上面的一些代码,但可能会有不同的东西 . 我立即过滤掉用户输入以仅包含奇数整数输入 . 如果所有输入都是偶数,则列表为空,代码检查空列表,然后对剩余的任何内容(奇数整数)进行排序并返回最后一个 . 如果有任何隐藏的问题,请告诉我(我对编写算法也很新) .
其他答案和评论表明列表和循环更好,但它们不是改变和缩短代码的唯一方法 .
在你的测试中,
else: a = a
部分什么都不做,将a
分配给它本身没有变化,所以它们都可以被删除,并且if
测试分别带到一行:这是最明显的变化,使其更容易遵循,而不会从根本上改变您正在做的事情的模式 .
在那之后,有一些方法可以重写它 - 例如,只保留数学,偶数除以2,余数为0,奇数有余数1.所以做
(x % 2) * x
会将偶数改为0,但保持奇数相同 .所以你可以替换所有的if测试,没有测试,只需要一个赋值:
线条稍微短一点,如果你对它的工作方式没有问题,你可以将它们合并到
value
行,并将其直接放入max
以获得:在没有某种循环的情况下,没有办法缩短分配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
),现在我们想完全从数字线上敲零:介绍:
a%2*a or None
. 它充实了,因为它就像解决一个谜题一样有效,你知道吗?将最大行和测试更改为:Evens被压扁为零,零被压扁为零,几率不变 .
Max
现在只有奇数可以使用,所以它现在可以选择一个负奇数作为答案 . 案件结案 . 顺便说一句 . 使用清单 .比较10个输入并打印最高的奇数
尝试以下方法 -
此代码也可以正常工作 . 语法测试python 2.7