Skip to main content
Clearer test of not none
Source Link
Toby Speight
  • 88.7k
  • 14
  • 104
  • 327
    numbers = [int(input('Enter the number: ')) for _ in range(10)]
    n = largest_odd(numbers)
    if n is not None:
        print(n)
    else:
        print("No odd numbers present")
#!/usr/bin/python3

def is_odd(n):
    return n % 2 == 1

def largest_odd(numbers):
    '''
    Return the largest odd number in the array,
    or None if there are no odd numbers

    Examples:
    >>> largest_odd([])
    
    >>> largest_odd([0,2])
    
    >>> largest_odd([0,2,1])
    1
    >>> largest_odd([0,-1,-5])
    -1
    >>> largest_odd([-5,-1,0])
    -1
    '''
    odd_numbers = filter(is_odd, numbers)
    return max(odd_numbers, default=None)

def input_integer(prompt):
    while (True):
        try:
            return int(input(prompt))
        except ValueError:
            print('An integer value is required')

if __name__ == '__main__':
    numbers = [input_integer('Enter the number: ') for _ in range(10)]
    n = largest_odd(numbers)
    if n is not None:
        print(f'The largest odd number was {n}')
    else:
        print('No odd numbers present')

if __name__ == '__main__':
    import doctest
    exit(doctest.testmod()[0] > 0)
    numbers = [int(input('Enter the number: ')) for _ in range(10)]
    n = largest_odd(numbers)
    if n:
        print(n)
    else:
        print("No odd numbers present")
#!/usr/bin/python3

def is_odd(n):
    return n % 2 == 1

def largest_odd(numbers):
    '''
    Return the largest odd number in the array,
    or None if there are no odd numbers

    Examples:
    >>> largest_odd([])
    
    >>> largest_odd([0,2])
    
    >>> largest_odd([0,2,1])
    1
    >>> largest_odd([0,-1,-5])
    -1
    >>> largest_odd([-5,-1,0])
    -1
    '''
    odd_numbers = filter(is_odd, numbers)
    return max(odd_numbers, default=None)

def input_integer(prompt):
    while (True):
        try:
            return int(input(prompt))
        except ValueError:
            print('An integer value is required')

if __name__ == '__main__':
    numbers = [input_integer('Enter the number: ') for _ in range(10)]
    n = largest_odd(numbers)
    if n:
        print(f'The largest odd number was {n}')
    else:
        print('No odd numbers present')

if __name__ == '__main__':
    import doctest
    exit(doctest.testmod()[0] > 0)
    numbers = [int(input('Enter the number: ')) for _ in range(10)]
    n = largest_odd(numbers)
    if n is not None:
        print(n)
    else:
        print("No odd numbers present")
#!/usr/bin/python3

def is_odd(n):
    return n % 2 == 1

def largest_odd(numbers):
    '''
    Return the largest odd number in the array,
    or None if there are no odd numbers

    Examples:
    >>> largest_odd([])
    
    >>> largest_odd([0,2])
    
    >>> largest_odd([0,2,1])
    1
    >>> largest_odd([0,-1,-5])
    -1
    >>> largest_odd([-5,-1,0])
    -1
    '''
    odd_numbers = filter(is_odd, numbers)
    return max(odd_numbers, default=None)

def input_integer(prompt):
    while (True):
        try:
            return int(input(prompt))
        except ValueError:
            print('An integer value is required')

if __name__ == '__main__':
    numbers = [input_integer('Enter the number: ') for _ in range(10)]
    n = largest_odd(numbers)
    if n is not None:
        print(f'The largest odd number was {n}')
    else:
        print('No odd numbers present')

if __name__ == '__main__':
    import doctest
    exit(doctest.testmod()[0] > 0)
More robust input
Source Link
Toby Speight
  • 88.7k
  • 14
  • 104
  • 327

Instead of print(n), we could produce more informative output. We'll use a Python-3 f-string for this:

        print(f'The largest odd number was {n}')

The f-string is a bit of magic that evaluates and replaces everything enclosed in braces, and it's very handing for formatting user output like this.

We can make it more robust by creating a function that repeatedly asks for input until an integer is provided:

def input_integer(prompt):
    while (True):
        try:
            return int(input(prompt))
        except ValueError:
            print('An integer value is required')

If we put it all together, the code looks like this:

#!/usr/bin/python3

def is_odd(n):
    return n % 2 == 1

def largest_odd(numbers):
    '''
    Return the largest odd number in the array,
    or None if there are no odd numbers

    Examples:
    >>> largest_odd([])
    
    >>> largest_odd([0,2])
    
    >>> largest_odd([0,2,1])
    1
    >>> largest_odd([0,-1,-5])
    -1
    >>> largest_odd([-5,-1,0])
    -1
    '''
    odd_numbers = filter(is_odd, numbers)
    return max(odd_numbers, default=None)

def input_integer(prompt):
    while (True):
        try:
            return int(input(prompt))
        except ValueError:
            print('An integer value is required')

if __name__ == '__main__':
    numbers = [input_integer('Enter the number: ') for _ in range(10)]
    n = largest_odd(numbers)
    if n:
        print(f'The largest odd number was {n}')
    else:
        print('No odd numbers present')

if __name__ == '__main__':
    import doctest
    exit(doctest.testmod()[0] > 0)

Important note

Be sure you're using Python 3, not Python 2:

  • Python 2 is in maintenance-only state now, and it's better to be learning the current language.
  • In Python 2, input() is dangerous because it interprets what is typed as a Python expression. If you cannot use Python 3, you should use raw_input() instead.
  • In Python 2, the default argument to max() is a positional argument, so you'd write max(odd_numbers, None) instead.

Instead of print(n), we could produce more informative output. We'll use a Python-3 f-string for this:

        print(f'The largest odd number was {n}')

The f-string is a bit of magic that evaluates and replaces everything enclosed in braces, and it's very handing for formatting user output like this.

We can make it more robust by creating a function that repeatedly asks for input until an integer is provided:

def input_integer(prompt):
    while (True):
        try:
            return int(input(prompt))
        except ValueError:
            print('An integer value is required')

If we put it all together, the code looks like this:

#!/usr/bin/python3

def is_odd(n):
    return n % 2 == 1

def largest_odd(numbers):
    '''
    Return the largest odd number in the array,
    or None if there are no odd numbers

    Examples:
    >>> largest_odd([])
    
    >>> largest_odd([0,2])
    
    >>> largest_odd([0,2,1])
    1
    >>> largest_odd([0,-1,-5])
    -1
    >>> largest_odd([-5,-1,0])
    -1
    '''
    odd_numbers = filter(is_odd, numbers)
    return max(odd_numbers, default=None)

def input_integer(prompt):
    while (True):
        try:
            return int(input(prompt))
        except ValueError:
            print('An integer value is required')

if __name__ == '__main__':
    numbers = [input_integer('Enter the number: ') for _ in range(10)]
    n = largest_odd(numbers)
    if n:
        print(f'The largest odd number was {n}')
    else:
        print('No odd numbers present')

if __name__ == '__main__':
    import doctest
    exit(doctest.testmod()[0] > 0)

Important note

Be sure you're using Python 3, not Python 2:

  • Python 2 is in maintenance-only state now, and it's better to be learning the current language.
  • In Python 2, input() is dangerous because it interprets what is typed as a Python expression. If you cannot use Python 3, you should use raw_input() instead.
  • In Python 2, the default argument to max() is a positional argument, so you'd write max(odd_numbers, None) instead.
Source Link
Toby Speight
  • 88.7k
  • 14
  • 104
  • 327

Re-read the problem statement - you missed this bit:

If no odd number was entered, it should print a message to that effect.


I'm not sure of your knowledge level, but I'll introduce the idea of a filter, which is the easiest way to select just the odd numbers from the array. Let's write a named function to detect odd numbers:

def is_odd(n):
    return n % 2 == 1

Then we can filter our numbers (let's give the list a more meaningful name than A, and use lower-case as that's Python standard):

    odd_numbers = filter(is_odd, numbers)

Once we have the odd numbers, we can use the built-in max function, though we need to provide a default value for when no numbers are odd:

    return max(odd_numbers, default=None)

We can put these together in a function:

def largest_odd(numbers):
    '''
    Return the largest odd number in the array,
    or None if there are no odd numbers

    Examples:
    >>> largest_odd([])
    
    >>> largest_odd([0,2])
    
    >>> largest_odd([0,2,1])
    1
    >>> largest_odd([0,-1,-5])
    -1
    >>> largest_odd([-5,-1,0])
    -1
    '''
    odd_numbers = filter(is_odd, numbers)
    return max(odd_numbers, default=None)

Notice that I've provided a description of what the function does, including examples. The description is called a docstring, and will become more important when you write more complex code. The examples are written in a particular form so they can be automatically tested using this bit of magic (don't worry too much about how it works just now):

if __name__ == '__main__':
    import doctest
    exit(doctest.testmod()[0] > 0)

To use largest_odd in a program, I suggest this:

    numbers = [int(input('Enter the number: ')) for _ in range(10)]
    n = largest_odd(numbers)
    if n:
        print(n)
    else:
        print("No odd numbers present")

That first line here is a list comprehension that calls input 10 times and creates an array.