生成器、迭代器脚本实例



def
counter (start_at=0) : count = start_at while True: val = (yield count) if val is not None: count = val else: count +=1 count = counter(5) #建立一个生成器 print(count.__next__()) #向外面返回一个5,然后count 变为6 print(count.__next__()) #返回一个6 print(count.send(9)) #往yield后面传一个值 print(count.__next__()) count.close() #关闭这个生成器 print(count.__next__()) #不能在生成一个新的值了 执行结果: 5 6 9 10 File "I:/untitled/cx/11月/11-6/2生成器函数.py", line 38, in <module> print(count.__next__()) StopIteration

调用next,它就去寻找yield,然后打印后面的值。

 

第二题

 有⼀个数据结构如下所⽰,请编写⼀个函数从该结构数据中返回由指定的字段和对应的值组成的字 典。如果指定字段不存在,则跳过该字段。(10分)
 data:{"time":"2016-08-05T13:13:05",
 "some_id":"ID1234",
 "grp1":{    "fld1":1,
 "fld2":2},
 "xxx2":{    "fld3":0,
 "fld5":0.4},
 "fld6":11,
 "fld7":7,
 "fld46":8}
 fields:由"|"连接的以"fld"开头的字符串,如:fld2|fld3|fld7|fld19

 def  select(data,fields):
 TODO:implementation
return result
data= {"time":"2016-08-05T13:13:05","some_id":"ID1234","grp1":{    "fld1":1,"fld2":2},
          "xxx2":{    "fld3":0,"fld5":0.4},"fld6":11,"fld7":7,"fld46":8}
fields = "fld2|fld3|fld7|fld19"

第一种解法
def  select(data,fields):
    result = {}
    fields_lst = fields.strip().split('|')
    for m in data.keys():
        if m in fields_lst:
            result[m] = data[m]
        elif type(data[m]) == dict:
            for n in data[m].keys():
                if n in fields_lst:
                    result[n] = data[m][n]
    return result
print(select(data,fields))

第二种解法
def  select(data,fields):
    result = {}
    result_1={}
    fields_lst = fields.strip().split('|')
    for m in data.keys():
        if type(data[m]) == dict:
            for n in data[m].keys():
                result_1[n] = data[m][n]
        else:
            result_1[m] = data[m]
    for k in fields_lst:
        if k in result_1.keys():
            result[k] = result_1[k]
    return result
print(select(data,fields))

3.动态生成平均值

def averager():
    total = 0.0
    count = 0
    average = None
    while True:
        term = yield average
        total += term
        count += 1
        average = total/count


g_avg = averager()
next(g_avg)
print(g_avg.send(10))
print(g_avg.send(30))
print(g_avg.send(5))

4.生成器动态监听文件输入

import time


def tail(filename):
    f = open(filename)
    f.seek(0, 2) #从文件末尾算起
    while True:
        line = f.readline()  # 读取文件中新的文本行
        if not line:
            time.sleep(0.1)
            continue
        yield line

tail_g = tail('tmp')
for line in tail_g:
    print(line)

5.金典1

def demo():
    for i in range(4):
        yield i

g=demo()

g1=(i for i in g)
g2=(i for i in g1)

print(list(g1))
print(list(g2))

6金典2

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()
for n in [1,10]:
    g=(add(n,i) for i in g)    =》(add(10,i) for i in add(10,i) for i in [0,1,2,3])
                                  这是一个生成器,在打印结果之前不会执行。
print(list(g))

 

posted @ 2017-12-20 15:41  明王不动心  阅读(294)  评论(0编辑  收藏  举报