<jupyter_start><jupyter_text>python生成器 本文讲解一下python生成器的基本用法。  生成器的使用场景 当数据量很大的时候，比如从一个超大文本文件中读取内容，如果一下子把数据全部放在列表中，相当于一下子把大量数据放在了内存中，有可能造成内存溢出。那么如何解决呢？ 解决方案：不存储所有的数据，而是存储列表元素的生成算法（相当于递推公式），只在使用的时候再根据生成算法生成相应的元素（惰性计算），这就是生成器。  创建生成器的方式  把列表生成式的中括号改为小括号<jupyter_code>a = (x for x in range(3))
print '【Output】'
print type(a)
print a.next()
print '-----'
for x in a:
    print x<jupyter_output>【Output】
<type 'generator'>
0
-----
1
2<jupyter_text>用yield关键字 如果生成器的递推算法比较复杂，列表生成式的方式已经无法满足要求，那么可以用函数+yield关键字的方式来创建生成器。 如果一个函数中出现了yield关键字，那么这个函数就不再是一个普通函数了，而变成了一个生成器，例如：<jupyter_code>def getNum(max):
    x = 0
    while x < max:
        yield x  # 相当于把普通函数的return语句变成了yield语句
        x += 1
a = getNum(3)

print '【Output】'
print type(a)
for x in a:
    print x<jupyter_output>【Output】
<type 'generator'>
0
1
2<jupyter_text>函数遇到yield就中断的特性<jupyter_code>def get():
    for i in range(3):
        print 'step' + str(i)
        yield i
    yield 111
    
    for i in range(10,12):
        print 'step' + str(i)
        yield i
    yield 222

a = get()
print '【Output】'
for x in a:
    print x<jupyter_output>【Output】
step0
0
step1
1
step2
2
111
step10
10
step11
11
222<jupyter_text>生成器的应用：生成斐波那契数列<jupyter_code>def fib(max):
    a,m,n = 0,1,1
    while(a < max):
        yield m
        m,n = n,m+n
        a += 1
print '【Output】'
for x in fib(6):
    print x<jupyter_output>【Output】
1
1
2
3
5
8
{'fraction_non_alphanumeric': 0.1199421965317919, 'fraction_numerical': 0.03757225433526012, 'mean_word_length': 3.8257839721254356, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '363617', 'license': 'MIT', 'n_tokens_mistral': 825, 'n_tokens_neox': 856, 'n_words': 130, 'path': 'generator/handout.ipynb', 'repo_name': 'dnxbjyj/python-basic', 'size': '1384'}