3

TypeError で終了する関数があり、その理由がわかりません:

#under 4 million

def fib(a, b):
    a, b = 0, 1
    while b <= 4000000:
        a, b = b, (a+b)
        print a

#always call it with "fib(0, 1)"

fiblist = [fib(0, 1)]
print fiblist
#now for the function that finds the sum of all even fib's

total = 0
for i in fiblist:
    if i%2 == 0:
        total = total + i
        print total

エラーメッセージは次のとおりです。

Traceback (most recent call last):
  File "C:\Python27\ProjectEuler\ProjectEuler2.py", line 19, in <module>
    if i%2 == 0:
TypeError: unsupported operand type(s) for %: 'NoneType' and 'int'
>>> 

あなたが提供できる助けに感謝します。ありがとう。

4

2 に答える 2

4

fib(a, b)何も返しません - 値を返す代わりに、それを出力します。関数が何も返すように指示していない場合、Python はそれをreturn None暗黙的に行います。

したがって、fiblist = [fib(0, 1)]です[None]

明らかに、None%2無意味です。

fib(a, b)ジェネレーターとyieldその結果になるように書き直す必要があります。range()次に、 、xrange()、リストなどを反復するのと同様の方法で、それを反復できます。

于 2013-06-14T03:15:26.030 に答える
4

関数を修正し、fib何かを返すようにします。また、パラメータを渡す必要がないことに注意してください。

def fib():
    a, b = 0, 1
    lst = []
    while b <= 4000000:
        a, b = b, (a+b)
        lst.append(a)
    return lst

次の行も修正します。

fiblist = fib()

fiblist実際の数値が含まれるようになり、安全に反復処理できます。これにより、発生していたエラーが修正されます。

于 2013-06-14T03:15:30.823 に答える