関数内for
のt
変数にループを使用したいだけです。
l = []
def func(s):
for i in range(1, 100):
t = i
p = t * 2 + s * 2
return p
l.append(func(10))
print l
tの値を1から99にして、すべての値のリストを出力したいのですが、常にl = [218]
。を取得することになります。
NumPyがインストールされていると仮定します(少なくとも元の質問で提案されています)。そのためnumpy-arrays
、非常に効率的な方法で(リスト内包表記や明示的な反復なしで)結果を取得する方法を紹介します。
> import numpy as np
> s = 10
> l = np.arange(1, 100) * 2 + s * 2 # Arrange produces an array. Syntax is like "range".
> print(l)
array([ 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46,
48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72,
74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98,
100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124,
126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150,
152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176,
178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202,
204, 206, 208, 210, 212, 214, 216, 218])
NumPy配列の数学演算がすべての要素に影響を与えるという事実を利用しました。:したがって、書き込み動作ことは簡単であるnp.arange(1, 100) * 2
が持つすべての要素を乗算するため、2
およびnumpy.arange
所与の間のすべての数値を含む配列を作成する可能性であるstart
とstop
オプションとstep
(だけなどpython range
)。
NumPyでは、append
単一の値を選択するのは適切ではありません(これは、値を追加するだけでなく、配列全体を再作成するためです)。ほとんどの場合、最終的なサイズと形状の配列を作成し、それを直接操作するのが最善です。もちろん、あなたのことができconcatenate
またはappend
異なるnumpyのアレイが、それは常に完全に新しい配列を作成し、(定期的に使用している場合)ので、非常に効率的ではありません述べたように。
それで、最初の試みとそれが機能しなかった理由に関するいくつかの観察:あなたの関数はたくさんの数を作成しましたが、それは各ループでそれらをオーバーライドし、最後のものだけを返します:
def func(s):
for i in range(1, 100):
t = i
p = t * 2 + s * 2
# Next iteration of the loop just overwrites p
# Returns only the last p
return p
これを(のyield
代わりにreturn
)ジェネレーターにすることもできますが、ここではおそらくやり過ぎです。それでも、それを示します:-)
l = []
def func(s):
for i in range(1, 100):
p = i * 2 + s * 2
yield p
l.append(list(func(10))) # Need to convert the generator to a list here.
# In this case a simple "l = list(func(10))" would be easier if you don't need to append.
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加