高级特性
通过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=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" [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" [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 >>> 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保存的是算法,每次调用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 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] 程序写完了,如何输出?又或者是说不同情况下怎么输出?有何不同? 集合数据类型: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的计算是惰性的,只有在需要返回下一个数据时它才会计算。(?)列表生成式
作业
生成器
一边循环一边计算的机制,称为生成器:generator
杨辉三角作业
疑问
迭代器
用于for循环的数据类型:疑问