七天学会Python基础-第七天1/3-匿名函数-闭包-内置函数Ⅱ

  1. 匿名函数(也叫一句话函数,比较简单)

    • 格式:函数名=lambda 形参:返回值

      • 所有类型的形参都可以加,但是一般使用匿名函数只是加位置参数,其他的用不到
      # 常规函数
      def func(a,b):
          return a+b
      # 构建匿名函数
      func1=lambda a,b:a+b
      print(func1(1,2))
      ------------------------------------------
      # 写一个匿名函数:接受两个int参数,将较大的数据返回
      lambda a,b:a if a>b else b
      
      • 1)此函数不是没有名字,他是有名字的,他的名字就是你给其设置的变量,比如func.

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

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

        func = lambda a,b,*args,sex= 'alex',c,**kwargs: kwargs
        print(func(3, 4,c=666,name='alex'))  # {'name': 'alex'}
        # 所有类型的形参都可以加,但是一般使用匿名函数只是加位置参数,其他的用不到。
        

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

        5)匿名函数不管多复杂.只能写一行.且逻辑结束后直接返回数据

  2. 内置函数Ⅰ

    • int(),用于将一个字符串或数字转换成整数,还可以将二进制转换成十进制

      int('1010',base=2)	# 将二进制转换成10进制
      
    • float(),用于将整数和字符串转换成浮点数。

    • complex(),用于创建一个值为real+imag*j的复数或者转化一个字符串或数位复数。如果第一个参数为字符串,则不需要指定第二个参数。

      print(complex(1,2)) # (1+2j)

    • bin() 返回一个数字的二进制。

      bin(10)

    • oct() 返回一个数字的八进制

      oct(10)

    • hex()返回一个数字的十六进制

      hex(10)

    • divmod(),返回除数与被除数的结果

      print(divmod(10,3)) # (3,1)

    • round(),保留浮点数小数的位数

      print(round(3.1415926,2)) # 3.14

    • pow(),求x**y次幂。(第三个参数为x**y的结果对z取余)

      print(pow(2,3,3)) # 2**3%2 2

    • bytes(),转换编码

      s1="太白"
      # 转化成utf-8
      b=s1.encode('utf-8')
      b=bytes(s1,encoding="utf-8")
      
    • ord(),输入字符,找该字符的编码的位置,现在ASCII码中进行查找,找不到再去Unicode中进行查找

      print(ord('a'))	# 97
      print(ord('中'))	# 20013  在Unicode中的位置
      
    • chr(),输入位置数字,找出其对应的字符

      print(chr(97))	# a
      print(chr(20013))	# 中 在Unicode中的位置
      
    • repr(),返回一个对象的string形式(原形毕露)

      s1="太白"
      print(s1) # 太白
      print(repr(s1)) # "太白"
      msg="我叫%r"%(s1)
      print(msg) # 我叫"太白"
      
    • all(),可迭代对象中全部是True才是True

    • any(),可迭代对象中有一个True就是True


    • print(),打印

      # print(*args,sep=" ",end='\n',file=None)
      print(1,2,3,4,sep='|') # 1|2|3|4  设置每个元素之间的分隔符
      ------------------------------------------------------
      print(1,end='')	# 打印结尾去掉换行
      print(2)
      
    • int(),pass

    • str(),pass

    • bool(),pass

    • set(),pass

    • list(),将一个可迭代对象转化为列表

      l2=list("abc")
      print(l2) # ['a','b','c']
      
    • tuple(),将一个可迭代对象转化为元组

    • dict(),通过相应的方式创建字典

      # 字典的几种创建方式
      # 1.直接创建
      # 2.元组的结构
      dic=dict([(1,"one"),(2,"two")])
      # 3.键值对的形式
      dic=dict(one=1,two=2)
      # 4.fromkeys
      # 5.update
      # 6.字典推导式
      
    • abs(),绝对值

      print(abs(-6)) # 6

    • sum(),求和

      l1=[i for i in range(10)]
      print(sum(l1)) #  45
      print(sum(l1,100)) # 145
      
    • reversed()

      l1=[i for i in range(10)]
      l1.reverse() # 列表的方法,对源列表进行翻转
      print(l1) # [9,8,7,6,5,4,3,2,1,0]
      -------------------------------------------------------
      obj=l1.reversed() # 列表的方法,不会对源列表进行改变,返回的是一个迭代器
      print(list(obj))	# [9,8,7,6,5,4,3,2,1,0]
      
    • zip(),拉链方法

      l1=[1,2,3,4,5]
      tul=("太白","b哥","德刚")
      s1='abcd'
      obj=zip(l1,tul,s1)
      for i in obj:
      	print(i) 
      print(list(obj))
      ----------------------
      (1,'太白','a')
      (2,'b哥','b')
      (3,'德刚','c')
      [(1,'太白','a'),(2,'b哥','b'),(3,'德刚','c')]
      
    • 以下方法最最最重要,可以加key(自定义方法)


    • min(),返回最小值

      • 过程:凡是可以能加key的:他会自动将可迭代对象中的每个元素按照顺序传入key对应的函数中,以返回值比较大小。
      l1=[33,2,1,54,7,-1,-9]
      print(min(l1))	# -9
      ---------------------	
      # 以绝对值的方式求最小值
      func = lambda a : abs(a)
      for i in l1:
          l2=append(func(i))
      print(min(l2))
      ---------------------
      def abss(a):
          return abs(a)
      print(min(l1,key=abss))
      
      • 练习:求出值最小的键
      dic={'a':3,'b':2,'c'1:}
      print(min(dic)) # min默认会按照字典的键去比较大小
      def func(a):
          return dic[a]
      print(min(dic,key=func))
      ------------------------------------------
      print(min(dic),key=lambda a:dic[a])
      
      • 过程详解

        def func(args):
            '''
            第一次:
            args:'a' 返回值:dic['a'] 记录:3
            第二次:
            args:'b' 返回值:dic['b'],将dic['b']与dic['a']进行比较 2比3小,记录2
            第三次:
            args:'c' 返回值:dic['c'],将dic['c']与dic['b']进行比较 1比2小,记录1
            '''
            return dic[args]
        print(min(dic,key=func))	# 这里的方法没括号
        
      • 练习

        l2=[('太白',18),('alex',73),('wusir',35),('口天吴',41)]
        print(min(l2,key=lambda a:a[1])) # min函数返回的永远是列表中的第一层元素 ('太白',18)
        print(min(l2,key=lambda a:a[1])[0]) # 返回元素 太白
        
        
    • max(),同上,求最大值 pass

    • sorted(),对列表进行排序,但不对源列表进行操作,返回的是一个列表

      l1=[22,33,1,2,3,8,7,6,5]
      l2=sorted(l1)
      print(l2) # [1,2,3,5,6,7,8,22,33]
      print(l1) # [22,33,1,2,3,8,7,6,5]
      ---------------------------------------
      l2=[('太白',18),('alex',73),('wusir',35),('口天吴',41)]
      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]
      # 输出大于3的
      print([i for i in l1 if i>3])	# 返回的是一个列表
      ------------------------------
      ret=filter(lambda x:x>3,l1)	# 此时ret是一个迭代器
      print(list(ret))
      
      
    • map(),列表推导式的循环模式

      # 生成l1=[1,4,9,16,25]
      print([i**2 for i in range(6)])
      ret=map(lambda x:x**2,range(1,6))	# 返回的是迭代器
      print(list(ret))
      
      
    • reduce

      from functools import reduce
      def func(x,y):
          """
          第一次:x,y:11,2   x+y=  记录13
          第二次:x=13,y=3   x+y=  记录16
          第三次:x=16,y=4   x+y=  记录20
          ......
          """
          return x+y
      l=reduce(funt,[11,2,3,4])
      print(l)
      
      
  3. 闭包:保证了数据的安全

    • 闭包的定义:

      • 闭包只能存在嵌套函数中
      • 内层函数对外层函数非全局变量的引用(使用),就会形成闭包。
    • 闭包的现象

      • 被引用的非全局变量也称作为自由变量,这个自由变量会与内层函数产生一个绑定关系,自由变量不会再内存中消失
    • 闭包的作用

      • 保证数据的安全
    • 如何判断一个嵌套函数是否是闭包

      # 例一:
      def wrapper():
          a = 1
          def inner():
              print(a)
          return inner
      ret = wrapper()
      # 是一个闭包
      
      # 例二:
      a = 2
      def wrapper():
          def inner():
              print(a)
          return inner
      ret = wrapper()
      # 不是闭包,a是全局变量
      
      # 例三:
      def wrapper(a,b):
          def inner():
              print(a)
              print(b)
          return inner
      a = 2
      b = 3
      ret = wrapper(a,b)
      # 也是闭包!
      
      
      • 使用代码判断是否为闭包

        # 如果他是闭包那么他肯定有一个自由变量
        # 例三:
        def wrapper(a,b):
            def inner():
                print(a)
                print(b)
            return inner
        a = 2
        b = 3
        ret = wrapper(a,b)
        print(ret.__code__.co__freevars)	# 返回的是元组 ('a','b')
        
        
    • 字面意思:封闭的东西,私密的,私用的

    • 例子:

      '''
      第一天价格为:100000元,平均收盘价:100000元
      第二天价格为:110000元,平均收盘价:(100000 + 110000)/2 元
      第三天价格为:120000元,平均收盘价:(100000 + 110000 + 120000)/3 元
      ........
      '''
      # 代码实现
      # 方案1
      l1=[]	# 全局变量 数据不安全
      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(110000))
      print(make_averager(120000))
      ---------------------------------------------------------
      
      

      改进:

      # 此时有个缺点,即操作l2或者其他列表时,可能会误操作到l1列表,这样计算结果就会受到影响
      # 方案2:为了数据安全,l1不能放到全局变量,放到make_averager函数体中
      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(110000))
      print(make_averager(120000))
      # 此时,调用一次make_averager方法,l1列表便会重置,所以方案2不可采用
      # 方案3 闭包方案
      def make_averager():
          l1=[]
          def averager(new_value):
      	    l1.append(new_value)
          	total=sum(l1)
          	return total/len(l1)
          return averager
      avg=make_averager() # 得到函数名averager
      print(avg(100000))
      print(avg(120000))
      print(avg(120000))
      
      


# 看代码求结果
def add(n,1):
    return n+1
def test():
    for i in range(4):
        yield i
g=test()
for i in [1,10]:
    g=(add(n,1) for i in g)
print(list(g))

posted @ 2021-05-23 18:44  double大博  阅读(84)  评论(0)    收藏  举报