Python基础教程:生成器

枫铃3年前 (2021-07-11)Python251

1、生成器

def func():
    print("111")
    yield 222
gener = func() # 这个时候函数不会执行. 而是获取到生成器
ret = gener.__next__() # 这个时候函数才会执行. yield的作用和return一样. 也是返回
数据
print(ret)
结果:
111
222

由于函数中存在了yield. 那么这个函数就是一个生成器函数. 这个时候. 我们再执行这个函数的时候. 就不再是函数的执行了. 而是获取这个生成器.

如何使用呢? 想想迭代器. 生成器的本质是迭代器. 所以. 我们可以直接执行__next__()来执行

send和__next__()区别:

  1. send和next()都是让生成器向下走一次
  2. send可以给上一个yield的位置传递值, 不能给最后一个yield发送值. 在第一次执行生成器代码的时候不能使用send()

⽣生成器可以使⽤用for循环来循环获取内部的元素:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func():
    print(111)
    yield 222
    print(333)
    yield 444
    print(555)
    yield 666
gen = func()
for i in gen:
    print(i)
结果:
111   222   333   444   555   666

2、列表推导式

lst = []
for i in range(1, 15):
    lst.append(i)
print(lst)

替换成列表推导式:

lst = [i for i in range(1, 15)]
print(lst)

列表推导式是通过一行来构建你要的列表, 列表推导式看起来代码简单. 但是出现错误之后很难排查.
列表推导式的常用写法:

[ 结果 for 变量 in 可迭代对象]

筛选模式:

[ 结果 for 变量 in 可迭代对象 if 条件 ]
# 获取1-100内所有的偶数
lst = [i for i in range(1, 100) if i % 2 == 0]
print(lst)

3、生成器表达式

生成器表达式和列表推导式的语法基本上是一样的. 只是把[]替换成()

生成器表达式也可以进行筛选:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 获取1-100内能被3整除的数
gen = (i for i in range(1,100) if i % 3 == 0)
for num in gen:
    print(num)
# 100以内能被3整除的数的平⽅方
gen = (i * i for i in range(100) if i % 3 == 0)
for num in gen:
    print(num)
# 寻找名字中带有两个e的⼈人的名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven',
'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
# 不不⽤用推导式和表达式
result = []
for first in names:
    for name in first:
        if name.count("e") >= 2:
            result.append(name)
print(result)
# 推导式
gen = (name for first in names for name in first if name.count("e") >= 2)
for name in gen:
    print(name)

生成器表达式和列表推导式的区别:

  1. 列表推导式比较耗一次性加生成器表达几乎不用内存. 使用的时候才分配和使用内存
  2. 得到的值不一样. 列表推导式得到的是一个列列表. 生成器表达式获取的是一个生成器.

生成器的惰性机制: 生成器只有在访问的时候才取值. 说白了. 你找他要他才给你值. 不找他要. 他是不会执行的.

4、字典推导式

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 把字典中的key和value互换
dic = {'a': 1, 'b': '2'}
new_dic = {dic[key]: key for key in dic}
print(new_dic)
# 在以下list中. 从lst1中获取的数据和lst2中相对应的位置的数据组成一个新字典
lst1 = ['jay', 'jj', 'sylar']
lst2 = ['周杰伦', '林俊杰', '邱彦涛']
dic = {lst1[i]: lst2[i] for i in range(len(lst1))}
print(dic)

5、集合推导式

集合推导式可以帮我们一个集合. 集合的特点: 无序, 不重复. 所以集合推导式自带去重功能

lst = [1, -1, 8, -8, 12]
# 绝对值去重
s = {abs(i) for i in lst}
print(s)

总结: 推导式有, 列表推导式, 字典推导式, 集合推导式, 没有元组推导式
生成器表达式: (结果 for 变量 in 可迭代对象 if 条件筛选)
生成器表达式可以直接获取到生成器对象. 生成器对象可以直接进行for循环. 生成器具有惰性机制.

相关文章

python xlsxwriter使用方法汇总

xlsxwriter用来写入excel的模块 1、创建一个excel文件 import xlsxwriter filename = '/U...

python列表各种切片姿势

顺着切,反...

Python变量作用域

__ author__ = 'Administrator’ 局部变量(在函数里面)只能在函数内部调用,...

Python 实现 动态规划 /斐波那契数列

Python 实现 动态规划 /斐波那契数列

1、斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。