生成式

本文深入探讨了Python中列表生成式的使用方法及其变形,包括条件判断的应用,以及如何利用列表生成式实现矩阵转置。此外,还介绍了生成器的概念、工作原理及其实现方式,并通过具体示例展示了生成器在实际编程中的应用。
摘要由CSDN通过智能技术生成

列表生成式使用变形:

 1). [i**2 for i in range(2,10,2) ]
 2). [fun(i) for i in range(2,10,2)]
 3). [i**2 for i in range(2,10,2) if i%3==0]
 4). [fun(i) for i in range(2,10,2) if i%3==0]
 5). [fun(i) for i in range(2,10,2) if isFun(i)]

题目: 找出1~10之间所有偶数, 并且返回一个列表, (包含以这个偶数为半径的圆的面积)
print([math.pi * r * r for r in range(2,11,2)])
结果:这里写图片描述

实现矩阵转置的两种方式

1). 列表生成式

li = [
    [1,2,3,3,4],
    [4,5,6,2,1],
    [7,8,9,1,2]
]
print([[ row[columnIndex] for row in li] for columnIndex in range(5)])

结果:这里写图片描述
2). 内置函数zip
print(list(zip(*li )))

字典生成式

字典生成式和连表生成式类似,只需要把[ ]改成{ }.并且包列表生成式里的的元素换成字典的的键值对。

集合生成式

字典生成式和连表生成式类似,只需要把[ ]改成{ }。

生成器

如果函数中有yield, 那么这个函数的返回值就是一个生成器;####生成器
yield: 当函数中包含yield关键字, 返回值是一个生成器, 如果要执行函数内容.需要调用next方法, 或者for循环.
运行过程: 当执行next方法时, 遇到yield程序停止, 直到执行下一次next方法时,从上一次停止的yield处继续执行,遇到yield停止运行.
return: 遇到return函数执行结束;

生成器可以使用的方法:
- next(g)
- g.send(”), 给生成器传递值;
给yield所在位置发送一个数据, 直到遇到下一个yield停止.
生成器fib()执行的过程分析:
看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
由此可以看出,生成器通过关键字 yield 不断的将迭代器返回到内存进行处理,而不会一次性的将对象全部放入内存,从而节省内存空间

def fun():
    print('step 1')
    yield "yield1"
    print('step 2')
    yield  'yield2'
    print('step3')
    res = yield 'yield3'  # res = "hello"
    print("生成器接收了一个值:", res)
    yield "yield4"


# 1. 函数中有yield, 返回值是一个生成器.
g = fun()
print(g)

# 2. 生成器函数默认不执行函数内容, 当next(g)时, 才执行函数内容.
# 3. 执行函数时, 一直执行, 遇到yield停止。 默认情况不会显示yield后面的内容,
#    如果要显示print(next(g))
next(g)
print(next(g))
print(next(g))
# 4. 如果需要给生成器函数传值
#       1). 必须有变量接收传递的值: res = yield 'yield3'
#       2). 通过g.send("hello")
#       3). send方法, 给yield所在位置传值, 接收值之后, 直到遇到yield停止.
g.send("hello")

题目:实现一个微信聊天机器人

def chat_robot():
    res = ''
    while True:
        receive = yield res
        if 'age' in receive:
            res = "年龄保密"
        elif 'name' in receive:
            res = "不知道名字"
        else:
            res = "不想说话"

def main():
    # 生成器对象
    Robot = chat_robot()
    next(Robot)
    while True:
        send_data = input("tt>>:")
        if send_data == 'q' or send_data == 'bye':
            print("不聊了, 我也撤了.....")
            break
        print(Robot.send(send_data))

main()

结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值