函数(3):函数的返回值和参数

 

 

一、函数的返回值

 

1. 如果返回的结果有多个,可以包装成一个元组,进行返回。而且元组的小括号可以(建议)不写。【例1】

2. 如果函数返回的是元组,可以用一个变量接受,也可以用多个变量接受,但是要注意个数要保持一致。【例2】

3. 经典面试题:不用其他变量,交换两个数的值。【例3】

 

 

例1:

函数(3):函数的返回值和参数

 

结果:

函数(3):函数的返回值和参数

 

函数返回的是一个元组,所以x就是一个元组。

 

 

例2:

函数(3):函数的返回值和参数

 

 

结果:

函数(3):函数的返回值和参数

 

 

例3:交换两个数,解答

函数(3):函数的返回值和参数

 

 

结果:

函数(3):函数的返回值和参数

 

 

 

二、函数的参数

1. 在函数内部,针对参数,使用赋值语句,并不会影响到实参的值。【例1】【例2】

2. 如果传递的是可变数据类型,在函数内部使用了方法来进行了修改,就会影响到外部数据。【例3】

3. 列表的"+="操作,本质上进行的是extend操作。

   list1 += list2 相当于:list1.extend(list2)这一句,而不是 list1 = list1 + list2这一句。【例4】【例5】【例6】

 

 

 

例1:

函数(3):函数的返回值和参数

 

结果:

函数(3):函数的返回值和参数

结果gl_num的值并没有变成99。为什么呢?

因为执行完第4行后,num指向99。

但是执行第6行的时候,并不是把99的值改成100。因为99是不可变类型。会创建一个内存,里面存放100,然后用num指向100。

 

函数(3):函数的返回值和参数

 

 

例2:

函数(3):函数的返回值和参数

 

结果:

函数(3):函数的返回值和参数

 

原因跟例1一样,虽然列表是可变数据类型,但是使用赋值语句时,是重新创建一个数据,然后用num_list指向它。并不是改变原有的数据。(见可变数据类型那一节

 

 

函数(3):函数的返回值和参数

 

 

例3:

函数(3):函数的返回值和参数

 

结果:

函数(3):函数的返回值和参数

 

发生改变了。

 

在开发的时候要格外注意。

 

 

例4:

函数(3):函数的返回值和参数

 

结果:

函数(3):函数的返回值和参数

 

num_list指向了一个新的地方。所以不改变原有的值。

 

 

 

例5:

函数(3):函数的返回值和参数

 

结果:

函数(3):函数的返回值和参数

 

非常奇怪。如果按照之前的"+="的理解,应该就跟【例4】得到相同的结果了。

但是显然并不是。而是相当于执行了 nums_list.extend(numlist)操作。

 

 

例6:

函数(3):函数的返回值和参数

 

结果:

函数(3):函数的返回值和参数

 

与例5的结果一致。说明了列表的+=操作相当于执行了 nums_list.extend(numlist)操作。

 

 

 

三、函数的缺省参数

缺省参数就是有默认值,可以不传入值。这样可以简化函数的调用。缺省参数通常使用最常见的值。【例1】

注意:

1. 必须保证带有默认值的缺省参数,在参数列表的末尾。

2. 在调用具有多个缺省参数的函数时,如果想给具体某一个传递参数,可以在调用的时候把参数名写出来。【例2】

 

 

 

例1:

函数(3):函数的返回值和参数

 

结果:

函数(3):函数的返回值和参数

 

 

例2:

函数(3):函数的返回值和参数

 

结果:

函数(3):函数的返回值和参数

 

第9行代码,False传递给了title这个变量了。

 

 

四、多值参数

有时候定义了一个函数,这个函数需要传入的参数个数是不确定的。这个时候,就可以使用到多值参数。

在Python中,支持两种多值参数:

1. 在参数名前,增加一个*号,这种参数可以接受一个元组。默认习惯使用*args。

2. 在参数明前,增加两个星号**,这个参数可以用来接受一个字典。默认习惯使用**kwargs。

 

可以只写*args【例1】,也可以只写**kwargs【例2】,也可以两个都写【例3】

 

 

例1:可以只写*args

函数(3):函数的返回值和参数

 

结果:

函数(3):函数的返回值和参数

 

demo("liupc",19) 执行时,args没有传入值,所以输出的是空的元组。

demo("li",20,21,22,23)执行时,"li"和20分别给了name和age,剩下的都给元组args了。

 

 

 

例2:也可以只写**kwargs

函数(3):函数的返回值和参数

 

结果:

函数(3):函数的返回值和参数

 

 

例3:也可以两个都写。但是*args必须在**kwargs前面。

函数(3):函数的返回值和参数

 

结果:

函数(3):函数的返回值和参数