Python函数的几点需要注意的细节

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/laoxuan2011/article/details/68985892

python的函数和C++等有明显区别的几点记录如下:

关于默认参数需要注意的细节

只有在形参表末尾的那些参数可以有默认参数值,即你不能在声明函数形参的时候,先声明有默认值的形参而后声明没有默认值的形参。
这是因为赋给形参的值是根据位置而赋值的。例如,def func(a, b=5)是有效的,但是 def func(a=5, b)是 无效 的。

关键参数

如果你的某个函数有许多参数,而你只想指定其中的一部分,那么你可以通过命名来为这些参数赋值——这被称作 关键参数 ——我们使用名字(关键字)而不是位置(我们前面所一直使用的方法)来给函数指定实参。
这样做有两个 优势 ——
一,由于我们不必担心参数的顺序,使用函数变得更加简单了。
二、假设其他参数都有默认值,我们可以只给我们想要的那些参数赋值。

def func(a, b=5, c=10): 
    print 'a is', a, 'and b is', b, 'and c is', c 

func(3, 7) 
func(25, c=24) 
func(c=50, a=100)  

输出:

$ python func_key.py 
a is 3 and b is 7 and c is 10 
a is 25 and b is 5 and c is 24 
a is 100 and b is 5 and c is 50   

名为 func 的函数有一个没有默认值的参数,和两个有默认值的参数。
在第一次使用函数的时候, func(3, 7),参数 a 得到值 3,参数 b 得到值 7,而参数 c 使用默认值 10。
在第二次使用函数 func(25, c=24)的时候,根据实参的位置变量 a 得到值 25。根据命名,即关键参数,参数 c 得到值 24。变量 b 根据默认值,为 5。
在第三次使用 func(c=50, a=100)的时候,我们使用关键参数来完全指定参数值。

注意,尽管函数定义中,a 在 c 之前定义,我们仍然可以在 a 之前指定参数 c 的

Python函数参数传递:传值还是传引用?

def change(val):
    val.append(100)
    val = ['T', 'Z', 'Y']
nums = [0, 1]
change(nums)
print(nums)

按照C++语言的思维,如果Python函数参数的传递是传值的话,结果应该是[0, 1],如果是传引用的话,结果应该是[‘T’, ‘Z’, ‘Y’]。
可是实际结果是:[0, 1, 100]。所以,Python函数参数的传递既不是所谓的传值也不是传引用。

Python中的变量和对象。
Python中的变量是没有类型的,我们可以把它看做一个(*void)类型的指针,变量是可以指向任何对象的,而对象才是有类型的。
而且Python中的对象有可变对象(number,string,tuple等)和不可变对象之分(list,dict等)。
比如下面的例子:

nums = (1, 2, 3)
type(nums) #输出:tuple
id(nums) #输出:59179256
nums = [1, 2, 3] 
type(nums) #输出:list
id(nums) #输出:59094960

可以看到nums是没有类型的,它可以指向一个tuple也可以指向一个list,从id就可以看出nums指向了不同的对象。
明白了这个概念,那么我们可以说Python中函数参数的传递是传递的变量的值,即就是变量所指向的对象的地址。
一般的,我们有下面的规律:
1. 不可变对象作为函数参数,相当于C系语言的值传递。
2. 可变对象作为函数参数,相当于C系语言的引用传递。
但是,其实只要我们内心记得:参数传递的是变量所指向的对象的地址就行,值传递和引用传递都是C++中的概念!
跟老齐学Python之深入变量和引用对象

Python中的赋值、浅拷贝、深拷贝介绍
总结:
1. 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 )。
2. 浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。
3. 深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。也就是说( 新瓶装新酒 )。
4.

参考资料

简明 Python 教程
Python函数参数传递:传值还是传引用

扫描二维码关注公众号,回复: 3851056 查看本文章

猜你喜欢

转载自blog.csdn.net/laoxuan2011/article/details/68985892