在python中,代码是越少越好,越简单越好。
因此就有了python常用的高级特性。
- 切片(Slice)
切片操作符,用于经常取指定索引范围的操作。
好处就是减少使用循环
eg:
L[0:3]
表示从索引0
开始取,直到索引3
为止,但不包括索引3
。
如果第一个索引是0
还可以省略。
倒数切片。-1
是倒数第一个元素的索引。
切片不但可以取相邻的,还可以每两个取一次,或者每5个取一次。
tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple
字符串切片:
小练习:
利用切片操作,实现一个trim()函数,去除字符串首尾的空格
def trim(s):
if(s[:1]==' '):
s = trim(s[1:])
elif(s[-1:]==' '):
s = trim(s[0:-1])
return s
- 迭代(Iteration)
给定一个list或tuple,可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration).
在python中,迭代是通过for……in
完成的。
a.迭代list
下标循环,Python内置的enumerate函数可以把一个list变成索引-元素对
b.迭代字符串
c.迭代dict
d.判断一个对象是否可迭代
通过collections模块的Iterable类型判断
IDLE界面不需要导入
在dos界面需要导入
from collections import Iterable
小练习:
请使用迭代查找一个list中最小和最大值,并返回一个tuple
def findMinAndMax(L):
if L != []:
max = L[0]
min = L[0]
for l in L:
if max < l:
max = l
if min > l:
min = l
return (min, max)
else:
return (None, None)
- 列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
例如,生成list[1,2,3,4,5,6,7,8,9,10]
list(range(1,11))
生成[1x1, 2x2, 3x3, ..., 10x10]
for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方
还可以使用两层循环,可以生成全排列:
把一个list中所有的字符串变成小写:
小练习:
判断list是否都是字符串,并将首字母变成小写,生成list
运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。
- 生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
把一个列表生成式的[]
改成()
,就创建了一个generator
generator保存的是算法,每次调用next(g)
,就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration
的错误。
使用for循环,不但可以避免抛出StopIteration
的错误,而且很方便。generator也是可迭代对象
如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。
例如著名的斐波拉契数列(Fibonacci)除第一个和第二个数外,任意一个数都可由前两个数相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
def fib(max):
n,a,b = 0,0,1
while n < max:
print(b)
a,b = b,a + b
n = n + 1
return 'done'
这个函数可以输出斐波拉契数列的前N项:
上述函数离generator还差一步:
要想把fib()函数变成generator,只需要把print(b)
改成yield b
就可以了。
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
如果一个函数定义中包含yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator
函数是顺序执行,遇到return
语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行。
小练习:
杨辉三角定义如下:
1
/ \
1 1
/ \ / \
1 2 1
/ \ / \ / \
1 3 3 1
/ \ / \ / \ / \
1 4 6 4 1
/ \ / \ / \ / \ / \
1 5 10 10 5 1
把每一行看做一个list,试写一个generator,不断输出下一行的list
def yhTri(n):
l,index = [1],0
while index < n:
yield l
l = [1] + [l[i] + l[i + 1] for i in range(len(l) - 1)] + [1]
index += 1
现在知道能用for
循环的数据类型有以下几种
一类是集合数据类型:list
,tuple
,dict
,str
一类是generator
包括生成器和带yield
的generator function。
些可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。