函数是将部分可重用的功能模块化便于代码复用降低程序的体量并提高代码整体的逻辑性和整洁度,在python语言中采用如下的结构进行函数构造
def 函数名(<参数>):
process
<return --->
1.参数设定(python中数据类型皆对象,参数采用引用传递)
- 位置参数:用于固定接受参数并在函数内部充当局部变量
def power(x):
return x * x
- 默认参数:实现位置参数功能并提供参数初始值(如下为常见指数运算设定平方运算为默认运算),此时默认参数位置上没有赋值该函数运行也不会出现错误。
def power(x,n=2):
return pow(x,n)
注意:在python中函数定义后便会实现初始化并且为参数创建空间,如果将默认参数设置为可变类型如列表,便会导致函数内部对该可变类型的操作有累加效应。
- 可变参数:用于接受不确定个数的参数,传入的参数在函数中形成元组,设计时需要放在位置参数的最后(
可变参数意味着可传入0个参数
)
def add(*objects):
sum = 0
for i in object:
sum += i
return sum
- 关键字可变参数:用于接收不确定数量的键值对并打包成一个字典,设计时需要放在位置参数列表的最后(
可变参数意味着可传入0个参数
)
def phoneDict(nameDict,**data):
print("The phoneDict named",nameDict,"name and value",data)
- 关键字参数:接收特定关键字的值(在函数调用时需要指明参数名字),利用
*
将其与其他参数分隔开,若在关键字参数前面有可变参数定义,则不需要加*
def person(name,age,*,city,job):
print(name,age,city,job)
print(type(city))
person('Jack', 24, city='Beijing', job='Engineer')
结果是:
>Jack 24 Beijing Engineer
><class 'str'>
2. 函数调用时的 * 及 **
- 可变参数的传入
直接传入:
func(1,2,3)
或者组装成list或tuple后再通过*args传入
func(*(1,2,3))
- 关键字可变参数的传入
直接传入
func(name = "Tony",ages = 19)
或者组装成dict后再通过**args传入
func(**{'name':'Tony','ages':19})
3.函数的参数传递是引用传递
在python中一切数据类型皆为对象,分为可变对象(List、Dict、Set)和不可变对象(String、Tuple、Number)。在函数中不可变对象仅仅可以作为信号参与函数内部操作而不能作为索引对原数据进行修改,所以可能在面对不可变对象作为参数传递的情况时会误以为是值传递。
可以用id()函数获取变量索引对象的地址来观察参数传递
def objectIndex(a):
print(id(a))
b = 1
print(id(b))
objectIndex(b)
结果是:
>140730317944608
>140730317944608
- copy函数对索引对象进行浅拷贝,但索引对象是多数据类型且其中包含对另一个多数据类型对象的索引,这样通过浅拷贝得到的变量通过双层索引便可以修改原先的数据。
import copy
listOne = [1,2,[3,4,5],6]
listTwo = copy.copy(listOne)
listTwo[2][1] = 1
print(listTwo)
结果是:
>[1, 2, [3, 1, 5], 6]
>[1, 2, [3, 1, 5], 6]
- deepcopy函数对索引对象进行深拷贝,即索引对象所相关联的所有对象将重新拷贝出来
import copy
listOne = [1,2,[3,4,5],6]
listTwo = copy.deepcopy(listOne)
listTwo[2][1] = 1
print(listOne)
print(listTwo)
结果是:
>[1, 2, [3, 4, 5], 6]
>[1, 2, [3, 1, 5], 6]
网友评论