2016-10-01 51 views
2

我有一个使数学表生成的代码,我觉得可以减少I重复使用三个相同的代码,但每个if/elif语句的解决方案略有不同。如何在'while'语句内的'if''elif'语句内如何浓缩'for x in range'语句

num=10 
x=str(input("Enter Math Operation (+, -, *): ")) 
while (x != "+" and x != "-" and x != "*"): 
    x=str(input("\tEnter Math Operation: ")) 
    if x=="+": 
     for table in range(1,11): 
      print(str(num),str(x),table,"=",num+table) 
    elif x=="-": 
     for table in range(1,11): 
      print(str(num),str(x),table,"=",num-table) 
    elif x=="*": 
     for table in range(1,11): 
      print(str(num),str(x),table,"=",num*table) 

请告诉我该代码如何被压缩。

+0

你可以做一个for循环包含了如果的,但它会用大桌子慢一点。你可以使用右侧运算符的exec作为字符串,但它会很慢并且很脆弱。你可以将一个add,subtract等函数传递给迭代列表的循环,但是它会过度并且更慢。总之,我认为这里的代码重用量是可以接受的。干,但不能太干... –

回答

2

您可以使用一个查找表来存储不同的功能

num=10 
x=str(input("Enter Math Operation (+, -, *): ")) 
while (x != "+" and x != "-" and x != "*"): 
    x=str(input("\tEnter Math Operation: ")) 
ops = { 
    '+': lambda x, y: x+y, 
    '-': lambda x, y: x-y, 
    '*': lambda x, y: x*y} 

fn = ops[x] 
for table in range(1,11): 
    print(str(num),str(x),table,"=",fn(num,table)) 
+0

他可以,但你会这样做,在这种简单的情况下? –

+0

@JacquesdeHooge我可能不会,但我希望代码审查人员能够告诉我,我重复了两行代码三次 - 这足以触发DRY。如果他们这样做,我一定会修复它。 –

+0

这是比我更好的答案 - 表而不是elif链更优雅。 –

2

函数是蟒蛇第一类对象。将正确的功能分配给一个变量,然后使用它。

num=10 
x=str(input("Enter Math Operation (+, -, *): ")) 
# Read operation 
while (x != "+" and x != "-" and x != "*"): 
    x=str(input("\tEnter Math Operation: ")) 
# Select appropriate function 
if x=="+": 
    op = lambda x, y : x + y 
elif x=="-": 
    op = lambda x, y : x - y 
elif x=="*": 
    op = lambda x, y : x * y 

# Use function 
for table in range(1,11): 
    val = op(num, table) 
    print(str(num), str(x),table,"=", val) 
6

你通常会做这样的事情:

  • 商店运营商作为一个变量

  • 功能使用字典查找运营商

  • 使用.format()而不是将大量的字符串拼在一起

  • 不要使用str()如果参数已经是一个字符串

这里是什么样子:

import operator 
x = 10 
operators = { 
    '+': operator.add, 
    '-': operator.sub, 
    '*': operator.mul, 
} 
while True: 
    op_name = input('Enter Math Operation ({}): '.format(', '.join(operators))) 
    op_func = operators.get(op_name) 
    if op_func is not None: 
     break 
for y in range(1, 11): 
    print('{} {} {} = {}'.format(x, op_name, y, op_func(x, y))) 
+0

天哪,这比以前的答案质量好得多(我是其中一个的作者)!这是知道python的人和真正的专家之间的区别。 –