You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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声明后带有=,参数是如何进行赋值的?我未找到相关的详细解释。


一、代码执行逻辑拆解

这行代码完整实现了题目要求,拆解后逻辑清晰:

  1. 动态导入计数器工具:__import__('collections').Counter是Python的动态导入写法,效果和import collections; collections.Counter完全一致——加载collections模块并取出Counter类,这个类用于统计字符串中每个字符的出现次数。
  2. 计数器减法做合法性判断:
    • c(b)统计参数b(对应原题的str2)的字符出现次数,生成Counter对象;c(a)统计参数a(对应原题的str1)的字符次数。
    • Counter支持减法运算:c(b)-c(a)会返回一个新Counter,仅保留str2中有但str1数量不足的字符。如果str1的字符完全能覆盖str2的需求,减法结果就是空Counter。
  3. 布尔值转换返回结果:空Counter在布尔判断中等价于False,用not取反后得到True,符合题目要求的返回值;若减法结果非空,not后就是False,说明字符数量不够。

二、Lambda参数中=的含义

这里的c=__import__('collections').Counter是Python函数参数的默认值语法,细节如下:

  • Python的函数(包括lambda匿名函数)允许给参数设置默认值,调用函数时如果不传该参数,就会使用预先定义的默认值。
  • 这里把c的默认值设为Counter类,相当于提前把统计字符的工具绑定到参数c上,lambda内部直接用c()创建计数器即可,无需重复导入模块。
  • 这种写法主要是为了压缩代码长度(Codewars社区常追求一行代码解题),同时避免每次调用lambda时重复执行导入操作,提升效率。

内容的提问来源于stack exchange,提问作者André

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:57:12