刚开始学 Python,遇到个问题搞不懂,求指点下

2016-09-01 23:53:33 +08:00
 Cursive

字符串转数字的函数:

from functools import reduce
    def str2int(s): 
        def fn(x, y): 
            return x * 10 + y 
        def char2num(s): 
            return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
        return reduce(fn, map(char2num, s))

{'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]

如果的 s 是 '1' , '2' 这种单个字符,还能理解,这是取词典的键值 可是如果 s 是 '1234' , '1990' 这种的多个字符的字符串,就搞不懂了

求指点下

5291 次点击
所在节点    Python
31 条回复
Allianzcortex
2016-09-02 10:18:08 +08:00
@hitmanx @Cursive str2int = lambda s: reduce((lambda x, y:x * 10 + y), map(int, s))
sudoz
2016-09-02 10:24:29 +08:00
看来是廖雪峰的教程
dongfang
2016-09-02 12:48:42 +08:00
第一,字符串是序列
第二, map(function,sequence)。注意到 map 要求第二个参数主要是序列就可以了。 map 会吧 function 作用到 sequence 的每一元素上。也就是 fn 会作用到字符串 s 的每一个字符上,并且返回一个 list
hanbaobao2005
2016-09-02 13:03:05 +08:00
@Cursive 取 key ,为哈绕不过? 就相当于从字典里取值,字典的 key 就是 s ,值是 s 对应的 int 值
Cursive
2016-09-02 14:37:34 +08:00
@sudoz 这都能看出来吗?


@hanbaobao2005 刚开始以为函数中的参数 s 是一样的,就短路了
V5z6821l30fmhfx6
2016-09-02 14:44:19 +08:00
注意这一句:

```
map(char2num, s)
```

这是 map 函数将字符串 s (例如'1234')的每一个字符都交给 char2num 函数转换,这不就是 map 函数的作用吗?

而 char2num 函数接收一个字符,返回一个数字,最后交由 reduce 函数把转换后的一个个数字组合成整数
necomancer
2016-09-02 22:48:33 +08:00
虽然没懂为什么不直接 int('1234') 完事。但是附上递归版的:

```
def str2num(s):
if not s:
return 0
return 10 * str2num(s[:-1]) + {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s[-1]]
```
necomancer
2016-09-02 22:49:40 +08:00
为什么没缩进……

def str2num(s):
....if not s:
........return 0
....return 10 * str2num(s[:-1]) + {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s[-1]]

只好人工缩进了
bombless
2016-09-03 11:03:20 +08:00
如果不能脑补局部化的代码可以拿张纸遮住无关的, 233
另外初学就看 reduce 这样的方式工作的代码好么 233 ,感觉不懂编程的人初学直接看还好点,夹生的米就不容易煮熟了
necomancer
2016-09-03 15:22:17 +08:00
kittygirl0070
2016-09-19 13:48:42 +08:00
reduce 不需要了,直接用 sum 就可以了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/303349

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX