高级特性
通过python的数据类型、语句和函数,可以编写程序。
构造1-99的列表,可以通过循环实现:
L=[]
n=1
while n<=99:
L.append(n)
n=n+2
切片
>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
>>>L[0:3] (从索引0开始取,取3个元素)
['Michael', 'Sarah', 'Tracy']
>>>L[:3] (也可以省略0,默认从头开始取)
>>>L[-2:] (倒数第二个开始取,取到最后)
['Bob', 'Jack']
>>>L[-2:-1] (倒数第二个取,取1个元素)
['Bob']
>>> L = list(range(100))
>>> L
[0,1,2,3, ...,99]
前十个数:
>>>L[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
后十个数:
>>>L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
前10个数,每两个取一个:
>>>L[:10:2]
[0, 2, 4, 6, 8]
所有数,每5个取一个:
>>>L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
作业
去掉空格
def trim(s)
while s==None:
return '测试失败'
while s[:1] == ' ':
s = s[1:]
while s[-1:] == ' ':
s = s[:-1]
return s
迭代
通过for循环来遍历list或tuple
dict也可以迭代。因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。
>>> d = {'a':1,'b':2,'c':3}
>>> for key in d:
... print(key)
...
a
c
b
默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()
字符串的迭代
>>> for ch in 'ABC':
... print(ch)
...
A
B
C
判断是否为可迭代对象 collections模块的Iterable类型判断
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
enumerate函数可以把一个list变成索引-元素对
>>> for i, value in enumerate(['A','B','C']):
... print(i, value)
...
0 A
1 B
2 C
同时引用两个变量
>>>for x,y in [(1,1),(2,4),(3,9)]:
... print(x,y)
...
1 1
2 4
3 9
作业
def findMinAndMax(L):
if L==[]:
return(None,None)
max=min=L[0]
for n in L:
if n>max:
max=n
if n<min:
min=n
return(min,max)
列表生成式
生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11))
>>>list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
生成平方数。方法一(循环):
>>> L=[]
>>> for x in range(1,11):
... L.append(x*x)
...
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
方法二(列表生成式代替循环生成上面的list):
>>> [x*x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来
加上if判断,这样我们就可以筛选出仅偶数的平方:
>>> [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']
同时迭代key和value:
>>> d={'x':'A','y':'B','z':'C'}
>>> [k+ '='+ v for k, v in d.items()]
['x=A', 'y=B', 'z=C']
最后把一个list中所有的字符串变成小写/大写:
>>> L=['LESLIE','IS','SO','CUTE']
>>> [s.lower() for s in L]
['leslie', 'is', 'so', 'cute']
>>> L=['leslie', 'is', 'so', 'cute']
>>> [s.upper() for s in L]
['LESLIE', 'IS', 'SO', 'CUTE']
不能在最后的if加上else:
>>> [x for x in range(1,11) if x %2==0 else 0]
File"<stdin>", line1
[x for x in range(1,11) if x %2==0 else 0]
SyntaxError: invalid syntax
把if写在for前面必须加else,否则报错:
>>> [x if x %2==0 for x in range(1,11)]
File"<stdin>", line1
[x if x %2==0 for x in range(1,11)]
SyntaxError: invalid syntax
for前面的if要加else:
>>> [x if x %2==0 else -x for x in range(1,11)]
[-1,2, -3,4, -5,6, -7,8, -9,10]
在一个列表生成式中,for前面的if ... else是表达式,而for后面的if是过滤条件,不能带else。
作业
L1 = ['Hello', 'World', 18, 'Apple', None]
L2=[x.lower() for x in L1 if isinstance(x,str)==True]
print(L2)
生成器
一边循环一边计算的机制,称为生成器:generator
创建generator 方法一:
把一个列表生成式的[]改成(),就创建了一个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 0x00000217AB9E46D0>
generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误
>>> g=(x*x for x in range(10))
>>> for n in g:
... print(n)
...
0
1
4
9
16
25
36
49
64
81
斐波那契数列数列
def fib(max):
n,a,b=0,0,1
while n<max:
print(b)
a,b=b,a+b #(b,a+b)是一个tuple
n=n+1
return'done'
把print(b)改为yield b, fib函数变成generator
杨辉三角作业
def triangles():
L=[1]
while true:
yield L
L=[1]+[L[n]+L[n+1] for n in range(len(L)-1)]+[1]
疑问
程序写完了,如何输出?又或者是说不同情况下怎么输出?有何不同?
迭代器
用于for循环的数据类型:
集合数据类型:list、tuple、dict、set、str等
generator:生成器和带yield的generator function
可以直接作用于for循环的对象统称为可迭代对象:Iterable
可以使用isinstance()判断一个对象是否是Iterable对象:
>>> from collections.abc import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
疑问
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。(?)