一,生成器:就是自己python用代码写的迭代器,生成器的本质就是迭代器。
生成器的构建方式:
1.通过生成器函数
2.生成器表达式
1.生成器函数:
def func1(x): x += 1 print(1111) yield x x +=2 print(2222) yield 'alex' g_obj = func1(5) # 生成器函数对象 print(g_obj) # <generator object func1 at 0x0000025E5D618780> print(g_obj.__next__()) #一个next对应一个yield print(g_obj.__next__()) #yield 将值返回给 生成器对象.__next__()
2.yield vs return 对比
return :结束函数,给函数的执行者返回值
yield : 不会结束函数,一个next对应yield,给 生成器对象.__next__() 返回值
3.生成器函数 vs 迭代器 区别
1.内存级别的区别
迭代器是需要可迭代对象进行转化。可迭代对象非常占内存
生成器直接创建,不需要转化,从本质就节约内存。
2.生成器可自定制的
def func1(): for i in range(1000000): yield i g1 = func1() for i in range(50): print(g1.__next__())
4.send 与 next的区别
1.send 与next一样,也是对生成器取值(执行一个yield)的方法。
2.send 可以给上一个yield传值。
3.第一次取值永远都是next
4.最后一个yield 永远也得不到send传的值。
def func1(): print(1) yield 6 print(2) yield 7 print(3) yield 8 return g = func1() print(next(g)) print(g.send('alex')) print(g.send('taibai'))
5.生成器表达式:
循环模式:(变量(加工后的变量) for 变量 in iterable)
g = (i for i in range(100000000000)) print(g) print(g.__next__()) print(g.__next__()) print(g.__next__())
筛选模式:(变量(加工后的变量) for 变量 in iterable if 条件)
g = (i for i in range(100000000000) if i % 2 == 0) print(g) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__())
二,列表推导式:一行代码几乎搞定你需要的任何列表
优点:一行解决,方便
缺点:容易着迷,不易排错,不能超过三次循环
结论:列表推导式不能解决所有列表问题,所以不要太刻意使用
#列表循环一般写法: l1 = [] for num in range(1,101): l1.append(num) print(l1) #列表推导式写法 # 循环模式 [变量(加工后的变量) for 变量 in iterable] l = [i for i in range(1,101)] print(l) l2 = ['python%s期' % i for i in range(1,16)] print(l2) print([i*i for i in range(1,11)]) # 筛选模式 [变量(加工后的变量) for 变量 in iterable if 条件] l3 = [i for i in range(1,31) if i % 2 == 0] #30以内所有偶数 print(l3) print([i for i in range(1,31) if i % 3 == 0]) #30以内所有能被3整除的数 print([i**2 for i in range(1,31) if i % 3 == 0]) #30以内所有能被3整除的数的平方 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] print([j for i in names for j in i if j.count('e') == 2]) #找到嵌套列表中名字含有两个'e'的
所有名字
三,字典推导式:
#将一个字典的key和value对调 mcase = {'a':10,'b':34} mcase_frequency = {mcase[k]: k for k in mcase} print(mcase_frequency) #合并大小写对应的value值,将k统一小写 mcase = {'a':10,'b':34,'A':7,'z':3} mcase_frequency = {k.lower():mcase.get(k.lower(),0) + mcase.get(k.upper(),0) for k in mcase.keys()} print(mcase_frequency)
四,集合推导式
#例:计算列表中每个值的平方,自带去重功能 squared = {x**2 for x in [1, -1, 2]} print(squared) # Output: set([1, 4])