Python之列表解析和生成器表达式

一:列表解析

列表解析(列表推导式)是非常有用,简单灵活的工具,可以动态的创建列表。

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=',')

 

你可能感兴趣的:(Python,基础学习)