0

空のリストをに渡すときに、Noneではなく1を返そうとしていreduce(mul, a)ます。私のコード:

from operator import mul
def product_list(a):
    for b in a:
        b = reduce(mul, a)
        if b == None:
            return 1
        return b

print product_list([])

空白のリストをキャッチするためにifステートメントをどこに配置しても、出力としてNoneを受け取ります。私はまだ基​​本を学んでいますが、これは私には意味がありません。私も試しました

from operator import mul
def product_list(a):
    if a == None:
        return 1
    else:
        for b in a:
            b = reduce(mul, a)
            if b == None or a == None:
                return 1
            return b

print product_list([])

Noneをキャッチして1を返すかどうかを確認するだけです。reduce()は私が思うように動作しませんか、それとも1を返すことを禁止し、Noneを強制的に返すという明らかな間違いがコードにありますか?

4

4 に答える 4

6

が空のリストの場合a、関数は何も返しません。デフォルトの戻り値はNoneです。

上部の空のリストをテストします。

if not a:
    return 1

2番目の関数では、をテストするだけですif a == Noneが、空のリスト[]がと等しくなることはありませんNone。テストする慣用的な方法は、代わりにオブジェクトIDテストNoneを使用することであることに注意してください。is

if a is None:

代わりにテストすることで、が空のリストある場合と存在するnot a場合の両方をキャッチします。aNone

それ以外の場合、コードはほとんど意味がありません。ループしますaが、最初の反復で関数に戻って終了します。

for b in a:
    b = reduce(mul, a)
    if b == None:
        return 1
    return b  # exit the function here, having only looked at the first element in `a`.

ただし、投稿のインデントを修正する必要があり、これらのreturnステートメントのインデントを誤解している可能性があります。その場合NameError、空のリストを渡すと代わりに取得されます。

于 2013-01-02T19:02:36.433 に答える
4

reduceスターター値として使用される3 番目の値を に渡すことができます。

In [6]: reduce(mul, [], 1)
Out[6]: 1

これは、空のリストを処理する最良の方法です。このケースNoneは、別の種類のエラーであるため、実際には別の場所で処理する必要があります。プログラムのセマンティクスに問題はなく、他の誰かが間違ったデータを提供したためです。たとえば、明示的にそれをキャッチする必要があります

if not isinstance(..., collections.Iterable):
   # do something

もちろん、reduce反復可能でないものを渡すとエラーが発生しますが、それで十分な場合があります。

于 2013-01-02T19:51:06.897 に答える
2

あなたが言うように、削減するために空のリストを渡していないことに注意してください。それを試してみてください:

>>> reduce(operator.mul, [])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: reduce() of empty sequence with no initial value

おそらく機能を理解していないと思いますreduce。しかし、私たちはあなたに対してそれを保持することはできません.Pythonコードではあまり使用されていません.

おそらく、次のような関数を定義したいと思うでしょう:

from operator import mul
def product_list(a):
    try:
        return reduce(mul,a)
    except TypeError:
        return 1

今すぐ試すことができます:

print product_list([1,2,3,4]) #24
print product_list([])  #1
于 2013-01-02T19:07:56.143 に答える
0
if a is None or len(a) == 0:
    return 1

上記の空のリストの状態を確認します。

于 2013-01-02T19:03:04.237 に答える