zoukankan      html  css  js  c++  java
  • 内置函数二 闭包

    今日总结

    非常重要的一章,可是上课的我好困好困

    1. 匿名函数

      1.1 lambda 形参 : 返回值 ———— lambda x : x

       	形参可有可无,返回值必须写,返回值只能是一个数据类型.  
      

      ​ 匿名函数的名字叫 lambda

      1.2 abs ( ) 绝对值

      1.3 filter("函数","可迭代对象") 写函数的时候可以指定过滤条件

      1.4 map("函数","可迭代对象" ) 写函数时,可以指定对元素的操作

      1.5 zip("可迭代对象","可迭代对象") 返回的是一个内存地址,一般是元组的形式

      1.6 sorted("可迭代对象",key = "函数名", reverse = True) key 是指定排序的规则,默认是升序,写了reverse = True 就是降序

      1.7 reserved ("可迭代对象") 对可迭代对象进行翻转(不改变源数据)

      1.8 max("可迭代对象",key = abs ) #key 指定查找,最大值时的规则

      1.9 min("可迭代对象",key = abs) #key 指定查找,最小时的规则

      1.10 sum("可迭代对象") list tuple set (字典是无序,所以不可以)

      1.11 reduce ("函数",可迭代对象) #函数指定的是计算方式

      1.12 format ( )

       		b ——  2
      

      ​ d —— 10

      ​ o —— 8

      ​ x —— 16

      1. 闭包

        定义: 嵌套函数内,使用非全局变量就是闭包

        干啥: 保证数据的安全性,装饰器的使用

      内置函数二

      abs

      # print(abs())   # 绝对值  返回的都是正数
      lst = [-1,2,3,-5,-90]
      print([abs(i) for i in lst])
      #[1, 2, 3, 5, 90]
      

    ​ enumerate

     enumerate    # 枚举("可迭代对象","序号的起始值")
    #  默认的起始值是 0        得到的都是元组的形式
    
    lst = [(0,1),(1,2),(2,3)]
    print([i for i in enumerate(lst,10)])
    #[(10, (0, 1)), (11, (1, 2)), (12, (2, 3))]
    
    lst = [1,2,3,4,5]
    print([i for i in enumerate(lst,1)])
    #[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)]
    
    lst = [2,3,4,5,6,7]
    print([i for i in enumerate(lst,3)])
    #[(3, 2), (4, 3), (5, 4), (6, 5), (7, 6), (8, 7)]
    
    lst = [11,22,33,-44,23,21]
    new_lst = []
    for i in enumerate(lst):
        new_lst.append(i)
    print(new_lst)
    输出结果
    [(0, 11), (1, 22), (2, 33), (3, -44), (4, 23), (5, 21)]
    
    print([i for i in enumerate(lst,1000)])
    
    输出结果
    [(1000, 11), (1001, 22), (1002, 33), (1003, -44), (1004, 23), (1005, 21)]
    

    max min sum (就他特殊一些)

    print(max([1,2,3,4,5,6,6,7,7,77,8,9])) #77
    print(min([2,3,4,56,7,8]))   #2
    print(sum([1,23,4]))      #28
    print(sum([1,2,3,4],10))   #20    后面的也是继续加上去
    

    range

    g = range(0,10)
    g.__iter__()  #判断是否是可迭代对象
    
    python 2 :
    range(0,10)    #获取的是一个列表
    xrange(0,10)   #获取的是一个可迭代对象
    
    from collections import Iterable,Iterator
    print(isinstance(g,Iterable))  #判断是否是可迭代对象
    print(isinstance(g,Iterator))  #判断是否是迭代器
    

    sep 多个元素连接符 是中间的连接符 end 是末尾

    print(1,end = "
    ")
    print(2)
    #结果
    1
    2
    
    连接起来
    print(1,2,3, sep = "*")
    #1*2*3
    
    print(1,2,3, sep = "    ")
    #1    2    3
    
    print(1,2,3,sep = "	")
    print(4)
    
    #
    1	2	3
    4
    
    print(dict( key = 1, a = "alex"))
    #{'key': 1, 'a': 'alex'}
    
    #print(list("alex"))    #['a', 'l', 'e', 'x']
    
    print(dict(((1,2),(2,3),(3,4))))
    {1: 2, 2: 3, 3: 4}
    
    print(dict([i for i in enumerate(range(20),1)]))   # 这里的 1 是为了排序 是字典中的键
    #{1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18, 20: 19}   得到的是字典
    

    zip 拉链 按照最小的进行合并

    lst1 = [1,2,3,4,5]
    lst2 = ["a","b","c","d","f","e"]
    print(dict(list(zip(lst1,lst2))))
    #{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'f'}    合并出来的是字典    面试题
    
    lst1 = [1,2,3,4,5,6,7,8,9]
    lst2 = ["a","b","d","e","f"]
    print(dict(zip(lst1,lst2)))     去掉 list 也是可以的     面试题
    

    dir 查看当前函数的方法

    print(dir(list))   #
    
    list  的方法
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
    

    重要的内置函数和匿名函数

    def func():
        print(123)
        return "你好"
    func()
    #123
    
    
    def func(a,b):
        return a+b
    print(func(1,2))
    
    #  3       形参和实参
    
    

    匿名函数

    lambda

    f = lambda x,y:(x,y)
    print(f(1,2))
    print(f.__name__)
    #
    (1, 2)
    <lambda>
    
    
    def func():
        return 1
    print(func())
    #  1
    
    
    print((lambda x:x)(2))  #同一行定义  同一行调用
    
    

    lambda

    # lambda  关键字  ---- 定义函数
    # x , y 形参
    # x + y 返回值  ----   只能返回一个数据类型
    
    
    # print((lambda x:x)(2))  #同一行定义  同一行调用
    
    
    lst = [lambda i : i*i for i in range(10)]    for  后面的只是控制循环的次数,
    print(lst[2](2))  #  没有后面(2) 就是一个地址,前面是函数地址
    # 4
    
    
    # lst = [lambda : i*i for i in range(10)]    形参可以不写,返回值必须要写,返回值只能返回一个数据类型
    # print(lst[2]())            这里存起来 等到下面调用的时候就返回值
    
    for i in range(10):   这一块是解释上面的为什么 i 是 9
        pass
    print(i)
    
    #类似于下面的代码  
    lst = []
    for i in range(10):
        def func():
            return i*i
        lst.append(func)
    print(lst[2]())
    #  9
    
    
    lst1 = []
    def func():
        for i in range(5):
            def foo():
                return i*i
            yield foo
    func()
    for x in func():
        lst1.append(x)
    print(lst1[2]())       这个事什么意思呢?留着难题
    
    

    内置函数

    print(format(13,">20"))   #右对齐
    print(format(13,"<20"))   #左对齐
    print(format(13,"^20"))   # 居中
    #
                      13
    13                  
             13         
    
    
    print(format(13,"08b"))   # 二进制
    print(format(13,"08d"))   # 十进制
    print(format(13,"08o"))   # 八进制
    print(format(13,"08x"))   # 十六进制
    #
    00001101
    00000013
    00000015
    0000000d            
    
    

    fliter 过滤

    lst = [1,2,3,4,5,6,7]
    def func(s):
        return s > 3      #func 就是自己定义一个过滤条件 lst 要迭代的对象
    print(list(filter(func,lst)))
    #[4, 5, 6, 7]
    
    
    print(list(filter(lambda x:x % 2 == 1,lst)))
    #[1, 3, 5, 7]
    
    

    map #对象映射

    print(list(map(lambda x : x*x,[1,2,3,8,4,5])))
    #[1, 4, 9, 64, 16, 25]
    
    
    lst = [1,23,34,4,5,213,123,41,12,32,1]
    print(sorted(lst))
    [1, 1, 4, 5, 12, 23, 32, 34, 41, 123, 213]   #升序
    
    
    dic = {"key":1,"key1":2,"key3":56}
    print(sorted(dic,key = lambda x:dic[x],reverse = True))  #按照值排序
    # key 是指定排序规则
    ['key3', 'key1', 'key']
    
    
    lst = [1,2,3,4,6,7,6]
    print(sorted(lst,reverse = True)) #降序     reverse = True
    #[7, 6, 6, 4, 3, 2, 1]
    
    

    reduce 累计算

    from functools import reduce
    print(reduce(lambda x,y:x-y,[1,2,3,4,5]))  #1-2 = -1   继续往后减
    # -13   
    
    

    闭包

    def func():
        a = 1
        def f1():
            def foo():
                print(a)
            return foo
        return f1   #返回给 ret ret() 就是f1()调用
    ret = func()
    a = ret ()
    a()
    func()()()   # 在嵌套函数中,使用非全局变量
                 #且不是本层变量,就是闭包
    
    
    avg_lst = []
    def func(price):
        avg_lst.append(price)
        avg = sum(avg_lst) / len(avg_lst)
        return avg
    print(func(15000))
    print(func(16000))
    print(func(17000))
    print(func(15000))
    
    15000.0
    15500.0
    16000.0
    15750.0
    
    
    闭包的作用:
    
    # 1.  保证数据的安全性
    
    # 2.  装饰器
    
    
  • 相关阅读:
    PyQt5经典案例
    JS实现深拷贝(解决循环引用等问题)
    React/Vue里的key到底有什么用?看完这篇你就知道了!(附demo代码)
    linux盘符操作命令
    Ubuntu20.04下安装opencv for C++
    数字图像处理-python随机噪声、高斯噪声和椒盐噪声实现
    数字图像处理-(1)pyqt页面
    数字图像处理-Python读取BMP文件
    docker笔记
    CentOS7安装GO
  • 原文地址:https://www.cnblogs.com/hualibokeyuan/p/11232309.html
Copyright © 2011-2022 走看看