Python 不论参数类型如何调用函数的正确方法

Python 不论参数类型如何调用函数的正确方法,python,Python,我有一个打印乘法表的程序 def print_tables(input): for i in xrange(1,11): print "%s x %s = %s" %(input, i, input*i) user_input = raw_input("What do you want multiplied ten fold? ") if(user_input.isdigit()): print_tables(int(user_input)) else:

我有一个打印乘法表的程序

def print_tables(input):
    for i in xrange(1,11):
        print "%s x %s = %s" %(input, i, input*i)

user_input = raw_input("What do you want multiplied ten fold? ")

if(user_input.isdigit()):
    print_tables(int(user_input))

else:
    print_tables(user_input)
如果用户输入字符串a,我希望输出为:

a x 1 = a
a x 2 = aa
a x 3 = aaa
a x 4 = aaaa
a x 5 = aaaaa
a x 6 = aaaaaa
a x 7 = aaaaaaa
a x 8 = aaaaaaaa
a x 9 = aaaaaaaaa
a x 10 = aaaaaaaaaa
在if和else块中调用print_tables函数对我来说确实有点多余

Python中有没有更好的方法来调用print_tables函数而不考虑参数类型?

一个好方法是:

print_tables(int(user_input) if user_input.isdigit() else user_input)
if user_input.isdigit():
    user_input = int(user_input)

print_tables(user_input)
也就是说,有一个调用,但将不同的情况汇集到一个变量中

def mul(x, y):
    try:
        return int(x) * y
    except ValueError:
        return x * y

def print_tables(input):
    for i in xrange(1,11):
        print "%s x %s = %s" %(input, i, mul(input, i))

user_input = raw_input("What do you want multiplied ten fold? ")
print_tables(user_input)
说明:print_表本身不支持类型,也就是说,它在不同参数的类型上没有不同的行为。乘法应该是多态的。所以,一个pythonic的方法是把它明确化

再想一想,如果你有一个函数让你对如何调用它摸不着头脑,不要试图用任何一种方法来解决这个问题。只需消除该功能

def _print_table(s):
    for i in xrange(1,11):
        print "%s x %s = %s" %(s, i, i * s)

def print_str_table(s):
    return _print_table(str(s))

def print_int_table(s):
    return _print_table(int(s))

user_input = raw_input("What do you want multiplied ten fold? ")
if user_input.isdigit():
    print_int_table(user_input)
else:
    print_str_table(user_input)
正如他们所说

放弃一切让你怀疑的东西,去追求那些让你毫无疑问的东西


如果用户输入,您的表将看起来像一个x7=aaaaaaaaaaa。这就是你想要的吗?是的,我忘了提那件事。我会在问题中加上它。这很有效,谢谢。在Python中编写这样的一行程序是一种可以接受的做法吗?@Nanda@Nanda:inline if是一些C语言测试中三元运算符的Python等价物?value\u if\u true:value\u if\u false@stefanch:谢谢你的链接。我浏览了PEP8,编写的代码就像Pythonista链接一样。@PauloScardine:在PEP8链接的“其他建议”部分中,它说函数应该正确缩进,而不是内联。但从你们所说的,我理解内联是可以的,如果这意味着我们想让它类似于三元运算符。这是正确的吗?这可能是个人偏好,但我不希望在运行时更改变量名称后面的类型。用户输入为string,则可能为int。我会给它一个不同的名称。@eumiro:如果用户输入为digit else用户输入,您可以使用new\u var=intuser\u input之类的内容创建一个新变量。但是这个变量可以有两种类型中的任何一种,尽管一次只能有一种。但是,在这种情况下,将变量保持为同一类型没有多大意义,因为函数可以接受不同类型的参数。从duck类型的角度来看,如果您对该变量所做的只是调用其上的print_表,那么重要的是当您调用该变量上的print_表时它是否工作。它的官方类型是不相关的。我同意用户输入的命名约定声称它是字符串,这不是一个好的选择。我应该用另一个名字。但是,正如@BrenBarn所说,在这种情况下,我只是想让打印表工作。嘿,我其实很喜欢你的答案。对不起,我接受了另一个答案,但如果你同意的话,我有一个问题。呼叫方不应该注意它正在传递的类型吗?在你修改的背景下,我的意思是,mulx,y不应该简单地对它接收到的参数进行乘法吗?@Nanda:我在帖子中回答。