前言:结合之前的知识,进行一些程序的编写。
3.1 切片
如题,取list或tuple的部分元素,按照某种规律,需要用到的就是:
。
>>> l = range(11)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> l[:4]
[0, 1, 2, 3]
>>> l[: : 2]
[0, 2, 4, 6, 8, 10]
>>> l[-3 :]
[8, 9, 10]
>>> l[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
由上可知,隔着取,去部分都可以通过:
实现,而对于字符串'xxx' u'xxx'
,可看作是一种list,虽然说str不变,但是结合之前讲过的内容,只是指向不变,原先生成的str还在,具体见如下:
>>> 'abcd'[:]
'abcd'
>>> 'abcd'[:2]
'ab'
3.2 迭代
给定一个list或tuple,通过for
循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
dict也可以迭代,但是默认取的是key
,如下:
>>> d = {'a':1,'b':2,'c':3}
>>> for i in d:
... print i
...
a
c
b
顺序不一是因为dict不像list按序存储。如果要迭代value,可以用for value in d.itervalues()
,如果要同时迭代key和value,可以用for k, v in d.iteritems()
。这里使用的是method,当然,字符串也可以迭代。
如何判断一个对象是可迭代对象?方法是通过collections模块的Iterable
类型判断:
>>> from collections import Iterable
>>> isinstance('ab',Iterable)
True
>>> isinstance((1,2),Iterable)
True
>>> isinstance(22,Iterable)
False
>>> isinstance(('a','b'),Iterable)
True
如果要对list实行下标循环,可以使用enumerate
函数:
>>> for a,b in enumerate(['a','b','c']):
... print a, b
0 a
1 b
2 c
可迭代就可以用for循环,包括我们自己定义的数据类型,这点在以后会用到。
3.3 列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list
的生成式。
运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。
>>> [x*x for x in range(1,11) if x%2==0]
[4, 16, 36, 64, 100] #不能用逗号
>>> [x + "T" + y for x in 'abc' for y in 'xyz']
['aTx', 'aTy', 'aTz', 'bTx', 'bTy', 'bTz', 'cTx', 'cTy', 'cTz']
>>> l = ['Peter','Mary','Amy']
>>> m = ['apple','peach']
>>> [x + " likes " + y for x in l for y in m]#注意数据类型的一致性
['Peter likes apple', 'Peter likes peach', 'Mary likes apple', 'Mary likes peach', 'Amy likes apple', 'Amy likes peach']
如何把一个list中的所有字符串变成小写:
>>> def test(l=[]):
... m = []
... for x in l:
... if isinstance(x,str):
... m.append(x.lower())
... else:
... m.append(x)
... return m
>>> l = ['Apple','BEer',1,None]
>>> test(l)
['apple', 'beer', 1, None]
>>> [x.lower() if isinstance(x,str) else x for x in l ]
['apple', 'beer', 1, None] #简便程度很显然,要注意的是for后面有了if就不能有else,逻辑不通,但是if...else 后面可以接for...in
3.4 生成器
生成器(generator)是一种一边循环一边计算的生成数据的方式,这样可以节约大量的存储空间。
方法一
列表生成式的状态下将[]
改为()
,用next()
调用数据,也可以使用for
循环,例子如下:
>>> [x*x for x in range(11)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> g=(x*x for x in range(11))
>>> g=<generator object <genexpr> at 0x02B224E0>
>>> g.next()
0
>>> g.next()
1
>>> g.next()
4
>>> g.next()
9
>>> for n in g:
... print n
16 #紧接着未算完的开始,重新获取的话需要重新定义一次
25
36
49
64
81
100
方法二
使用yield
语句。示例如下:
>>> def fib(n):
... i,a,b = 0,0,1
... while i < n:
... print b
... a,b=b,a+b
... i = i+1
>>> fib(5)
1
1
2
3
5
>>> def fib(n):
... i,a,b = 0,0,1
... while i < n:
... yield b
... a,b=b,a+b
... i = i+1
>>>
>>> fib(5)
<generator object fib at 0x02B96968>
>>> for n in fib(5):
... print n
...
1
1
2
3
5
如果一个函数定义中包含yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator
。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。但是对于函数而言,一般只用for来进行调用就可以了,不使用next()方法。