1、list与tuple的切片操作:
list[:5]或list[0:5]表示第0,1,2,3,4个索引值;
负,list[-2:0]等于list[-2:]即倒数第2、倒数第1个数;
跳:list[1:10:2],表示步长为2的。
2、迭代操作:
对于list、tuple还有字符串都可以用 for…in 进行迭代,而对于dictionary的话,也可以哦,只不过默认情况下,dict迭代的是key。
迭代value,用 for value in d.itervalues()
同时迭代key和value,用 for k, v in d.iteritems()
3、列表生成式:很方便
生成1-10的list:
>>> range(1,11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
生成 12、22、……102的list:
>>> list = [x*x for x in range(1,11)] >>> list [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
还可以再选择一下:
>>> [x * x for x in range(1, 11)if x % 2 == 0] [4, 16, 36, 64, 100]
还可以两层循环的:
>>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
注:效果一样
>>>a
=
[[
1
,
2
,
3
],[
4
,
5
,
6
],[
'a'
,
'b'
]]
>>>[y
for
x
in
a
for
y
in
x]
[
1
,
2
,
3
,
4
,
5
,
6
,
'a'
,
'b'
]
from
numpy
import
*
>>> a
=
array([[
1
,
2
],[
3
,
4
],[
5
,
6
]])
>>> a.flatten()
array([
1
,
2
,
3
,
4
,
5
,
6
])
4、生成器:
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。
创建方法1:第一种方法很简单,只要把一个列表生成式的
[]
改成()
,就创建了一个generator:>>> 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 <generator object <genexpr> at 0x104feab40>可以通过generator的.next()方法打印出来数据,另外也可以通过迭代哦,基本上我们都选择for…in迭代方法。
创建方法2:通过特殊函数创建:如果一个函数定义中包含
yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator。#这是函数,输出斐波那契数列 def fib(max): n, a, b = 0, 0, 1 while n < max: print b a, b = b, a + b n = n + 1 #这是generator,也是生成斐波那契数列; def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1
注意:这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用
next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行。>>> def odd(): ... print 'step 1' ... yield 1 ... print 'step 2' ... yield 3 ... print 'step 3' ... yield 5 ... >>> o = odd() >>> o.next() step 1 1 >>> o.next() step 2 3 >>> o.next() step 3 5 >>> o.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration