我正在编写一个函数,该函数从控制台获取三个可选参数。
def FizzBuzz(target_number=100, fizz=3, buzz=5):
for i in range(target_number):
output = "" #This is what the function will return
if i % fizz == 0: #If a multiple of Fizz, add "Fizz" to output
output += "Fizz"
if i % buzz == 0: #If a multiple of Buzz, add "Buzz" to output
output += "Buzz"
if output == "": #If neither Fizz nor Buzz is in the output, print number instead
output += str(i)
print(output)
我用sys.argv:运行它
if len(sys.argv) == 2:
FizzBuzz(int(sys.argv[1]))
elif len(sys.argv) == 3:
FizzBuzz(int(sys.argv[1]), int(sys.argv[2]))
else:
FizzBuzz(int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3]))
这种方法既乏味又无效。有更简单的方法吗?
检查argparse
模块:
import argparse
parser = argparse.ArgumentParser(description='FizzBuzz')
parser.add_argument('--target', type=int, default=100,
help='Target number (default: 100)')
parser.add_argument('--fizz', type=int, default=3,
help="Multiples of this argument will output 'Fizz' (default: 3)")
parser.add_argument('--buzz', type=int, default=5,
help="Multiples of this argument will output 'Buzz' (default: 5)")
if __name__ == "__main__":
args = parser.parse_args()
FizzBuzz(args.target, args.fizz, args.buzz)
与将sys.argv[1:]
的每个元素转换为整数相比,这种方法的一个优点是,每个参数都是真正可选的——您可以只传递--buzz 7
,最后一个参数使用7,其他参数使用默认值。
这里有一个可能的解决方案:
FizzBuzz(*map(int, sys.argv[1:]))