74 lines
1.8 KiB
Python
74 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
|
|
from typing import Iterator
|
|
import io
|
|
import sys
|
|
|
|
# Functions
|
|
|
|
def odds(stream=sys.stdin) -> list[int]:
|
|
''' Return a list of all the odd numbers in stream.
|
|
|
|
>>> odds(io.StringIO('\\n'.join('1 2 3 4 5'.split())))
|
|
[1, 3, 5]
|
|
'''
|
|
results = []
|
|
for line in stream:
|
|
number = int(line)
|
|
if number % 2:
|
|
results.append(number)
|
|
return results
|
|
|
|
def odds_fp(stream=sys.stdin) -> Iterator[int]:
|
|
''' Return a sequence of odd numbers from stream using map and filter.
|
|
|
|
>>> odds_fp(io.StringIO('\\n'.join('1 2 3 4 5'.split()))) # doctest: +ELLIPSIS
|
|
<filter object at ...>
|
|
'''
|
|
numbers = map(int, stream)
|
|
return filter(lambda x: x % 2, numbers)
|
|
|
|
def odds_lc(stream=sys.stdin) -> list[int]:
|
|
''' Return a list of all the odd numbers in stream using a list
|
|
comprehension.
|
|
|
|
>>> odds_lc(io.StringIO('\\n'.join('1 2 3 4 5'.split())))
|
|
[1, 3, 5]
|
|
'''
|
|
numbers = []
|
|
for line in stream:
|
|
number = int(line)
|
|
if number % 2:
|
|
numbers.append(number)
|
|
return numbers
|
|
|
|
def odds_gr(stream=sys.stdin) -> Iterator[int]:
|
|
''' Return a sequence of odd numbers from stream using yield.
|
|
|
|
>>> odds_gr(io.StringIO('\\n'.join('1 2 3 4 5'.split()))) # doctest: +ELLIPSIS
|
|
<generator object odds_gr at ...>
|
|
'''
|
|
for line in stream:
|
|
number = int(line)
|
|
if number % 2:
|
|
yield number
|
|
|
|
# Main Execution
|
|
|
|
def main(arguments=sys.argv[1:], stream=sys.stdin) -> None:
|
|
odds_functions = {
|
|
'-f': odds_fp,
|
|
'-l': odds_lc,
|
|
'-g': odds_gr,
|
|
}
|
|
|
|
if not arguments:
|
|
print('Usage: odds.py [-f -l -g]', file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
odds_function = odds_functions.get(arguments[0], odds)
|
|
for odd in odds_function(stream):
|
|
print(odd)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|