私は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]
。
私は何を間違えていますか?
現在、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]
問題を完全に回避しないのはなぜですか?
_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
_
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]
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])
yield
の使用に興味があるかもしれません
_def square(x):
for y in x:
yield math.pow(y, 2.0)
_
そのようにあなたはどちらかを呼び出すことができます
_for sq in square(x):
...
_
正方形のリスト全体を一度に生成するのではなく、反復ごとに1つの要素を生成するか、list(square(x))
を使用してオンデマンドで完全なリストを取得します。
これは、もう少し機能的なスタイルを使用する楽しい機会です。
_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()
でラップするだけです。
あなたのコードはどこにも意味がありません。最後の構文エラーは、印刷の閉じ括弧が欠落しているため、forループ内で呼び出しを返します。これは1回だけ実行されることを意味し、result.appendはコンストラクタspではなく関数spです。
result.append(math.pow(y,2))
問題ではない唯一のものは、あなたの質問であるリストを渡すことです。
def f(a):
print a
f([1,2,3])
でる
[1,2,3,]