1. 全局变量和局部变量
通过global关键字把局部变量转换为全局变量
num = 10
def demo1():
print("demo1" + "-" * 50)
# global 关键字,告诉 Python 解释器 num 是一个全局变量
global num
num = 100
print(num)
def demo2():
print("demo2" + "-" * 50)
print(num)
# demo1() # 输出 100
demo2() # 输出10
print("over")
2. 函数进阶
- 函数返回多个值
def measure():
"""返回当前的温度"""
print("开始测量...")
temp = 39
wetness = 10
print("测量结束...")
return temp, wetness
temp, wetness = measure()
print(temp)
print(wetness)
- 交换两个数
解法 1 —— 使用其他变量
# 解法 1 - 使用临时变量
c = b
b = a
a = c
解法 2 —— 不使用临时变量
# 解法 2 - 不使用临时变量
a = a + b
b = a - b
a = a - b
解法 3 —— 异或运算
a = a ^ b
b = a ^ b
a = a ^ b
解法 4 —— Python 专有,利用元组
a, b = b, a
- 面试题
def demo(num, num_list):
print("函数内部代码")
# num = num + num
num += num
# num_list.extend(num_list) 由于是调用方法,所以不会修改变量的引用
# 函数执行结束后,外部数据同样会发生变化
num_list += num_list # 注意: Python中的列表+=是在原有集合上操作,要区别于scala
print(num)
print(num_list)
print("函数代码完成")
gl_num = 9
gl_list = [1, 2, 3]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)
- 多值参数
有时可能需要 一个函数 能够处理的参数 个数 是不确定的,这个时候,就可以使用 多值参数
python 中有 两种 多值参数:
参数名前增加 一个 * 可以接收 元组
参数名前增加 两个 * 可以接收 字典
一般在给多值参数命名时,习惯使用以下两个名字
*args —— 存放 元组 参数,前面有一个 *
**kwargs —— 存放 字典 参数,前面有两个 *
args 是 arguments 的缩写,有变量的含义
kw 是 keyword 的缩写,kwargs 可以记忆 键值对参数
def demo(num, *args, **kwargs):
print(num, type(num))
print(args, type(args))
print(kwargs, type(kwargs))
demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)
- 元组和字典的拆包
def demo(*args, **kwargs):
print(args)
print(kwargs)
# 需要将一个元组变量/字典变量传递给函数对应的参数
gl_nums = (1, 2, 3)
gl_xiaoming = {"name": "小明", "age": 18}
# 没有拆包,会把两个元素全部传给tuple, 而字典里面是空的
demo(gl_nums, gl_xiaoming)
# 进行了拆包,会把相应的元素传递给tuple和dict
demo(*gl_nums, **gl_xiaoming)