Skip to content
scipython.com

P4.4.1Hailstone sequence generator with a usage message

Modify the Hailstone sequence generator of Exercise P2.5.7 to generate the hailstone sequence starting at any positive integer, \(n\), that the user provides on the command line (use sys.argv). Handle the case where the user forgets to provide \(n\) or provides an invalid value for \(n\) gracefully.

Show solution

Here, we try to read the integer from the command line argument as a string at sys.argv[1]. If none was supplied by the user, this attempt will raise an IndexError (since sys.argv would be a list containing only the program name at sys.argv[0]); if the user supplied a command line argument but not one which can be cast to an integer, the line n = int(sys.argv[1]) will raise a ValueError. We also raise our own ValueError exception if the argument is an integer less than 1.

import sys

try:
    n = int(sys.argv[1])
    if n < 1:
        raise ValueError
except (IndexError, ValueError):
    print(f'Please enter an integer greater than 0 on the command line.\n'
          f'For example, python {sys.argv[0]} 8')
    sys.exit(1)

while True:
    print(n, end=' ')
    if n == 1:
        break
    if n % 2:
        n = 3 * n + 1
    else:
        n = n // 2
print()