一:列表解析
列表解析(列表推导式)是非常有用,简单灵活的工具,可以动态的创建列表。
1,基本语法:
[ expr for iter_var in iterable ]
iterable是一个可迭代对象 expr是元素的处理结果;
列表解析就是在一行代码中写了一个for循环;结果返回的是一个列表
例1:我要创建一个[0,1,4,9,16,25]列表
1)传统函数式编程:
map(lambda(x:x**2),range(6))
2)列表解析:(效率更高!)
[x**2 for x in range(6)]
可以看到新的语句中只调用了一个函数range(),原来的语句用了三个函数map(),lambda(), range()
2,拓展语法:(添加if条件判断)
[ expr for iter_var in iterable if cond_expr]
过滤或捕获满足条件的表达式 cond_expr 的序列成员
例:现有以列表seq = [11,22,32,33,15,8,9,7,9,16,15] 得到所有的奇数。
seq = [11,22,32,33,15,8,9,7,9,16,15]
l = [x for x in seq if x%2==1]
print(l)
二:生成器表达式
生成器表达式和列表解析的差别仅在 ()
1,生成器表达式语法 (返回的是一个生成器)
genetor = ( expr for iter_var in iterable if cond_expr)
2,例题:计算文本中单词的个数?计算文本中非空字符的个数?
- 打开文本,得到文件句柄
- 利用生成器表达式 创建一个生成器
- for循环遍历生成器 以空格分割,并用 len() 计算长度。
- 非空字符的个数?可以len(word)然后进行加和sum()
with open('测试','r',encoding='utf-8') as f:
n = len([word for line in f for word in line.split()])#单词的个数
f.seek(0)#将文件指针移动到开始
s = sum([len(word) for line in f for word in line.strip()])#非空字符串的个数
print(n,s)
例题:求文件中最长的行
- for遍历循环f,得到line
- 用len()求出大小,用max() 求最大值
with open('测试','r',encoding='utf-8') as f:
q = max((len(line.strip())for line in f))
print(q)
例题:交叉配对,将['a','b','c','d']和[1,2,3,4] 交叉配对
rows = ['a','b','c','d']
cols = [1,2,3,4]
ret = ((x,y) for x in rows for y in cols)#ret是一个生成器,要用for循环遍历输出
for i in ret:
print(i,end=',')