在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。请始终牢记,代码越少,开发效率越高。
>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
切片,取前3个元素
>>> L[0:3]
说明:L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。
如果第一个索引是0,可以省略
>>> L[:3]
倒数切片
>>> L[-2:]
说明:从倒数第二个取,一直取到最后一个
前10个数,每两个取一个
>>> L = list(range(100)) //创建一个0-99的list
>>> L[:10:2]
复制list
>>> L[:]
tuple也可以用切片操作,只是操作的结果仍是tuple
>>> (0, 1, 2, 3, 4, 5)[:3]
字符串也可以用切片操作,只是操作结果仍是字符串
>>> 'ABCDEFG'[:3]
>>> [x * x for x in range(1, 11)]
>>> [x for x in range(1, 11) if x % 2 == 0]
>>> [x if x % 2 == 0 else -x for x in range(1, 11)]
定义:列表元素可以按照某种算法推算出来,可以在循环的过程中不断推算出后续的元素。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
>>> g = (x * x for x in range(10))
>>> next(g)
>>> g = (x * x for x in range(10)) >>> for n in g: ... print(n)
>>> from collections.abc import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False
>>> from collections.abc import Iterator >>> isinstance((x for x in range(10)), Iterator) True >>> isinstance([], Iterator) False >>> isinstance({}, Iterator) False >>> isinstance('abc', Iterator) False
说明:生成器都是可迭代对象,但list、dict、str虽然是可迭代对象,却不是迭代器。
可以这样简单理解,迭代器可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
>>> isinstance(iter([]), Iterator)
凡是可作用于for循环的对象都是可迭代类型;
凡是可作用于next()函数的对象都是迭代器类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是可迭代对象但不是迭代器,不过可以通过iter()函数变为迭代器。
生成器是一种特殊的迭代器(注意这个逻辑关系反之不成立)。
合理使用生成器,可以降低内存占用、优化程序结构、提高程序速度。
生成器在 Python 2 的版本上,是协程的一种重要实现方式;而 Python 3.5 引入 async await 语法糖后,生成器实现协程的方式就已经落后了。
迭代器是一个有限集合,生成器则可以成为一个无限集。调用 next(),生成器根据运算会自动生成新的元素
声明一个迭代器, [i for i in range(10)]
声明一个生成器, (i for i in range(10))
生成器并不会像迭代器一样占用大量内存,只有在被使用的时候才会调用。而且生成器在初始化的时候,并不需要运行一次生成操作,相比于迭代器节省了一次生成10个元素的过程,因此耗时明显比迭代器短。