(13)生成式

生成式就是用一行代码完成多行代码的等式

列表生成式
res=[]
for item in range(1,11):
  if item > 5:
  res.append(item)
  print(res)

我们for循环几行代码实现了一个范围值放入另一个列表中

如果用列表生成式,则只需要一行
res=[item for item in range(1,11) if item > 5]  # 创建一个列表,放入for循环,因为for循环已经在列表中所以不需要再append方法,直接把值放for循环的左边,然后将返回值赋值给一个变量,打印这个返回值
print(res)

 

res=[2222 for item in range(1,11) if item > 5]  #rang()就是表示列表内有多少个元素,左边这个也可以自定义,如果是一个数字,那么列表中会产生10个2222
print(res)

 

res=[item**2 for item in range(1,11) if item > 5]  #rang()就是表示列表内有多少个元素,左边的值也可以是一个运算式,列表中产生的值就是每个数字的平方式  
print(res)

 

res=[item for item in range(1,11) if item > 5] #表达式的扩展方法,列表的右边也可以是一个判断式,但是只有if,没有else
print(res)

PS:运行逻辑就是先产生一个列表,列表的元素从for循环获取,然后将值放到循环体的左边

PS:要获取返回值必须将返回值放入一个变量打印才能获取

PS:表达式内只要是

PS:for循环生成式最多用到for循环加一个if判断的层面,无法再扩展

 

列表表达式实例

names=['alex_sb','egon','kevin_sb','hxx_sb','wxx_sb']
res=[name for name in names if name.endswith('sb')]
print(res)

 

字典生成式
res={i:i**2 for i in range(10) if i > 5}
print(res)

 

用字典生成式的方式将一个列表转换成字典
l=[('name','egon'),('age',18),('gender','male')]
dic={k:v for k,v in l if k!='age'}
print(dic)

 

集合生成式
res={i for i in range(10)}
print(res,type(res))

PS:注意集合和字典一样是{}表示,但是字典内是key和value形式表示,而集合这是字符串或者是数字表示

 

生成器表达式
res = (x for x in range(1, 5))
print(res)
print(next(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))

PS:生成器表达式和元祖一样是用(),但是()生成的不是元祖,生成器中没有生成元祖生成式

 

生成式实例

获取文本文件内字符最长的一行的字符数

with open('aaa.txt',encoding='utf-8') as f:
  g=(len(line) for line in f)
  print(max(g))  #用max方法获取最大值

PS:max的底层会调用一个for循环,然后取出最大值

用生成式表示
res=max(len(line) for line in f) #这种语法可以省略生成器的(),max((len(line) for line in f)) = max(len(line) for line in f) 这样写即可 
print(res)

 

posted @ 2018-11-25 15:07  clyde_S  阅读(320)  评论(0编辑  收藏  举报