11-Python3从入门到实战—基础之生成器和迭代器

Python从入门到实战系列——目录

切片

Python提供切片(Slice)操做符用来获取列表、元组等数据中的部分元素;如,读取列表python

list[m:n]:表示获取m-n区间的元素
list[m:n:o]:表示以条件o获取m-n之间的元素git

num = list(range(100))  # 建立0-99的列表num
  • 获取num中前三个元素
>>> num[0:3]
['0', '1', '2']
>>> num[:3]    # 索引从0开始时,0能够省略
['0', '1', '2']
  • 获取num中后三个元素
>>> num[-3:]
['97', '98', '99']]
  • 每隔10个数获取全部元素
>>> num[::5]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
  • 复制一个列表
>>> num[:]
[0, 1, 2, 3, 4, 5, 6...98,97]

迭代

Python 中经过for循环来遍历list或tuple,这种遍历称为迭代(Iteration);github

  • 迭代的使用
>>> user={'0':'张三','1':'李四','2':'王五','3':'赵六',}
>>> for key in user:
...     print(key)
>>> print('---------分割线-----------')
>>> for value in user.values():
...     print(value)

输出结果:app

0
1
2
3
---------分割线-----------
张三
李四
王五
赵六函数

  • 判断对象是否可迭代
>>> user={'0':'张三','1':'李四','2':'王五','3':'赵六',}
>>> print(isinstance(1,Iterable))
>>> print(isinstance(user,Iterable))

输出结果:code

False
True对象

  • 遍历输出对象的下标和值
>>> user={'0':'张三','1':'李四','2':'王五','3':'赵六',}
>>> for key,value in enumerate(user.values()):
...     print(key,value)

输出结果:索引

0 张三
1 李四
2 王五
3 赵六内存

迭代器

迭代器是一个能够记住遍历的位置的对象;迭代器对象从集合的第一个元素开始访问,直到全部的元素被访问完结束;迭代器只能往前不会后退;get

迭代器有两个基本的方法:建立迭代器对象的 iter() 和 输出迭代器对象的下一元素的 next();

  • 基本使用
>>> nums = [1,2,3,4]
>>> num = iter(nums)
>>> print(next(num))
>>> print(next(num))
>>> print(next(num))

输出

1
2
3

  • 迭代器结合 for 循环使用
>>> nums = [1,2,3,4]
>>> num = iter(nums)
>>> for n in num:
...     print(n)

输出结果:

1
2
3
4

  • 迭代器结合 while 循环使用
>>> while True:
...     try:
...         print(next(num))
...     except StopIteration:
...         print("迭代完毕")
...         sys.exit()

输出:

1
2
3
4
迭代完毕

列表生成式

  • 生成列表的方法
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 原始生成[11,22,...,10*10]方法
>>> for x in range(1,11):
...     l.append(x*x)
...
>>> l
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>
  • 使用Python内置强大的生成[11,22,...,10*10]列表的方法
>>> [x * x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>
  • 生成[11,22,...,10*10]元素为偶数的列表
>>> [x * x for x in range(1,11) if x % 2 ==0]
[4, 16, 36, 64, 100]
  • 双重循环生成列表
>>> [x + y for x in 'ABC' for y in 'abc']
['Aa', 'Ab', 'Ac', 'Ba', 'Bb', 'Bc', 'Ca', 'Cb', 'Cc']
  • 使用两个变量生成列表
>>> str = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [key + '=' + value for key, value in str.items()]
['x=A', 'y=B', 'z=C']

生成器

经过列表生成式能够生成一个列表,可是列表受内存限制,容量是有限的,而且,若是建立一个包含几百万元素的列表,而只须要使用其中元素时便形成了空间浪费;
这时候就应该使用生成器(generator);生成器表达式能作的事情列表解析基本都能处理,只不过在须要处理的序列比较大时,列表解析比较费内存。

  • 建立一个生成器
>>> gen = (x * x for x in range(10))
>>> gen
<generator object <genexpr> at 0x0000000002742E08>
>>>
  • 读取生成器中的元素
>>> for x in gen:
...     print(x)
...
0
1
4
9
16
25
36
49
64
81
>>>

生成器函数

生成器函数:在函数中若是出现了yield关键字,那么该函数就再也不是普通函数,而是生成器函数;

  • 使用函数实现斐波拉契数列
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'
>>> fib(6)
1
1
2
3
5
8
'done'
  • 使用生成器函数实现斐波拉契数列
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'
>>> for n in fib(6):
...     print(n)
...
1
1
2
3
5
8
  • generator和函数的执行流程不同。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
相关文章
相关标签/搜索