您身边的网站建设专家
成功案例

【建站服务】泸州淘宝装修/泸州京东店铺设计/泸州拼多多网店装修公司/泸州企业网店开通申请-网店装修设计-域名申请

日期: 2022-09-21 05:35:26 浏览数:4


​

上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。


泸州淘宝装修/泸州京东店铺设计/泸州拼多多网店装修公司/泸州企业网店开通申请-网店装修设计

网站建设.png

生成器


在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

以下实例使用 yield 实现斐波那契数列:

实例(Python 3.0+)

#!/usr/bin/python3 import sys def fibonacci(n): # 生成器函数 - 斐波那契    a, b, counter = 0, 1, 0    while True:        if (counter > n):            return        yield a        a, b = b, a + b        counter += 1f = fibonacci(10) # f 是一个迭代器,由生成器返回生成 while True:    try:        print (next(f), end=" ")    except StopIteration:        sys.exit()

执行以上程序,输出结果如下:

0 1 1 2 3 5 8 13 21 34 55


来看一下有yield和没有yield的情况会对生成器了解多点:


第一种:使用 yield

#!/usr/bin/python3


import sys


def fibonacci(n,w=0): # 生成器函数 - 斐波那契

    a, b, counter = 0, 1, 0

    while True:

        if (counter > n): 

            return

        yield a

        a, b = b, a + b

        print('%d,%d' % (a,b))

        counter += 1

f = fibonacci(10,0) # f 是一个迭代器,由生成器返回生成


while True:

    try:

        print (next(f), end=" ")

    except :

        sys.exit()

输出结果:


0 1,1

1 1,2

1 2,3

2 3,5

3 5,8

5 8,13

8 13,21

13 21,34

21 34,55

34 55,89

55 89,144

第二种:不使用 yield

#!/usr/bin/python3


import sys


def fibonacci(n,w=0): # 生成器函数 - 斐波那契

    a, b, counter = 0, 1, 0

    while True:

        if (counter > n): 

            return

        #yield a

        a, b = b, a + b

        print('%d,%d' % (a,b))

        counter += 1

f = fibonacci(10,0) # f 是一个迭代器,由生成器返回生成


while True:

    try:

        print (next(f), end=" ")

    except :

        sys.exit()

输出结果:


1,1

1,2

2,3

3,5

5,8

8,13

13,21

21,34

34,55

55,89

89,144

第二种没有yield时,函数只是简单执行,没有返回迭代器f。这里的迭代器可以用生成l列表来理解一下:


>>> l = [i for i in range(0,15)]

>>> print(l)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

>>> m = (i for i in range(0,15))

>>> print(m)

<generator object <genexpr> at 0x104b6f258>

>>> for g in m:

...     print(g,end=', ')

... 

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,

这里的m就像上面的f一样,是迭代器。


cowpea

   cowpea


  115***1355@qq.com


5年前 (2017-07-27)

   ErikaEmma


  463***503@qq.com


   参考地址


228

什么情况下需要使用 yield?


一个函数 f,f 返回一个 list,这个 list 是动态计算出来的(不管是数学上的计算还是逻辑上的读取格式化),并且这个 list 会很大(无论是固定很大还是随着输入参数的增大而增大),这个时候,我们希望每次调用这个函数并使用迭代器进行循环的时候一个一个的得到每个 list 元素而不是直接得到一个完整的 list 来节省内存,这个时候 yield 就很有用。


具体怎么使用 yield 参考:Python yield 使用浅析


以斐波那契函数为例,我们一般希望从 n 返回一个 n 个数的 list:


def fab(max): 

   n, a, b = 0, 0, 1 

   L = [] 

   while n < max: 

       L.append(b) 

       a, b = b, a + b 

       n = n + 1 

   return L

上面那个 fab 函数从参数 max 返回一个有 max 个元素的 list,当这个 max 很大的时候,会非常的占用内存。


一般我们使用的时候都是这个样子的,比如:


f = iter(fab(1000))

while True:

    try:

        print (next(f), end=" ")

    except StopIteration:

        sys.exit()

这样我们实际上是先生成了一个 1000 个元素的 list:f,然后我们再去使用这个 f。


现在,我们换一个方法:


因为我们实际使用的是 list 的遍历,也就是 list 的迭代器。那么我们可以让这个函数 fab 每次只返回一个迭代器——一个计算结果,而不是一个完整的 list:


def fab(max): 

    n, a, b = 0, 0, 1 

    while n < max: 

        yield b 

        # print b 

        a, b = b, a + b 


泸州淘宝装修/泸州京东店铺设计/泸州拼多多网店装修公司/泸州企业网店开通申请-网店装修设计


上往建站提供搭建网站,域名注册,官网备案服务,网店详情页设计,企业网店,专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管,网页美工排版,致力于域名申请,竞价托管,软文推广,全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机,网站推广,百度竞价托管,网站建设,上网建站推广服务,网络公司有哪些等业务,专业团队服务,效果好。

服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)


全国咨询热线:400-111-6878

地址:全国各地都有驻点商务

Copyright © 2021 通陆科技

网站建设:上往建站