web-dev-qa-db-ja.com

Pythonで関数の入力としてリストを渡す方法

私はPythonを使用していますが、引数としてリストを受け取る関数があります。たとえば、私は次の構文を使用しています、

def square(x,result= []):
    for y in x:
        result.append=math.pow(y,2.0)
        return result

print(square([1,2,3]))

出力は[1]私が得ることになっている場所のみ[1,4,9]

私は何を間違えていますか?

11
Arpan Das

現在、forループの最初の反復で関数から値を返しています。このため、forループの2回目と3回目の繰り返しは行われません。次のように、ループの外にreturnステートメントを移動する必要があります。

import math

def square(x):
    result = []
    for y in x:
        result.append(math.pow(y,2.0))
    return result 

print(square([1,2,3]))

出力

[1.0, 4.0, 9.0]
14
gtlambert

問題を完全に回避しないのはなぜですか?

_def square(vals):
    return [v*v for v in vals]
_

編集:最初の問題は、複数の人が指摘しているように、forループを短絡しているということです。 returnが来るはずですループではなく、ループの中に。

次の問題は_list.append_の使用です-割り当てるのではなく、呼び出す必要があります。つまり、result.append(y*y)です。 _result.append = y*y_は、代わりにメソッドを数値で上書きし、おそらく次に呼び出したときにエラーをスローする可能性があります。

これを修正すると、関数を繰り返し呼び出すと、次の明らかなエラーが発生することがわかります。

_print(square([1,2,3])     # => [1, 4, 9]
print(square([1,2,3])     # => [1, 4, 9, 1, 4, 9]
_

可変アイテム(リスト)をデフォルトとして渡すため、そのデフォルトアイテムの以降の使用はすべて同じ元のリストを指します。

代わりに、試してください

_def square(vals, result=None):
    if result is None:
        result = []
    result.extend(v*v for v in vals)
    return result
_
18
Hugh Bothwell

resultも使用しますか?リスト内包表記を使用して結果を生成し、それを返すことができます。 resultが変数として使用されていないため、関数に渡した理由はわかりません。

また、return resultループ内では、関数は最初の反復で値を返すので、リストの最初の数の2乗を返すだけです。

import math

def square(x):
    return [math.pow(y, 2) for y in x]

>>> print(square([1,2,3]))
[1.0, 4.0, 9.0]
6
Alexander

Forループの外側に戻る必要があります。それ以外の場合、最初の反復後に停止します。

def square(x):
    result=[]
    for y in x:
        result.append(math.pow(y,2.0)) # add to list after calculation
    return result 

print(square([1,2,3])
3
Munir

yield の使用に興味があるかもしれません

_def square(x):
    for y in x:
        yield math.pow(y, 2.0)
_

そのようにあなたはどちらかを呼び出すことができます

_for sq in square(x):
    ...
_

正方形のリスト全体を一度に生成するのではなく、反復ごとに1つの要素を生成するか、list(square(x))を使用してオンデマンドで完全なリストを取得します。

3
Tobias Kienzler

これは、もう少し機能的なスタイルを使用する楽しい機会です。

_import math
map(lambda x:(math.pow(x,2)), [1,2,3])
_

これはmap関数を使用します。これはリストと関数を受け取り、その関数がリストの各メンバーに個別に適用された新しいリストを返します。この場合、math.pow(x,2)関数をリストの各メンバーに適用します。各番号はx​​です。

map(lambda x:(math.pow(x,2)), [1,2,3])は反復可能を返すことに注意してください。これは非常に便利ですが、リストを取得する必要がある場合は、ステートメント全体をlist()でラップするだけです。

2
richardlaborde

あなたのコードはどこにも意味がありません。最後の構文エラーは、印刷の閉じ括弧が欠落しているため、forループ内で呼び出しを返します。これは1回だけ実行されることを意味し、result.appendはコンストラクタspではなく関数spです。

result.append(math.pow(y,2))

問題ではない唯一のものは、あなたの質問であるリストを渡すことです。

def f(a):
    print a
f([1,2,3])

でる

[1,2,3,]
0
user2255757