python的高级特性
在python中,代码是越少越好,越简单越好。
因此就有了python常用的高级特性。
- 切片(Slice)
切片操作符,用于经常取指定索引范围的操作。
好处就是减少使用循环
eg:
list切片
L[0:3]表示从索引0开始取,直到索引3为止,但不包括索引3。
如果第一个索引是0还可以省略。
list切片
倒数切片。-1是倒数第一个元素的索引。
切片不但可以取相邻的,还可以每两个取一次,或者每5个取一次。
list切片
tuple也是一种list,唯一区别是tuple不可变。因此,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
迭代list
下标循环,Python内置的enumerate函数可以把一个list变成索引-元素对
迭代list:索引-元素对
b.迭代字符串
字符串迭代
c.迭代dict
迭代dict
同时迭代key和value
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]
生成list
for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方
生成条件list
还可以使用两层循环,可以生成全排列:
全排列
把一个list中所有的字符串变成小写:
字符串变小写
小练习:
判断list是否都是字符串,并将首字母变成小写,生成list
练习
运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。
- 生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
把一个列表生成式的[]改成(),就创建了一个generator
生成器和列表生成式的区别
generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
使用for循环,不但可以避免抛出StopIteration的错误,而且很方便。generator也是可迭代对象
for循环迭代生成器
如果推算的算法比较复杂,用类似列表生成式的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。