切片就像他的名字那样,切成一片一片的。
看看例子就懂了
>>>L=[0,1,2,3,4,5,6,7]
#第1位到第3位(0-2):0,1,2
>>>L[0:3]
#第3位到第5位(2-4):2,3,4
>>>L[2:5]
#从第1位开始到第5位(0-4):0,1,2,3,4
>>>L[:5]
#从第2位到最后一位(2-7):2,3,4,5,6,7
>>>L[2:]
#所有
>>>L[:]
#从倒数第2到最后(6-7):6,7
>>>L[-2:]
#从第1位到倒数第2(0-6):0,1,2,3,4,5
>>>L[:-2]
#所有,每两位取1位
>>>L[::2]
#从第2位到第5位,每两位取一次
>>>L[1:5:2]
#倒序输出
>>>L[::-1]
list、tuple等等都可以用切片
列表生成器是循环的简化版吧,我个人觉得
简单来说就是用中括号括住表达式
看例子:
#生成列表list,range()生成从1到10的序列
>>>L = list(range(1,11))
>>>[x*x for i in L]
#遍历L,若是2的倍数就输出i*i
>>>[x*x for i in L if i%2==0]
也可以双重循环,但是python主张简单,所以如果是双重循环不如用for形式
生成器generator,与列表生成器样子很类似,
他是一步一步的生成下一个值的(一边循环一边计算),直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
#列表生成器
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
#生成器
>>> g = (x * x for x in range(10))
>>> g
at 0x1022ef630>
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> Traceback (most recent call last):
File "" , line 1, in <module>
StopIteration
这样每次都要next(),看上去都很痛苦了,然而直接用for也可以,并且通过for循环来迭代它,并且不需要关心StopIteration的错误。
>>> g = (x * x for x in range(10))
>>> for n in g:
... print(n)
...
0
1
4
9
16
25
36
49
64
81
上面看到的只是生成器最简单的调用方式,这里要介绍yield语句,他在很多地方都有运用,在生成器中,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是是一个generator:
而generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
例如: r = yield b 这个表达式分成两部分
首先 yield b 返回b
然后 r = yield 获取值赋给r
判断是否可迭代对象
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
你可能会问,为什么list、dict、str等数据类型不是Iterator?
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。