生成器

生成器

一、什么是生成器

生成器本质上就是迭代器,同时也不仅仅是迭代器,除了迭代器其他用途也不是很多,所以他其实就是一个自定义迭代器

二、yield关键字

在这之前我们先来看看什么是迭代器对象,也就是迭代器对象具有

具有__iter__, __next__的方法

我们再来看一段代码

def func():
    return 123
f = func():
print(f)  #123
#我们调用了func函数,那他当然是123了

那么我们来看一下returnyield到底有什么区别呢?

我们再来看一段代码

def func():
    yield 456   # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
    print(789)  # yield会停止函数,当运行下一次next才会继续运行下面的代码
    yield 12345  # 一个yield对应一个next
    print(369789)
f = func()  #生成器
print(f)   # <generator object func at 0x000001F0E44237D8>
f_iter = f.__iter__()
print(f_iter.__next__())
print(f_iter.__next__())
print(f_iter.__next__())

这就表现出了returnyield的区别

二、yield和return的区别

yield的三个特性

1.yield可以把函数变成生成器(自定制的迭代器对象,具有__iter____next__方法)

2.yield可以停止函数,下一次next再次运行yield下面的代码

3.有n个yield生成器就有n个元素,就可以next n次,第n+1次next会报错

return的特性

1.返回值

2.终止函数

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

  1. 生成一个可迭代器对象 --- 》 我要把我的range函数变成一个可迭代对象(迭代器对象)
  2. 丢一个10进去,然后通过for循环的迭代next会丢出0,1,2,3,4,5,6,7,8,9
def range(x):
    count = 0
    while count < x:
        yield count
        count += 1
for i in range(10):
    print(i)
def range (start,end,step):  #有三个参数的range循环
    start = 0
    while start<end:
        yield start
        start +=step
for i in range(1,20,2):
    print(i)
原文地址:https://www.cnblogs.com/yanjiayi098-001/p/11348486.html