zoukankan      html  css  js  c++  java
  • Day 13 匿名函数 :内置函数: 闭包

    01 今日大纲内容

    • 如何学习:
      • 一定要把预习加上!
      • 分配比例:
        • 文字总结格式(1/3),晚上20点-21点之前 完成总结以及代码练习
        • 20点-21点之后写作业

    02 昨日内容回顾作业讲解

    • 生成器:生成器就是迭代器,生成器是自己用python代表构建的
        1. 生成器函数
        2. 生成器表达式
        3. python内部提供的
      • 如何判断函数与生成器函数
        • yield
        • yield (一个yield对一个next,返回值,不终止)与 return(终止函数,返回值)的区别
      • 吃包子
      • yield from 讲一个可迭代对象,变成一个生成器
      • 列表推导式,生成器表达式
        • 循环模式[变量(加工后的变量 for 变量 in iterable)]
        • 筛选模式[变量(加工后的变量 for 变量 in iterable if 条件)]
      • 内置函数(避免重复造轮子,提升开发效率,68个)

    03 今日内容

    1. 匿名函数:一句话函数,比较简单的函数

      1. 此函数不是没有名字,他是有名字的,他的名字就是你给其设置的变量,比如func

      2. lambda 是定义匿名函数的关键字,相当于函数的def

      3. lambda 后面直接加形参,形参加多少都可以,只要用逗号隔开就行

      4. 返回值在冒号之后设置,返回值和正常函数一样,可以使任意数据类型

      5. 匿名函数不管多复杂,只能写一行,且逻辑结束后直接返回数据
        课上练习:

        匿名函数 :一句话函数,比较简单的函数

        def func(a,b):
        return a + b

        构建匿名函数

        func1 = lambda a,b:a+b
        print(func1(1,2))

      • 接收一个可切片的数据,返回索引为0与2的对应元素(元组形式)
        func2 = lambda a:(a[0],a[2])
        print(func2([22,33,44,55,66]))
      • 写匿名函数,接收两个int参数,将较大的数据返回
        func3 = lambda a,b: a if a > b else b
        print(func3(1,200))
    2. 内置函数
      # python提供了68个内置函数
      # 今天讲的这部分大部分了解即可
      # eval 剥去字符串的运算外衣,运行里面的代码,有返回值**
      s1 = '1 + 3'
      print(s1)
      print(eval(s1))
      s = "{'name':'alex'}"
      print(s,type(s))
      # print(dict(s)) ##错误
      print(eval(s),type(eval(s)))
      # 网络传输的str input 输入的时候,sql注入等等,绝对不能够使用eval,携带病毒的字符串,eval后直接运行病毒

      # exec 与 eval 几乎是一样,代码流
      msg = '''
      for i in range(10):
          print(i)
      '''
      print(msg)
      exec(msg)
      
      
      # hash 哈希值
      print(hash('ahsfgajhhalga'))
      
      # help 帮助
      s1 = 'laksldka'
      print(help(str))
      print(help(str.upper))
      s1 = 'dasd'
      s1.upper()    #对变量本身不更改
      print(s1)
      
      # # callable 判断一个对象是否可以被调用!!!
      s1 = 'aksdajklf'
      # s1()   # TypeError: 'str' object is not callable
      def fun():
          pass
      fun()   #可执行
      print(callable(fun))
      print(callable(s1))
      
      
      # int # 整形
      print(int(4.6))
      
      # float # 浮点型
      print(type(3.6))
      
      # complex 复数
      print(complex(1,2)) #(1+2j)
      
      # bin:将十进制转换成2进制
      print(bin(100))    # 0b1100100
      
      # oct:将十进制转化成八进制字符串并返回
      print(oct(10))     #0o12
      
      # hex:将十进制转化成十六进制字符串并返回
      print(hex(160))    #0xa0
      print(hex(16))    #0x10
      print(hex(13))    #0xd
      
      # divmod !!取商取余
      print(divmod(10,3)) #(3, 1) 商3余1
      
      # round:保留浮点数的小数位数!!
      print(round(3.14156,2))
      
      # pow:求x**y次幂 (三个参数时,对x**y的结果对z取余)
      print(pow(2,3))     #2的三次方,8
      print(pow(2,3,3))   #8除以3 余2
      
      # bytes 编码
      s1 = '太白'
      b = s1.encode('utf-8')
      print(b)
      b = bytes(s1,encoding='utf-8')
      print(b)
      
      # ord:输入字符找到该字符的编码位置
      # ascii Unicode
      print(ord('a'))
      print(ord('中')) #20013
      
      # chr:输入位置,找出对应的字符
      print(chr(98)) # b
      print(chr(20014))   #Unicode
      
      # repr:返回一个对象的string形式(原形毕露)!!!
      s1 = '存龙'
      print(s1)
      print(repr(s1))
      msg = f'我叫{s1}'
      print(msg)
      print(repr(msg))
      
      
      # all 可迭代对象中,全都是True 才是True
      l1 = [1, 2, '太白3', True, [1,2,3], '']
      print(all(l1))  #False
      
      # any :可迭代对象中,有一个是True 就是True
      l1 = [1, 2, '太白3', True, [1,2,3], '']
      print(any(l1))
      
      # print函数
      # print(self, *args, sep=' ', end='
      ', file=None)
      print(1,2,3,4)
      print(1,2,3,4,sep='^')
      
      print(1,end=' ')
      print(2)
      
      # list函数
      l1 = [1,2,3,4]
      l2 = list() #[]
      l2 = list('asdhjashf')
      print(l2)   #['a', 's', 'd', 'h', 'j', 'a', 's', 'h', 'f']
      
      dict 字典创建的几种方式
      这季节创建
      # 元组的解构
      dic = dict([(1,'one'),(2,'two'),(3,'three')])   #列表中放元组
      print(dic)
      dic = dict(one=1,two = 2)    #dict中放参数
      print(dic)
      # fromkeys
      # 字典推导式
      
      
      # abs()   #绝对值!!!
      print(abs(-6))
      
      # sum()   #求和!!!
      l1 = [i for i in range(10)]
      s1 = '123456'
      print(sum(l1))  #45
      print(sum(l1,100))  #145
      # print(sum(s1)) #错误 TypeError: unsupported operand type(s) for +: 'int' and 'str'
      
      # reversed 翻转 返回的是一个翻转的迭代器!!!
      l1 = [i for i in range(10)]
      l1.reverse()    #列表的方法,改变了原列表
      print(l1)#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      l1 = [i for i in range(10)]
      obj = reversed(l1)  #不对原列表进行操作
      print(l1)   #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      print(list(l1)) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      
      # zip 拉链方法
      l1 = [1,2,3,4,5,6]
      tu1 = ('太白','b哥','的干煤化工')
      s1 = 'sadjakjda'obj = zip(l1,tu1,s1)
      print(list(obj))
      
      # 以下方法最最最重要!!!!!!!!!!!
      # min max
      l1 = [33,2,3,54,7,-1,-9]
      print(min(l1))
      # 以绝对值的方法去最小值
      l2 = []
      func = lambda a:abs(a)
      for i in l1:
          l2.append(func(i))
      print(min(l2))
      
      def abss(a):
          '''
          第一次:a = 33 以绝对值 取最小值 33
          第二次:a = 2  以绝对值 取最小值 2
          第三次:a = 3  以绝对值 取最小值 2
          ........
          第六次:a = -1 以绝对值 取最小值 1
          '''
          return abs(a)
      print(min(l1,key = abss)) #abss不加(),使用变量名
      # 凡是可以加key的:他会自动的将可迭代对象中的每个元素按照顺序传入key对应的函数中,
      # 以返回值比较大小
      dic = {'a':3,'b':2,'c':1}
      求出最小的键
      print(min(dic)) #min会按照字典的键去比较大小
      def func(*args):
      '''
          第一次:
          args:'a'  返回值:dic['a']  记录:3
          第二次:
          args:'b'  返回值:dic['b']  记录:2
          第三次:
          args :'c' 返回值:dic['c']  记录:1
      '''
          return dic[args]
      print(min(dic,key=lambda a:dic[a]))
      func = lambda a:dic[a]
      print(min(dic,key=func))
      l2 = [('太白',18), ('alex', 73), ('wusir', 35), ('口天吴', 41)]
      print(min(l2))
      print(min(l2,key=lambda a:l2[1]))
      # max pass
      
      # sorted 加key
      l1 = [22, 33, 1, 2, 8, 7,6,5]
      l2 = sorted(l1)
      print(l1)
      print(l2)
      l2 = [('大壮', 76), ('雪飞', 70), ('纳钦', 94), ('张珵', 98), ('b哥',96)]
      print(sorted(l2))
      print(sorted(l2,key=lambda a:a[1])) #返回的是一个列表,默认从低到高
      print(sorted(l2,key=lambda a:a[1],reverse=True)) #返回的是一个列表,默认从低到高
      
      # filter  列表推导式的筛选模式
      l1 = [2, 3, 4, 1, 6, 7, 8]
      print([i for i in l1 if i > 3]) #返回的是列表
      ret = filter(lambda a:a>3,l1)   #返回的是迭代器
      print(ret)
      print(list(ret))
      
      # map  列表推导式的循环模式
      l1 = [2, 3, 4, 1, 6, 7, 8]
      print([i**2 for i in l1])   #返回的是列表
      ret = map(lambda a:a**2,l1) #返回的是迭代器
      print(list(ret))
      
      
      # reduce    #累加 第一次取2个值,后续一次取1个值,根据函数来计算
      from functools import reduce
      def func(x,y):
          '''
          第一次:x,y:11,2   x+y
          '''
          return x+y
      l = reduce(func,[11,2,3,4,5])
      print(l)
      
    3. 闭包:整个历史中的某个商品的平均收盘价。什么叫平局收盘价呢?就是从这个商品一出现开始,每天记录当天价格,然后计算他的平均值:平均值要考虑直至目前为止所有的价格。
      比如大众推出了一款新车:小白轿车。
      第一天价格为:100000元,平均收盘价:100000元
      第二天价格为:110000元,平均收盘价:(100000 + 110000)/2 元
      第三天价格为:120000元,平均收盘价:(100000 + 110000 + 120000)/3 元
      1.闭包只存在于嵌套函数中
      2.内层函数对外层函数非全局变量(自由变量)的引用或使用,就会形成闭包
      3.被引用的非全局变量也称作自由变量,这个自由变量会与内层函数产生一个绑定关系
      4.自由变量不会再内存中消失
      5.闭包的作用,保证数据的安全.函数外访问不到l1
      # 闭包
      # 封闭的东西:保证数据安全

      # 不断输入参数,求平均值 方案一:
      l1 = [] # l1为全局变量,数据不安全
      li = []
      def make_averager(new_value):
          l1.append(new_value)
          total = sum(l1)
          averager = total/len(l1)
          return averager
      print(make_averager(100000))
      print(make_averager(180000))
      print(make_averager(140000))
      print(make_averager(103000))
      print(make_averager(93000))
      
      
      # 方案二:数据安全,l1不能是全局变量
      # 每次执行的时候,l1列表都会重新赋值成[]
      li = []
      def make_averager(new_value):
          l1 = []
          l1.append(new_value)
          total = sum(l1)
          averager = total/len(l1)
          return averager
      print(make_averager(100000))
      print(make_averager(200000))
      
      
      # 方案三:闭包
      def make_averager():
          l1 = []
          def averager(new_value):
              l1.append(new_value)
              print(l1)
              total = sum(l1)
              return total/len(l1)
          return averager
      
      avg = make_averager()   #averager
      print(avg.__code__.co_freevars)
      print(avg(100000))
      print(avg(140000))
      print(avg(167000))
      print(avg(190000))
      print(avg(173000))
      
      def func():
          return 666
      ret = func()    #函数消失了,但是返回值给了ret
      print(globals())
      
      闭包:多用于面试题:什么是闭包?闭包有什么用?
      1.闭包只存在于嵌套函数中
      2.内层函数对外层函数非全局变量的引用或使用,就会形成闭包 (自由变量)
      被引用的费全局变量也称作自由变量,这个自由变量会与内层函数产生一个绑定关系
      自由变量不会再内存中消失
      闭包的作用,保证数据的安全.函数外访问不到l1
      
      # 如何判断一个嵌套函数是不是闭包?
      # 例一:是闭包
      def wrapper():
          a = 1
          def inner():
              print(a)
          return inner
      ret = wrapper()
      # 例二:不是闭包
      a = 2
      def wrapper():
          def inner():
              print(a)
          return inner
      ret = wrapper()
      
      
      # 例三:
      #   也是闭包!
      def wrapper(a,b):
          def inner():
              print(a)
              print(b)
          return inner
      # 传值相当于:
      a = 2
      b = 3
      ret = wrapper(a,b)  #ret得到inner
      # 如何利用代码判断闭包,对内层函数进行判断
      print(ret.__code__.co_freevars)
      
      def make_averager():
          l1 = []
          def averager(new_value):
              l1.append(new_value)
              print(l1)
              total = sum(l1)
              return total/len(l1)
          return averager
      
      avg = make_averager()  # averager
      

    04 今日总结

    • 匿名函数
    • 内置函数(三颗星一定记住,两颗星尽量记住)
    • 闭包

    05 预习内容

    • 装饰器
  • 相关阅读:
    Postfix邮件
    RAID和LVM磁盘阵列
    CF1400G
    CF1400F
    2020 AC Saber夏季赛 游记
    APIO2018 题解
    2020北京中考游记
    初中数学几何推理大梳理
    CF1373F Network Coverage
    部编人教版初中历史书事件影响/意义汇总
  • 原文地址:https://www.cnblogs.com/Redbean1231/p/13375399.html
Copyright © 2011-2022 走看看