8.13 生成器

mac2022-06-30  103

8.13 生成器

三元表达式

# 三元表达式/列表推导式/字典生成式 只是让你的代码更少了,但是逻辑没有变化 # 三元表达式只支持双分支结构

普通表达式:

if dog_name == 'crazy_dog': print('疯狂舔?') else: print('溜了')

三元表达式:

print('疯狂舔?') if dog_name == 'crazy_dog' else print('666')

列表推导式

普通表达式:

lt = [] for i in range(10): lt.append(i**2) print(lt)

列表推导式

lt = [i ** 2 for i in range(10)] print(lt)

字典生成器

字典生成式一般与zip(拉链函数--》列表里面包了元组)连用

dic = {'a': 1, 'b': 2} new_dic = {k * 2: v ** 2 for k, v in dic.items()} print(new_dic) # {'aa': 1, 'bb': 4} z = zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4]) # 压缩方法,Python解释器的内置方法 for k,v in z: print(k,v) ''' a 1 b 2 c 3 d 4 ''' dic = {k: v ** 2 for k, v in zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4])} # 不能写这种代码 print(dic) # {'a': 1, 'b': 4, 'c': 9, 'd': 16}

生成器

自定义迭代器, 生成器就是迭代器(自己造出来的)

def func(): yield 456 # yield会使函数func()变成生成器对象,因此他就具有__iter__方法 print(789) # yield会停止函数,当运行下一次next才会继续运行下面的代码 yield 101112 # 一个yield对应一个next print(131415) f = func() # 生成器 print(f) # <generator object func at 0x000001F0E44237D8> f_iter = f.__iter__() print(f_iter.__next__()) print(f_iter.__next__()) # yield的三个特性 1. yield可以把函数变成生成器(自定制的迭代器对象,具有__iter__和__next__方法) 2. yield可以停止函数,再下一次next再次运行yield下面的代码 3. 有n个yield生成器就有n个元素,就可以next n次, 第n+1次next会报错 # return 的特性 1. 返回值 2. 终止函数

用生成器自定制一个range方法

range(10)

生成一个可迭代器对象 --- 》 我要把我的range函数变成一个可迭代对象(迭代器对象)

丢一个10进去,然后通过for循环的迭代next会丢出0,1,2,3,4,5,6,7,8,9

# 最笨的方法, def range(*args): if len(args) == 2: x = args[0] y = args[1] while True: yield x x+=1 if x == y: break if len(args) == 1: x = args[0] c = 0 while c< x: yield c c += 1 if len(args) == 3: x = args[0] y = args[1] z = args[2] while x<y: yield x x+=z else: print('参数出错,只能是三个参数!') for i in range(1,10,2): print(i) ''' 1 3 5 7 9 '''

转载于:https://www.cnblogs.com/dadazunzhe/p/11348011.html

相关资源:Python核心编程第二版(中文)
最新回复(0)