Pythonの反復
10058 ワード
pythonの使用を開始すると、Pythonのforループは他の言語のforループのように動作しないことがわかります.ではpythonのforサイクルの下部動作原理は何なのか、なぜこのように設計されているのか(推測).
ループの問題
私たちはいくつかの「罠」を見て私たちの旅を始めます.ループがPythonでどのように働いているかを理解した後、私たちは再びこれらの問題を見て、何が起こったのかを説明します.
質問1:2回のループ
数値リストとジェネレータを設計すると、ジェネレータはこれらの数値の平方を返します.
ジェネレータオブジェクトをtupleコンストラクタに渡して、メタグループにすることができます.
sum(squares) 0
numbers = [1, 2, 3, 5, 7] squares = (n**2 for n in numbers)
9 in squares
True
9 in squares
False
counts = {'key_1': 2, 'key_2': 1}
x, y = counts
x
'key_1'
let numbers = [1, 2, 3, 5, 7]; for (let i = 0; i < numbers.length; i += 1) {
}
numbers = [1, 2, 3, 5, 7] for n in numbers:
for item in some_iterable:
numbers = [1, 2, 3, 5, 7] coordinates = (4, 5, 7) words = "hello there"
numbers[0] 1 coordinates[2]
7
words[4]
'o'
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)
numbers = [1, 2, 3, 5, 7] i = 0 while i < len(numbers):
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
numbers = {1, 2, 3, 5, 7} coordinates = (4, 5, 7) words = "hello there"
iter(numbers)
iter(coordinates)
iter(words)
numbers = [1, 2, 3] my_iterator = iter(numbers) next(my_iterator)
1
next(my_iterator)
2
next(my_iterator)
3
next(my_iterator)
Traceback (most recent call last): File "", line 1, in StopIteration
def funky_for_loop(iterable, action_to_do):
def funky_for_loop(iterable, action_to_do):
for n in numbers:
x, y, z = coordinates
a, b, *rest = numbers print(*numbers)
unique_numbers = set(numbers)
numbers = [1, 2, 3] squares = (n**2 for n in numbers)
next(squares) 1 next(squares)
4
squares = (n**2 for n in numbers) for n in squares:
... print(n) ... 1 4 9
numbers = [1, 2, 3] iterator1 = iter(numbers) iterator2 = iter(iterator1)
iterator1 is iterator2
True
def is_iterator(iterable):
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
next(iterator)
1
list(iterator)
[2, 3, 5, 7]
list(iterator)
[]
letters = ['a', 'b', 'c'] e = enumerate(letters) e
next(e)
(0, 'a')
numbers = [1, 2, 3, 5, 7] letters = ['a', 'b', 'c'] z = zip(numbers, letters) z
next(z)
(1, 'a')
next(open('hello.txt'))
'hello worldn'
class square_all:
from itertools import count numbers = count(5) squares = square_all(numbers) next(squares) 25 next(squares)
36
def square_all(numbers):
def square_all(numbers):
>>>>全文を読む
ループの問題
私たちはいくつかの「罠」を見て私たちの旅を始めます.ループが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):
>>>>全文を読む