python基础 day12 生成器、生成器表达式、列表字典集合推导式

一、生成器

生成器的本质就是迭代器
唯一的区别是:生成器我们自己用python代码构建的数据结构,而迭代器是python提供的,或者转化得来的。

  • 获取生成器的三种方式

    1.生成器函数

    2.生成器表达式

    3.python内部提供

  • 生成器函数获取生成器

def func():
    yield 3
    yield 4
ret = func()
print(ret)  # <generator object func at 0x0000025DF985F580>生成器对象

print(next(ret))  # 3
print(next(ret))
'''
3
4
'''  # 一个next对应一个yield
  • return 和yield的区别:

    return是结束函数,一个函数只存在一个return,并给函数执行者返回值

    函数中只要有yield,那么它就是生成器函数而不是函数了

    生成器函数中可以存在多个yield,一个yield对应一个next,yield不会结束函数

def gen_fun():
    for i in range(1,5001):
        yield i
ret = gen_fun()

for i in range(200):
    print(next(ret))

for i in range(100):
    print(next(ret))
  • yield from
def func():
    li = [1, 2, 3, 4, 5]
    yield from li  # 将li这个列表变成了迭代器返回

ret = func()
print(next(ret))
print(next(ret))
print(next(ret))
print(next(ret))
print(next(ret))
def func():
    list1 = [1, 2, 3, 4, 5]
    list2 = [6, 7, 8]
    yield from list1
    yield from list2

g = func()
for i in range(8):
    print(next(g))

二、生成器表达式,列表推导式

  • 列表推导式

用一行代码构建一个比较复杂有规律的列表

  1. 循环模式:[变量(加工后的变量) for 变量 in iterable]
li = [i for i in range(1, 11)]
print(li)
# 1.将10以内的所有整数的平方写入列表
list1 = [i ** 2 for i in range(1, 11)]
print(list1)
# 2.100以内所有偶数
list2 = [i for i in range(2, 101, 2)]
print(list2)
# 3.从Jason的女朋友1号到Jason的女朋友100号写入列表
list3 = [f'Jason的女朋友{i}号' for i in range(1, 101)]
print(list3)
# 4.构建[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
list4 = [i for i in range(1, 11)] + list('JQKA')
print(list4)
  1. 筛选模式:[变量(加工后的变量) for 变量 in iterable if 条件]
# 1.100以内能被3整除的数字
list1 = [i for i in range(101) if i % 3 == 0]
print(list1)
# 2.过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
li = ['jason', 'a', 'carly', 'cc', 'dog']
list2 = [i.upper() for i in li if len(i) >= 3]
print(list2)
# 3.筛选出来含有两个'e'的所有的字符串全部大写
list3 = [['jason', 'a', 'ceely', 'cc', 'eeg', 'aece'], ['eye', 'uuueee', 'sex']]
list4 = [j.upper() for i in list3 for j in i if j.count('e') == 2]
print(list4)
  • 生成器表达式:

写法上与列表推导式唯一的区别就是[]变成(),但是生成器推导式非常节省内存

list1 = (i for i in range(101) if i % 3 == 0)
print(list1)
print(next(list1))
print(next(list1))
print(next(list1))

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

1.写法上[] 和 ()
2.本质上iterable(可迭代对象) 和iterator(迭代器)的区别

  • 字典推导式
list1 = ['k1', 'k2', 'k3']
list2 = ['v1', 'v2', 'v3']
dic = {list1[i]: list2[i] for i in range(len(list1))}
print(dic)
  • 集合推导式
set1 = {i for i in range(1, 11)}
print(set1)

猜你喜欢

转载自www.cnblogs.com/west-yang/p/12602571.html