1. 变量进阶
1.1 变量的引用
- 在
Python
中,变量和数据是分开存储的; - 数据保存在内存中的一个位置;
- 变量中保存着数据在内存中的地址;
- 变量中记录数据的地址,叫做引用;
- 使用
id()
函数可以查看变量中保存数据所在的内存地址;
1.2 函数的参数和返回值的传递
def test(num):
print("在函数内部 %d 对应的内存地址是 %d" % (num, id(num)))
a = 10
print("a 变量保存数据的内存地址是 %d" % id(a))
# 调用函数,本质上传递的是实参保存数据的引用, 而不是实参保存的数据
# 函数的返回值,本质上返回的是数据的引用,而不是数据本身
test(a)
1.3 可变和不可变数据类型
- 不可变类型:
- 数字类型
int
,bool
,float
,complex
- 字符串
str
- 元组
tuple
- 数字类型
- 可变类型:
- 列表
list
- 字典
dict
- 列表
1.4 局部变量和全局变量
- 局部变量: 在函数内部定义的变量,只能在函数内部使用;
- 全局变量: 在函数外部定义的变量,所有函数内部都可以使用这个变量;
- 在函数内部,可以通过全局变量的引用获取对应的数据;
- 但是,不允许直接修改全局变量的引用(即使用赋值语句修改全局变量的值);
- 为了避免局部变量和全局变量出现混淆,全局变量的名称前应该增加
g_
或gl_
的前缀;
# 示例一
num = 10
def demo1():
# 如果使用赋值语句,会在函数内部,定义一个局部变量
num = 99
print("demo1 ==> %d" % num)
def demo2():
print("demo2 ==> %d" % num)
demo1() # 输出结果: demo1 ==> 99
demo2() # 输出结果: demo2 ==> 10
# 示例二: 在函数内部修改全局变量的值
# 需要使用 global 关键字进行声明
num = 10
def demo1():
# global 关键字,告诉 python 解释器, num 是一个全局变量
global num
num = 100
print("demo1 ==> %d" % num)
def demo2():
print("demo2 ==> %d" % num)
demo1() # 输出结果: demo1 ==> 100
demo2() # 输出结果: demo2 ==> 100
2. 函数进阶
2.1 函数的返回值
# 示例一: 利用元组返回多个值
# 需求: 测量温度和湿度
def measure():
"""测量温度和湿度"""
print("测量开始...")
temp = 39
wetness = 35
print("测量结束...")
# 如果函数返回的类型是元组, 小括号可以省略
# return (temp,wetness)
return temp, wetness
result = measure()
print(result)
# 如果需要单独的处理温度或者湿度,可以使用多个变量, 一次接收函数的返回结果;
# 注意: 使用多个变量接收结果时, 变量的个数应该和元组中元素的个数保持一致;
gl_temp, gl_wetness = measure()
print(gl_temp)
print(gl_wetness)
# 示例二: 交换两个数字
# 要求: 1. 有两个整数变量 a = 6, b = 100
# 2. 不使用其他变量, 交换两个变量的值
# 方法一:
a = a + b
b = a - b
a = a - b
# 方法二: Python 专有, 利用元组
# a, b = (b, a)
a, b = b, a
2.2 函数的参数
# 列表变量调用 += 本质上是在执行列表变量的 extend 方法
def demo(num, num_list):
print("函数内部代码")
num += num
num_list += num_list
print(num)
print(num_list)
print("函数代码完成")
gl_num = 9
gl_list = [1, 2, 3]
demo(gl_num, gl_list)
print(gl_num) # 9
print(gl_list) # [1, 2, 3, 1, 2, 3]
2.4 函数的缺省参数
- 定义函数时, 可以给某个参数指定一个默认值, 具有默认值的参数就叫做缺省参数;
- 调用函数时, 如果没有传入缺省参数的值, 则在函数内部使用定义函数时指定的参数默认值;
- 函数的缺省参数, 将常见的值设置为参数的缺省值, 从而简化函数的调用;
- 缺省参数的注意事项:
- 缺省参数的定义位置:带有默认值的缺省参数,定义在参数列表末尾;
- 调用带有多个缺省参数的函数时,需要指定参数名;
# 示例一: 对列表排序的方法
gl_list = [1, 8, 3, 2]
# 默认就是升序排序, 因为这种应用需求更多
gl_list.sort()
print(gl_list)
# 只有当需要降序排序时, 才需要传递 reverse 参数
gl_list.sort(reverse=True)
print(gl_list)
# 示例二: 指定函数的缺省参数
def print_info(name, gender=True):
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s 是 %s" % (name, gender_text))
2.5 多值参数
- 当一个函数能够处理的参数个数是不确定的时候,就可以使用多值参数;
- Python 中有两种多值参数:
- 参数名前增加一个
*
可以接收元组; - 参数名前增加两个
*
可以接收字典;
- 参数名前增加一个
- 一般在给多值参数命名时,习惯使用以下两个名字:
*args
:存放元组参数;**kwargs
: 存放字典参数;(kw
是keyword
的缩写)
2.6 元组和字典的拆包
- 在调用带有多值参数的函数时,如果希望:
- 将一个元组变量,直接传递给
args
- 将一个字典变量,直接传递给
kwargs
- 将一个元组变量,直接传递给
- 就可以使用拆包,简化参数的传递, 拆包的方式是:
- 在元组变量前,增加一个
*
- 在字典变量前,增加两个
*
- 在元组变量前,增加一个
# 示例一
def demo(*args, **kwargs):
print(args)
print(kwargs)
gl_nums = (1, 2, 3)
gl_info = {"name":"小明", "age": 17}
demo(*gl_nums, **gl_info)
参考资料: