python生成式
本篇将介绍Python的列表生成式,更多内容请参考:Python学习指南
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
举个例子,要生成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,]
但是要生成[1×1, 2×2, 3×3, 4×4,..., 10×10]怎么做?方法一是循环:
>>>L = []
>>>for x in range(1, 11):
L.append(x * x)
>>>L
[1, 4 ,9 ,16, ..., 100]
但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:
>>>[x*x for x in range(1, 11)]
[1, 4, 16, 25, 36, 49, 64, 81, 100]
写列表生成式时,把要生成的元素x * x放在前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。
for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:
>>>[x*x for x in range(1, 11) if x % 2 == 0]
[4, 16, 64, 100]
还可以使用两层循环,还可以生成全排列:
>>>[m+n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
三层和三层以上的循环就很少使用了。
运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:
>>>import os #导入os模块
>>>[d for d in os.listdir('.')] #os.listdir可以列出文件和目录
for循环其实可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value:
>>>d = {'X':'A', 'y':'B', 'z':'C'}
>>>for k, v in d.items():
print(k, '=', 'v')
y = B
x = A
z = C
因此,列表生成式也可以使用两个变量来生成list:
>>>d = {'x':'A', 'y':'B', 'z':'C'}
>>>[k+= ' ='+v for k, v in d.items()]
['y=B', 'x=A', 'z=C']
最后把一个list中所有的字符串变成小写:
>>>L = ['Hello', 'World', 'IBM', 'Apple']
>>>[s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']
复杂表达式
1、使用for循环的迭代不仅可以迭代普通的list,还可以迭代dict。
假设有如下的dict:
d = {'Adam':95, 'Lisa':85, 'Bart':59}
完全可以通过一个复杂的列表生成式把它变成一个HTML表格:
tds = ['<tr><td>%s</td><td>%s</td></tr>'%(name, score) for name, score in d.items()]
print('<table>')
print('<tr><th>Name</th><th>Score</th></tr>')
print '\n'.join(tds)
print('</table>')
注意:字符串可以通过%进行格式化,用指定的参数替代%s。字符串的join()方法可以把一个list拼接成一个字符串。
2、在生成的表格中,对于没有及格的同学,请把分数标记为红色。
d = {'Adam':95, "Lisa":85, "Bart":59}
def generate_tr(name, score):
if score < 60:
return '<tr><td>%s</td><td style="color:red">%s</td></tr>' %s(name, score)
return '<tr><td>Name</td><td>Score</td></tr>'%(name, score)
tds = [generate_tr(name, score) for name, score in d.items()]
print('<table border = "1">')
print('\n'.join(tds))
print('</table>')
3、条件过滤
列表生成式的for循环后面还可以加上if判断,例如:
>>>[x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
如果我们只想要偶数的平方,不改动range()的情况下,可以加上if来筛选:
>>>[x*x for x in range(1, 11) if x % 2 == 0]
[4, 16, 64, 100]
有了if条件,只有if判断为True的时候,才把循环的当前元素添加到列表中。
编写一个函数,它接收一个list,然后把list中的所有字符串变成大写后返回,非字符串元素将被忽略。
[x.upper() for x in L if isinstance(x, str)]
参考
python生成式的更多相关文章
- python 生成式和生成器
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/10/17 21:46 # @Author : lijunjiang # @Fi ...
- python生成式:列表、字典、集合
python的3类生成式: 列表生成式 字典生成式 集合生成式 1.python列表生成式 my_data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(&quo ...
- python生成式和生成器
一,生成式和生成器 1,列表生成式 mylist = [ i*i for i in range(3) if i>1 ] print(mylist) 运行结果:[4] 可以发现,快速生成列表的表达 ...
- python 生成式,生成器,迭代器,可迭代
1.生成器就是迭代器2.生成式用[](中括号)包起来,生成器用()(圆括号)包起来3.生成式在使用前已经在内存中存在,生成器只有在使用时才生成4.迭代器是可以用.__next__()不断取出下一值,直 ...
- python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)
1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...
- python【5】-生成式,生成器
一.条件和循环 1. if语句 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> else: <执行4> 例如: ...
- python基础——列表生成式
python基础——列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4 ...
- python学习笔记——列表生成式与生成器
1.列表生成式(List Comprehensions) python中,列表生成式是用来创建列表的,相较于用循环实现更为简洁.举个例子,生成[1*1, 2*2, ... , 10*10],循环用三行 ...
- Python的高级特性之切片、迭代、列表生成式、生成器
切片 切片就是获取一个list.tuple.字符串等的部分元素 l = range(100) #取[0,5)元素 print(l[:5]) #[0, 1, 2, 3, 4] #在[0,99]中每隔10 ...
随机推荐
- ngRepeat track by
刚刚看见一篇文章讲述track by的功能的,大致记录如下: 1. ng-repeat="friend in friends" 一般不使用track by的情况下,每次刷新DOM, ...
- Dijkstra堆优化学习
最短路径例题 今天特地学习了Dijkstra的堆优化(主要是慕名已久). 我们需要一个堆来记录[编号,到编号这个点的最短路径值(当然只是当前的)] 与原来的Dijkstra操作基本一致,主要有以下几点 ...
- [js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形)
绘制曲线,经常会用到路径的知识,如果你对路径有疑问,可以参考我的这篇文章[js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解. arc:画 ...
- Eclipse中添加文档注释快捷键
该博客仅记录自己添加文档注释时的操作,由于参考文档地址忘了,因此如果与其他文档重复,请见谅 以下是我的操作过程: 例如: /** * @param * @return */ 快捷键为: ...
- Quartz学习——Quartz简单入门Demo(二)
要学习Quartz框架,首先大概了解了Quartz的基本知识后,在通过简单的例子入门,一步一个脚印的走下去. 下面介绍Quartz入门的示例,由于Quartz的存储方式分为RAM和JDBC,分别对这两 ...
- 接口测试——HttpClient工具的https请求、代理设置、请求头设置、获取状态码和响应头
目录 https请求 代理设置 请求头设置 获取状态码 接收响应头 https请求 https协议(Secure Hypertext Transfer Protocol) : 安全超文本传输协议, H ...
- GCD hdu1695容斥原理
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- spring boot 快速生成demo工程 官网生成
最近一直在弄springboot的项目,居然最近才知道快速生成springBoot工程,原来可以这么简单, 而且官网还提供了生成java或是web项目,需要jpa,模板等服务,直接一键集成.话不多说, ...
- 单独创建一个Android Test Project 时junit 的配置和使用
现在的集成ADT后Eclipse都可以直接创建Android Test Project 如图所示: 命名后选择你要测试的单元程序,比如我自己准备测试sms,便可以如图所示那样选择 本人新建的测试工程为 ...
- HDU2048 HDU2049 组合数系列 错排
HDU1465HDU2048HDU2049#include<cstdio> #include<cstdlib> #include<iostream> #includ ...