Codewars中scramble函数的Lambda实现解析及参数赋值疑问
Codewars scramble函数的Lambda实现解析
问题背景
我在Codewars平台做编程练习题时遇到以下题目:实现函数
scramble(str1, str2),当str1的部分字符可重排后匹配str2时返回true,否则返回false。完成题目后我看到他人的实现代码:scramble=lambda a,b,c=__import__('collections').Counter:not c(b)-c(a)。想请教这段代码的执行逻辑,为何Lambda声明后带有=,参数是如何进行赋值的?我未找到相关的详细解释。
一、代码执行逻辑拆解
这行代码完整实现了题目要求,拆解后逻辑清晰:
- 动态导入计数器工具:
__import__('collections').Counter是Python的动态导入写法,效果和import collections; collections.Counter完全一致——加载collections模块并取出Counter类,这个类用于统计字符串中每个字符的出现次数。 - 计数器减法做合法性判断:
c(b)统计参数b(对应原题的str2)的字符出现次数,生成Counter对象;c(a)统计参数a(对应原题的str1)的字符次数。- Counter支持减法运算:
c(b)-c(a)会返回一个新Counter,仅保留str2中有但str1数量不足的字符。如果str1的字符完全能覆盖str2的需求,减法结果就是空Counter。
- 布尔值转换返回结果:空Counter在布尔判断中等价于
False,用not取反后得到True,符合题目要求的返回值;若减法结果非空,not后就是False,说明字符数量不够。
二、Lambda参数中=的含义
这里的c=__import__('collections').Counter是Python函数参数的默认值语法,细节如下:
- Python的函数(包括lambda匿名函数)允许给参数设置默认值,调用函数时如果不传该参数,就会使用预先定义的默认值。
- 这里把
c的默认值设为Counter类,相当于提前把统计字符的工具绑定到参数c上,lambda内部直接用c()创建计数器即可,无需重复导入模块。 - 这种写法主要是为了压缩代码长度(Codewars社区常追求一行代码解题),同时避免每次调用lambda时重复执行导入操作,提升效率。
内容的提问来源于stack exchange,提问作者André
相关产品推荐
相关产品推荐

