鱼C论坛

 找回密码
 立即注册
查看: 633|回复: 3

请教大佬们,reduce函数的工作流程

[复制链接]
发表于 2018-9-5 03:57:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是一个将多个字符替换成一个字符,但是我不懂他的流程,一直想不懂,有大佬能详细介绍一下吗, 并且我想找这个函数的内置代码也找不到,请问在哪找呢

from functools import reduce

def replace_char(s, oldChar, newChar ):
    return reduce(lambda s, char: s.replace(char, newChar), oldChar, s)

s = 'aaa,bbb/ccc|ddd\tzzz?ooo'
new_s = replace_char(s, ',/|\t?', ' ')
print(new_s)

主要搞不清楚,后面的s和前面的s.replace发生了什么变化,而且流程不懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-5 09:22:12 | 显示全部楼层
其实就是把oldChar里的一个个拿来替换s。
def replace_char(s, oldChar, newChar):
    for i in oldChar:
        s = s.replace(i, newChar)
    return s

没啥必要看源码,看介绍就行了。
reduce?
Docstring:
reduce(function, sequence[, initial]) -> value

Apply a function of two arguments cumulatively to the items of a sequence,
from left to right, so as to reduce the sequence to a single value.
For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
((((1+2)+3)+4)+5).  If initial is present, it is placed before the items
of the sequence in the calculation, and serves as a default when the
sequence is empty.
Type:      builtin_function_or_method

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 09:52:32 | 显示全部楼层
return reduce(lambda s, char: s.replace(char, newChar), oldChar, s)
对于一般的reduce(lambda x,y:x+y,[1,2,3,4,5])大家肯定熟悉了
这里是给了初始值的,这样lambda s,char里(这里强调是lambda表达式里的s,而非字符串s)
s最开始就变成了 'aaa,bbb/ccc|ddd\tzzz?ooo',(lambda表达式里的s和外边没有决定关系,完全可以写成return reduce(lambda x, char: x.replace(char, newChar), oldChar, s))
因为给定初值, s初始就是'aaa,bbb/ccc|ddd\tzzz?ooo'  char初始值就是 ',/|\t?'的第一个字符逗号
下一次s就变成了'aaa,bbb/ccc|ddd\tzzz?ooo'.replace(',')的结果,而char也变成了',/|\t?'的第二个字符/
最后实现了全部替换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 09:58:20 | 显示全部楼层
reduce(function, sequence[, initial])
设定了初值,function第一个变量就不是可迭代对象sequence的第一个元素开始迭代,而是从initial开始
第二个变量变成了从可迭代对象sequence第一个元素开始
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 22:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表