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   \n   123   \n    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表达式:简便的表达简单的函数
  • 内置函数
  • 两道面试题记住
posted @ 2019-10-10 19:44  薛定谔的猫儿  阅读(98)  评论(0编辑  收藏  举报