• Python基础(四)


    函数

    函数就是将⼀段具有独⽴功能的代码块,整合到⼀个整体并命名,在需要的位置调⽤这个名称即可完成对应的需求。函数在开发过程中,可以更⾼效的实现代码重⽤

    def 函数名(参数):
    代码1
    代码2
    
    函数名(参数):调用函数
    
    • 1
    • 2
    • 3
    • 4
    • 5

    需求1:制作计算器,计算任意俩个数字之和,并且保存结果

    def sum_num(a,b):
      return a+b
    
    result = sum_num(1, 2)
    print(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (1)说明文档:如果代码多,我们不需要在很多代码中找到这个函数定义的位置才能看到注释。如果想更⽅便的查看函数的作⽤,可以借助函数的说明文档。
    在这里插入图片描述

    (2)函数嵌套使用:一个函数里面又嵌套了另外一个函数。
    在这里插入图片描述
    如果函数A中,调⽤了另外⼀个函数B,那么先把函数B中的任务都执⾏完毕之后才会回到上次函数A执⾏的位置。

    需求2:打印多条横线

    def print_line():
        print('-'*20)
    
    def print_lines():
        i=0
        while i<=10:
            print_line()
            i+=1
    
    print_lines()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (3)变量作用域:局部变量和全局变量
    在这里插入图片描述作用:在函数体内部,临时保存数据,即当函数调⽤完成后,则销毁局部变量。

    在这里插入图片描述
    误区:
    在这里插入图片描述
    不是。因为第十五行得到a的数据仍然是100,仍然是定义全局变量a的时候的值,而没有返回值,而没有返回testB函数内部的200。综上,testB的内部a=200只是定义了一个局部变量。

    如何在函数体内部修改全局变量:
    在这里插入图片描述

    (4)return:return a, b返回多个数据的时候,默认是元组类型。return后⾯可以连接列表、元组或字典,以返回多个值。

    (5)多函数执行流程:
    在这里插入图片描述
    在这里插入图片描述

    函数参数

    1. 位置参数:调用函数时根据函数定义的参数位置来传参。传递和定义参数的顺序要保持一致。
      在这里插入图片描述
    2. 关键字参数
      函数调⽤,通过“键=值”形式加以指定。可以让函数更加清晰、容易使⽤,同时也清除了参数的顺序需求。
    def user_info(name, age, gender):
      print(f'您的名字是{name},年龄是{age},性别是{gender}')
      user_info('Rose', age=20, gender='⼥')
      user_info('⼩明',gender='男',age=16)
    
    • 1
    • 2
    • 3
    • 4

    note:函数调⽤时,如果有位置参数时,位置参数必须在关键字参数的前⾯,但关键字参数之间不存在先后顺序。

    1. 缺省参数
      缺省参数也叫默认参数,⽤于定义函数,为参数提供默认值,调⽤函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调⽤)。
      在这里插入图片描述函数调⽤时,如果为缺省参数传值则修改默认参数值;否则使⽤这个默认值。
    2. 不定长参数:可变参数(用于不确定调用的时候传递多少个参数。此时,可以用包裹packing位置参数或者包裹关键字参数来进行参数传递)
      (1)包裹位置传递:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为⼀个元组(tuple),args是元组类型,这就是包裹位置传递。
      在这里插入图片描述(2)包裹关键字传递

    在这里插入图片描述name指的是变量名,不加引号。

    综上,无论是包裹位置传递或者包裹关键字传递,都是一个组包过程。

    其他知识

    拆包

    #拆包元组
    def return_num():
      return 100, 200
      num1, num2 = return_num()
    print(num1)# 100
    print(num2)# 200
    
    #拆包字典
    dict1 = {'name':'TOM', 'age':18}
    a, b = dict1#对字典进⾏拆包,取出来的是字典的key
    print(a)# name
    print(b)# age
    print(dict1[a])# TOM
    print(dict1[b])# 18
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    交换俩个变量的值

    c=a
    a=b
    b=c
    
    a,b=1,2
    a,b=b,a
    print(a)
    print(b)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    引用

    在python中,值都是靠引用传递的。(数据通过变量传递)我们可以⽤id()来判断两个变量是否为同⼀个值的引⽤。我们可以将id值理解为那块内存的地址标识。

    # 1.不可变: int类型
    a = 1
    b = a
    print(b)# 1
    print(id(a))# 140708464157520
    print(id(b))# 140708464157520
    a = 2# 因为修改a的数据,内存需要再开辟另外一空间存储
    print(b)# 1,说明int类型为不可变类型
    print(id(a))# 140708464157552,此时得到是的数2的内存地址
    print(id(b))# 140708464157520
    
    
    # 2.列表
    aa = [10, 20]
    bb = aa
    print(id(aa))# 2325297783432
    print(id(bb))# 2325297783432
    aa.append(30)
    print(bb)# [10, 20, 30],列表为可变类型
    print(id(aa))# 2325297783432
    print(id(bb))# 2325297783432
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述在这里插入图片描述
    引用当作实参:

    def test1(a):
      print(a)
      print(id(a))
      a += a
      print(a)
      print(id(a))
    
    # int:计算前后id值不同
    b = 100
    test1(b)
    
    #列表:计算前后id值相同
    c = [11, 22]
    test1(c)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    可变与不可变

    数据能够直接进⾏修改,如果能直接修改那么就是可变,否则是不可变类型
    在这里插入图片描述

    函数加强篇

    递归

    特点:函数内部自己调用自己+必须有出口

    # 3+2+1
    def sum(i):
      if i==1
        return 1
      return i+sum(i-1)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    Lambda表达式

    应用场景:一个函数有一个返回值,并且只有一句代码,可以用Lambda简化

    lambda 参数列表:表达式
    
    • 1

    (1)使用Lanbda表达式相比函数,可以简化代码所占的内存
    (2)Lambda的参数可有可⽆,函数的参数lambda在表达式中完全适⽤。
    (3)lambda函数能接收任何数量的参数但只能返回⼀个表达式的值

    fn2=lambda:100
    print(fn2)#直接打印Lambda表达式,输出的是内存地址(匿名函数)
    print(fn2())#无参调用
    
    fn3=lambda a,b:a+b
    print(fn3(1,2))
    print((lambda a,b:a+b)(1,2))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    参数形式

    # 无参
    print((lambda:100)())
    # 一个参数
    print((lambda a:a)('hello'))
    # 默认参数
    print((lambda a,b,c=100:a+b+c)(10,20))
    # 可变参数:接受不定长位置参数,返回元组
    print((lambda *args:args)(10,20,30))
    #接受不定长的关键字参数,返回字典
    print((lambda**kwargs: kwargs)(name='python', age=20))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    应用

    # 判断
    fun=lambda a.b:a if a>b  else b
    print(100,22)
    
    #列表数据按照字典的key值进行排序
    students = [{'name':'TOM', 'age':20},'name':'ROSE','age':19},{'name':'Jack','age':22}
    
    #按name值升序排列
    students.sort(key=lambda x: x['name'])
    print(students)
    #按name值降序排列
    students.sort(key=lambdax: x['name'],reverse=True)
    print(students)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    高阶函数

    函数作为另外一个函数的参数传入的编程模式称为高阶函数,高阶函数是函数式编程的体现,是一种高度抽象的编程形式。

    # 求绝对值
    abs(-10) # 10
    
    def add_num(a, b):
       return abs(a) +abs(b)
    result = add_num(-1, 2)
    print(result)# 3
    
    def sum_num(a, b, f):
      return f(a) + f(b)
    result = sum_num(-1, 2, abs)
    print(result)# 用f代替abs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    函数式编程⼤量使⽤函数,减少了代码的重复,因此程序⽐较短,开发速度较快。

    学员管理系统

    需求
    进⼊系统显示系统功能界⾯,功能如下:
    (1)添加学员
    (2)删除学员
    (3)修改学员信息
    (4)查询学员信息
    (5)显示所有学员信息
    (6)退出系统
    系统共6个功能,⽤户根据⾃⼰需求选取。

    步骤
    1.显示功能界⾯
    2.⽤户输⼊功能序号
    3.根据⽤户输⼊的功能序号,执⾏不同的功能(函数)

    #功能函数的作用都是操作学员,每个学员的信息用字典存储,
    # 存储全部学员信息应该是全局变量列表
    info=[]
    
    # 显示功能函数
    def print_info():
      print('-'*20)
      print('欢迎登录学员管理系统')
      print('1:添加学员')
      print('2:删除学员')
      print('3:修改学员信息')
      print('4:查询学员信息')
      print('5:显示所有学员信息')
      print('6:退出系统')
      print('-'*20)
    
    #添加学员信息
    def add_info():
        new_id=input("请输入学号")
        new_name=input("请输入姓名")
        new_tel=input("请输入手机号")
        global info#声明全局变量
        for i in info:
            if new_name==i['name']:
                print("该用户已经存在")
                return
        info_dict={}
        info_dict["id"]=new_id
        info_dict["name"]=new_name
        info_dict["tel"]=new_tel
        info.append(info_dict)
        print(info)
    
    # 删除学员信息
    def del_info():
      """删除学员"""
      while True:
         del_id = int(input('请输⼊要删除的学员学号:'))
         global info
    #检查学员是否存在
    #如果存在则删除列表指定下标的数据
         if 0<= del_id<len(info):
           del_flag = input('确定要删除吗?yes or no')
           if del_flag == 'yes':
               del info[del_id]
               print(info)
               break
    #删除了⽬标学员信息后退出循环
         else:
             print('输⼊学员有误,请重新输⼊')
    
    def modify_info():
      """修改学员信息"""
      while True:
          modify_num = int(input('请输⼊要修改的学员学号:'))
          global info
    #检查这个学员是否存在,存在则打印学员信息,并按⽤户输⼊修改
          if 0<= modify_num<len(info):
              print(f'该学员学号是{info[modify_num]["id"]},姓名是{info[modify_num]["name"]},⼿机号是{info[modify_num]["tel"]}')
              info[modify_num]["id"] = input('请输⼊学号:')
              info[modify_num]["name"] = input('请输⼊姓名:')
              info[modify_num]["tel"] = input('请输⼊⼿机号:')
              print(info)
              break
      else:
        print('输⼊学员有误')
    
    def search_info():
      """查询学员信息"""
      search_name = input('请输⼊要查找的学员姓名:')
      for i in info:
          if search_name == i['name']:
              print('***查询到信息如下***')
              print(f'该学员学号是{i["id"]},姓名是{i["name"]},⼿机号是{i["tel"]}')
              break
      else:print('查⽆此⼈......')
    # 用户输入功能
    
    while True:
        print_info()
        user_num=int((input("请输入功能序号")))
        if user_num == 1:
           add_info()
        elif user_num == 2:
           del_info()
        elif user_num == 3:
            modify_info()
        elif user_num == 4:
            search_info()
        elif user_num == 5:
            print('学号\t姓名\t⼿机号')
            for i in info:
              print(f'{i["id"]}\t{i["name"]}\t{i["tel"]}')
        elif user_num == 6:
            exit_flag = input('确定要退出吗?yes or no')
            if exit_flag == 'yes':
                break
        else:
            print("输入的功能有误")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
  • 相关阅读:
    【无标题】
    10.6、华为数通HCIP-DataCom H12-821单选题:101-120
    浅议开发者面临的信息偏差影响因素
    算法篇------贪心1
    Spring笔记一:简介及入门案例
    Docker安装和配置nginx服务
    6020一拖二快充线:手机充电的革命性创新
    「2024」预备研究生mem-分析推理强化:多对多画表格(上)
    bp神经网络反向传播原理,BP神经网络反向传播
    MySQL学习(二)——MySQL内置函数
  • 原文地址:https://blog.csdn.net/m0_63203388/article/details/125370105