为什么python reduce()会跳过None元素?

All*_*uin 2 python reduce

我试图获得一个网址的主页.首先,我使用for循环并实现目标.

home = ''
my_url = 'http://www.mysite.com/subdir/subdir2/index.html'
for item in my_url.split('/')[:3]:
    home += item + '/'
print  home
Run Code Online (Sandbox Code Playgroud)

而且我能得到

'http://www.mysite.com/' 
Run Code Online (Sandbox Code Playgroud)

然后我遇到了之前从未使用过的reduce().所以我试了一下,这是代码:

my_url = 'http://www.mysite.com/subdir/subdir2/index.html'
home = ''
home = reduce(lambda x,y : x + y + '/',my_url.split('/')[:3])
print home
Run Code Online (Sandbox Code Playgroud)

这次我得到了

'http:/www.mysite.com/'
Run Code Online (Sandbox Code Playgroud)

是否减少只是忽略其中的无?对结果的解释是什么?

是的,我从这个主题知道我可以使用urllib的解析器函数来做到这一点,所以我希望这里的讨论集中在reduce()

Mar*_*cin 6

my_url = 'http://www.mysite.com/subdir/subdir2/index.html'
home = ''
home = reduce(lambda x,y : x + y + '/',my_url.split('/')[:3])

my_url.split('/')[:3] #=> ['http:', '', 'www.mysite.com']

'http:' + '' + '/' #=> 'http:/'
'http:/' + 'www.mysite.com' + '/' #=> 'http:/www.mysite.com/'
Run Code Online (Sandbox Code Playgroud)

这并不神秘.一切都按预期工作 - 问题是URL不统一,因为协议用双斜杠分隔.

理解reduce如何工作的有用工具scanl来自functional(http://pypi.python.org/pypi/functional):

In [11]: home = scanl(lambda x,y : '%s%s/'%(x,y),my_url.split('/')[0],my_url.split('/')[1:3])

In [12]: home
Out[12]: <generator object _scanl at 0x0000000003DEC828>

In [13]: list(home)
Out[13]: ['http:', 'http:/', 'http:/www.mysite.com/']
Run Code Online (Sandbox Code Playgroud)

请注意,str.join实现略有不同的算法:

In [16]: '/'.join(my_url.split('/'))
Out[16]: 'http://www.mysite.com/subdir/subdir2/index.html'
Run Code Online (Sandbox Code Playgroud)

这是人们通常想要的 - 它相当于:

In [22]: reduce(lambda x,y : '%s/%s'%(x,y),my_url.split('/'))
Out[22]: 'http://www.mysite.com/subdir/subdir2/index.html'
Run Code Online (Sandbox Code Playgroud)