首页 > 其他分享 >生成器与lambda表达式

生成器与lambda表达式

时间:2024-09-15 22:24:04浏览次数:9  
标签:__ func1 tortoise 迭代 生成器 print 表达式 lambda

目录

生成器

yield 关键字用于创建生成器(generator)

生成器是一种特殊的迭代器,不需要一次性将所有数据加载到内存中,使用 yield 关键字,函数可以返回一个值,然后在下一次调用时从上次返回的位置继续执行

特性

延迟计算,生成器仅在需要时才计算下一个值,这使得它们非常适合处理大规模数据集或无限序列
节省内存,按需生成,因此它们占用的内存更少
迭代器协议,生成器实现了迭代器协议,因此可以使用在任何迭代上下文中

迭代器协议

核心方法
iter(): 返回迭代器对象本身,用于for循环中
next(): 返回迭代器的下一个值。如果没有更多的值可返回,应该抛出 StopIteration 异常,表示迭代结束

迭代器协议的工作原理

可迭代对象(Iterable): 任何实现了__iter()__方法的对象

  • list,dict,set,tuple,str
  • __iter()__方法会返回一个迭代器对象

迭代器对象(Iterator): 实现了 next() 和 iter() 方法的对象

  • 迭代器不仅可以被迭代,还能够记住当前的位置,以便下次继续从上一个返回值处迭代

可迭代对象:只要实现了 __iter__() 方法,它就是可迭代的,代表一个可以产生迭代器的对象。
迭代器对象:不仅实现了 __iter__(),还实现了 __next__() 方法。迭代器负责逐个产生元素,并能记住当前的位置

使用生成器


def func1():
    print("函数func1被调用1")
    yield 2
    print("函数func1被调用2")
    yield 3
    print("函数func1被调用3")
    yield 4

f1 = func1()
print(f1.__next__())
print(f1.__next__())
print(f1.__next__())
print(f1.__next__()) #此处报错

执行结果

函数func1被调用1
2
函数func1被调用2
3
函数func1被调用3
4
Traceback (most recent call last):
  File "xxxxxxx", line 14, in <module>
    print(f1.__next__())
          ^^^^^^^^^^^^^
StopIteration
def func1():
    print("函数func1被调用1")
    yield 2
    print("函数func1被调用2")
    yield 3
    print("函数func1被调用3")
    yield 4

f1 = func1()
for i in f1:
    print(i)

使用for循环对生成器的数据访问

函数func1被调用1
2
函数func1被调用2
3
函数func1被调用3
4
def gentor():
    res = None
    while True:
        res = yield res

g = gentor()
g.__next__()
print(g.send("aaa"))
print(g.send("bbb"))

执行结果

aaa
bbb

计算程序花费时间

import time
import random

def run_time(type):
    def wrapper(func):
        def inner():
            print("{}正在跑步".format(type))
            time1 = time.time()
            func()
            time2 = time.time()
            time_diff = time2 - time1
            print("花费时间:", time_diff)
            print("{}结束跑步".format(type))
        return inner
    return wrapper

run_length = 10

@run_time("tortoise")
def tortoise():
    speed = 1
    for i in range(1, run_length // speed + 1):
        print("tortoise 正在跑了{}米".format(i))
        time.sleep(1)
        print("tortoise 正在休息{}秒".format(1))

@run_time("rabbit")
def rabbit():
    speed = 5
    for i in range(1, run_length // speed + 1):
        rand = int(random.randint(1, 10))
        print("rabbit 正在跑了{}米".format(speed * i))
        time.sleep(rand)
        print("rabbit 正在休息{}秒".format(rand))

tortoise()
rabbit()

执行结果

tortoise正在跑步
tortoise 正在跑了1米
tortoise 正在休息1秒
tortoise 正在跑了2米
tortoise 正在休息1秒
tortoise 正在跑了3米
tortoise 正在休息1秒
tortoise 正在跑了4米
tortoise 正在休息1秒
tortoise 正在跑了5米
tortoise 正在休息1秒
tortoise 正在跑了6米
tortoise 正在休息1秒
tortoise 正在跑了7米
tortoise 正在休息1秒
tortoise 正在跑了8米
tortoise 正在休息1秒
tortoise 正在跑了9米
tortoise 正在休息1秒
tortoise 正在跑了10米
tortoise 正在休息1秒
花费时间: 10.00684404373169
tortoise结束跑步
rabbit正在跑步
rabbit 正在跑了5米
rabbit 正在休息9秒
rabbit 正在跑了10米
rabbit 正在休息7秒
花费时间: 16.001411199569702
rabbit结束跑步

lambda函数

sort()函数排序,是将列表中的元素逐一对比,按从小到大顺序排列
例如goods_info.sort(key=lambda x: x[1]),其中x就是goods_info列表中的子元素,即sort函数会默认将子元素拆分出来,传递给lambda函数

goods_info = [
    ("水杯", 12.5, 25),
    ("西装", 1280, 3689),
    ("电脑", 7800, 13800),
    ("摄像头", 248.8, 349)
]

# sort(key=函数)
goods_info.sort(key=lambda x: x[1]/x[2])

print(goods_info)
[('西装', 1280, 3689), ('水杯', 12.5, 25), ('电脑', 7800, 13800), ('摄像头', 248.8, 349)]
my_list = [1,2,3,4,5]
res_list = map(lambda x: x+1 , my_list)

print(my_list)
print(list(res_list))
[1, 2, 3, 4, 5]
[2, 3, 4, 5, 6]
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 创建一个 Person 类的实例列表
people = [
    Person("Alice", 30),
    Person("Bob", 25),
    Person("Charlie", 35)
]

# 使用 lambda 表达式提取年龄
# map(函数,数据)
ages = map(lambda person: person.age, people)

# 将结果转换为列表并打印
print(list(ages))  # 输出: [30, 25, 35]

from functools import reduce

numbers = [1, 2, 3, 4, 5]

result = reduce(lambda x, y: x + y, numbers)
print(result)  

标签:__,func1,tortoise,迭代,生成器,print,表达式,lambda
From: https://www.cnblogs.com/anyux/p/18415771

相关文章