python:列表推导同filter和map比较以及生成器表达式

列表推导:生成一个列表的快捷方式

#1:列表推导
a = [ord(b) for b in 'abcedf']#ord函数转化为对于的ASCII值
print(a)#输出为[97, 98, 99, 101, 100, 102]
#2:普通写法
c = []
for b in 'abcdef':
	c.append(ord(b))
print(c)
#显然列表推导可读性更好,但记住用列表推导最后是要生成一个列表
#注意:如果列表推导代码超过2行,就没什么优势,得考虑for循环了

2:列表推导不会有变量泄露得问题

x='abc'
y=[ord(x) for x in x]
print(y)#输出为[97, 98, 99]
print(x)#输出为'abc'

而我在虚拟机ubuntu上python2版本运行则会出现泄露问题
在这里插入图片描述
不过现在得py3版本是不会出现的,都有了自己的局部变量
3:filter和map
filter函数:过滤函数,将序列中的每个元素作为参数传递函数进行判断,返回True或False,将返回True的元素放在新列表(python3中迭代器),注意返回的一个是迭代器,加个list即列表
用法:filter(函数名,迭代器)2个参数

def a(x):
	return x%3==0#3的倍数
print(list(filter(a,range(10))))#输出为[0, 3, 6, 9]实现了过滤

2:map函数:返回包含每次传递给参数返回的新列表(python3为迭代器)
用法:map(函数,迭代器)

def a(x):
	return str(x)#将元素转化为字符串
print(list(map(a,range(10))))#输出为['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

3;有一种简便方法是用匿名函数,lambda

print(list(filter(lambda x:x%3==0,range(10))))#输出为[0, 3, 6, 9]lambda即为函数名,可以代表任何函数名

4:其实列表推导比用filter或map组合快些。

print([x for x in range(10) if x%3==0])#输出为[0, 3, 6, 9]看是不是很简洁

5:生成器表达式(生成器推导)
对于列表推导,生成器表达式是更好的选择
生成器表达式用法:和列表推导差不多,把方括号换成圆括号就可以了,返回一个生成器,可逐步执行计算,用next函数或__next__方法获取下一个值,当然也可以进行迭代

y=(i for i in range(10) if i%3==0)
for x in y:
	print(x)
#输出为0
#3
#6
#9

生成器最大特点就是节约内存不会一次性产生含有0 3 6 9 的列表,而是逐个产生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值