8.13 生成器

Posted dadazunzhe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.13 生成器相关的知识,希望对你有一定的参考价值。

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
'''

以上是关于8.13 生成器的主要内容,如果未能解决你的问题,请参考以下文章

8.13 2

8.13 1

《DSP using MATLAB》Problem 8.13

《DSP using MATLAB》示例Example 8.13

8.13 12.6-12.9

8.13 一周学习