Python星号表达式及一行字符首次出现位置代码解析求助
嘿,我完全理解你看到这段代码时的困惑——乍一看确实有点紧凑,但拆解开来每一步都很清晰,尤其是那个星号的作用,咱们一步步来捋:
先拆分代码的执行逻辑(从内到外)
咱们把print(*map(input().find,map(chr,range(97,123))))拆成几个核心部分:
1. 生成a-z的字符序列
range(97,123)会生成从97到122的整数(因为range是左闭右开的),这些正好是小写字母a到z的ASCII码值。
接着map(chr, range(97,123))把每个整数转换成对应的字符,最终得到一个包含'a','b','c',...,'z'的迭代器。
2. 批量查找每个字符的首次出现位置
input()会获取你输入的字符串(比如baekjoon),而input().find其实是把这个字符串的find方法单独拎了出来——str.find(c)的作用是返回字符c在字符串中首次出现的索引,找不到就返回-1。
然后map(input().find, map(chr, ...))就会把前面生成的a-z每个字符,依次传给find方法,相当于循环执行input_str.find('a')、input_str.find('b')...input_str.find('z'),最终得到一个包含所有结果的迭代器。
3. 星号表达式的核心作用:解包迭代器
这就是你最困惑的部分了!print()函数默认接受多个独立的位置参数,然后用空格分隔输出。但map返回的是一个迭代器(不是一堆单独的参数),直接传进去的话,print会输出迭代器的对象地址,而不是里面的数值。
这里的*是迭代器解包运算符,它会把迭代器里的每个元素单独“拆”出来,作为print的一个个位置参数。比如如果map返回的结果是[1,0,-1,...,-1],那么print(*map(...))就等价于:
print(1, 0, -1, -1, 2, -1, ..., -1)
这样print就会把这些参数用空格分隔输出,正好得到你看到的结果。
为什么这段代码这么简洁?
它用了Python的函数式编程思路:把生成字符、批量调用方法、输出结果这几个步骤用map串联起来,再用星号解包省去了手动循环、收集结果再打印的冗余代码。对比你写的冗长代码,本质上做的是一样的事情,但把重复的循环逻辑交给了map和星号来处理。
再举个具体例子(输入baekjoon时)
- 生成a-z字符序列 →
'a','b','c','d','e',...,'z' - 调用
find方法:'baekjoon'.find('a')→ 1'baekjoon'.find('b')→ 0'baekjoon'.find('c')→ -1- ...以此类推,直到
'baekjoon'.find('z')→ -1
- 星号解包这些结果,传给print → 输出
1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
内容的提问来源于stack exchange,提问作者HI YUM

