上周面试面试官冷不丁问了一句Python 的 lambda 和 C# 的 Lambda 有什么区别我脱口而出都是匿名函数嘛差不多。面试官笑了笑那你给我分别写一个接受任意数量参数的版本那一刻我才意识到——C# 的 Lambda 和 Python 的 lambda 虽然长得像骨子里完全不是一回事。C# 的 Lambda 是全能选手Python 的 lambda 是临时工。基础语法对比C# 版本// Lambda 表达式 Funcint, int square x x * x; Funcint, int, int add (a, b) a b; Actionstring print msg Console.WriteLine(msg); // 带代码块的 Lambda Funcint, int, int divide (a, b) { if (b 0) throw new DivideByZeroException(); return a / b; };Python 版本# Lambda 表达式只能是一行 square lambda x: x * x add lambda a, b: a b print_msg lambda msg: print(msg) # Python 的 lambda 只能是单个表达式 # 不能写多行代码块 # divide lambda a, b: if b 0: ... # 语法错误对比一下对比项C#Python语法x x * 2lambda x: x * 2多行代码支持用大括号不支持只能单表达式类型声明必须指定参数类型不需要返回值自动推断或显式 return自动返回表达式结果语句可以包含任意语句只能是表达式C# 的 Lambda 是完整版Python 的是精简版。用法场景对比作为参数传递C# 版本// 在 LINQ 中使用 var numbers new Listint { 1, 2, 3, 4, 5 }; // Lambda 作为参数 var doubled numbers.Select(x x * 2).ToList(); var evens numbers.Where(x x % 2 0).ToList(); var sum numbers.Aggregate(0, (acc, x) acc x); // 自定义方法接受 Lambda public ListT FilterT(ListT list, FuncT, bool predicate) { return list.Where(predicate).ToList(); } var result Filter(numbers, x x 3);Python 版本# 在内置函数中使用 numbers [1, 2, 3, 4, 5] # Lambda 作为参数 doubled list(map(lambda x: x * 2, numbers)) evens list(filter(lambda x: x % 2 0, numbers)) sum_result reduce(lambda acc, x: acc x, numbers) # 自定义函数接受 Lambda def filter_list(lst, predicate): return [x for x in lst if predicate(x)] result filter_list(numbers, lambda x: x 3)C# 的 Lambda 配合 LINQ 使用Python 的配合map/filter使用。作为返回值C# 版本// 返回 Lambda public Funcint, int Multiplier(int factor) { return x x * factor; } var triple Multiplier(3); Console.WriteLine(triple(5)); // 15 // 多行 Lambda 作为返回值 public Funcint, int, int CreateCalculator(string operation) { return (a, b) operation switch { add a b, sub a - b, mul a * b, _ throw new ArgumentException() }; }Python 版本# 返回 Lambda def multiplier(factor): return lambda x: x * factor triple multiplier(3) print(triple(5)) # 15 # Python 的 lambda 只能是单表达式 # 不能写多行逻辑所以复杂场景要用普通函数 def create_calculator(operation): if operation add: return lambda a, b: a b elif operation sub: return lambda a, b: a - b elif operation mul: return lambda a, b: a * b else: raise ValueError(fUnknown operation: {operation})C# 的 Lambda 可以包含复杂逻辑Python 的只能是简单表达式。Lambda 对比普通函数C# 版本// Lambda vs 普通方法 Funcint, int, int addLambda (a, b) a b; int AddMethod(int a, int b) { return a b; } // Lambda 可以访问外部变量闭包 int multiplier 10; Funcint, int multiply x x * multiplier;Python 版本# Lambda vs 普通函数 add_lambda lambda a, b: a b def add_function(a, b): return a b # Lambda 也可以访问外部变量闭包 multiplier 10 multiply lambda x: x * multiplierPython 的 lambda 就是普通函数的语法糖C# 的 Lambda 有独立的语法地位。常见用法模式排序C# 版本// 按属性排序 var users new ListUser { /* ... */ }; users.Sort((a, b) a.Name.CompareTo(b.Name)); users users.OrderBy(u u.Age).ToList(); users users.OrderByDescending(u u.Salary).ToList();Python 版本# 按属性排序 users [{name: 张三, age: 25}, /* ... */] users.sort(keylambda u: u[name]) users.sort(keylambda u: u[age]) users.sort(keylambda u: u[salary], reverseTrue)字典转换C# 版本// 用 Lambda 做转换 var dict new Dictionarystring, int { [a] 1, [b] 2 }; var values dict.Select(kv kv.Value).ToList(); var newDict dict.ToDictionary(kv kv.Key, kv kv.Value * 2);Python 版本# 用 Lambda 做转换 dict_data {a: 1, b: 2} values list(map(lambda x: x[1], dict_data.items())) new_dict {k: v * 2 for k, v in dict_data.items()}设计哲学C# 的 Lambda 是完整的匿名函数——支持多行代码、闭包、泛型推断是 LINQ 的核心。Python 的 lambda 是轻量级语法糖——只能写单个表达式复杂逻辑还是用普通函数。C# 的 Lambda 像是迷你函数能干的事和普通函数差不多 Python 的 lambda 像是一次性纸杯用完就扔别指望它能干重活。坑点提醒Python 的 lambda 只能是表达式——不能包含语句# 错误lambda 不能包含语句 # func lambda x: print(x) if x 0 else None # 语法错误 # 正确写法用三元表达式 func lambda x: print(x) if x 0 else None # 这是表达式可以 # 或者直接用普通函数 def func(x): if x 0: print(x)C# 的 Lambda 会捕获变量引用——循环中的常见坑// 错误所有 Lambda 捕获的是同一个变量 var actions new ListAction(); for (int i 0; i 5; i) { actions.Add(() Console.WriteLine(i)); } // 执行所有 action输出都是 5 // 正确写法创建局部变量 var actions new ListAction(); for (int i 0; i 5; i) { int temp i; actions.Add(() Console.WriteLine(temp)); } // 输出 0, 1, 2, 3, 4Python 的 lambda 同样捕获引用——同样的坑# 错误 funcs [] for i in range(5): funcs.append(lambda: print(i)) for f in funcs: f() # 都输出 4 # 正确写法用默认参数创建新作用域 funcs [] for i in range(5): funcs.append(lambda ii: print(i)) for f in funcs: f() # 输出 0, 1, 2, 3, 4不要滥用 Lambda——保持可读性# 不好过度使用 lambda data list(map(lambda x: x * 2, filter(lambda x: x 0, numbers))) # 好用列表推导式 data [x * 2 for x in numbers if x 0]迁移指南C# 开发者最容易犯的错这一章节的内容比较特殊迁移指南会在后续文章中详细讨论。一句话总结C# 的 Lambda 是全能匿名函数Python 的 lambda 是一次性纸杯——好用但别指望它能干重活。下一篇咱们来聊聊列表推导式 vs LINQ——两种语言处理集合的语法糖大比拼。示例代码C# 转 Python 全系列配套练习代码含 48 章示例GitHubGitHub - LadyKiller1025/csharp-python-demos: C# vs Python 学习系列 - Demo 代码合集 · GitHubGiteehttps://gitee.com/qakjhzx/csharp-python-demos 欢迎点赞、收藏、转发你的支持是我持续创作的动力上周面试面试官冷不丁问了一句Python 的 lambda 和 C# 的 Lambda 有什么区别我脱口而出都是匿名函数嘛差不多。面试官笑了笑那你给我分别写一个接受任意数量参数的版本那一刻我才意识到——C# 的 Lambda 和 Python 的 lambda 虽然长得像骨子里完全不是一回事。C# 的 Lambda 是全能选手Python 的 lambda 是临时工。基础语法对比C# 版本// Lambda 表达式 Funcint, int square x x * x; Funcint, int, int add (a, b) a b; Actionstring print msg Console.WriteLine(msg); // 带代码块的 Lambda Funcint, int, int divide (a, b) { if (b 0) throw new DivideByZeroException(); return a / b; };Python 版本# Lambda 表达式只能是一行 square lambda x: x * x add lambda a, b: a b print_msg lambda msg: print(msg) # Python 的 lambda 只能是单个表达式 # 不能写多行代码块 # divide lambda a, b: if b 0: ... # 语法错误对比一下对比项C#Python语法x x * 2lambda x: x * 2多行代码支持用大括号不支持只能单表达式类型声明必须指定参数类型不需要返回值自动推断或显式 return自动返回表达式结果语句可以包含任意语句只能是表达式C# 的 Lambda 是完整版Python 的是精简版。用法场景对比作为参数传递C# 版本// 在 LINQ 中使用 var numbers new Listint { 1, 2, 3, 4, 5 }; // Lambda 作为参数 var doubled numbers.Select(x x * 2).ToList(); var evens numbers.Where(x x % 2 0).ToList(); var sum numbers.Aggregate(0, (acc, x) acc x); // 自定义方法接受 Lambda public ListT FilterT(ListT list, FuncT, bool predicate) { return list.Where(predicate).ToList(); } var result Filter(numbers, x x 3);Python 版本# 在内置函数中使用 numbers [1, 2, 3, 4, 5] # Lambda 作为参数 doubled list(map(lambda x: x * 2, numbers)) evens list(filter(lambda x: x % 2 0, numbers)) sum_result reduce(lambda acc, x: acc x, numbers) # 自定义函数接受 Lambda def filter_list(lst, predicate): return [x for x in lst if predicate(x)] result filter_list(numbers, lambda x: x 3)C# 的 Lambda 配合 LINQ 使用Python 的配合map/filter使用。作为返回值C# 版本// 返回 Lambda public Funcint, int Multiplier(int factor) { return x x * factor; } var triple Multiplier(3); Console.WriteLine(triple(5)); // 15 // 多行 Lambda 作为返回值 public Funcint, int, int CreateCalculator(string operation) { return (a, b) operation switch { add a b, sub a - b, mul a * b, _ throw new ArgumentException() }; }Python 版本# 返回 Lambda def multiplier(factor): return lambda x: x * factor triple multiplier(3) print(triple(5)) # 15 # Python 的 lambda 只能是单表达式 # 不能写多行逻辑所以复杂场景要用普通函数 def create_calculator(operation): if operation add: return lambda a, b: a b elif operation sub: return lambda a, b: a - b elif operation mul: return lambda a, b: a * b else: raise ValueError(fUnknown operation: {operation})C# 的 Lambda 可以包含复杂逻辑Python 的只能是简单表达式。Lambda 对比普通函数C# 版本// Lambda vs 普通方法 Funcint, int, int addLambda (a, b) a b; int AddMethod(int a, int b) { return a b; } // Lambda 可以访问外部变量闭包 int multiplier 10; Funcint, int multiply x x * multiplier;Python 版本# Lambda vs 普通函数 add_lambda lambda a, b: a b def add_function(a, b): return a b # Lambda 也可以访问外部变量闭包 multiplier 10 multiply lambda x: x * multiplierPython 的 lambda 就是普通函数的语法糖C# 的 Lambda 有独立的语法地位。常见用法模式排序C# 版本// 按属性排序 var users new ListUser { /* ... */ }; users.Sort((a, b) a.Name.CompareTo(b.Name)); users users.OrderBy(u u.Age).ToList(); users users.OrderByDescending(u u.Salary).ToList();Python 版本# 按属性排序 users [{name: 张三, age: 25}, /* ... */] users.sort(keylambda u: u[name]) users.sort(keylambda u: u[age]) users.sort(keylambda u: u[salary], reverseTrue)字典转换C# 版本// 用 Lambda 做转换 var dict new Dictionarystring, int { [a] 1, [b] 2 }; var values dict.Select(kv kv.Value).ToList(); var newDict dict.ToDictionary(kv kv.Key, kv kv.Value * 2);Python 版本# 用 Lambda 做转换 dict_data {a: 1, b: 2} values list(map(lambda x: x[1], dict_data.items())) new_dict {k: v * 2 for k, v in dict_data.items()}设计哲学C# 的 Lambda 是完整的匿名函数——支持多行代码、闭包、泛型推断是 LINQ 的核心。Python 的 lambda 是轻量级语法糖——只能写单个表达式复杂逻辑还是用普通函数。C# 的 Lambda 像是迷你函数能干的事和普通函数差不多 Python 的 lambda 像是一次性纸杯用完就扔别指望它能干重活。坑点提醒Python 的 lambda 只能是表达式——不能包含语句# 错误lambda 不能包含语句 # func lambda x: print(x) if x 0 else None # 语法错误 # 正确写法用三元表达式 func lambda x: print(x) if x 0 else None # 这是表达式可以 # 或者直接用普通函数 def func(x): if x 0: print(x)C# 的 Lambda 会捕获变量引用——循环中的常见坑// 错误所有 Lambda 捕获的是同一个变量 var actions new ListAction(); for (int i 0; i 5; i) { actions.Add(() Console.WriteLine(i)); } // 执行所有 action输出都是 5 // 正确写法创建局部变量 var actions new ListAction(); for (int i 0; i 5; i) { int temp i; actions.Add(() Console.WriteLine(temp)); } // 输出 0, 1, 2, 3, 4Python 的 lambda 同样捕获引用——同样的坑# 错误 funcs [] for i in range(5): funcs.append(lambda: print(i)) for f in funcs: f() # 都输出 4 # 正确写法用默认参数创建新作用域 funcs [] for i in range(5): funcs.append(lambda ii: print(i)) for f in funcs: f() # 输出 0, 1, 2, 3, 4不要滥用 Lambda——保持可读性# 不好过度使用 lambda data list(map(lambda x: x * 2, filter(lambda x: x 0, numbers))) # 好用列表推导式 data [x * 2 for x in numbers if x 0]迁移指南C# 开发者最容易犯的错这一章节的内容比较特殊迁移指南会在后续文章中详细讨论。一句话总结C# 的 Lambda 是全能匿名函数Python 的 lambda 是一次性纸杯——好用但别指望它能干重活。下一篇咱们来聊聊列表推导式 vs LINQ——两种语言处理集合的语法糖大比拼。示例代码C# 转 Python 全系列配套练习代码含 48 章示例GitHubGitHub - LadyKiller1025/csharp-python-demos: C# vs Python 学习系列 - Demo 代码合集 · GitHubGiteehttps://gitee.com/qakjhzx/csharp-python-demos 欢迎点赞、收藏、转发你的支持是我持续创作的动力