この記事では、主に Python の for ループの使用法を紹介します。これは、IBM の公式 Web サイトの技術文書からのものです。必要な方は、
for ループ
を参照してください。 with Python" 」の記事では、if ステートメントと while ループ、複合ステートメント、および Python コードの関連ブロックを示すための Python ステートメントの適切なインデントについて説明します。この記事は、Python for ループの紹介で終わります。ただし、その使用法と機能という点では、for ループの方が注目に値するため、この記事ではこのループについては個別に説明します。
for ループには、コンテナ オブジェクトから 1 つの項目を抽出し、それに対して特定の操作を実行できる単純な構文があります。簡単に言えば、for ループを使用して、オブジェクトのコレクション内の項目を反復処理します。オブジェクトのコレクションには、前の記事で説明したタプル、文字列、リスト タイプなど、任意の Python コンテナ タイプを使用できます。ただし、コンテナのメタファーは、これら 3 つのタイプよりも強力です。メタファーには、ディクショナリやセットなどの他のシーケンス タイプが含まれますが、これについては今後の記事で説明します。
でも待ってください!さらに、for ループを使用すると、反復メタファーをサポートする任意のオブジェクトを反復処理することができるため、for ループは非常に便利になります。
リスト 1 は、for ループの基本構文を示し、for ループ内で continue ステートメントと Break ステートメントを使用する方法も示しています。
リスト 1. for ループの疑似コード
for item in container: if conditionA: # Skip this item continue elif conditionB: # Done with loop break # action to repeat for each item in the container else: # action to take once we have finished the loop.
このシリーズの 2 番目の記事「Python の探索、パート 2: Python の型階層の探索」では、Python タプルを紹介します。記事で述べたように、タプル型は不変の異種コンテナです。これは主に、タプルにはさまざまなタイプのオブジェクトを格納できるが、一度作成すると変更できないことを意味します。リスト 2 は、for ループを使用してタプルの要素を反復処理する方法を示しています。
リスト 2. for ループとタプル
>>> t = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) >>> count = 0 >>> for num in t: ... count += num ... else: ... print count ... 45 >>> count = 0 >>> for num in t: ... if num % 2: ... continue ... count += num ... else: ... print count ... 20
この例では、まず 0 から 9 (9 を含む) の整数を格納する t という名前のタプルを作成します。最初の for ループはタプルを反復処理し、タプル内の値の合計を count 変数に累積します。コードがタプル内のすべての要素を反復処理すると、for ループの else 節に入り、count 変数の値を出力します。
リスト 2 に示す 2 番目の for ループも、タプル内のすべての要素を反復処理します。ただし、コンテナ内の 2 で割り切れる項目の値のみが累積されます (式がゼロ以外の場合に if ステートメントが true になり、num が 2 で割り切れないときに % 演算子を使用すると、ゼロ以外の値が返されることに注意してください)価値) 。この制限は、適切な if ステートメントと continue ステートメントを使用することで実現されます。前の記事で述べたように、 continue ステートメントにより、それを含むループが次の反復を開始します。同じ結果を得るもう 1 つの方法は、タプル内の現在の項目が偶数かどうかをテストし (if not num % 2: を使用)、真の場合は現在の項目を累計に加算することです。コードがタプルの反復処理を完了すると、else 節が呼び出され、合計が出力されます。
このシリーズの 3 番目の記事「Python の探索: パート 3: Python の型階層の探索」では、Python 文字列について説明します。 String は不変の同形コンテナです。つまり、文字のみを保持でき、作成後に変更することはできません。リスト 3 は、Python 文字列を for ループのコンテナとして使用する方法を示しています。
リスト 3. for ループと文字列
>>> st = "Python Is A Great Programming Language!" >>> for c in st: ... print c, ... P y t h o n I s A G r e a t P r o g r a m m i n g L a n g u a g e ! >>> count = 0 >>> for c in st: ... if c in "aeiou": ... count += 1 ... else: ... print count ... 10 >>> count = 0 >>> for c in st.lower(): ... if c in "aeiou": ... count += 1 ... else: ... print count ... 12
この例では 3 つの異なる for ループが提供されており、すべて同じ文字列を反復処理します。最初の for ループは、文字列「Python Is A Great Programming Language!」を反復処理し、文字列を一度に 1 文字ずつ出力します。この例では、print ステートメントの変数 c にカンマが追加されます。これにより、print ステートメントは、改行文字の代わりにスペース文字が後に続く文字値を印刷します。次のカンマがないと、文字がすべて別々の行に出力され、読みにくくなります。
次の 2 つの for ループは文字列を反復処理し、文字列に含まれる母音 (「a」、「e」、「i」、「o」、または「u」) の数を数えます。 2 番目の for ループは、元の文字列を反復処理するときに小文字の母音のみを検索します。 3 番目の for ループは、文字列オブジェクトの下位メソッドの呼び出しによって返された一時文字列を反復処理します。 lower メソッドは、文字列内のすべての文字を小文字に変換します。したがって、3 番目の for ループではさらに 2 つの母音が検索されます。
このシリーズの 4 番目の記事「Python の探索、パート 4: Python の型階層の探索」では、Python リストを紹介します。リストは異種の変更可能なコンテナーです。つまり、リストにはさまざまなタイプのオブジェクトを格納でき、作成後に変更できます。リスト 4 は、リストと for ループの使用方法を示しています。
リスト 4. for ループと list
>>> mylist = [1, 1.0, 1.0j, '1', (1,), [1]] >>> for item in mylist: ... print item, "\t", type(item)) ... 1 <type 'int'> 1.0 <type 'float'> 1j <type 'complex'> 1 <type 'str'> (1,) <type 'tuple'> [1] <type 'list'>
list は非常に柔軟な Python コンテナー タイプであるため (このシリーズの残りの部分で何度も登場します)、この例は単純すぎるように思えるかもしれません。ただし、ここに重要な点があります。for ループを使用すると、さまざまなオブジェクトを含むリストであっても、コンテナ内の各項目の処理が非常に簡単になります。この例では、Python リスト内のすべての項目を反復処理し、各項目とそれに対応する Python 型を別の行に出力します。
反復と可変コンテナ
Python list 是一个可变序列,提供了一种令人好奇的可能性:for 循环主体可以修改其正在迭代的 list。正如您可能认为的,这样并不好,如果进行此操作,Python 解释器将无法很好地工作,如清单 5 所示。
清单 5. 在 for 循环中修改容器
>>> mylist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> for item in mylist: ... if item % 2: ... mylist.insert(0, 100) ... ^CTraceback (most recent call last): File "<stdin>", line 3, in ? KeyboardInterrupt >>> print mylist [100, ...., 100, 100, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Many lines deleted for clarity >>> mylist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> for item in mylist[:]: ... if item % 2: ... mylist.insert(0, 100) ... >>> print mylist [100, 100, 100, 100, 100, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
本例中的第一个 for 循环只要在原始 list 中发现奇数,它就在 list 的开始插入数值 100。当然,这是一种演示此问题的不同寻常的方式,但却非常好。一旦在三个点的 Python 提示后按 Enter 键,Python 解释器就处于无限循环的混乱中。要停止这种混乱,必须通过按 Ctrl-C(其在 Python 输出中显示为 ^C)来中断进程,然后会出现 KeyboardInterrupt 异常。如果打印出修改的 list,将看到 mylist 现在包含大量的值为 100 的元素(新元素的准确数量取决于您中断循环的速度)。
本例中的第二个 for 循环演示了如何避免此问题。使用切片运算符创建原始 list 的副本。现在 for 循环将迭代该副本,而对原始 list 进行修改。最终的结果是修改后的原始 list,它现在以五个值为 100 的新元素开始。
for 循环和序列索引
如果您用过其他编程语言,Python for 循环可能看起来有点儿古怪。您可能认为它更像 foreach 循环。基于 C 的编程语言具有 for 循环,但它的设计目的是对一系列操作执行特定次数。Python for 循环可以通过使用内置的 range 和 xrange 方法来模拟该行为。清单 6 中演示了这两种方法。
清单 6. range 和 xrange 方法
>>> r = range(10) >>> print r [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> type(r) <type 'list'> >>> xr = xrange(10) >>> print xr xrange(10) >>> type(xr) <type 'xrange'>
本例首先演示了 range 方法,它创建一个包含一系列整数的新 list。调用 range 方法的一般形式是提供单个值,用作整数 list 的上限。零为起始值。因此,调用 range(10) 将创建包含整数 0 至 9(包含 9)的 list。range 方法接受起始索引以及步长。所以,调用 range(11,20) 将创建从 11 至 19(包含 19)的整数 list,而调用 range(12, 89, 2) 将创建从 12 至 88 的偶数 list。
由于 xrange 方法也创建整数 list(其使用相同参数),所以它与 range 方法非常相似。但是,xrange 方法仅在需要时才在 list 中创建整数。例如,在清单 6 中,尝试打印出新创建的 xrange 时除了 xrange 的名称,不会显示任何数据。当需要迭代大量整数时,xrange 方法更适用,因为它不会创建极大的 list,那样会消耗大量计算机内存。
清单 7 演示了如何在 for 循环内使用 range 方法来创建整数 1 至 10(包含 10)的乘法表。
清单 7. 创建乘法表
>>> for row in range(1, 11): ... for col in range(1, 11): ... print "%3d " % (row * col), ... print ... 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100
本例使用两个 for 循环,外面的 for 循环关注乘法表中的每一行,嵌套的 for 循环关注每行内的列。每个循环都迭代包含整数 1 至 10(包含 10)的 list。最里面的 print 语句使用了一个名为 字符串格式化 的新概念来创建格式设置精美的表。字符串格式化是一种非常有用的技术,用于以格式设置精美的布局创建由不同数据类型组成的 string。现在详细信息并不重要,将来的文章中将讲述这些内容(了解 C 编程语言的 printf 方法的任何人都会很熟悉这些内容)。在本例中,字符串格式化指定将从整数创建新 string 且需要保留三个字符来存放该整数(如果该整数小于三个字符,将在左边用空格填补,从而使数据排列整齐)。第二个 print 语句用于打印新行,从而使乘法表中的下一行被打印在新的行中。
range 方法还可用于迭代容器,通过使用适当的索引访问序列中的每一项。要进行此操作,需要包含容器的允许范围索引值的整数 list,这可以通过使用 range 方法和 len 方法来轻松实现,如清单 8 所示。
清单 8. 在 for 循环内索引容器
>>> st = "Python Is A Great Programming Language!" >>> for index in range(len(st)): ... print st[index], ... P y t h o n I s A G r e a t P r o g r a m m i n g L a n g u a g e ! >>> for item in st.split(' '): ... print item, len(item) ... Python 6 Is 2 A 1 Great 5 Programming 11 Language! 9
这个最后的示例演示了如何使用 len 方法作为 range 方法的参数,创建可用于单独访问 string 中每个字符的整数 list。第二个 for 循环还显示了如何将 string 分割为子字符串的 list(使用空格字符来指示子字符串的边界)。for 循环迭代子字符串 list,打印每个子字符串及其长度。
结束语
本文讨论了 Python for 循环并演示了它的一些使用方式。可以将 for 循环与提供迭代器的任何 Python 对象结合使用,这些对象包括 tuple、string 和 list 等内置序列类型。for 循环和 list 序列一起使用时具有强大的功能,您会发现自己在许多情况中都要使用它们。Python 提供了用于组合这两个概念的简单机制,称为列表理解,将来的文章中将讲述该内容。
関連する推奨事項:
PHP での for ループと foreach ループの使用法と違い
以上がPython_pythonのforループの使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。