python学习笔记3:切片,迭代,生成器

切片

  1. 注意切片L[0:3]是一个新的列表,对原来的L没有影响
  2. 取一个list或tuple的部分元素是非常常见的操作
  3. **L[0:3]**表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。如果第一个索引是0,还可以省略: L[:3]
  4. 注意倒数第一个元素的索引是-1,倒数切片:L[-2:]
  5. 对于 L = [0, 1, 2, 3, …, 99]
    前10个数,每两个取一个
    L[:10:2] 结果是 [0, 2, 4, 6, 8]
  6. 只写L[:]就可以原样复制一个list
  7. tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple
  8. Python字符串切片原来返回的是也是一个字符串,列表切片还是列表

迭代

给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,迭代是通过for … in来完成的
还可以作用在其他可迭代对象上
字典也可以这样,只不过迭代的是key,并且无序

  1. 如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:
    from collections import Iterable
    isinstance(‘abc’, Iterable)
    True

  2. enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

    for i, value in enumerate([‘A’, ‘B’, ‘C’]):
    … print(i, value)

    0 A
    1 B
    2 C

  3. for x, y in [(1, 1), (2, 4), (3, 9)]:
    … print(x, y)
    同时引用了两个变量,在Python里是很常见的

列表生成器

  1. list(range(1, 11))
  2. [x * x for x in range(1, 11)] 结果是[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  3. for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:[x * x for x in range(1, 11) if x % 2 == 0]
  4. 还可以使用两层循环,可以生成全排列:[m + n for m in ‘ABC’ for n in ‘XYZ’] 结果是:[‘AX’, ‘AY’, ‘AZ’, ‘BX’, ‘BY’, ‘BZ’, ‘CX’, ‘CY’, ‘CZ’] (字符串相加为拼凑)
  5. for循环其实可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value:

d = {‘x’: ‘A’, ‘y’: ‘B’, ‘z’: ‘C’ }
for k, v in d.items():
… print(k, ‘=’, v)

y = B
x = A
z = C

  1. 最后把一个list中所有的字符串变成小写:
    L = [‘Hello’, ‘World’, ‘IBM’, ‘Apple’]
    [s.lower() for s in L]
    [‘hello’, ‘world’, ‘ibm’, ‘apple’]

生成器 generator(会不断有新的返回值)

边循环一边计算的机制,称为生成器:generator
只要把一个列表生成式的[]改成(),就创建了一个generator
g = (x * x for x in range(10))
g
<generator object at 0x1022ef630>
在这里插入图片描述
generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
上面这种不断调用next(g)实在是太变态了,正确的方法是使用for循环,因为generator也是可迭代对象,for n in g

果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:
变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行,但是把函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代

for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中

(列表可以通过相加来扩展元素

用for来不断对生成器迭代是,必须设置if break来退出for循环

迭代器

可迭代对象:Iterable
迭代器:Iterator

一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator:包括生成器和带yield的generator function

可以使用isinstance()判断一个对象是否是Iterable对象
from collections import Iterable
isinstance([], Iterable)

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

Python的for循环本质上就是通过不断调用next()函数实现的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值