全局变量和局部变量
1、全局变量
- 在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块 结束。
- 全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。
- 全局变量一般做常量使用。
- 函数内部要改变全局变量的值,使用 global 声明一下
2、局部变量
- 在函数体中(包含形式参数)声明的变量。
- 局部变量的引用比全局变量快,优先考虑使用。
- 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量。
函数参数的传递
函数的参数传递本质上就是:从实参到形参的赋值操作。
Python 当中“一切皆对象”, 所有的赋值操作都是“引用的赋值”。所以,Python 中参数的传递都是“引用传递”,不是“值传递”。
- 对“可变对象”进行“写操作”,直接作用于原对象本身。
- 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”)
– 可变对象有:字典、列表、集合、自定义的对象等
– 不可变对象有:数字、字符串、元组、function 等
1. 传递可变对象的引用
在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。
举个栗子:
l = [10, 20]
def func(m):
print("m:", id(m)) # l 和 m 是同一个对象
m.append(30) # 由于 m 是可变对象,不创建对象拷贝,直接修改这个对象
func(l)
print("l:", id(l))
print(f'l : {l}')
结果:
# m: 2149956976328
# l: 2149956976328
# l : [10, 20, 30]
2. 传递不可变对象的引用
在”赋值操作”时,由于不可变对象无法修改,系统会新创建一个对象。。
举个栗子:
a = 100
def func(n):
print(f"n's id: {id(n)}") # 传递进来的是 a 对象的地址
n += 200 # 由于 a 是不可变对象,因此创建新的对象 n
print(f"n's id: {id(n)}") # n已经变成了新的对象
print(f'n : {n}')
func(a)
print(f'a : {a}')
print(f'a : {id(a)}')
# 结果:
# n's id: 1752725632
# n's id: 2346697530128
# n : 300
# a : 100
# a : 1752725632
函数参数的几种类型
1. 位置参数
函数调用时,实参默认按位置顺序传递,需要个数和形参匹配。按位置传递的参数,称为:“位置参数”。
For example:
def user_info(name, age, gender):
print(f'your\'s name is {name}, age is'
f' {age}, gender is {gender}')
user_info('tom', 20, 'male')
user_info('male', 20, 'tom') # 错误传递的后果
# 结果:
# your's name is tom, age is 20, gender is male
# your's name is male, age is 20, gender is tom
Tips:没什么好说的,别传错了就行。
2. 默认值参数
我们可以为某些参数设置默认值,这样这些参数在传递时就是可选的。称为“默认值参数”。 默认值参数放到位置参数后面。
def f1(a,b,c=10,d=20):
#默认值参数必须位于普通位置参数后面
print(a,b,c,d)
f1(8,9)
f1(8,9,19)
f1(8,9,19,29)
结果:
8 9 10 20
8 9 19 20
8 9 19 29
3. 关键字参数
user_info(age=20, gender='female', name='Wang')
结果:
user_info(age=20, gender='female', name='Wang')
4. 不定长度参数
- *param(一个星号),将多个参数收集到一个“元组”对象中。
def user_infomation(*args):
print(args)
user_infomation('TOM')
user_infomation('TOM', 18) # 接受任一参数,返回一个元组
结果:
('TOM',)
('TOM', 18)
- **param(两个星号),将多个参数收集到一个“字典”对象中。
def user_infomation1(**kwargs):
print(kwargs)
user_infomation1(name='TOM', age=20) # 返回一个字典
结果:
{'name': 'TOM', 'age': 20}
5. 函数参数类型总结
总结就是参数的类型很多,实际使用过程中也会碰到各种各样的问题,包括它的顺序,关键字以及是否获取的是可变类型的参数等等。初学的时候会有点乱,多写多练,总会掌握的比较扎实的。
写在最后
本节给大家介绍了Python语法中的函数的参数及参数传递。内容较为枯燥,但是用途甚广!!!勤能补拙是良训,希望大家还是动手做一做,有问题可以私信我,欢迎交流和提出您的宝贵意见。
你要偷偷学Python,然后惊艳所有人。
转载请注明:XAMPP中文组官网 » python基础学习函数式编程[二]