0

乗算表を出力するプログラムがあります。

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)

ユーザーが string"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

とブロックprint_tablesの両方で関数を呼び出すことは、私には少し冗長に感じます。ifelse

print_tablesパラメータの型に関係なく、Pythonで関数を呼び出すより良い方法はありますか?

4

3 に答える 3

3
print_tables(int(user_input) if user_input.isdigit() else user_input)
于 2012-09-21T07:34:45.300 に答える
3

1 つの良い方法は次のとおりです。

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

print_tables(user_input)

つまり、呼び出しは 1 つですが、さまざまなケースを 1 つの変数にまとめます。

于 2012-09-21T07:42:22.460 に答える
1
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_tablesそれ自体は型を認識していません。つまり、異なる引数の型で異なる動作をすることはありません。ポリモーフィックであるべきは乗算です。したがって、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)

彼らが言うように、

疑いのないもののために疑いを抱かせるものはすべて捨てる

于 2012-09-21T08:16:35.737 に答える