💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] ### **函数小结:** 1. 概念:函数就是封装整个代码整体,是显示某个功能的小工具 最大的概念是封装,把代码封装到函数中 2. 使用 ①.定义函数:把代码封装到函数中 ②.调用函数:享受封装的结果 3. 作用:提高开发效率,实现代码重用。 4. 函数的调用顺序: (1) 定义函数时,不会进入函数内部执行代码 (2).调用函数时,才会进入函数内部执行代码 (3). 调用函数完成后,回到函数调用的地方继续向下执行 <br /> ### **函数的返回值:** 1. 作用: 1).返回值; 2).退出当前函数(导致 return下方的代码不执行) 2. 格式: return返回结果 3. return可以将函数运行结果返回到函数调用的地方 4. 函数体中 return后面的代码不再执行(可以使用 return提前终止函数的运行) 5. 函数体中 return后面没有返回结果,但是函数调用地方偏偏需要返回结果 python解释器会把None返回(什么都没有,与 MySQL中NULL相似) <br /> ### **函数的嵌套调用小结:** 1. 函数中嵌套调用另一个函数 2. 举例:demo01()函数中嵌套调用demo02() ①.先调用demo01()函数,先执行dem01()函数中的代码 ②.在执行代码中遇到嵌套调用demo02(),进入demo02()函数中执行代码 ③.demo02()函数中代码完毕后回到调用的地方继续向下执行 ④.继续执行demo01()中代码,最后执行完毕后,回到调用demo01()函数的地方 <details> <summary>函数嵌套代码.py</summary> ``` def demo02(): print("----demo02函数调用开始----") print("----demo02函数的中间执行过程----") print("----demo02函数调用结束----") def demo01(): print("----demo01函数调用开始----") demo02() print("----demo01函数的中间执行过程----") print("----demo01函数调用结束----") demo01() #运行结果: ----demo01函数调用开始---- ----demo02函数调用开始---- ----demo02函数的中间执行过程---- ----demo02函数调用结束---- ----demo01函数的中间执行过程---- ----demo01函数调用结束---- ``` </details> <br /> ### **模块中的函数小结:** 1. 把 python文件当做一个模块来使用,模块是比函数更大的封裝,模块中可以封裝多个函数 2. 原则上,任何一个 python文件都可以作为模块,模块名要符合标识符命名规范 3. 使用模块 ①.导入模块 import模块名 ②.使用模块中的工具 模块名.函数名(参数) / 模块名.变量名 4. 作用:把成熟稳定的代码封装到模块中,供其他开发者使用,提高开发效率 5. 注意:被导入的模块会被 Python解释器从头到尾扫描一遍(如果遇到可执行的代码则直接执行) <br /> ### **变量的引用小结** 1. 变量和数据都是保存在内存中 2. 变量和数据是分开存储的 3. 数据保存在内存中的某个位置,通过地址来标记 4. 变量中保存的是数据的地址,通过地址可以找到数据在内存中的位置 5. 把变量保存数据地址的过程称为引用 6. id()函数可以查看变量或数据的内存地址 占位符: %d 十进制 %x 十六进制 7. 变量的重新赋值,修改的是变量中引用的数据地址 8. 结论:变量之间的赋值,本质是引用(地址)的传递 9. 结论:函数参数的传递,本质是引用的传递 10. 结论:函数返回值传递,本质也是引用的传递 <br /> ### **不可变数据类型:** 1. 概念:源内存空间中数据不允许修改 如果想要修改,只能开辟新内存空间,让变量引用指向新内存空间数据的地址 分类: int float bool str tuple <br /> ### **可变数据类型:** 1. 概念:源内存空间中的数据可以修改 不需要开辟新内存空间,只要在源内存基础上修改数据 分类: list dict ``` info_list = [10, 20] print(info_list) print(id(info_list)) print("-" * 30) info_list.append(300) print(info_list) print(id(info_list)) #运行结果: [10, 20] 4385775488 ------------------------------ [10, 20, 300] 4385775488 ``` 注意: 无论是对可变数据类型和不可变数据类型,重新赋值,都会改变变量的引用指向 判断数据是否是可变数据类型,不是通过重新赋值语句实现,而是通过方法实现的。 <br /> ### **hash()函数:--------了解** 0. 是 Python内置的函数 1. 作用:用来提取数据的特征值(指纹) 相同的数据得到相同的结果 不相同的数据得到不同的结果 2. hash()函数只能作用于不可变数据类型 3. 字典的key值是通过hash()函数运算的 4. 所以字典的key值只能是不可变数据类型(除了列表和字典以外的数据类型) 字典的 value值可以是任意数据类型 <br /> ### **局部变量小结:** 1. 在函数内部定义的变量就是局部变量(作用范围只能是当前函数内部) 2. 在函数外部无法直接访问局部变量 3. 不同的函数中可以定义同名的局部变量 4. 局部变量的生命周期:从定义变量时开始,到函数运行结束 ``` def demo01(): # 在函数内部定义的变量就是局部变量(作用范围只能是当前函数内部) num = 100 print("--1--num=%d, id(num)=%d" % (num, id(num))) def demo02(): # 不同的函数中可以定义同名的局部变量 num = 300 print("--2--num=%d, id(num)=%d" % (num, id(num))) demo01() demo02() ``` <br /> ### **全局变量:** 1. 在所有函数外边定义的变量叫做全局变量 2. 作用:让所有的函数都可以访问到全局变量,作为所有函数通信的桥梁 3. 一般情况下,全局变量定义在所有函数的最上边, 4. 为了和普通变量区分,添加前缀 g_ 或 gl_ 5. 修改全局变量需要使用 global声明(告诉 Python解释器,我修改的是全局变量) 6. 修改全局变量后,函数访问的是修改后的全局变量值 7. 如果不加 global关键字,并没有修改全局变量,定义一个和全局变量同名的局部变量 8. 在 global关键字声明之前,不能访问全局变量 <br /> ### **函数参数和返回值组合** 1. 无参数,无返回值 ​ 比如:名片管理系统中 菜单显示功能 2. 无参数,有返回值 ​ 数据采集----采集的数据结果需要返回 3. 有参数,无返回值 ​ 比如:名片管理系统中 操作名片函数 deal_card(item) 4. 有参数,有返回值 ​ QQ登录(微信登录) <br /> ### **函数返回值进阶:** 1. 函数可以返回多个数据 2. 借助容器返回容器(列表,元组,字典),一般情况使用元组返回多个数据 3. 使用元组返回多个数据时,小括号可以省略 4. 在函数调用地方,使用一个变量接收返回值(当前变量就是返回的数据类型) 5. 在函数调用地方使用多个变量接收拆分的数据,返回多少个数据就因该有多少个变量接收 ~~~ def func():    '''   当前函数返回多个数据   :return:   '''    tmp = 27    wetness = 89.5    pm_25 = 120 ​    return tmp, wetness, pm_25 ​ ret = func() print(ret) print(type(ret)) ~~~ ``` ''' 1.有两个整数变量 a = 6, b = 100 2.不使用其他变量,交换两个变量的值 ''' a = 6 b = 100 # 方法1.使用临时变量 ''' temp = a a = b b = temp print("a = %s" % a) print("b = %s" % b) ''' # 方法2.使用元祖 b, a = a, b print("a = %s" % a) print("b = %s" % b) ``` 结论: 1. 不可变数据类型做为函数参数,在函数内部对形参变量使用赋值语句,不会影响到实参变量 2. 可变数据类型做为函数参数,在函数内部对形参变量使用赋值语句,不会影响到实参变量 3. 不可变数据类型做为函数参数,在函数内部对形参变量使用方法,不会影响到实参变量 4. 可变数据类型做为函数参数,在函数内部对形参变量使用"方法"修改数据,会影响到实参变量 ### **eval() 函数小结:** eval()函数将字符串当做有效的表达式,进行计算 把字符串两边的双引号去掉,双引号中内容是什么 eval()函数返回的结果就是什么 <details> <summary>eval()函数的使用.py</summary> ``` # eval()函数的使用 def calc(): info = input("请输入加减乘除混合运算式:") print(info) print(type(info)) print(eval(info)) calc() ``` </details> <br /> ### **缺省参数:** ~~~ 1.带有默认值的参数就是缺省参数 2.调用函数时,没有给缺省参数传递参数,则使用默认值 3.调用函数时,给缺省参数传递参数、则使用传递参数,不会使用默认值了 4.调用函数时,实参前面可以添加形参的变量名,形参的变量名=值 5.定义函数时,缺省参数(带有默认值的参数)放在必须参数的后面 6.函数具有多个缺省参数时,调用时注意参数之间的顺序,建议添加形参变量名 ~~~ <details> <summary>自定义函数带有缺省参数.py</summary> ``` # 目标:自定义函数带有缺省参数 # 定义函数 # 注意:缺省参数也是带有默认值的参数 # name是必须参数 # 注意:缺省参数(带有默认值的参数一定要放在 必须参数的后面) def func(name, age=20, position="学生"): print("name=%s" % name) print("age=%s" % age) print("position=%s" % position) # 调用函数 # 向缺省参数传递参数,使用的是传递的参数 func("张三", 30, "班长") # 不向缺省参数传递参数,使用的是默认值 func("张三") #向缺省参数传参时,建议加上形参变量名,age=25 是关键字参数 func("张三", position="班长", age=25) ``` </details> <br /> ### **定义支持多值参数的函数** ~~~ *args接受多余的参数,以元组的格式保存 **kwargs接收关键字参数,以字典的格式保存 调用函数 name="张三"关键字参数 ~~~ <details> <summary>函数的多值参数.py</summary> ``` # 目标:探究函数的多值参数 # *args 用来接收多余的参数,以元组的格式保存 # **kwargs 用来接收多余的关键字参数,以字典的格式保存 def demo(num, *args, **kwargs): print(num) print(args) print(kwargs) demo(10) demo(10, 20) demo(10, 20, 30, 40, 50, name = "小明", age = 20) ``` </details> <br /> ### **多值参数:** ~~~ 多值参数: 1.定义函数时, args:用来接收多余参数,以元组的形式保存数据 ** kwargs:用来接收关键字参数,以字典的格式保存数据 定义函数时,*ags,* kwargs作为形参,功能是组包 2.调用函数时,name="小明",age=18 关键字参数 调用函数时,*args,**kwargs作为实参,功能是拆包(解包) ~~~ <details> <summary>多值参数拆包.py</summary> ``` # 目标:多值参数拆包 def test(a,b,*args,**kwargs): print(a) print(b) print(args) print(kwargs) def demo(a, b, *args, **kwargs): print(a) print(b) print(args) print(kwargs) print("-" * 30) print(a,b,args,kwargs) demo(10, 20, 30, 40, 50, name = "小明", age = 20) 打印结果: ---------------------------- 10 20 ((30, 40, 50, 60), {'name':'小明', 'age':20}) {} ``` </details> <br /> ### **匿名函数** ~~~ 1.匿名函数( lambda表达式) 2.作用:省略def 关键字定义函数的标准步骤,可以快速的定义功能简单的函数 3.语法: lambda 参数 / 多个参数 : 表达式 ~~~ <details> <summary>匿名函数.py</summary> ``` ''' 匿名函数 概念:省略了d定义函数的标准步骤,可以定义功能简单的函数 语法:1 ambda参数:表达式 说明:匿名函数又和1amb表达式 特点:匿名函数把表达式作为整个返回值进行返回 ''' # 定义匿名函数 不带参数的匿名函数 # print(lambda: 100) ret = lambda : 100 print(ret) print(ret()) print((lambda: 100)()) # 定义匿名函数 带一个参数的匿名函数 func = lambda x : x + 100 print(func) print(func(50)) print((lambda x: x + 100)(30)) # 定义匿名函数 带两个参数的匿名函数 func = lambda x, y : x + y print(func) ret = func(10, 20) print(ret) print((lambda x, y : x + y)(100, 200)) # 匿名函数作为函数的参数 def sum_num(a, b, opt): print("a=%d" % a) print("b=%d" % b) print("%d + %d = %d" % (a, b, opt(a, b))) sum_num(10, 20, lambda x, y : x + y) ``` </details> <br />