温州建设小学网站首页,沧州网站建设的集成商,wordpress做企业主页,seo网站整站优化零、文章目录
Python基础05-函数
1、函数的作用及其使用步骤
#xff08;1#xff09;函数的作用 在Python实际开发中#xff0c;我们使用函数的目的只有一个“让我们的代码可以被重复使用” 函数的作用有两个#xff1a; ① 代码重用#xff08;代码重复使用#xf…零、文章目录
Python基础05-函数
1、函数的作用及其使用步骤
1函数的作用 在Python实际开发中我们使用函数的目的只有一个“让我们的代码可以被重复使用” 函数的作用有两个 ① 代码重用代码重复使用 ② 模块化编程模块化编程的核心就是函数一般是把一个系统分解为若干个功能每个功能就是一个函数
2函数是什么 函数是一个被命名的、独立的、完成特定功能的代码段其可能给调用它的程序一个返回值。 被命名的在Python中大部分函数都是有名函数函数都有名字 独立的、完成特定功能的代码段函数的功能要专一专门为了完成某个功能而定义 返回值当函数执行完毕后其可能会返回一个值给函数的调用处
3函数的定义
函数的定义
def 函数名称([参数1, 参数2, ...]):函数体...[return 返回值]4函数的调用
不同的需求参数可有可无。在Python中函数必须先定义后使用。
# 定义函数
def 函数名称([参数1, 参数2, ...]):函数体...[return 返回值]# 调用函数
函数名称(参数1, 参数2, ...)Python中的函数是一个被命名的、独立的、完成特定功能的一段代码并可能给调用它的程序一个return返回值。
作用① 代码重用 ② 模块化编程把一个系统分解为若干个功能每个功能就是一个函数 面向过程
函数定义的基本语法
def 函数名称([参数]):函数体代码不仅一行一般是一个完整的功能[return 返回值]注意① 函数的参数与返回值非必选项可有可无要根据业务的需要② 在函数定义时只是向内存中抛出一个函数的名称其函数体内部的代码并没有真正执行只有调用时函数内部的代码才真正被执行函数的调用过程
函数名称() 找到内存中的函数名称并立即执行其内部的代码# 封装一个函数
def greet(name):return 您好, name# 见到张老师
result1 greet(老张)
result1 ,早上好,吃了么
print(result1)# 见到李老师
result2 greet(老李)
print(result2)# 见到王老师
result3 greet(老王)
print(result3)5引入函数
① 使用Python代码编写一个打招呼程序
第一步见到一个老师打一声招呼
print(您好)
第二步见到一个老师打一声招呼
print(您好)
第二步见到一个老师打一声招呼
print(您好)虽然以上程序可以满足程序的需求但是我们发现我们的代码做了很多重复性的工作。我们能不能对以上代码进行进一步的优化避免代码的重复性编写。
② 升级使用Python代码编写一个打招呼程序函数——一次编写多次利用
# 定义函数封装函数
def greet():print(您好)# 调用函数
# 见到一个老师打一声招呼
greet()
# 见到一个老师打一声招呼
greet()
# 见到一个老师打一声招呼
greet()③ 升级使用Python代码编写一个打招呼程序可以实现向不同的人打不同的招呼
# 定义一个函数同时为其定义一个参数
def greet(name):print(f{name}您好)# 调用函数
# 见到了张老师打一声招呼
greet(老张)
# 见到了李老师打一声招呼
greet(老李)
# 见到了王老师打一声招呼
greet(老王)④ 升级函数的设计原则“高内聚、低耦合”函数执行完毕后应该主动把数返回给调用处而不应该都交由print()等函数直接输出。
# 定义一个函数拥有name参数同时函数执行完毕后拥有一个return返回值
def greet(name):# 执行一系列相关操作return name 您好# 调用函数
# 见到了张老师打一声招呼
print(greet(老张))
# 见到了李老师打一声招呼
print(greet(老李))
# 见到了王老师打一声招呼
print(greet(老王))6函数返回值 如果一个函数如些两个return (如下所示)程序如何执行 答只执行了第一个return原因是因为return可以退出当前函数导致return下方的代码不执行。 思考如果一个函数要有多个返回值该如何书写代码 答可以一个return返回多个返回值用逗号隔开或者返回列表集合或元组。注意① return a, b写法返回多个数据的时候默认是元组类型。② return后面可以连接列表、元组或字典以返回多个值 在函数的内部当函数执行完毕后可能会给函数调用的位置一个返回值接下来聊聊返回值的概念
① 一个函数中是否可以同时拥有多个return是否全部会被执行
答从语法上一个函数内部是可以同时拥有多个return关键字的但是只有第一个return会被执行。因为函数一旦遇到了
return返回值会立即执行两个操作返回return后面的结果强制中止此函数的继续执行。② 在其他编程语言中一个函数只能返回一个值那Python中的函数是否可以同时返回多个值呢
答在Python语言中函数既可以返回一个值也可以返回多个值注意多个值的返回是以元组形式进行返回输出的③ 当函数执行完毕后return返回值到底返回到哪里了如果一个函数要是没有返回值则默认返回什么
答返回给函数调用位置如果一个函数没有return返回值则当这个函数执行完毕后其返回None# 1、定义一个func1()函数
def func1():return 1 # 多个return返回第一个后面代码不执行return 2return 3 result1 func1()
print(result1) # 1 # 2、定义一个func2函数
def func2():return 1, 2, 3 # 多个返回值result2 func2()
print(result2) # (1, 2, 3)
print(type(result2)) # class tuple# 3、定义一个func3()函数
def func3():pass # 无返回值result3 func3()
print(result3) # None2、函数的说明文档
1函数的说明文档是什么
思考定义一个函数后程序员如何书写程序能够快速提示这个函数的作用 答注释 思考如果代码多我们是不是需要在很多代码中找到这个函数定义的位置才能看到注释如果想更方便的查看函数的作用怎么办 答函数的说明文档函数的说明文档也叫函数的文档说明。
2函数的说明文档的定义
定义函数的说明文档
def 函数名(参数): 说明文档的位置 代码......查看函数的说明文档或者Ctrl Q快速查看
help(函数名)案例演示 函数说明文档就相当于函数的说明书在这个说明书中我们需要标注这个函数的作用、拥有的参数以及最终的返回值
基本语法
def func(): 函数说明文档 函数体代码如何快速查看函数的说明文档呢
help(函数名称)
可以基于PyCharm中快捷键 Ctrl Qdef sum_num(num1, num2):sum_num函数主要用于实现对两个数进行求和操作:param num1: int代表第一个参数:param num2: int代表第二个参数:return: 返回num1与num2的加和result num1 num2return result# 使用help方法就可以查看sum_num函数说明文档
help(sum_num)# 使用快捷键快速查看某个函数说明文档 Ctrl Q
sum_num()# 扩展一下在Python中所有的系统函数都有说明文档如果遇到某个函数没有见过直接使用Ctrl Q就可以快速查看此函数说明文档
list1 [1, 2, 3, 4, 5]
list1.reverse()3、函数的嵌套
1函数的嵌套是什么
所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数。 所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数。
学习重点① 函数嵌套的基本语法② 掌握函数嵌套的执行流程# 1、定义一个testB函数
def testB():print(----- testB start -----)print(testB函数体代码...)print(----- testB end -----)# 2、定义testA函数
def testA():print(----- testA start -----)# 所谓的嵌套就是在一个函数的内部又调用了另外一个函数testB()print(----- testA end -----)# 3、执行testA函数
testA()执行效果
----- testA start -----
----- testB start -----
testB函数体代码...
----- testB end -----
----- testA end -----2执行过程
如果函数A中调用了另外一个函数B那么先把函数B中的任务都执行完毕之后才会回到上次 函数A执行的位置。 3PyCharm调试小技巧
先打断点然后Debug运行程序执行至断点处。Step overF8代码一步一步向下执行但是遇到了函数以后不进入函数体内部直接返回函数的最终的执行结果。Step intoF7代码一步一步向下执行但是遇到了函数以后进入到函数体内部一步一步向下执行直到函数体的代码全部执行完毕。 4、函数的应用案例
1案例1
封装一个函数求三个数的平均值 案例封装一个函数求三个数的平均值# 1、定义一个函数
def func(num1, num2, num3):func函数主要用于求三个数的平均值:param num1: int, 第一个参数:param num2: int, 第二个参数:param num3: int, 第三个参数:return: 函数的返回值返回三个数的平均值result (num1 num2 num3) / 3return result# 2、调用函数
print(func(10, 20, 30))2案例2
编写一个函数有一个参数str1输入信息如‘1.2.3.4.5’使用函数对其进行处理要求最终的返回结果为’5-4-3-2-1’ 案例编写一个函数有一个参数str1输入信息如‘1.2.3.4.5’使用函数对其进行处理要求最终的返回结果为5-4-3-2-1# 1、定义一个函数
def func(str1): # str1 1.2.3.4.5# ① 翻转 5.4.3.2.1str2 str1[::-1]# ② 把点号替换为-横岗return str2.replace(., -)# 2、调用函数
print(func(1.2.3.4.5))3案例3
使用函数生成4位长度的验证码 案例使用函数生成4位长度的验证码
验证码可以起到防止恶意攻击用户登录的时候只有账号和密码 账号和密码都是字符串一般就是键盘上的相关字符组合
admin
123456
admin888
有很多暴力破解器 不断的进行字符串组合然后尝试破解你的账号和密码所以引入了一个随机验证码这样一个模块
每次运行生成的验证码都是不同的所以暴力破解器没办法识别每次的验证码所以可以起到防止恶意攻击目的# 第四步引入random随机模块
import random
# 1、封装一个函数生成4位长度的随机验证码
def func():# 第一步定义一个字符串用于生成验证码str1 23456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ# 第二步定义一个空字符串专门用于接收4位长度的验证码code # 第三步生成4位长度的验证码其实就是循环4次每次循环时要做两件事# 第一件事从str1中随机获取一个字符# 第二件事把获取到的随机字符追加到code空字符串中for i in range(4):# 第五步如何从str1中抽取一个随机字符答使用索引随机randnum random.randint(0, len(str1) - 1)# 第六步把每次得到的随机字符拼接到code变量中code str1[randnum]# 第七步把得到的结果作为函数的返回值return code# 2、调用func函数
print(func())4案例4
使用函数生成指定长度的验证码 案例使用函数生成指定长度的验证码
验证码可以起到防止恶意攻击用户登录的时候只有账号和密码 账号和密码都是字符串一般就是键盘上的相关字符组合
admin
123456
admin888
有很多暴力破解器 不断的进行字符串组合然后尝试破解你的账号和密码所以引入了一个随机验证码这样一个模块
每次运行生成的验证码都是不同的所以暴力破解器没办法识别每次的验证码所以可以起到防止恶意攻击目的# 第四步引入random随机模块
import random
# 1、封装一个函数生成指定长度的随机验证码
def func(length):# 第一步定义一个字符串用于生成验证码str1 23456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ# 第二步定义一个空字符串专门用于接收4位长度的验证码code # 第三步生成4位长度的验证码其实就是循环4次每次循环时要做两件事# 第一件事从str1中随机获取一个字符# 第二件事把获取到的随机字符追加到code空字符串中for i in range(length):# 第五步如何从str1中抽取一个随机字符答使用索引随机randnum random.randint(0, len(str1) - 1)# 第六步把每次得到的随机字符拼接到code变量中code str1[randnum]# 第七步把得到的结果作为函数的返回值return code# 2、调用func函数
print(func(6))5、变量的作用域
1变量的作用域是什么 变量作用域指的是变量的作用范围变量在哪里可用在哪里不可用主要分为两类全局作用域与局部作用域。 在函数内部定义范围就称之为局部作用域在函数外部全局定义范围就是全局作用域
# 全局作用域
def func():# 局部作用域2局部变量和全局变量
在Python中定义在函数外部的变量就称之为全局变量定义在函数内部变量就称之为局部变量。
# 定义在函数外部的变量全局变量
num 10
# 定义一个函数
def func():# 函数体代码# 定义在函数内部的变量局部变量num 1003变量作用域的作用范围
全局变量在整个程序范围内都可以直接使用 在全局作用域中定义的变量就是全局变量
探讨一下全局变量的访问范围
① 在全局作用域中可以访问全局变量
② 全局变量还可以在局部作用域中访问
综上所述全局变量既可以在全局作用域中访问也可以在局部作用域中访问其是通用的str1 hello
# 定义一个函数
def func():# 在函数内部调用全局变量str1print(f在局部作用域中调用str1变量{str1})# 直接调用全局变量str1
print(f在全局作用域中调用str1变量{str1})
# 调用func函数
func()局部变量在函数的调用过程中开始定义函数运行过程中生效函数执行完毕后销毁。在全局作用域访问局部变量报错。 局部变量在局部作用域函数的内部中定义的变量就被称之为局部变量。
探讨一下局部变量访问范围
① 局部变量是可以在局部作用域中访问的
② 局部变量是否可以在全局作用域中访问呢答不能因为计算机的垃圾回收机制
综上所述局部变量不是万能的只能在局部作用域中访问无法在全局作用域中访问因为当函数执行完毕后其局部变量会自动被计算机的内存所回收扩展内存的垃圾回收机制
因为函数执行完毕后其内部的局部变量与程序都要被计算机的内存所回收
早期计算机内存只有2MB所以需要即用即清所以的计算机程序都需要先加载数据到内存局部变量也会占用一段内存空间。
又由于局部变量一般只在函数调用时被使用当函数调用结束其变量就变得没有价值。所以计算机的内存会自动执行清理操作把局部变量占用的空间及时回收所以会导致在全局作用域中无法直接访问局部变量
# 定义一个函数
def func():# 在函数内部定义一个局部变量num 10print(f在局部作用域中调用num局部变量{num})# 调用func函数
func()
# 在全局作用域中调用num局部变量
print(f在全局作用域中调用num局部变量{num})4global关键字
在局部作用域中是无法对全局变量进行修改的一定要进行修改必须使用global关键字。
# 定义全局变量num 10
num 10
# 定义一个函数func
def func():# 尝试在局部作用域中修改全局变量 修改失败num 20# 调用函数func
func()
# 尝试访问全局变量num
print(num) # 10加上global关键字global关键字只是针对不可变数据类型的变量进行修改操作数值、字符串、布尔类型、元组类型可变类型可以不加global关键字。
# 定义全局变量num 10
num 10
# 定义一个函数func
def func():# 尝试在局部作用域中修改全局变量 加上global关键字修改成功global numnum 20# 调用函数func
func()
# 尝试访问全局变量num
print(num) # 206、函数参数进阶
1形参和实参 在函数定义与调用时我们可以根据自己的需求来实现参数的传递。在Python中函数的参数一共有两种形式 形参在函数定义时所编写的参数就称之为形式参数实参在函数调用时所传递的参数就称之为实际参数 在Python代码中函数定义时所指定的参数被称之为形式参数简称形参函数调用时所指定的参数被称之为实际参数简称实参
还要特别注意函数的形参属于局部变量只能在函数的内部使用def greet(name): # name是一个形参# name作用域只在此函数内部有效因为其是一个局部变量return 您好 name# 定义一个全局变量
name 老王
greet(name) # 函数调用时所指定的参数是一个实参通常是一个全局变量2函数的参数类型 位置参数调用函数时根据函数定义的参数位置来传递参数传递和定义参数的顺序及个数必须一致。 关键字参数函数调用通过“键值”形式加以指定。可以让函数更加清晰、容易使用同时也清除了参数的顺序需求。函数调用时如果有位置参数时位置参数必须在关键字参数的前面但关键字参数之间不存在先后顺序。
# 1、定义一个函数
def func(name, age, mobile):print(name)print(age)print(mobile)# 2、在函数调用时函数一共有3个参数所以调用时也需要传递3个参数但是传递过程中有两种传递方式① 位置传参 ② 关键词传参
# ① 位置传参根据函数定义时参数的位置传递参数的值强调参数的位置顺序不能颠倒
func(Tom, 23, 10086)# ② 关键词传参根据参数值方式来实现对参数的传递优势不需要考虑位置关系只要参数名称没错任何位置都可以
func(nameJack, mobile10010, age19)3缺省参数默认值
缺省参数也叫默认参数用于定义函数为参数提供默认值调用函数时可不传该默认参数的值注意所有位置参数必须出现在默认参数前包括函数定义和调用。函数调用时如果为缺省参数传值则修改默认参数值否则使用这个默认值。 在Python代码中函数定义时的参数一共有3种类别
① 普通参数如def func(name, age, mobile)
② 缺省参数默认值参数如def func(name, age, gendermale)
③ 不定长参数如def func(*args, **kwargs)
有些情况下我们可以为某个参数定义一个默认值我们把这种带有默认值的参数就称之为缺省参数默认值参数
基本语法
def 函数名称(普通参数, 参数名称默认值):pass# 优点① 如果我们传参过程中想让某个参数拥有默认值可以直接省略参数的传递
函数名称普通参数的值② 如果你不想使用默认值则可以给默认值参数传递一个值用于替换默认值def student(name, age, gendermale):print(name, age, gender)# 调用student函数
student(Tom, 23)
student(Jack, 25)
student(婉儿, 19, female)4不定长参数
不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。**不定长元组位置参数**传进的所有参数都会被args变量收集它会根据传进参数的位置合并为一个元组(tuple)args是元组类型。
def user_info(*args):print(args)user_info(TOM)# (TOM,)
user_info(TOM, 18)# (TOM, 18)**不定长字典关键字参数**传进的所有参数都会被kwargs变量收集它会根据传进参数的位置合并为一个字典(tuple)kwargs是字典类型。
def user_info(**kwargs):print(kwargs)user_info(nameTOM, age18, id110)# {name: TOM, age: 18, id: 110}不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。
此时可用包裹(packing)位置参数或者包裹关键字参数来进行参数传递会显得非常方便。
*args 不定长位置参数不定长元组参数*args代表固定格式args代表变量的名称主要用于接收不定长位置参数
**kwargs 不定长关键词参数不定长字典参数**kwargs代表固定格式kwargs代表变量名称主要用于接收不定长关键词参数# 定义func函数时参数应该如何编写呢
def func1(*args):print(args)# 调用一个函数时可以有多重调用方法
func1()
func1(1)
func1(1, 2)
func1(1, 2, 3)
################################################
def func2(**kwargs):print(kwargs)func2()
func2(a1)
func2(a1, b2)
func2(a1, b2, c3)*args与**kwargs一起使用 在实际Python开发工作中*args与**kwargs还可以结合在一起使用
注意事项*args必须放在左边**kwargs必须放在右边def func(*args, **kwargs):print(args)print(kwargs)# 当我们调用func函数时为其传递参数*args用于接收位置参数**kwargs用于接收关键词参数
func(1, 2, 3, a4, b5)# 输出
# (1, 2, 3)
# {a: 4, b: 5}# 需求请封装一个函数用于接收list1与dict1的值然后对其进行求和操作函数最终返回结果为12345
# 在Python中*args还可以专门用于接收列表类型或者元组类型的数据
# **kwargs还可以专门用于接收字典类型的数据
def func(*args, **kwargs):sum 0for i in args:sum ifor value in kwargs.values():sum valueprint(sum)list1 [1, 2, 3]
dict1 {a:4, b:5}func(*list1, **dict1)# 15参数混用情况 在Python代码中函数定义时的参数一共有3种类别
① 普通参数如def func(name, age, mobile)
② 缺省参数默认值参数如def func(name, age, gendermale)
③ 不定长参数如def func(*args, **kwargs)
在函数中以上三种参数还可以混合在一起使用特别注意顺序很重要
def func(① 普通参数 ② *args ③ 缺省参数 ④ **kwargs):passdef func(a, b, *args, c4, **kwargs):print(a, b)print(args)print(c)print(kwargs)# 如何传递参数
func(1, 2, 3, c100, d5, e6)# 输出
# 1 2
# (3,)
# 100
# {d: 5, e: 6}7、引用变量及可变类型、非可变类型
1值传递与引用传递
在大多数编程语言中值的传递通常可以分为两种形式“值传递与引用地址传递”但是在Python中变量的传递基本上都是引用地址传递。我们可以用id() 来判断两个变量是否为同一个值的引用。我们可以将id值理解为那块内存的地址标识。
2可变类型与不可变类型 可变类型当这个内存地址一旦固定其值还可以改变的数据类型 列表 字典 集合 不可变类型当这个内存地址一旦固定则其值无法改变的数据类型 整型浮点型字符串元组
# 整数类型不可变类型
a 1
b a
print(b) # 1
print(id(a)) # 140731559954872
print(id(b)) # 140731559954872
a 2 # a的值发生改变
print(id(a)) # 140731559954904a的地址变成了新地址
print(id(b)) # 140731559954872b的地址没有变化
print(b) # 1, 不可变数据类型数值在赋值以后其中一个值的改变相当于指向一个新的地址不影响另外一个变量因为两者指向空间地址不同。# 列表序列可变数据类型
aa [10, 20]
bb aa
print(id(aa)) # 1661917188352
print(id(bb)) # 1661917188352
aa.append(30) # aa的值发生改变
print(id(aa)) # 1661917188352aa地址没有发生改变
print(id(bb)) # 1661917188352bb地址没有发生改变
print(bb) # [10, 20, 30], 可变数据类型列表在赋值以后其中一个值的改变影响另外一个变量因为两者指向空间地址相同。3可变类型与不可变类型函数中应用
可变类型在全局或局部中对可变类型进行增删改操作其外部和内部都会受到影响。
# 定义一个函数
def func(names2):# names2 names1# 局部作用域names2.append(赵六)# 定义一个全局变量
names1 [张三, 李四, 王五]
# 调用函数
func(names1)
print(names1) # A. [张三, 李四, 王五] B. [张三, 李四, 王五, 赵六]不可变类型局部或全局的改变对外部和内部都没有任何影响。
# 定义一个函数
def func(num):# num anum 1print(num)# 定义一个全局变量
a 10
# 调用函数
func(a)
# 在全局作用域中打印a
print(a) # 108、元组拆包
1拆包是什么
简单来说就是把一个元组中的数据一个一个拆解出来的过程就称之为叫做拆包操作。
2基本语法 什么是拆包
简单来说就是把一个元组中的数据一个一个拆解出来的过程就称之为叫做拆包操作。
注意元组中有多少个元素则左边的变量就有多少个tuple1 (10, 20)
# 拆包
num1, num2 tuple1# 以上代码可以简写为
num1, num2 (10, 20)# 还可以进一步简写
num1, num2 10, 20print(num1)
print(num2)3变量交换案例 # 第一步把c2 和 c1先组装为一个元组c2, c1圆括号可以省略不写不写也是一个元组
# 第二步利用元组拆包特性把c2的值赋值给c1变量把c1的值赋值给c2变量
c1 可乐
c2 牛奶
c1, c2 c2, c1
print(c1)# 牛奶
print(c2)# 可乐