生成器拓展内容

注意事项:

1.生成器只能遍历一次(母鸡一生只能下一定数量的蛋,下完了就死掉了)

求出詹姆斯15个赛季常规赛总得分,并求出单赛季所占总得分比例
single season scores.txt 文件内容

{'赛季':'2003-2004赛季','得分':1654}
{'赛季':'2004-2005赛季','得分':2175}
{'赛季':'2005-2006赛季','得分':2478}
{'赛季':'2006-2007赛季','得分':2132}
{'赛季':'2007-2008赛季','得分':2250}
{'赛季':'2008-2009赛季','得分':2304}
{'赛季':'2009-2010赛季','得分':2258}
{'赛季':'2010-2011赛季','得分':2111}
{'赛季':'2011-2012赛季','得分':1683}
{'赛季':'2012-2013赛季','得分':2036}
{'赛季':'2013-2014赛季','得分':2089}
{'赛季':'2014-2015赛季','得分':1743}
{'赛季':'2015-2016赛季','得分':1920}
{'赛季':'2016-2017赛季','得分':1954}
{'赛季':'2017-2018赛季','得分':2251}

def point(filename):
    with open('single season scords', 'r', encoding='utf-8') as f:
        for r in f:
            yield r

p = point('single season scores.txt')
all = sum(eval(i)['得分'] for i in p)
print(all)

for i in p:
mm    print(i/all)

在上述代码中,单赛季所占总得分的比例求不出来,这是因为,生成器只能遍历一次。在我们执行sum语句的时候,就遍历了我们的生成器,当我们再次遍历我们的生成器的时候,将不会有任何记录。所以,上面的代码不会有任何输出。

因此,生成器的唯一注意事项就是:生成器只能遍历一次。

2.将函数赋值给一个变量时,普通函数与生成器函数所产生的效果差别

#普通函数
def pro():
    print('kingjames')
    return 0
t = pro()


#生成器函数
def pro():
    print('kingjames')
    yield 0
t = pro()

上述代码中,普通函数会打印出‘kingjames’,而生成器函数不会打印出来普通函数,将函数赋值给变量时,相当于执行这个函数。而生成器函数,将函数赋值给变量时,相当于只是拿到了这个生成器,并没有去执行它,得调用__next__方法,或者使用for循环才能运行函数。

原文地址:https://www.cnblogs.com/cjsword/p/10438396.html