# 去除首尾的空白deftrim(s):
start =0for i inrange(len(s)):if s[i]!=" ":
start = i
break
end =len(s)for i inreversed(range(len(s))):if s[i]!=" ":
end = i+1breakreturn s[start:end]
迭代
for ch in str 可以直接遍历字符串中的字符
判断一个对象是否可迭代, collection.abc中的Iterable类型判断
isinstance(xxx,Iterable)
需要下标时,使用enumerate将list变为 索引-元素对
for i, val in enumerate(list)
for循环里,可以同时引用两个变量
列表生成式
创建list
[x * x for x in range(1,11)]
[x * x for x in range(1,11) if x%2 == 0]
此时的if放在后面,作为过滤的条件
此时的if后不能加else
循环也可以多层使用
[m+n for m in ‘ABC’ for n in ‘XYZ’]
结果为AX,AY,AZ,BX,BY,BZ,CX,CY,CZ
for前面是一个表达式,必须要有具体的结果
[x if x%2 ==0 else -x for x in range(1,11)]
意为偶数为正,奇数为负
这里的if就不是过滤条件了,因此需要补上else,使其称为一个完整的表达式
总结,if放for后,就是过滤条件,不能要else; if放for前,就是表达式,必须要else
practice: [s.lower() if isinstance(s,str) else s for s in L]
生成器
不创建完整的list,而是在循环的过程中不断推算出后续的元素,从而节省内存
generator
创建生成器
将列表的[]改为()
在函数中,yield
每次调用next()时函数执行,遇到yield返回,再次执行时从上从yield后继续执行
def fun():xxx g = fun() ,然后使用g就ok
for循环访问生成器时,无法拿到return值,只能捕获StopIteration错误才行
通过next(g)来访问下一个元素
当没有元素时,会抛出StopIteration错误
一般使用for循环来使用
for each in g
杨辉三角行生成器实现
defyanghui_triangle(n):'''
打印杨辉三角
:param n: 一直到第几行
:return:
'''
l =[1]# 初始列表yield l
for i inrange(n):
res =[1]+[l[j]+l[j+1]for j inrange(len(l)-1)]+[1]
l = res
yield res