web-dev-qa-db-ja.com

Pythonの範囲関数はどのように機能しますか?

書いたら

for i in range(5):
      print i

次に、0、1、2、3、4を与えます
それは、Python同時にiに0、1、2、3、4を割り当てましたか?
しかし、私が書いた場合:

for i in range(5):
      a=i+1

それから私はaを呼び出します、それは5だけを与えます
ただし、「print a」を追加すると、1、2、3、4、5になります
では、ここでの違いは何ですか?
私は文字列かリストか何かですか?

または、誰かが私を整理するのを手伝うことができます:

for l in range(5):
    #vs,fs,rs are all m*n matrixs,got initial values in,i.e vs[0],fs[0],rs[0] are known
    #want use this foor loop to update them
    vs[l+1]=vs[l]+fs[l]
    fs[l+1]=((rs[l]-re[l])
    rs[l+1]=rs[l]+vs[l]
#then this code gives vs,fs,rs

この種のコードを実行すると、l = 5の場合にのみ答えが得られます
ループを開始させるにはどうすればよいですか?

すなわち、l = 0はvs [1]、fs [1]、rs [1]の値を取得しました。
その後、l = 1はvs [2]、rs [2]、fs [2]の値を取得しました...など。
しかしpythonはfs、vs、rsの異なる配列を与え、lの異なる値に対応します

どうすればそれらを一枚にすることができますか?

23
user211037

すべてではありませんが、ほとんどのプログラミング言語の「forループ」は、コードを複数回実行するメカニズムです。

このコード:

for i in range(5):
    print i

次のように動作すると考えることができます:

i = 0
print i
i = 1
print i
i = 2
print i
i = 3
print i
i = 4
print i

iの値が0、1、2、3、4 同時にになるのではなく、順番に発生します。

「aを呼び出して、5だけを与える」と言うとき、あなたはこのようなことを意味すると思います:

for i in range(5):
    a=i+1
print a

これはlastが与えられた値を出力します。ループが繰り返されるたびに、ステートメントa=i+1は、aが持っていた最後の値を新しい値で上書きします。

コードは基本的に上から下に順番に実行されます。forループは、変数の1つに異なる値を指定して、コードを元に戻し、再び何かを作成する方法です。

これであなたの質問の答えになることを願っています。

プログラミングを教えるとき(どんな言語でも)、次のコード例に似た用語でforループを導入します。

_for eachItem in someList:
    doSomething(eachItem)
_

...便利なことに、構文的に有効なPythonコード。

Python range()]関数は、いくつかの下限(デフォルトではゼロ)から上限まで(ただし含まれない)整数のリストを返すか生成します。他の数(デフォルトでは1つ)の増分(ステップ)。

range(5)は、シーケンスを返します(またはgenerates)シーケンス:0、1、2、3、4(最大上限)。

range(2,10)の呼び出しは、2、3、4、5、6、7、8、9を返します。

range(2,12,3)の呼び出しは、2、5、8、11を返します。

Pythonのrange()関数がまたはgenerateシーケンスを返すことを数回言ったことに注意してください。これは比較的高度な区別であり、通常は初心者にとっては問題になりません。古いバージョンのPython range()はリストを作成し(リストに割り当てられたメモリに値を入力)、そのリストへの参照を返しました。これは大きな範囲では非効率的です。これはかなりのメモリを消費する可能性があり、いくつかの状況で潜在的に数値の大きな範囲を反復したいが、ループから早く "break"になる可能性がありました(たとえば、興味のある特定のアイテムを見つけた後)。

Pythonは、generatorと呼ばれるプログラミング構造を介して、同じセマンティクス(同じことを行う)を実装するより効率的な方法をサポートします。リスト全体を割り当ててデータを設定し、静的データ構造として返す代わりに、Pythonは必要な情報(上限と下限、ステップ/インクリメント値)でオブジェクトをインスタンス化できます...オブジェクトは、最後に返された番号を追跡し、上限に達するまで新しい値を計算します(そして、「StopIteration」と呼ばれる例外を使用して呼び出し元にシーケンスの終了を通知するポイント)。この手法(一度にすべてではなく動的に値を事前に計算する)は、「遅延評価」と呼ばれます。

言語の他の構成要素(forループの基礎となるものなど)は、そのオブジェクトをリストであるかのように処理できます。

ほとんどの場合、Pythonのバージョンがrange()の古い実装を使用しているか、ジェネレーターに基づいた新しい実装を使用しているかどうかを知る必要はありません。数百万の範囲のアイテムを使用している場合、またはそれぞれ数千の異なる範囲を作成している場合、古いバージョンのPythonでrange()を使用するとパフォーマンスが低下する場合があります。そのような場合、設計を再考してwhileループを使用するか、ジェネレーターの「遅延評価」セマンティクスを実装するオブジェクトを作成するか、xrange()バージョンのrange() Python=のバージョンが含まれている場合、または暗黙的にジェネレーターを使用するPythonのバージョンのrange()関数が含まれている場合.

ジェネレーターなどの概念、およびより一般的な形式の遅延評価、透過性Python基本を超えてプログラミングする。通常、単純なプログラミングタスクについて知る必要はないが、より大きなデータセットを使用したり、より厳しい制約(時間/パフォーマンスやメモリの境界など)で作業しようとすると重要です。

19
Jim Dennis
for i in range(5):

と同じです

for i in [0,1,2,3,4]:
7
Josh Pearce

range(x)は、0〜x-1の数字のリストを返します。

_>>> range(1)
[0]
>>> range(2)
[0, 1]
>>> range(3)
[0, 1, 2]
>>> range(4)
[0, 1, 2, 3]
_

for i in range(x):は、range()によって返されるリスト内の各要素に対して1回ずつ本体(最初の例では_print i_)を実行します。 iは、リストの「現在の」項目を参照するために本文内で使用されます。その場合、iは整数を参照しますが、ループするオブジェクトに応じて、任意のタイプにすることができます。

6

range関数は数値のリストを提供しますが、forループはリストを反復処理し、各アイテムに対して指定されたコードを実行します。

for i in range(5):
      print i

これは、iが0から4の範囲で、print iを5回実行するだけです。

for i in range(5):
      a=i+1

これにより、a=i+1が5回実行されます。各反復でaの値を上書きしているため、最後には最後の反復の値、つまり4 + 1のみが取得されます。

便利なリンク:
http://www.network-theory.co.uk/docs/pytut/rangeFunction.html
http://www.ibiblio.org/swaroopch/byteofpython/read/for-loop.html

0
Konamiman

それはループしています、おそらく問題は印刷の一部にあります...

システムが印刷するロジックが見つからない場合は、コンテンツを出力する場所に次のように追加します。

for i in range(len(vs)):
    print vs[i]
    print fs[i]
    print rs[i]
0
Santi