Pythonの反復

10058 ワード

pythonの使用を開始すると、Pythonのforループは他の言語のforループのように動作しないことがわかります.ではpythonのforサイクルの下部動作原理は何なのか、なぜこのように設計されているのか(推測).
ループの問題
私たちはいくつかの「罠」を見て私たちの旅を始めます.ループがPythonでどのように働いているかを理解した後、私たちは再びこれらの問題を見て、何が起こったのかを説明します.
質問1:2回のループ
数値リストとジェネレータを設計すると、ジェネレータはこれらの数値の平方を返します.
>>> numbers = [1, 2, 3, 5, 7]
>>> squares = (n**2 for n in numbers)

ジェネレータオブジェクトをtupleコンストラクタに渡して、メタグループにすることができます.
>>> tuple(squares)
(1, 4, 9, 25, 49)```  



                    sum   ,            ,  88。

sum(squares) 0
        0。

###    2:     

                     

numbers = [1, 2, 3, 5, 7]  squares = (n**2 for n in numbers)
       9     squares     ,Python        9   squares  。               ,Python       9    squares  。

9 in squares
True
9 in squares
False
           ,Python          。

###    3 :  

          :

counts = {'key_1': 2, 'key_2': 1}

x, y = counts
                   ,                。

            ,        。         ,     :

x
'key_1'
  :Python   for   

            Python        ,         。

Python       for   。        ,               for   。

       C     for   ,  JavaScript   :

let numbers = [1, 2, 3, 5, 7]; for (let i = 0; i < numbers.length; i += 1) {
print(numbers[i])

}
JavaScript、 C、 C++、 Java、 PHP                   for   ,   Python     。

Python         C     for   。  Python             for      ,            foreach   。

   Python   for      :

numbers = [1, 2, 3, 5, 7] for n in numbers:
print(n)
**    C     for     ,Python   for         ,         ,    ,      。Python   for           numbers            。**

  ,     Python      for    ,       C     for   。      for                     。
**  :      **

          Python         for   ,               。

           Python    for        。          ,               。

for item in some_iterable:
print(item)
               ,  ,          。

numbers = [1, 2, 3, 5, 7] coordinates = (4, 5, 7) words = "hello there"
       ,          。      0     ,          ,                。  ,  ,                 。

numbers[0] 1 coordinates[2]
7
words[4]
'o'
Python            ,               。  、  、            ,         。

my_set = {1, 2, 3} my_dict = {'k1': 'v1', 'k2': 'v2'} my_file = open('some_file.txt') squares = (n**2 for n in my_set)
  ,      for              ,            ,   Python             。

Python   for        

       :Python   for               。        while          :

numbers = [1, 2, 3, 5, 7] i = 0 while i < len(numbers):
print(numbers[i])
i += 1
**      ,             。            。**

                ,         :

fruits = {'lemon', 'apple', 'orange', 'watermelon'} i = 0 while i < len(fruits): ... print(fruits[i])
... i += 1
Traceback (most recent call last): File "", line 2, in  TypeError: 'set' object does not support indexing
**      ,         。**

            Python              。              ,      。

**      for   **

**      ,Python   for           。  ,Python   for        。
                 。                ,                    。**

            。

          :    ,          。

numbers = {1, 2, 3, 5, 7} coordinates = (4, 5, 7) words = "hello there"
       Python     iter           ,          iter               ,                。

iter(numbers)
 
iter(coordinates)
 
iter(words)
 
         ,                     next           。

numbers = [1, 2, 3] my_iterator = iter(numbers) next(my_iterator)
1
next(my_iterator)
2

        ,               ,     。
          next  ,           ,      StopIteration  :

next(my_iterator)
3
next(my_iterator)
Traceback (most recent call last): File "", line 1, in  StopIteration
                 ,              next           。          next,         ,       StopIteration   。          Pez    (LCTT   :Pez                ),      。     Pez    ,     Pez    ,        ,       ,     。

**   for    **

            iter    next   ,          for              。

           for      while   :

def funky_for_loop(iterable, action_to_do):
for item in iterable:
    action_to_do(item)
      ,    :

               
            
           ,    for      
                 StopIteration   ,       

def funky_for_loop(iterable, action_to_do):
iterator = iter(iterable)
done_looping = False
while not done_looping:
    try:
        item = next(iterator)
    except StopIteration:
        done_looping = True
    else:
        action_to_do(item)
         while             for   。

            Python           。         iter   next            ,        Python   for         。

   ,        for     Python        ,                     。

**     iterator protocol         “  Python             ”   。       iter   next     Python          。Python                    。**

       for     (       ):

for n in numbers:
print(n)
-             :

x, y, z = coordinates
-              :

a, b, *rest = numbers print(*numbers)
-               :

unique_numbers = set(numbers)
  Python                              。     Python            ,          。

**       **

       :        ,             ,     Python     ,         。

**    :  Python              。**

    squares         :

numbers = [1, 2, 3] squares = (n**2 for n in numbers)
       ,              next         :

next(squares) 1 next(squares)
4
            ,               :

squares = (n**2 for n in numbers) for n in squares:
... print(n) ... 1 4 9
       Python          ,         。

         ,           ,        ?

**       **

                ,             。

**        **

        :**Python               ,             。**

           ,          next               :

numbers = [1, 2, 3] iterator1 = iter(numbers) iterator2 = iter(iterator1)
**   ,             iter  ,            。**

           iter  ,          :

iterator1 is iterator2
True
        ,                。

def is_iterator(iterable):
return iter(iterable) is iterable
    ?

           。

-                 
-                        
  ,  Python           ,            。

          ,                    。

       ,       :

numbers = [1, 2, 3, 5, 7] iterator = iter(numbers) len(iterator) TypeError: object of type 'list_iterator' has no len() iterator[0]
TypeError: 'list_iterator' object is not subscriptable
      Python         ,                            next   ,          :

next(iterator)
1
list(iterator)
[2, 3, 5, 7]
              ,       :

list(iterator)
[]
               ,        ,              。

               ,            ,           :

   |     |      
------- | ------- | -------  
       |  V  |  ?
    |     V |     V
    |     V |     V
   | V | X

        

     Python                。

            iter   ,          。

**   :**

      next   ,       ,       ,        StopIteration   
      iter   ,            
            :

         TypeError           iter          
         TypeError           next           
     iter  ,                
    Python        。

      

           ,         ,               ,        。           ,               。                   ,         ,   CPU   。

       

     Python          ,            。Python             。  ,Python   enumerate   reversed        。

letters = ['a', 'b', 'c'] e = enumerate(letters) e
 
next(e)
(0, 'a')
  Python 3  ,zip, map   filter      。

numbers = [1, 2, 3, 5, 7] letters = ['a', 'b', 'c'] z = zip(numbers, letters) z
 
next(z)
(1, 'a')
Python            。

next(open('hello.txt'))
'hello worldn'
  Python                   。              ,              。

**          **

                ,         ,                     。

                       ,                。

class square_all:
def __init__(self, numbers):
    self.numbers = iter(numbers)
def __next__(self):
    return next(self.numbers) * 2
def __iter__(self):
    return self
                     ,        。

  ,               count,      square_all    count                  :

from itertools import count numbers = count(5) squares = square_all(numbers) next(squares) 25 next(squares)
36
          ,          。  ,               ,            :

def square_all(numbers):
for n in numbers:
    yield n**2
                  ,          。

   yield        ,      :yield         next            。yield                    。

                      。

def square_all(numbers):
>>>>全文を読む