python 函数(3)

发布时间:2019-05-30 21:02:06编辑:auto阅读(1929)

    1. 函数小高级 ( 5* )

    • 1 函数名可以当作变量来使用

      def func():
          print(123)
      
      v1 = func  # func代表函数的地址
      
      func()
      v1()   # v1、func的函数地址相同,执行调用的函数也相同
      def func():
          print(123)
      
      func_list = [func, func, func]
      # func_list[0]()  a
      # func_list[1]()  b
      # func_list[2]()  c
      for item in func_list:   # a/b/c的简化形式
          v = item()
          print(v)
      def func():
          print(123)
      
      def bar():
          print(666)
      
      info = {'k1': func, 'k2': bar}
      
      info['k1']()           # 函数也可以作为字典的值(也可以做为键,但是没有意义)
      info['k2']()

      注意:函数是不可变的,可以做集合的元素,也可以作为字典的键 (但是做键没有太大意义)。

      ​ 集合中可以放多个重复的函数,但只执行一次。(因为集合的特性:不可重复的)

      混淆你

      def func():
          return 123
      
      func_list1 = [func,func,func]
      func_list2 = [func(),func(),func()]
      
      print(func_list1)     # 打印的是func的函数地址
      print(func_list2)     # 打印的是func执行完返回的值
      
      info = {
          'k1':func,     # 函数的地址
          'k2':func(),   # 函数执行完返回的值
      }
      
      print(info)

      2 函数也可以当作参数来进行传递

      def func(arg):
          print(arg)
      
      func(1)
      func([1,2,3,4])
      
      def show():
          return 999
      func(show)      # 执行函数func,参数为show,show没有+(),表示show没有执行只是代表该函数的地址。
      def func(arg):
          v1 = arg()
          print(v1)
      
      def show():
          print(666)
      
      func(show)
      def func(arg):
          v1 = arg()
          print(v1)
      
      def show():
          print(666)
      
      result = func(show)
      print(result)

      面试题:多个函数的调用

      def func():
          print('花费查询')
      
      def bar():
          print('语音沟通')
      
      def base():
          print('xxx')
      
      def show():
          print('xxx')
      
      def test():
          print('xxx')
      
      info = {
          'f1': func,
          'f2': bar,
          'f3':base,
          'f4':show,
          'f5':test
      }
      choice = input('请选择要选择功能:')
      function_name = info.get(choice)
      if function_name:
          function_name()
      else:
          print('输入错误')

    总结:函数当作一个变量:参数传值 / 当作元素嵌套到字典、列表中

    2. lambda表达式 (匿名函数)

    用于表示简单的函数

    lambda表达式,为了解决简单函数的情况:

    def func(a1,a2):       =====> func = lambda a1,a2:a1+a2  # 函数直接得到返回值,这里隐藏了return
        return a1+a2       简化
    # 三元运算,为了解决简单的if else的情况,如:
    if 1 == 1:
        a = 123
    else:
        a = 456
    
    a =  123  if 1 == 1 else 456
    
    # lambda表达式,为了解决简单函数的情况,如:
    def func(a1,a2):
        return a1 + 100 
    
    func = lambda a1,a2: a1+100
    func1 = lambda : 100 
    
    func2 = lambda x1: x1 * 10
    
    func3 = lambda *args,**kwargs: len(args) + len(kwargs)
    
    DATA = 100
    func4 = lambda a1: a1 + DATA
    v = func4(1)
    print(v)
    
    
    DATA = 100
    def func():
        DATA = 1000
        func4 = lambda a1: a1 + DATA
        v = func4(1)
        print(v)
    func()
    
    
    func5 = lambda n1,n2: n1 if n1 > n2 else n2
    v = func5(1111,2)
    print(v)

    lambda表达式只能用一行来表示函数,只能用参数来作为变量。

    练习题

    # 练习题1
    USER_LIST = []
    def func0(x):
        v = USER_LIST.append(x)
        return v 
    
    result = func0('alex')
    print(result)
    
    
    # 练习题2
    
    def func0(x):
        v = x.strip()
        return v 
    
    result = func0(' alex ')
    print(result)
    
    ############## 总结:列表所有方法基本上都是返回None;字符串的所有方法基本上都是返回新值 #################
    # 练习题3
    USER_LIST = []
    func1 = lambda x: USER_LIST.append(x)
    
    v1 = func1('alex')
    print(v1)
    print(USER_LIST)
    
    # 练习题4
    func1 = lambda x: x.split('l')
    
    v1 = func1('alex')
    print(v1)
    
    # 练习题5
    func_list = [lambda x:x.strip(), lambda y:y+199,lambda x,y:x+y]
    
    v1 = func_list[0]('alex ')
    print(v1)
    
    v2 = func_list[1](100)
    print(v2)
    
    v3 = func_list[2](1,2)
    print(v3)

    总结:

    列表所有方法基本上都是返回None,字符串的所有方法基本上都是返回新值。

    3. 内置函数

    函数分为:自定义函数 和 内置函数

    目前python的内置函数分为几大类:

    • 1.强制转换

      bool() / int() / str() / list() / dict() /tuple() / set()

    • 2.输入输出

      print() / input()

    • 3.其他

      len() / open() / id() / range() / type()

    • 4.数学相关

        1. abs() 绝对值

          v = abs(-1)
          print(v)   # 1
        2. float() 转换成浮点型(小数)

          v = 55
          v1 = float(v)
          print(v1)    # 55.0
        3. max() 找到最大值

          v = [1,2,33,5,9]
          result = max(v)
          print(result)   # 33
        4. min() 找到最小值

          v = [1,2,311,11,8]
          v2 = min(v)
          print(v2)  # 1
        5. sum() 求和

          v = [1,2,311,11,9]
          v1 = sum(v)
          print(v1)  # 334
        6. divmod() 两数相除的商和余数

          a,b = divmod(1001,5)
          print(a,b)   # 200  1

          补充:字符串格式化:'你少妻-%s' %(i,) ------>后面%(i,)如果括号中只有一个变量,可以写成:'你少妻-%s' %i

          # 练习题  请通过分页对数据进行展示
          """
          要求:
              每页显示10条数据
              让用户输入要查看的页面:页码
          """
          
          USER_LIST = []
          for i in range(1,836):
              temp = {'name':'你少妻-%s' %i,'email':'123%s@qq.com' %i }
              USER_LIST.append(temp)
          
          # 数据总条数
          total_count = len(USER_LIST)
          
          # 每页显示10条
          per_page_count= 10
          
          # 总页码数
          max_page_num,a = divmod(total_count,per_page_count)
          if a>0:
              max_page_num += 1
          
          while True:
              pager = int(input('要查看第几页:'))
              if pager < 1 or pager > max_page_num:
                  print('页码不合法,必须是 1 ~ %s' %max_page_num )
              else:
                  """
                  # 第1页:USER_LIST[0:10] -> 0123456789
                  # 第2页:USER_LIST[10:20]
                  # 第3页:USER_LIST[20:30]
                  ...
                  """
                  start = (pager-1) * per_page_count
                  end = pager * per_page_count
                  data = USER_LIST[start:end]
                  for item in data:
                      print(item)
      • 5.进制转换相关

        • bin() 将十进制转换成二进制

          num = 13
          v1 = bin(num)
          print(v1)  # 0b1101
        • oct() 将十进制转换成八进制

          num = 8
          v1 = oct(num)
          print(v1)  # 0o10
        • int() 将其他的进制转换成十进制

          # 二进制转化成十进制
          v1 = '0b1101'
          result = int(v1,base=2)
          print(result)  # 13
          
          # 八进制转化成十进制
          v1 = '0o1101'
          result = int(v1,base=8)
          print(result)
          
          # 十六进制转化成十进制
          v1 = '0x1101'
          result = int(v1,base=16)
          print(result)
        • hex() 将十进制转换成十六进制

          num = 16
          v1 = hex(num)
          print(v1)  # 0x10

          面试题

          # 1字节等于8位
          # IP: 192.168.12.79  ->  001010010 . 001010010 . 001010010 . 001010010
          
          # 1. 请将 ip = "192.168.12.79" 中的每个十进制数转换成二进制并通过,连接起来生成一个新的字符串。
          ip = "192.168.12.79"
          ip_list = ip.split('.') # ['192','168','12','79']
          result = []
          for item in ip_list:
              result.append(bin(int(item)))
          print(','.join(result))
          
          
          # 2. 请将 ip = "192.168.12.79" 中的每个十进制数转换成二进制: 
          #          0010100100001010010001010010001010010 -> 十进制的值。
          
          # 3232238671
          
          ip = "192.168.12.79"
          ip1 = ip.split('.')
          lis = []
          for i in ip1: 
              lis.append(bin(int(i)))
          # val = ','.join(lis)
          # b = val.replace('0b', '')
          # b1 = b.split(',')
          b1 = ','.join(lis).replace('0b', '').split(',')
          e = []
          #f or c in b1:
          for c in ','.join(lis).replace('0b', '').split(','):
              if len(c) < 8:
                  val = 8 - len(c)
                  d = list(c)
                  d.insert(0,'0' * val)
                  d1 = ''.join(d)
                  e.append(d1)
              else:
                  e.append(c)
          f = ''.join(e)
          f1 = int(f,base = 2 )
          print(f1)

关键字