回顾一下py基础(lamada,迭代器,生成器)

本文深入探讨Python中的Lambda匿名函数特性,包括其命名空间限制、变量作用时机及实际应用案例。同时,全面解析迭代器的基本概念、创建方法及其在列表、自定义对象中的运用,以及生成器的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lamada匿名函数:

python 使用lamada创建匿名函数
lamada拥有一个自己的命名空间,其只能访问自己的参数

a = lambda b,c:b+c
print(a(1,2))
a = lambda x,y:x*y+1
print(a(20,5))
传20,5 给a =》(20*5+1) = 101

lambda在调用的时候才对变量赋值,而不是定义的时候:

###lambda在运行的时候才调用其他变量,而不是定义的时候
num2 = 100
sum1 = lambda num1 : num1 + num2 ;
num2 = 10000
sum2 = lambda num1 : num1 + num2 ;
print( sum1( 1 ) )
print( sum2( 1 ) )
output :
10001
10001

直接通过lambda对(1, 2)排序

a = [(1, 2), (4, 1), (9, 10), (13, -3)]
a.sort(key=lambda x: x[1])
output:
[(13, -3), (4, 1), (1, 2), (9, 10)]

global a 表示从全局变量哪到函数当中,这样就可以对这个全局变量进行修改了。

input()输入可以带上字符:

 

info = input("请输入")
print(info)

常见对象自省:

dir,查看一个对象的所有属性和方法。	
type,返回一个对象的类型。
inspect,查看一个模块的信息(inspect.getsource(hello)/(hello.hi))#直接查看源码
inspect.getabsfile(hello)  # 查看一个模块的路径

python的迭代器与生成器,迭代器是python最强大的功能之一:

1、迭代器是访问集合的一种方式,迭代器是一个可以记住遍历的位置的对象。
2、迭代器从集合的第一个元素开始访问,直到所有元素被访问完,迭代器只能往前不会后退。
3、迭代器的两种基本用法:iter()、next()。
4、可迭代对象是指其在创建的时候设立了__iter__方法,这样才能用迭代器。

example:
list1 = [5,1,3,7]
it = iter(list1) #创建一个list的迭代器
for i in it:
	print(i)	#遍历这个迭代器
print(next(it)) #输出这个迭代器
print(next(it))
print(next(it))
print(next(it))

a = [2,3]
b = [3,4]
c = zip(a, b) #打成迭代器
a,b = c
print(a)
print(b)

创建迭代器:

# -*- coding = UTF-8 -*-
class Student:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):  # python2.x中使用next,python3.x中使用__name__
        x = self.a
        self.a += 10
        return x

if __name__ == "__main__":
    a = Student()
    it = iter(a)
    times = 0  # 这里这个迭代器只走10遍
    for counter, i in enumerate(it):
        if (counter == 10):
            break
        print('遍历迭代器',i)
    print(next(it))
    print(next(it))
    print(next(it))

在python中,使用yield的被称作生成器:

生成器是一个返回迭代器的函数,在调用生成器运行的过程中。
每次遇到yield时函数会暂停并保存当前的运行信息,返回yield值,并且在下次执行这个迭代器的时候,
函数会从上次断掉的地方再次执行。
比如读数据读时候,数据很大,一次读完内存顶不住,用迭代器只取前面部分。
例子:
# -*- coding = UTF-8 -*-
def f():
    for i in range(0,10):
        yield i

res = f()
print(next(res)) #next 拿出第一个yield
print(next(res))
print(next(res))
print(next(res))
打印:
0、1、2、3
表示中断把结果输出,

 

<think>我们正在讨论Lambda表达式,但根据引用内容,用户提供的引用似乎都是关于Java和C#的Lambda表达式。然而,用户的实际需求是了解Lambda表达式的使用方法或示例。因此,我将以Java和C#为例,结合引用内容,介绍Lambda表达式的基本概念、语法和常见用法。首先,Lambda表达式是一种匿名函数,它可以被传递,并且可以简洁地表示一个行为。它通常用于函数式接口(在Java中)或委托(在C#中)。根据引用[3],Lambda表达式的基本语法如下(以Java为例):-无参数:()->{...}-有参数:(参数)->{...}-单行表达式可以省略大括号和return关键字在C#中,Lambda表达式的语法略有不同,使用“=>”运算符。接下来,我将按照以下结构组织回答:1.Lambda表达式的概念2.Lambda表达式在Java中的使用(包括示例)3.Lambda表达式在C#中的使用(包括示例)4.常见使用场景5.注意事项最后,生成相关问题。注意:用户提供的引用中,引用[1][2][3]是关于Java的,引用[4]是关于C#的。因此,我将分别给出两种语言的示例。由于用户要求使用中文回答,并且按照格式要求,行内公式使用$...$,独立公式使用$$...$$,但在Lambda表达式中可能涉及较少数学公式,如果有涉及再使用。现在开始组织回答。</think> ### Lambda表达式详解与应用指南 Lambda表达式是一种**简洁的函数表示法**,主要用于简化匿名函数(或委托)的实现。以下是核心概念、语法及多语言示例解析: --- #### 一、Lambda表达式核心概念 1. **本质**: - 编译器会将Lambda表达式转换为标准的匿名方法(Java/C#)[^1][^3] - 适用于函数式接口(单抽象方法的接口)或委托场景 - 核心价值:**减少样板代码,提升可读性** 2. **与普通方法的区别**: | 特性 | 普通方法 | Lambda表达式 | |--------------|------------------|----------------------| | 名称 | 需明确命名 | 匿名 | | 语法复杂度 | 高(包含修饰符等)| 低(箭头语法) | | 适用场景 | 复杂逻辑 | 简单逻辑/函数传递 | --- #### 二、Java语法与示例 ##### 1. 基本语法结构 ```java (参数列表) -> { 执行体 } // 多行逻辑 (参数) -> 表达式 // 单行可省略{} ``` ##### 2. 典型使用场景 ```java // 场景1: 替代Runnable接口 Runnable task = () -> System.out.println("线程运行中"); // 无参[^3] // 场景2: 集合过滤 List<String> list = Arrays.asList("Java", "Python", "C++"); list.stream() .filter(s -> s.length() > 4) // 有参Lambda .forEach(System.out::println); // 场景3: 函数式接口 Function<Integer, String> converter = num -> "数字: " + num; System.out.println(converter.apply(42)); // 输出"数字: 42" ``` --- #### 三、C#语法与示例 ##### 1. 基本语法结构 ```csharp (参数) => { 执行体 } // 多行逻辑 参数 => 表达式 // 单行可省略{} ``` ##### 2. 高级应用示例 ```csharp // 动态生成加法方法[^4] var paramA = Expression.Parameter(typeof(int), "a"); var paramB = Expression.Parameter(typeof(int), "b"); var lambda = Expression.Lambda<Func<int, int, int>>( Expression.Add(paramA, paramB), paramA, paramB ); var addFunc = lambda.Compile(); Console.WriteLine(addFunc(3, 4)); // 输出7 // 与LINQ结合 var numbers = new List<int> {1, 2, 3, 4}; var squares = numbers.Select(x => x * x); // [1, 4, 9, 16] ``` --- #### 四、通用使用场景 1. **集合操作**:过滤/映射/归约(如Java Stream API, C# LINQ) 2. **事件处理**:替代匿名内部类(如按钮点击事件) 3. **并发编程**:简化线程任务实现 4. **回调机制**:异步编程中的回调函数 5. **策略模式**:动态替换算法逻辑 --- #### 五、注意事项 1. **变量捕获**: - Java要求捕获的局部变量必须是`final`或等效不可变[^1] - C#可捕获可变变量(需注意闭包陷阱) ```java int factor = 2; // 等效final Function<Integer, Integer> multiplier = x -> x * factor; ``` 2. **代码可读性**: - 复杂逻辑建议拆分为独立方法 - 避免超过3行的Lambda表达式 3. **调试限制**: - 匿名特性使堆栈跟踪信息更抽象 - IDE需支持Lambda调试(如IntelliJ IDEA的Lambda调试工具) --- ### 代码对比示例 | 任务 | 传统匿名类 (Java) | Lambda表达式 (Java) | |------------------|---------------------------------------|-----------------------------| | 线程任务 | `new Runnable() { public void run(){ System.out.print("Run"); }}` | `() -> System.out.print("Run")` | | 比较器 | `new Comparator<String>() { public int compare(String a, String b) { return a.length()-b.length(); }}` | `(a,b) -> a.length() - b.length()` |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值