Python - 代替for循环的方法汇总(持续更新)


1. 列表解析


举个栗子,创建一个列表:

squares = []
for value in range(1, 11):
	squares.append(value**2)

可用如下代码代替:

squares = [value**2 for value in range(1,11)]


2. 利用map函数,操作列表中的每一个元素


map函数基本语法如下:

map(function, iterable, ...)

其中function为函数;iterable为一个或多个list;py3返回一个迭代器

举个栗子,上面列表解析的语句就可以写成这样:

squares = list(map(lambda x: x ** 2, range(1,11)))

特别地,如果map函数的第一个参数为None,效果相当于zip函数:

map(None, [1,2,3], [4,5,6], [7,8,9])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

zip([1,2,3], [4,5,6], [7,8,9])      
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

但当序列长度不对应时,两个函数的处理方法不同:

map(None, [1,2,3], [4,5,6], [7,8,9,10])   
[(1, 4, 7), (2, 5, 8), (3, 6, 9), (None, None, 10)]

zip([1,2,3], [4,5,6], [7,8,9,10])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]


3. 利用filter函数,过滤列表中所有元素


filter函数基本语法如下:

filter(function, iterable)

注意这里只能有一个迭代对象
类似地,filter的返回值也为迭代器,而非list,故需要强制类型转换

filter函数的本质为,依次判断迭代对象中每个元素对于function是否为True
因此,function为None时,返回的是迭代对象中每个True的元素

#一个栗子
def is_odd(n):
    return n % 2 == 1
newlist = list(filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))

#另一个栗子
filter(lambda x:1<x<10, [-10, 0, 1, 2, 8, 10, 11])  		#lambda匿名函数
[2, 8]


4. 利用reduce函数


reduce函数的基本语法如下:

reduce(function, iterable[, initializer])

其中function为函数,有两个参数;iterable为迭代对象;initializer为初始参数,可选。

reduce函数的本质为,将function应用于迭代对象的前两个元素,得到的结果再与下一个元素进行function运算,以此类推
(注意,元素的前后顺序即为其在function中对应的参数顺序)

如果存在初始参数,则function的第一次运算中,第一个函数参数为初始参数initializer,第二个函数参数为迭代对象的第一个元素。之后的运算方式与没有初始参数时相同。


一个求和的栗子:

reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
15


  • 15
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值