一、全局变量和局部变量
[1]全局变量和局部变量:
全局变量:是指函数外部的变量,所有函数内部都可以使用
局部变量:是指函数外部的变量,只在函数外部使用
[2]例子:
global_variable = "全局变量"
def print_var():
local_variable = "局部变量"
print("在函数内部调用:" + local_variable) #在函数内部使用局部变量
print("在函数内部调用:" + global_variable) #在函数内部使用全局变量
print_var()
print("在函数外部调用:" + global_variable) #在函数外部使用全局变量
#由于函数的局部变量只能在函数的内部使用,在外部使用的话直接报错
print("在函数内部调用:" + local_variable) #在函数外部使用局部变量
[3]截图:
[2]变量的生命周期:
- 定义:是变量在内从中从被创建到被回收的过程
- 注意:
局部变量在函数执行时才会被创建
函数执行后局部变量被系统收回
[3]在函数内部如何更改全局变量
[1]语法:使用global关键字即可
- 例子:
global_variable = "全局变量"
def print_var():
local_variable = "局部变量"
global global_variable #利用global关键字告诉函数global_variable是全局变量
global_variable = "在函数内部更改了全局变量" #更改全局变量
print("在函数内部调用:" + local_variable) #在函数内部使用局部变量
print("在函数内部调用:" + global_variable) #在函数内部使用全局变量
print_var()
print()
print("在函数外部调用:" + global_variable) #在函数外部使用全局变量
- 截图:
[2]注意:
如果在函数内部中使用赋值语句则会定义一个同名的局部变量,不会修改同名的全局变量
- 例子:
global_variable = "全局变量"
def print_var():
local_variable = "局部变量"
global_variable = "我是在函数内部定义的一个局部变量"
#这一个赋值语句并没有更改全局变量,因为没有用global关键字,
# 这条语句等价于直接创建一个和全局变量同名的局部变量
print("在函数内部调用:" + local_variable) #在函数内部使用局部变量
print("在函数内部调用:" + global_variable) #在函数内部使用全局变量
print_var()
print()
print("在函数外部调用:" + global_variable) #在函数外部使用全局变量
- 截图:
二、函数的参数和返回值的作用
1. 函数的类型
函数的类型 |
无参数,无返回值 |
有参数,无返回值 |
无参数,有返回值 |
有参数,有返回值 |
2.什么时候需要用参数,或者返回值?:
需要在把函数外部的数据放到函数内部处理的时候就需要参数
希望得到返回结果,并且对返回结果进行一定的操作时,就需要用返回值
3.注意事项:
- 在函数内部修改形参,不改变外部实参的值(无论修改的形参是否是可变类型)
- 但如果形参是可变类型并且使用与可变类型相关的方法时候,对形参的修改就会影响到外部实参的值
- 例子:
list1 = [1,2,3,4]
list2 = [2,4,6,8]
def print_var(list_num1, list_num2):
list_num1.append(5)
print("list_num1的地址:" + str(id(list_num1)))
print("print_var:", list_num1) #可变类型调用方法就相当于是改变了原来的值
list_num2 = list_num2 + [1]
print("list_num2的地址:" + str(id(list_num2)))
print("print_var:",list_num2) #可变类型没有调用参数就没有改变原来的值
print_var(list1, list2)
print()
print("list1的地址:" + str(id(list1)))
print("print:",list1)
print("list2的地址:" + str(id(list2)))
print("print:",list2)
- 截图:
三、形参类型
1.缺省参数
[1]定义:
在定义函数时候,可以给某个形参先指定一个特定的值
[2]作用:
如果在调用的时候,没有传入缺省参数的值,则可以使用函数在定义的时候指定的参数的默认值
通俗的说:就是给形参先赋值一个值(就是初始化),如果没有给这个形参传入值的话就用初始化的值
[3]注意事项:
1)缺省参数要放于所有参数的末尾
2)调用多个缺省参数的时候,如果想要给某个具体的缺省参数赋值的话,需要用" 缺省名 = 具体的实参的值"
[4]例子:
def print_info(name, title="", gender=True):
"""
:param title:职位
:param name:班上的同学的姓名
:param gender: True是男生,False是女生
:return:
"""
gender_text = "男生"
if not gender:
gender_text = "女生"
print("[%s] %s 是 %s" % (title, name, gender_text))
print_info("小明")
print_info("老王")
print_info("小红",gender=False)
[5]截图
2.多值参数
[1]应用场景:
当函数处理的参数的个数不确定的时候,就需要使用多值参数
[2]多值参数分类:
参数名前加一个 *
,接收的是一个元组
参数名前加两个*
,接收的是一个字典
[3]例子:
def demo(num, *nums, **person):
print(num)
print(nums)
print(person)
demo(1) #如果不给多值参数进行传值的话,那么就是一个空元组,空字典
demo(1,2,3,4,5,"xiaoming",name = "小明", age = 18) #1会传给num,2,3,4,5,"小明"会传给*nums
[4]截图:
[5]注意事项:
- 一般在给多值参数进行命名的时候,习惯这样命名地:
*args —存放元组参数
**kwargs —存放字典参数 - 如果不给多值参数进行传入参数的话那么直接就是一个空元组和空字典
- 我们在给字典类型的多值参数传值的时候需要注意以下几点
【1】我们需要知道在传值的时候是需要用键值对进行传值,同时键值对中的键是字符串类型
四、元组与字典的拆包(针对多值参数)
1.应用场景:
当需要给函数传入元组变量和字典变量时候就需要拆包
2.语法:
元组变量前面加*
字典变量前面加**
3.例子:
def demo(*args, **kwargs):
print(args)
print(kwargs)
# 当我们需要传入元组变量/字典变量时就需要拆包
gl_nums = (1,3,4)
gl_dict = {"name": "小明"}
# demo(gl_nums, gl_dict)
demo(*gl_nums, **gl_dict)