The other answers and comments suggesting lists and loops are much nicer, but they're not the only way to change and shorten your code.
In your tests, the else: a = a
sections are doing nothing, assigning a
to itself is no change, so they can all be removed, and the if
tests brought onto one line each:
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.'
That's the most obvious change that makes it easier to follow, without fundamentally changing the pattern of what you are doing.
After that, there are ways you could rewrite it - for example, staying with math only, even numbers divide by 2 with remainder 0 and odd numbers have remainder 1. So doing (x % 2) * x
will change even numbers into 0, but keep odd numbers the same.
So you could replace all the if tests, with no test, just an assignment:
a = (a % 2) * a
b = (b % 2) * b
c = (c % 2) * c
...
if e%2 == 0: e = 0
if f%2 == 0: f = 0
The lines get slightly shorter, and if you're OK with how that works, you could merge those into the value
line, and put that straight into max
to get:
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.'
There isn't really a way to shorten assigning ten variables without some kind of loop, and it's arguable whether any of this is 'more easily expressing the program', but it does take 58 lines down to 17, remove 10 conditional tests, 10 else/no-op assignments and 1 variable while keeping approximately the same structure / workings.
PS. I changed max = max()
because calling your variable by the same name as the function is a bad idea - you can't use the function again, and it's confusing to other Python programmers reading your code who already know what 'max' does, if you've reused that name for something else.
Edit: A commentor suggests negative numbers matter. The above writing answers "here's my code, how could I express it more easily?" without introducing any new Python or changing the behaviour, but it cannot handle negative odd numbers; max()
will always choose a zero over a negative odd number, and the program will wrongly answer that "there are no odd numbers".
I don't think that's fixable without introducing any new concepts at all. And if introducing new concepts is happening, use lists and loops. Andy's suggestion to build a list that includes only the odd numbers, and then take the max value of that, for example.
But, doing something to handle them without lists -- there is another approach that hardly changes the shape of the code at all, introducing the boolean OR
operation, which compares two true/false values and returns false if they are both false, otherwise true.
Python does a lot of automagic behind-the-scenes conversion to true/false to make logical operators work well. Variables with no value (zero, empty containers, empty strings) are all "false" and variables with some value are all "true".
From earlier, we have one bit that knocks even numbers to zero (a%2*a
) and now we want to knock zero off the numberline completely:
-3 or None -> -3
-1 or None -> -1
0 or None -> None
1 or None -> 1
3 or None -> 3
5 or None -> 5
Introducing: a%2*a or None
. It's magical, ugly, hard to follow, but valid Python -- and I'm chuffed because it's like solving a puzzle and it works, you know? Change the max line and the test to:
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 get squished to zeros, zeros get squished to nothing, odds come through unchanged. Max
now only has odd numbers to work with so it can now pick a negative odd number as the answer. Case closed. btw. use lists.