前言
养成一个好的习惯只需要坚持21天,Day5
高级特性
- 切片
- 迭代
- 列表生成器
- 生成器
切片
取一个list和tuple的部分元素可以用切片快速实现。
L为一个list,L[0:3]
表示从索引0开始取到索引3为止,但不包括索引3,即索引0,1,2三个元素。
如果第一个索引是0,还可以省略为L[:3]
,运行结果和L[0:3]
一样。
如果索引从1开始,取出两个元素则可以写作L[1:3]
,运行结果如下:
由list列表元素的存取可以使用-1作为最后一个元素的索引,这里也支持倒数切片,但要记住倒数第一个元素的索引是-1。
首先创建一个0-99的数列,可以取前10个数、后10个数、前10个数每两个取一个、所有数每隔5个取一个:
字符串也可以看作是一个list,从而进行切片操作。
练习
利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:
def trim(s):
if len(s)==0:
return s
while s[0]==' ':
s=s[1:]
if len(s)==0:
return s
while s[-1]==' ':
s=s[:-1]
if len(s)==0:
return s
return s
迭代
如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。Python中,迭代是通过for...in
来完成的,只要是可迭代对象,无论有没有下标都可以进行迭代,比如list、dict以及字符串等等。
默认情况下,dict
迭代的是key
。如果要迭代value
,可以用for value in d.values()
,如果要同时迭代key
和value
,可以用for k, v in d.items()
。
如何判断一个对象是否是可迭代对象,可以通过通过collections模块的Iterable类型判断:
Python内置的enumerate
函数可以把一个list
变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:
练习
请使用迭代查找一个list中最小和最大值,并返回一个tuple:
def findMinAndMax(L):
if L == []:
return(None,None)
else:
(min,max)=(L[0],L[0])
for x in L:
if x > max:
max = x
elif x < min:
min = x
return (min,max)
列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。灵活运用列表生成式可以大大简化代码实现。
举个栗子,要生成list[1,2,3,4,5,6,7,8,9,10]
可以使用list(range(1,11))
:
如果要生成[1x1, 2x2, 3x3, ..., 10x10]
,可以使用列表生成式一句实现:
if...else
例如输出1到10中的偶数:
在一个列表生成式中,for
前面的if ... else
是表达式,而for
后面的if
是过滤条件,不能带else
。即如果for在if之前,则后面不能加else;如果if在for之前,则后面必须加else。
练习
把list中的字符串变成小写字符串
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 =[s.lower() for s in L1 if isinstance(s, str)]
print(L2)
运行结果:
['hello', 'world', 'apple']
生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。在Python中,可以使用生成器:generator实现一边循环一遍计算的机制。
如何创建一个generator呢?
首先把一个列表生成式的[]改成(),就创建了一个generator:
用next(g)
可以打印出生成器中的元素,直到最后一个。
generator的函数,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行。
练习
斐波拉契数列(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
运行示例:
def triangles():
L = [1]
while True:
yield L
L = [L[x]+L[x+1] for x in range(len(L)-1)]
L.insert(0,1)
L.append(1)
if len(L)>10:
break
n = 0
results = []
for t in triangles():
results.append(t)
n = n + 1
if n == 10:
break
for t in results:
print(t)
if results == [
[1],
[1, 1],
[1, 2, 1],
[1, 3, 3, 1],
[1, 4, 6, 4, 1],
[1, 5, 10, 10, 5, 1],
[1, 6, 15, 20, 15, 6, 1],
[1, 7, 21, 35, 35, 21, 7, 1],
[1, 8, 28, 56, 70, 56, 28, 8, 1],
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
]:
print('测试通过!')
else:
print('测试失败!')
运行结果: