Python中map函数的作用及map前星号表达式的功能咨询
关于Python中map函数和星号解包的问题解答
我来一步步帮你拆解这个问题,搞清楚map函数和星号的作用~
1. Python中map函数的核心作用
map()是Python内置的高阶函数,它的作用是把指定函数依次应用到可迭代对象(比如列表、元组、迭代器)的每个元素上,最终返回一个迭代器对象,里面包含每次函数调用的结果。
举个简单的例子:
# 把字符串列表转成整数列表 num_strs = ['1', '2', '3'] result = map(int, num_strs) print(list(result)) # 输出: [1, 2, 3]
这里map(int, num_strs)会对num_strs里的每个字符串调用int()函数,返回的迭代器需要转成列表(或者遍历)才能看到具体结果——这也是为什么你直接打印map对象会得到<map object at 0x...>的原因。
2. map前的星号*是什么作用?
这个星号是解包操作符,它的作用和map函数本身无关,而是和后面的print函数直接相关(当然也依赖于map返回的是可迭代对象)。
具体来说:
map(...)返回的是一个迭代器,里面包含26个元素(对应a-z每个字母在输入字符串中的索引);- 星号
*会把这个迭代器里的元素逐个拆出来,作为独立的位置参数传给print函数; print函数可以接受任意多个位置参数,然后把它们用空格分隔打印出来。
结合你的代码来看:
print(*map(input().find, map(chr, range(97,123))))
拆解步骤:
map(chr, range(97,123))生成从a到z的26个小写字母的迭代器;input().find是绑定了用户输入字符串的find方法(相当于把每个字母作为参数传给input_str.find());- 外层
map(...)得到每个字母在输入字符串中的索引(找不到则返回-1),是一个包含26个整数的迭代器; *把这个迭代器解包成26个独立的整数参数,传给print,最终打印出这26个数字。
3. 为什么去掉星号会输出<map object at 0...>?
当你去掉星号直接写print(map(...))时,你传给print的是map迭代器对象本身,而不是里面的元素。print函数遇到对象时,会调用它的默认字符串表示(也就是__str__方法),所以会输出像<map object at 0x00000123456789AB>这样的内容,而不是迭代器里的元素。
如果不想用星号,也可以把迭代器转成列表再打印:
print(list(map(input().find, map(chr, range(97,123)))))
这样会输出一个包含26个整数的列表。
4. 星号和*args的关系?
你猜的没错,它们是同一个操作符的两种用法:
- 在函数定义中,
def func(*args):是收集参数——把所有传入的位置参数打包成一个元组args; - 在函数调用中,
func(*iterable)是解包参数——把可迭代对象的元素拆成独立的位置参数传给函数。
所以这里的星号确实和你理解的args相关,只是方向相反。
内容的提问来源于stack exchange,提问作者hiyum
相关产品推荐
相关产品推荐

