所谓的函数,有点变成基础的都知道,函数就是最小的模块单位,我们把一个功能封装为一个模块,用一个名字作为函数名,用几个参数作为参数,这就是函数了
首先看一下,python的函数都是什么样子的:
def func(obj):
print(obj)
func("aaa")
这就是最基本的python的函数的调用和使用;
下面我们来总结一下比较关键的几个点,因为对于C语言来说的话,是存在实参和形参之分的,所谓的实参的话,就是说传递的是值,传递以后,值是不能够被改变的,但是形参的话,是指的是如果传递给了函数的参数是可以被改变的,同样,在python中也是存在的;
1)如果参数是字符串、元组、数值这样的不能改变的值的话,那么是值传递
2)如果是列表,字典这样的东西的话,那么就是地址传递,也就是形参,可以看一下例子,例子是在C语言中文网上抄的:
def demo(obj) :
obj += obj print("形参值为:",obj)
print("-------值传递-----")
a = "C语言中文网"
print("a的值为:",a)
demo(a)
print("实参值为:",a)
print("-----引用传递-----")
a = [1,2,3]
print("a的值为:",a)
demo(a)
print("实参值为:",a)
-------值传递-----
a的值为: C语言中文网
形参值为: C语言中文网C语言中文网
实参值为: C语言中文网
-----引用传递-----
a的值为: [1, 2, 3]
形参值为: [1, 2, 3, 1, 2, 3]
实参值为: [1, 2, 3, 1, 2, 3]
看到例子没,这个例子就是说明的是,如果传递的是字符串的话,在函数内部会重新开辟一个空间来进行短暂的存储一下参数,然后会可以改变这个值,然后根本无法改变a的值;但是如果a是一个列表或者字典的话,那就不一定了,那么就说明,这个就是一个地址传递,a的值是可以进行改变的;
那么看到这,可能还有个问题,有以下两个方面:
1、如果我想改变字符串或者数值怎么办?有一个办法,我们把它放到列表里,让它成为一个列表,那么就可以了;
2、如果我们不想改变列表,或者字典怎么办?有一个办法:
1)对于列表来说,我们可以传入一个副本
func(list_name[:]),这样,我们传入的是list_name的副本,就不会有问题了
2)对于字典的话,我们可以传入,然后做一个深拷贝
def func(data)
datacopy = data.deepcopy();#或者datacopy = deepcopy(data)
这样的话,我们做一层深拷贝的话,我们就很容易的不会改变它的值了
涉及到参数的问题,还有个问题需要注意,即参数可以涉及关键字的用法,如下:
str2= "22222222222"
str1= "1111111111"
func1(str2 =str2,str1 = str1)
func1(str1,str2 = str2)
以上两个这样是可以的,但是func1(str2,str1 = str1)、func1(str2 =str2,str1)都是不可以的,对于第一个,func1的str1参数会有两个值,这是不允许的;对于第二个来说的话,涉及到关键字,一定要放到后面;
同样,函数如果存在默认值的话,也是一样的:
如
def func1(str1 = str1,str2 ):
print(str1)
print(str2)
这样是不行的!因为默认值必须写到后面如
def func1(str1 ,str2 = str2):
func1(str1)
这样用才可以
那么下面我想总结的是,如何参数的高级用法,如何让函数传入多个参数,也就是参数数量没有任何的限制,我会分成三部分进行总结:
1、传递任意数量的实参:
def make_pizza(*toppings):
for topping in toppings:
print(topping)
make_pizza("1","2","3");
然后打印出来的就是1,2,3了,当然是分行打印的;这里说明的是,如果是一个*号,就会可以传递任意数量的参数,但是这种的话,参数必须是同一种类型;
2、传递不同类型的任意数量的实参:
上述所说,那是参数类型必须一样,如果不一样怎么办?可以这样
def make_pizza(size,*toppings):
print(size,toppings)
make_pizza(12,“1”,“2”)
也就是说,我们单独抽出这个参数即可,然后单独的作为了一个参数作为函数的参数;
def func1(str2,*str):
for keyin str:
print(key)
print("===============")
print(str2)
func1(1,"111","222","333")
这里面有一些需要注意的地方;第一个是str2,一定要放到str1之前,第二个是不能两个参数都是带*
3、传送任意数量的关键字参数:
例一:
def func1(**str):
for key in str.keys():
print(key)
print("===============")
func1(location = "1")
看到了两个**,这就类似于字典了,字典的key就是location,对应的值就是1
例二:
def func1(**str):
tmp= {}
for key,valuein str.items():
tmp[key]= value
print("===============")
print (tmp)
func1(location= "3")
结果:{'location': '3'}
这种用法有个必须要注意的地方,就是和dict函数是一样的,那就是如果使用dict来创建字典的话,那么必须参数的键为字符串,这种函数也是,键必须是字符串;