Python中map()与str.strip结合异常问题及内置函数源码查询疑问
问题解析:
map() 用法错误原因及内置函数源码查找方法 一、为什么你的 map() 写法无法正确工作?
你误解了 map() 函数的参数传递逻辑!
map(func, iter1, iter2, ...) 的核心工作逻辑是:依次从每个传入的迭代器中取出一个元素,作为参数打包传给 func,而不是把第二个迭代器整体作为 func 的固定参数。
来看你的代码实际执行过程:
teststring=" (A) / (B) " result = list(map(str.strip, teststring.split("/"), " ()"))
- 首先
teststring.split("/")得到列表[' (A) ', ' (B) '] " ()"会被当作字符迭代器,依次输出' '、'('、')'map()按位置配对调用函数:- 第一次:把
' (A) '和' '传给str.strip→ 等价于' (A) '.strip(' '),结果是'(A)' - 第二次:把
' (B) '和'('传给str.strip→ 等价于' (B) '.strip('('),结果是' (B) '(只去除了开头的(,空格和结尾的)没处理)
- 第一次:把
- 因为第一个迭代器只有2个元素,第三个字符
')'不会被用到,最终结果自然不符合预期。
正确的 map() 写法
要给 str.strip() 固定传递 ' ()' 作为参数,需要用 lambda 包装一层,把分割后的子字符串和固定参数绑定:
teststring=" (A) / (B) " result = list(map(lambda s: s.strip(' ()'), teststring.split("/"))) # 输出:['A', 'B']
这样 map() 会把每个分割后的子字符串传给 lambda,再由 lambda 调用 strip(' ()'),逻辑和你能用的列表推导式完全一致。
二、如何查找 map() 等内置函数的源码?
你用的Anaconda Python本质是CPython发行版,而Python的绝大多数内置函数(比如 map()、str.strip())都是用C语言实现的,没法直接在 .py 文件里找到它们的源码,需要查看CPython的底层源码:
- 找到对应版本的CPython源码:你用的是Python 3.6.4,可以去CPython官方仓库找到3.6分支的代码
- 核心内置函数的位置:
map()的源码在Python/bltinmodule.c文件中,搜索builtin_map就能找到完整实现str.strip()的源码在Objects/stringobject.c文件中,搜索string_strip函数即可
- 如果想快速理解
map()的逻辑,也可以自己写一个Python层面的简化模拟版:
这个模拟能帮你直观理解def my_map(func, *iterables): iterators = [iter(it) for it in iterables] while True: try: args = [next(it) for it in iterators] yield func(*args) except StopIteration: returnmap()如何处理多迭代器的参数传递。
内容的提问来源于stack exchange,提问作者Ando Jurai
相关产品推荐
相关产品推荐

