注意事项:
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循环才能运行函数。