# 1 手动访问迭代器中的元素

```f = open('test.txt')
for line in f:
print(line)```

```with open('test.txt') as f:
try:
while True:
line = next(f)
print(line)
except StopIteration:
print('超出范围')```

# 2 用生成器创建新的迭代模式

```def frange(start,stop,increment):
x = start
while x < stop:
yield x
x += increment

for n in frange(0,5,0.8):
print(n)```

```0
0.8
1.6
2.4000000000000004
3.2
4.0
4.8```

# 3 实现迭代协议

```class Node:
def __init__(self,value):
self._value = value
self._child = []

def __repr__(self):
return 'Node({!r})'.format(self._value)

self._child.append(node)
def __iter__(self):
return iter(self._child)
def depth_first(self):
yield self
for c in self:
yield from c.depth_first()

if __name__ == '__main__':
root = Node(0)
child1 = Node(1)
child2 = Node(2)
child3 = Node(3)
child4 = Node(4)
child5 = Node(5)
for ch in root.depth_first():
print(ch)```

# 4 反向迭代

```a = list(range(0,5))
for x in reversed(a):
print(x)```

```f = open('test.txt')
for line in reversed(list(f)):
print(line)```
```这是第10行

```class Countdown():
def __init__(self,start):
self.start = start

def __iter__(self):
n = self.start
while n > 0:
yield n
n -= 1
def __reversed__(self):
n = 1
while n <= self.start:
yield n
n += 1
m = Countdown(5)
for i in iter(m):
print(i)

for i in reversed(m):
print(i)```

# 5 对迭代器做切片操作

```def count(n):
while True:
yield n
n += 1
c = count(0)
b = c[10:15]```
```Traceback (most recent call last):
File "D:/home/test_temp/test_generator.py", line 72, in <module>
b = c[10:15]
TypeError: 'generator' object is not subscriptable```

```def count(n):
while True:
yield n
n += 1
c = count(0)
import itertools
b = itertools.islice(c,10,15)
print(list(b))```

# 6 跳过可迭代对象中的前一部分元素

```#测试文件
#锦小年
#verison：1.0
#Python

```from itertools import dropwhile
with open('test.txt') as f:
for line in dropwhile(lambda line:line.startswith('#'),f):
print(line)```

```这是第一行

itertools.dropwhile()函数的第一个参数是要丢弃的元素的条件，只要它的值为True，对应的元素就会被丢弃。如果已知要丢弃元素的索引值，使用itertoos.islice()函数也可以实现这个功能。

# 7 迭代对象的排列和组合

7.1 迭代元素的全排列 itertools.permutations()函数能很好的实现迭代对象元素的全排列：

```a = ['a','b','c']
from itertools import permutations
for p in permutations(a):
print(p)```

```('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')```

```a = ['a','b','c']
from itertools import permutations
for p in permutations(a,2):
print(p)```
```('a', 'b')
('a', 'c')
('b', 'a')
('b', 'c')
('c', 'a')
('c', 'b')```

7.2 产生输入序列中所有元素的全部组合形式 利用itertools.combination()函数可达到这个效果：

```a = ['a','b','c']
from itertools import combinations
for p in combinations(a,3):
print(p)```

itertools.combinations()函数必须提供排列的长度参数，同时她是忽略顺序的，也就是（‘ a’,'b','c'）和('a','c','b')是同一组合。 itertools模块给我们提供了很多强大实用的功能，所以在处理迭代对象的时候，首先去看看有没有相关对应的函数，可以给我们提供很多完美的解决方案

# 8 以索引值-对的形式迭代序列

```a = ['a','b','c']
for index,val in enumerate(a):
print(index,val)```
```0 a
1 b
2 c```

```a = ['a','b','c']
for index,val in enumerate(a,1):
print(index,val)```
```1 a
2 b
3 c```

```with open('test.txt') as f:
for index,line in enumerate(f,1):
print('这是第%d行     '%index,line)```

# 9 同时迭代多个序列

```x =list(range(0,10,2))
y =list(range(1,10,2))
c = zip(x,y)
print(list(c))
for a,b in zip(x,y):
print(a,b)```

```x =list(range(0,10,2))
y =['a','b','c','f','m','hhhh']
c = zip(x,y)
from itertools import zip_longest
d = zip_longest(x,y)
print(list(d))
print(list(c))```
```[(0, 'a'), (2, 'b'), (4, 'c'), (6, 'f'), (8, 'm'), (None, 'hhhh')]
[(0, 'a'), (2, 'b'), (4, 'c'), (6, 'f'), (8, 'm')]```

111 篇文章45 人订阅

0 条评论

## 相关文章

902

### wtfPython—Python中一些奇妙的代码

wtfPython是github上的一个项目，作者收集了一些奇妙的Python代码片段，这些代码的输出结果会和我们想象中的不太一样； 通过探寻产生这种结果的内部...

810

3855

3598

17410

### 【选择题】Java基础测试四（15道）

【选择题】Java基础测试四（15道） 41.以下哪项是接口的正确定义？（ B D ） A、 interface B { void print...

4889

1998

### php 弱类型问题

php 是一门简单而强大的语言，提供了很多 Web 适用的语言特性，其中就包括了变量弱类型，在弱类型机制下，你能够给一个变量赋任意类型的值。

1570

### 01 - JavaSE之基础及面向对象

byte(-128 ~ 127) short(-32768 ~ 32767) int(-2147483648 ~ 2147483647)

1734

### python operator模块学习

operator模块是python中内置的操作符函数接口，它定义了一些算术和比较内置操作的函数。operator模块是用c实现的，所以执行速度比python代码...

822