zoukankan      html  css  js  c++  java
  • python笔记(10)--高阶函数、lambda函数和内置函数

    Day 11

    今日内容:

    • 函数小高级
    • lambda表达式
    • 内置函数

    内容回顾:

    1. 函数基本结构

    2. 参数

      • 形参
        • 基本参数:
        • 默认值参数:def func(a1,a2=123):pass
          • 注意:默认值如果是不可变类型,随便用;如果是可变类型,有问题
        • 万能参数:*args **kwargs
      • 实参
        • 位置传参
        • 关键字传参
    3. 返回值

      • 默认返回:None

      • 特殊情况

        def func():
            return 1,2,3,4
        
    4. 作用域

      • 全局和局部

      • 优先使用自己局部作用域,再使用全局作用域

      • 子作用域只能读取或修改父级的值,不能重新赋值

      • global和nonlocal的区别

    5. 函数的嵌套

    内容详细:

    1.函数小高级

    函数当做变量来使用

    • 列表中也可以放函数;集合中也可放函数;字典中也可用values做函数,不建议键使用函数

    注意

    • 函数执行中如有变量接收函数,必须有返回值或None
    • 函数执行中没有变量接收函数,则没有任何返回值
    def func():
        print(123)
    
    FUNC_LIST=[func,func,func]
    FUNC_LIST[0]()			#123
    FUNC_LIST[1]()			#123
    FUNC_LIST[2]()			#123
    
    for item in FUNC_LIST:
        item()				#123   
       123   
        123
     	v=item()
        print(v)			#123 None   123  None   123   None
    
    ###列表中也可以放函数,集合中也可放函数,字典中也可用values做函数
    def func():
        print(123)
    def bar():
        print(666)
    FUNC_LIST={"k1":func,"k2":bar}
    FUNC_LIST["k1"]()			#结果为123
    

    函数当做参数进行传递

    def func(arg):
        arg()
    
    def bar():
        print(666)
    
    func(bar)			#结果为666
    ############################
    def func(arg):
        v1=arg()
        print(v1)
    def bar():
        print(666)
    
    func(bar)		#结果为666     None
    ############################
    def func(arg):
        v1=arg()
        print(v1)
    def bar():
        print(666)
    
    result = func(bar)
    print(result)	#结果为666  None   None
    ###########################
    def func(arg):
        print(777)
        v1=arg()
        print(v1)
    def bar():
        print(666)
    
    v2 = func(bar)#详解:首先执行等号右边的,func(bar),把函数名称bar作为参数传入到func()函数中,此时arg=bar,则func(arg)函数变为:
    #def func(bar):
    #	print(777)			#第一步打印777
    #	v1=bar()			#第二步,先算等号右边的,执行bar(),输出666,返回值为None,赋值给v1
    # 	print(v1)			#第三步,打印None
    #此时返回func(bar)的返回值为None,赋值给v2
    print(v2)				#第四步,打印None
    
    #结果为:
    777
    666
    None
    None
    

    练习题:choice选择

    def func1():
        print("语音助手")
    def func2():
        print("文件助手")
    def func3():
        print("人工服务")
    def func4():
        print("业务助手")
    def func5():
        print("贷款助手")
    info = {
        "f1":func1,
        "f2":func2,
        "f3":func3,
        "f4":func4,
        "f5":func5
    }
    
    while True:
        choice = input("请输入要选择的功能:").strip()
        function_name = info.get(choice)
        if function_name:
            function_name()
            break
        else:
            print("输入错误")
            continue
    

    2.lambda表达式

    • 用于表示简单的函数,默认return冒号后面的内容

    • lambda函数中不能自己创建变量,只能使用父级变量

      #三元运算,为了解决简单的if..else的情况,如
      if a == 1:
          flag = True
      else:
          flag = False
      #三元运算表达式:
      flag =True if a == 1 else False
      
      #lambda表达式,为了解决简单函数的情况,如:
      def func(a1,a2):
          return a1 + a2
      #lambda表达式:
      func = lambda a1,a2:a1 + a2
      v = func(1,2)
      print(v)		#结果为3
      
      func1 = lambda : 100		#没有参数,并return 100
      
      func2 = lambda a1:a1*100	#参数为a1,return a1*100
      
      func3 = lambda *args,*kwargs:len(args)+len(kwargs)	#参数为任意值,计算两个的长度
      
      DATA = 100
      def func():
          DATA = 1000
          bar = lambda a1:a1 + DATA
          v = bar(1)
          print(v)
      
      func()				#结果为1001,lambda不能定义变量,只能从父级找
      

    lambda与三元运算结合

    #传统的写法
    def func(n1,n2):
         if n1 > n2:
             print(n1)
         else:
             print(n2)
    # 简写:lambda + 三元运算写法
    func = lambda n1,n2:n1 if n1>n2 else n2
    
    v = func(1,222)
    print(v)
    

    练习题:

    • 列表中所有方法的返回值基本都是None
    • 字符串所有方法基本上都是返回新值
    #下面代码结果是什么
    USER_LIST = []
    func = lambda v:USER_LIST.append(v)
    
    item = func("yanan")
    print(item)			#结果为None
    print(USER_LIST)	#结果为['yanan']
    
    #列表中所有方法的返回值基本都是None
    
    
    func_list = [lambda x:x.strip(),lambda y:y + 100,lambda z,x:z+x]
    
    v1 = func_list[0]("   alec")
    print(v1)			#结果为alec
    
    v2 = func_list[1](10)
    print(v2)			#结果为110
    
    v3 = func_list[2](8,2)
    print(v3)			#结果为10
    

    3.内置函数

    • 自定义函数

    • 内置函数

      img

      数学相关:

      • abs():取绝对值

        v = abs(-1)
        print(v)		#结果为1
        
      • float,转换为浮点型(小数)

        v = 55
        v1 = float(v)
        print(v1)		#结果为55.0
        
      • max(),取变量中最大值

        v = [11,22,33,555,777]
        result = max(v)
        print(result)		#取列表中最大值
        
      • min(),取变量中最小值

        v = [11,22,33,555,777]
        result = min(v)
        print(result)		#取列表中最小值
        
      • sum(),求和

        v = [11,22,33,555,777]
        result = sum(v)
        print(result)		#取列表中所有数值相加
        
      • divmod(),两数相除的商和余数

        result = divmod(1001,5)
        print(result)		#结果为(200,1)
        #也可以用两个数接收
        a,b = divmod(1001,5)
        c = a+b
        print(a,b,c)			#结果为200,1,201
        

      进制转换相关:

      • bin,将十进制转换为二进制

        num = 13
        v = bin(num)
        print(v)
        
      • oct,将十进制转换为八进制

        num = 13
        v = oct(num)
        print(v)
        
      • int,将其他的进制转换为十进制

        • 除十进制以外,其他进制进行互相转换时,可先转为十进制再转换为目标进制
        #二进制转换为十进制:
        v1 = '0b1101'
        result = int(v1,base=2)
        print(result)		#结果为13
        
        #八进制转换为十进制:
        v1 = '0o1101'
        result = int(v1,base=8)
        print(result)		#结果为577
        
        #十六进制转换为十进制:
        v1 = '0x1101'
        result = int(v1,base=16)
        print(result)		#结果为4353
        
      • hex,将其他的进制转换为十六进制

        num = 13
        v = hex(num)
        print(v)
        

      练习题:

    • 将IP地址中每个十进制数转换成二进制并通过","连接起来生成一个新的字符串。

      ip = "192.168.155.9"
      ip_list = ip.split(".")
      # print(ip_list)
      info = []
      for item in ip_list:
          info.append(bin(int(item)))
      
      print(",".join(info))			#结果为0b11000000,0b10101000,0b10011011,0b1001
      
    • 二进制面试题:(本节重点)

      #将IP地址中每个十进制数转换成二进制连接起来,生成一个新的二进制,再转为十进制输出
      #注意:每个数字都将为8位字节,0b只能在开头,后续每段由八位0 1组成。格式为:0b11000000110000001100000011000000
      
      ip = "192.16.18.2"
      #以点分割成每个元素加入到列表中
      ip_list = ip.split(".")
      #新建空列表,循环每个ip_list元素
      info = []
      for item in ip_list:
          #十进制转为二进制
          item = bin(int(item))
          #除前两位后全取出来
          data = item[2:]
          #判断“0b”后面是否有八位
          if len(data) == 8:
              info.append(data)
          else:
              #如果不够就在前面加0,直到满足八位
              num = 8 - len(data)
              new_num = num * "0" + "1"
              message = data.replace("1", new_num, 1)
              info.append(message)
      #把得到的列表转变为一个字符串,前面加“0b”,然后二进制转十进制
      new_data = int("0b"+"".join(info),base=2)
      print(new_data)
      
    • 面试题:通过分页对数据进行展示(本节重点)

      '''
      通过分页对数据进行展示
      要求:
          每页显示10条数据;
          让用户输入要查看的页面:页码
      '''
      USER_LIST = []
      for i in range(1, 852):
          temp = {"yanan": "alec-%s" % i, "emil": "506965776@qq.com-%s" % i}
          USER_LIST.append(temp)
      # 总数据量
      list_num = len(USER_LIST)
      # 每页显示的数据
      par_num = int(input("请输入每页要展示的数据:"))
      # 总页码数
      max_num, a = divmod(list_num, par_num)
      if a >= 1:
          max_num += 1
      while True:
          # 用户输入页码
          pager = int(input("页码范围在1-%s,请输入第几页:" % max_num))
          if pager < 1 or pager > max_num:
              print("请重新输入,页码范围在1-%s" % max_num)
          else:
              end = pager * par_num
              start = end - par_num
              data = USER_LIST[start:end]
              for item in data:
                  print(item)
      

    本章总结:

    • 函数当做是一个变量:参数传值 / 当元素嵌套到字典列表中。(本章重点)
    • lambda表达式:简便的表达简单的函数
    • 内置函数
    • 两道面试题记住
  • 相关阅读:
    Java for循环打印九九乘法表
    java判断回文数代码实例
    java 判断回文数实例代码
    价值
    Java代码实例 判断这个数是否是素数
    Java for循环求水花仙数
    java代码实例 使用switch实现简易的计算器(实现加减乘除)
    java基础代码实例 求1100之间的奇数和偶数
    Java 判断闰年代码实例
    可以将控制台输出信息保存到本地的Log4j配置
  • 原文地址:https://www.cnblogs.com/lynlearnde/p/11650173.html
Copyright © 2011-2022 走看看