Python基础05-函数

零、文章目录

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)  # None

2、函数的说明文档

(1)函数的说明文档是什么
  • 思考:定义一个函数后,程序员如何书写程序能够快速提示这个函数的作用?
    • 答:注释
  • 思考:如果代码多,我们是不是需要在很多代码中找到这个函数定义的位置才能看到注释?如果想更方便的查看函数的作用怎么办?
    • 答:函数的说明文档(函数的说明文档也叫函数的文档说明)。
(2)函数的说明文档的定义
  • 定义函数的说明文档
def 函数名(参数):""" 说明文档的位置 """ 代码......
  • 查看函数的说明文档,或者Ctrl + Q快速查看
help(函数名)
  • 案例演示:
'''
函数说明文档:就相当于函数的说明书,在这个说明书中我们需要标注这个函数的作用、拥有的参数以及最终的返回值!
基本语法:
def func():""" 函数说明文档 """函数体代码如何快速查看函数的说明文档呢?
help(函数名称)
可以基于PyCharm中快捷键 => Ctrl + Q
'''
def 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执行的位置。

image-20231120110921089

(3)PyCharm调试小技巧
  • 先打断点,然后Debug运行程序,执行至断点处。
  • Step over(F8):代码一步一步向下执行,但是遇到了函数以后,不进入函数体内部,直接返回函数的最终的执行结果。
  • Step into(F7):代码一步一步向下执行,但是遇到了函数以后,进入到函数体内部,一步一步向下执行,直到函数体的代码全部执行完毕。

image-20231120111541477

image-20231120111713981

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 = 100
(3)变量作用域的作用范围
  • 全局变量:在整个程序范围内都可以直接使用
'''
在全局作用域中定义的变量就是全局变量!
探讨一下全局变量的访问范围:
① 在全局作用域中可以访问全局变量
② 全局变量还可以在局部作用域中访问
综上所述:全局变量既可以在全局作用域中访问,也可以在局部作用域中访问,其是通用的!
'''
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}')
(4)global关键字
  • 在局部作用域中是无法对全局变量进行修改的,一定要进行修改,必须使用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) # 20

6、函数参数进阶

(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(name='Jack', mobile='10010', age=19)
(3)缺省参数(默认值)
  • 缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。
  • 函数调用时,如果为缺省参数传值则修改默认参数值;否则使用这个默认值。
'''
在Python代码中,函数定义时的参数一共有3种类别:
① 普通参数,如def func(name, age, mobile)
② 缺省参数(默认值参数),如def func(name, age, gender='male')
③ 不定长参数,如def func(*args, **kwargs)
有些情况下,我们可以为某个参数定义一个默认值,我们把这种带有默认值的参数就称之为缺省参数(默认值参数)
基本语法:
def 函数名称(普通参数, 参数名称=默认值):pass# 优点:① 如果我们传参过程中,想让某个参数拥有默认值,可以直接省略参数的传递
函数名称(普通参数的值)② 如果你不想使用默认值,则可以给默认值参数传递一个值,用于替换默认值
'''
def student(name, age, gender='male'):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(name='TOM', age=18, id=110)# {'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(a=1)
func2(a=1, b=2)
func2(a=1, b=2, c=3)
  • *args与**kwargs一起使用
'''
在实际Python开发工作中,*args与**kwargs还可以结合在一起使用!
注意事项:*args必须放在左边,**kwargs必须放在右边
'''
def func(*args, **kwargs):print(args)print(kwargs)# 当我们调用func函数时为其传递参数,*args用于接收位置参数,**kwargs用于接收关键词参数
func(1, 2, 3, a=4, b=5)# 输出
# (1, 2, 3)
# {'a': 4, 'b': 5}
# 需求:请封装一个函数,用于接收list1与dict1的值,然后对其进行求和操作,函数最终返回结果为1+2+3+4+5
# 在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, gender='male')
③ 不定长参数,如def func(*args, **kwargs)
在函数中,以上三种参数还可以混合在一起使用,特别注意:顺序很重要
def func(① 普通参数 ② *args ③ 缺省参数 ④ **kwargs):pass
'''
def func(a, b, *args, c=4, **kwargs):print(a, b)print(args)print(c)print(kwargs)# 如何传递参数
func(1, 2, 3, c=100, d=5, e=6)# 输出
# 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)) # 140731559954904,a的地址变成了新地址
print(id(b)) # 140731559954872,b的地址没有变化
print(b) # 1,  不可变数据类型(数值)在赋值以后,其中一个值的改变相当于指向一个新的地址,不影响另外一个变量,因为两者指向空间地址不同。# 列表序列:可变数据类型
aa = [10, 20]
bb = aa
print(id(aa)) # 1661917188352
print(id(bb)) # 1661917188352
aa.append(30) # aa的值发生改变
print(id(aa)) # 1661917188352,aa地址没有发生改变
print(id(bb)) # 1661917188352,bb地址没有发生改变
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)  # 10

8、元组拆包

(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)# 可乐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/221095.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频推拉流EasyDSS互联网直播/点播平台构建户外无人机航拍直播解决方案

一、背景分析 近几年&#xff0c;国内无人机市场随着航拍等业务走进大众&#xff0c;出现爆发式增长。无人机除了在民用方面的应用越来越多&#xff0c;在其他领域也已经开始广泛应用&#xff0c;比如公共安全、应急搜救、农林、环保、交通 、通信、气象、影视航拍等。无人机使…

Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现

Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现 漏洞名称影响版本影响版本 漏洞复现环境搭建漏洞利用 总结 漏洞名称 影响版本 Apache CouchDB是一个开源的NoSQL数据库&#xff0c;专注于易用性和成为“完全拥抱web的数据库”。它是一个使用JSON作为数据存储格式…

CentOs7.x安装部署SeaTunnelWeb遇到的坑

CentOs7.x安装部署SeaTunnelWeb遇到的坑 文章目录 1. 环境2. SeaTunnel安装部署2.1下载安装包2.2 设置环境变量2.3 安装连接器插件2.4 拷贝jar包到lib下2.5 启动命令2.6 执行官方client提交任务demo 3. SeaTunnel-Web安装部署3.1 下载安装包3.2 初始化数据库脚本或修改配置appl…

用户行为分析遇到的问题-ubantu16,hadoop3.1.3

用户行为分析传送门 我的版本 ubantu16 hadoop 3.1.3 habse 2.2.2 hive3.1.3 zookeeper3.8.3 sqoop 1.46/1.47 我sqoop把MySQL数据往hbase导数据时候有问题 重磅&#xff1a;大数据课程实验案例&#xff1a;网站用户行为分析&#xff08;免费共享&#xff09; 用户行为分析-小…

如何下载知网论文、专利的PDF格式

知网的论文格式有其特有的格式&#xff1a;CAJ。将CAJ格式转化为Word或者PDF非常麻烦&#xff0c;且会出现乱码的情况&#xff0c;直接用知网官方的CAJ浏览器也不太方便。为此&#xff0c;困扰了许久。 其实&#xff0c;知网可以直接下载PDF格式&#xff0c;只需在浏览器上安装…

【JavaWeb】往浏览器打印一个hello world

上集:建一个web项目 第一步&#xff1a;建好Servlet类的文件 右键src&#xff0c;建一个class 就行 第二步&#xff1a;编代码 可以直接复制粘贴 用来测试的类 import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; //↓是注解&#xff0…

2018年第七届数学建模国际赛小美赛A题空中加油飞行计划解题全过程文档及程序

2018年第七届数学建模国际赛小美赛 A题 空中加油飞行计划 原题再现&#xff1a; 太平洋中部一个小岛上的居民被自然灾害困住。救援人员需要派遣一架轻型飞机运送少量急救药品到岛上&#xff0c;并运送一名重伤者到医疗基地求救。岛上有一个无人值守的简易机场&#xff0c;可以…

Gin之GORM多表关联查询(多对多;自定义预加载SQL)

数据库三个,如下: 注意:配置中间表的时候,表设计层面最好和配置的其他两张表契合,例如其他两张表为fate内的master和slave;要整合其对应关系的话,设计中间表的结构为master_id和slave_id最好(不然会涉及重写外键的操作) 重写外键(介绍) 对于 many2many 关系,连接表…

德人合科技 | 防止公司电脑文件数据资料外泄,自动智能透明加密保护系统

【透明加密软件】——防止公司电脑文件数据资料防止外泄&#xff0c;自动智能透明加密保护内部核心文件、文档、图纸、源代码、音视频等资料&#xff01; PC端访问地址&#xff1a; www.drhchina.com &#x1f31f; 核心功能&#xff1a; 透明加密&#xff1a;采用高级加密算…

netty线程调度定制

1、netty的线程调度问题 在netty的TCP调度中&#xff0c;线程的调度封装在NioEventLoopGroup中&#xff0c;线程执行则封装在NioEventLoop中。 线程调度规则封装在MultithreadEventExecutorGroup的next方法中&#xff0c;这个方法又封装了EventExecutorChooserFactory&#xf…

wireshark抓包分析网络延迟

一、问题点 通过一个抓包文件如何判断服务通信是都有延迟&#xff0c; 二、抓包截图以及分析 时间戳&#xff1a; 2023-12-20&#xff1a;年月日 09:14:02&#xff1a;时分秒 2020&#xff1a;毫秒&#xff08;MS&#xff09;&#xff0c;秒后面的单位就是MS 单位换算&am…

黑马点评06分布式锁 2Redisson

实战篇-17.分布式锁-Redisson功能介绍_哔哩哔哩_bilibili 1.还存在的问题 直接实现很麻烦&#xff0c;借鉴已有的框架。 2.Redisson用法 3.Redisson可重入原理 在获取锁的时候&#xff0c;看看申请的线程和拿锁的线程是否一致&#xff0c;然后计算该线程获取锁的次数。一个方法…

20231218在微软官网下载WINDOWS10以及通过rufus-4.3p写入U盘作为安装盘

20231218在微软官网下载WINDOWS10以及通过rufus-4.3p写入U盘作为安装盘 2023/12/18 17:06 百度搜索&#xff1a;下载 windows10 https://www.microsoft.com/zh-cn/software-download/windows10 下载 Windows 10 更新之前&#xff0c;请参阅 Windows 版本信息状态中的已知问题&a…

Git初始

一)git的介绍: 1)假设现在有一个文档&#xff0c;你的老板要求你针对于这份文件进行修改&#xff0c;进行完成的修改的版本是版本1&#xff0c;接下来是文档2&#xff0c;修改完文档2以后&#xff0c;接下来老板还不同意&#xff0c;于是又有了文档三&#xff0c;文档四&#x…

Bert-vits2-v2.2新版本本地训练推理整合包(原神八重神子英文模型miko)

近日&#xff0c;Bert-vits2-v2.2如约更新&#xff0c;该新版本v2.2主要把Emotion 模型换用CLAP多模态模型&#xff0c;推理支持输入text prompt提示词和audio prompt提示语音来进行引导风格化合成&#xff0c;让推理音色更具情感特色&#xff0c;并且推出了新的预处理webuI&am…

基于PHP的蛋糕购物商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的蛋糕购物商城系统 一 介绍 此蛋糕购物商城基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销…

【深度学习】序列生成模型(五):评价方法计算实例:计算BLEU-N得分【理论到程序】

文章目录 一、BLEU-N得分&#xff08;Bilingual Evaluation Understudy&#xff09;1. 定义2. 计算N1N2BLEU-N 得分 3. 程序 给定一个生成序列“The cat sat on the mat”和两个参考序列“The cat is on the mat”“The bird sat on the bush”分别计算BLEU-N和ROUGE-N得分(N1或…

css实现0.5px宽度/高度显——属性: transform: scale

在大多数设备上&#xff0c;实际上无法直接使用 CSS 来精确地创建 0.5 像素的边框。因为大多数屏幕的最小渲染单位是一个物理像素&#xff0c;所以通常只能以整数像素单位渲染边框。但是&#xff0c;有一些技巧可以模拟出看起来像是 0.5 像素的边框。 这里介绍使用&#xff1a…

阶段十-springsecurity总结

jwt认证流程 SpringSecurity 认证过程 第一步&#xff1a; 创建一个类实现UserDetailsService接口&#xff0c;重写其中的方法 通过重写 public UserDetails loadUserByUsername(String username) 方法 从数据库校验用户输入的用户名 配置SecurityConfig Bean注入 Passwor…

node.js mongoose aggregate

目录 官方文档 简述 Aggregate的原型方法 aggregate进行操作 官方文档 Mongoose v8.0.3: Aggregate 简述 在 Mongoose 中&#xff0c;Aggregate 是用于执行 MongoDB 聚合操作的类。MongoDB 聚合操作是一种强大的数据处理工具&#xff0c;可以用于对集合中的文档进行变换和…