4

実行することにした数値に応じて、タイム テーブル チャートを出力する簡単な関数を作成しました。言語の基本的な理解のために私が抱えている問題は、最初のループのみを返し、他には何も返さない理由です。

def timestables(number):
  for a in range(1, number+1):
    b = a*a
    c = a
    return (str(c) + " * " + str(c) + " = " + str(b))

print(timestables(5))

私は答えを得る..

1 * 1 = 1

return の代わりに print を使用してこの問題を修正しようとしましたが、最終的には None も表示されます。

def timestables(number):
  for a in range(1, number+1):
    b = a*a
    c = a
    print (str(c) + " * " + str(c) + " = " + str(b))

print(timestables(5))

私は答えを得る..

1 * 1 = 1
2 * 2 = 4
3 * 3 = 9
4 * 4 = 16
5 * 5 = 25
None

None エラーを回避するために、for ループから与えられたすべての結果を返すにはどうすればよいですか?

4

3 に答える 3

15

yield彼ら。

def timestables(number):
  for a in range(1, number+1):
    yield '%s + %s = %s' % (a, a, a*a )

for x in timestables(5):
  print x

これにより、関数がジェネレーター関数に変わり、結果を反復する必要があります。つまり、結果はリストではなく、反復可能です。

リストが必要な場合、最も簡単なのは明示的にリストを作成することです:

res = list(timestables(5))

しかし、繰り返しますが、そうしない場合は、そうしません。

私見、これは最もpythonicな方法です。

于 2013-04-19T11:11:44.037 に答える
10

returnループ内にいると、関数はステートメントforに到達するとすぐに実行を停止します。return

これを回避するには、リストを使用してこれらの値を格納し、そのリストを返します。

def timestables(number):
    lst = []
    for a in range(1, number+1):
        b = a*a
        c = a
        lst.append(str(c) + " * " + str(c) + " = " + str(b))
    return lst

補足として、文字列の書式設定を使用して文字列を作成する必要があります。

lst.append('{a} * {a} = {b}'.format(a=a, b=a*a))

bこれで、これらすべての中間変数 (およびc)を取り除くことができ、代わりにリスト内包表記を使用できます。

def timestables(number):
    return ['{a} * {a} = {b}'.format(a=a, b=a*a) for a in range(1, number+1)]

関数がリストを返すのではなく、複数行の文字列を返したい場合は、次を使用できますstr.join

def timestables(number):
    return '\n'.join('{a} * {a} = {b}'.format(a=a, b=a*a) for a in range(1, number+1))

これで、関数をテストできます。

>>> print(timestables(5))
1 * 1 = 1
2 * 2 = 4
3 * 3 = 9
4 * 4 = 16
5 * 5 = 25
于 2013-04-19T11:08:35.347 に答える
0

配列を返すことができます:

def timestables(number):
    out = []
    for a in range(1, number+1):
        b = a*a
        c = a
        out.append( str(c) + " * " + str(c) + " = " + str(b))

    return out
print(timestables(5))
于 2013-04-19T11:10:43.023 に答える