• lambda表达式


    一、复习

    迭代器:拥有__iter__,__next__;

    怎样从迭代器中取值:_next 和 for

    生成器:

    自己定义一个能实现迭代器功能的函数就是生成器

    生成器函数:带yield的函数,调用生成器函数,不会执行函数中的任何功能,只是返回一个生成器,调用next、时才执行函数中内容,遇到yield停止,并返回yield的值

    send方法就是向函数中传值,把值赋给yield对应的变量,同时还执行next方法

    一个要用send方法的生成器函数中至少要有两个yield、

    一个生成器函数中有多少个yield就可以调用多少个(next+send)方法、

    生成器的激活只能用next方法

    #2.生成器表达式
    #new_g = (i*i for i in range(100)) #new_g是一个生成器表达式

    二、作业

    读文件,找带关键字的行

    # 3.处理文件,用户指定要查找的文件和内容
    # 将文件中包含要查找内容的每一行都输出到屏幕
    
    def read(fname,str):
        with open(fname,encoding="utf-8")as f:
            l=f.readlines();
            for i in l:
                if str in i:
                    yield i
    
    aa=read("1","奥特曼")
    for i in aa:
        print(i)

    、进阶版本

    __author__ = 'Administrator'
    
    def init(fun):
        def inner(*args,**kwargs):
            g=fun(*args,**kwargs)
            next(g)
            return g
        return inner
    
    
    
    @init
    def read(g_read_line):
        while True:
            fname=yield
            str=yield
            with open(fname,encoding="utf-8")as f:
                l=f.readlines()
                for line in l:
                    if str in line:
                        g_read_line.send(line)
    
    @init
    def read_line():
        while True:
            line=yield
            if line:print(line)
    
    
    
    g_read=read(read_line())
    g_read.send("1")
    g_read.send("奥特曼")

    列表推倒式和生成器表达式

    new_l = []
    for i in range(100):
        new_l.append(i*i)
    
    #list(range(100))
    
    new_l = [i*i for i in range(100)]
    
    new_l = (i*i for i in range(100))  #生成器表达式

    生成器相关面试题

    # 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(g2))
    # print(list(g1))
    
    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)
    
    # # g=(add(n,i) for i in g)
    # n = 10
    # g=(add(n,i) for i in (add(n,i) for i in g))
    # print(list(g))
    
    # for i in [1,2]:
    #     pass
    #
    # print(i)
    
    
    import os
    
    def init(func):   #预激活生成器的一个装饰器
        def wrapper(*args,**kwargs):
            g=func(*args,**kwargs)  #func是一个生成器函数,返回的g是一个生成器
            next(g)   #预激活生成器
            return g #返回激活后的生成器g
        return wrapper
    
    @init    #list_files = init(list_files) == wrapper
    def list_files(target): #target = opener_g
        while 1:
            dir_to_search=yield
            for top_dir,dir,files in os.walk(dir_to_search): #os.walk   (路径,文件夹,文件)
                for file in files:  #从文件列表中获取一个一个的文件
                    target.send(os.path.join(top_dir,file))  #把文件的绝对路径传给了opener_g
    @init    #opener = init(opener)  ==  wrapper
    def opener(target): #target = cat_g
        while 1:
            file=yield   #拿到了一个文件的路径
            fn=open(file,encoding='utf-8') #打开文件获取了一个文件句柄
            target.send((file,fn))  #cat_g发送了一个文件的路径和句柄
    @init  #cat = init(cat) == wrapper
    def cat(target):  #target = grep_g
        while 1:
            file,fn=yield  #文件路径和文件的句柄
            for line in fn:
                target.send((file,line))  #文件路径,文件中的一行
    @init  #grep = init(grep) == wrapper
    def grep(pattern,target):  #要搜索的关键字,printer_g
        lst = []
        while 1:
            file,line=yield  #文件的路径和每一行
            if pattern in line and file not in lst: #判断关键字是否在当前行
                lst.append(file)
                target.send(file) #printer_g.send文件路径
    @init  #printer = init(printer) == wrapper
    def printer():
        while 1:
            file=yield  #获取一个文件路径
            if file:
                print(file)  #打印文件的路径:文件里包含了要搜索的关键字
    
    g=list_files(opener(cat(grep('python',printer()))))
    # g=list_files(opener(cat(grep('python',printer_g))))
    # g=list_files(opener(cat(grep_g)))
    # g=list_files(opener(catg)))
    # g=list_files(opener_g)
    g.send('D:Python代码文件存放目录S6day18')
    
    #用户给一个路径和关键字
    #可以从一个文件路径中找到所有包含关键字的文件

    二、匿名函数、

    匿名函数 简单的需要用函数去解决的问题 匿名函数的函数体 只有一行也叫lambda表达式

    # cal2 = lambda n : n*n
    # ret = cal2(20)
    # print(ret)
    
    # def add(x,y):return x+y
    # add2 = lambda x,y : x+y
    # ret = add2(1,2)
    # print(ret)
    print(max(dic))
    func = lambda k:dic[k]
    print(max(dic,key = func))
    print(max(dic,key=lambda k:dic[k]))
    l = [1,2,3,4]
    d=lambda x:x*x
    print(list(map(d,l)))
    l = [10,11,8,12]
    # def func(x):
    #     return x>10
    # print(list(filter(func,l)))
    # print(list(filter(lambda x:x>10,l)))
    #现有两个元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
    t1 = (('a'),('b'))
    t2 = (('c'),('d'))
    print(list(zip(t1,t2)))
    c=lambda t:{t[0]:t[1]}
    d=map(c,zip(t1,t2))
    print (list(d))
    
    
    d=list(map(lambda z:{z[0],z[1]},zip(t1,t2)))
    print(d)
    l=[i for i in range(100) if i%3==0]
    print(l)
    print(len(l))
    # names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
    #          ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    # print([name for lst in names for name in lst if name.count('e') >=2])
    mcase = {'a': 10, 'b': 34}
    for i in mcase:
        print(i)
    
    [i for i in mcase]
    print({key:key+'1' for key in mcase})
    print({key:mcase[key] for key in mcase})
    print({mcase[key]:key for key in mcase})
    
    mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
    mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase}
    print(mcase_frequency)
  • 相关阅读:
    【原】Ubuntu13.04安装、卸载Gnome3.8
    【原】安装、卸载、查看软件时常用的命令
    【原】中文Ubuntu主目录下的文档文件夹改回英文
    【原】Ubuntu ATI/Intel双显卡 驱动安装
    【转】Hadoop vs Spark性能对比
    【译】Spark调优
    【转】Spark源码分析之-scheduler模块
    【转】Spark源码分析之-deploy模块
    【转】Spark源码分析之-Storage模块
    【转】弹性分布式数据集:一种基于内存的集群计算的容错性抽象方法
  • 原文地址:https://www.cnblogs.com/ctztake/p/7291115.html
Copyright © 2020-2023  润新知