详解Python传⼊参数的⼏种⽅法
Python传⼊参数的⽅法有:位置参数、默认参数、可变参数、关键字参数、和命名关键字参数、以及各种参数调⽤的组合
写在前⾯
Python唯⼀⽀持的参数传递⽅式是『共享传参』(call by sharing)
多数⾯向对象语⾔都采⽤这⼀模式,包括Ruby、Smalltalk和Java(Java的引⽤类型是这样,基本类型按值传递)
共享传参是指函数的各个形式参数获得实参中各个引⽤的副本;也就是说,函数内部的形参是实参的别名(alias)
这种⽅案的结果是,函数可能会修改作为参数传⼊的可变对象,但是⽆法修改那些对象的标识(即不能把⼀个对象替换为另⼀个对象)
位置参数
位置参数是最简单的传⼊参数的⽅式,在其它的语⾔中也常常被使⽤
演⽰⼀:
def func(a, b):
print(a+b)
func(1, 2) #3
演⽰⼆:
def power(x, n):
s = 1
while(n > 0):
n -= 1
s *= n
return s
power(2, 3) #8
默认参数
默认参数就是在调⽤函数的时候使⽤⼀些包含默认值的参数
def power(x, n=2):
s = 1
while(n > 0):
n -= 1
s *= n
reutrn s
power(3) #9
power(2, 3) #8
定义默认参数要牢记⼀点:默认参数必须指向不变对象!
#以下这个函数如果被多次调⽤会在默认添加多个END字符串
def add_end(l = []):
l.append('END')
return l
#为了避免这个问题,应该把传⼊的默认参数设置为不可变的
def add_end(l = None):
l = []
l.append('END')
return l
可变参数
可变参数就是允许在调⽤参数的时候传⼊多个(≥0个)参数(类似于列表、字典)
#这才是可变参数,虽然在使⽤上和列表没有区别,但是参数nums接收到的是⼀个tuple(这些参数在传⼊时被⾃动组组装为⼀个元祖)
def calc(*nums):
sum = 0
for n in nums:
sum += n
return sum
>>> calc(1,2,3)
7
>>> my_ls = [1,2,3]
>>> calc(*my_ls)
7
关键字参数
可变参数允许传⼊0个~多个参数,⽽关键字参数允许在调⽤时以字典形式传⼊0个或多个参数(注意区别,⼀个是字典⼀个是列表);在传递参数时⽤等号(=)连接键和值
#⽤两个星号表⽰关键字参数
def person_info(name, age, **kw):
print("name", name, "age", age, "other", kw)
>>> person_info("Xiaoming", 12)
name Xiaoming age 12 other{}
>>> person_info("Dahuang", 35, city = "Beijing")
name Dahuang age 35 other {'city':'Beijing'}
命名关键字参数
命名关键字参数在关键字参数的基础上限制传⼊的的关键字的变量名
和普通关键字参数不同,命名关键字参数需要⼀个⽤来区分的分隔符*,它后⾯的参数被认为是命名关键字参数
#这⾥星号分割符后⾯的city、job是命名关键字参数
person_info(name, age, *, city, job):
print(name, age, city, job)
>>> person_info("Alex", 17, city = "Beijing", job = "Engineer")
Alex 17 Beijing Engineer #看来这⾥不再被⾃动组装为字典
不过也有例外,如果参数中已经有⼀个可变参数的话,前⾯讲的星号分割符就不要写了(其实星号是写给Python解释器看的,如果⼀个星号也没有的话就⽆法区分命名关键字参数和位置参数了,⽽如果有⼀个星号即使来⾃变长参数就可以区分开来)
#args是变长参数,⽽city和job是命名关键字参数
person_info(name, age, *args, city, job):
print(name, age, args, city)
>>> person_info("Liqiang", 43, "balabala", city = "Wuhan", job = "Coder")
Liqiang 43 balabala Wuhan Coder
参数组合
总结⼀下,在Python中⼀种可以使⽤5中传递参数的⽅式(位置参数、默认参数、变长参数、关键字参数、命名关键字参数)
注意,这些参数在书写时要遵循⼀定的顺序即:位置参数、默认参数、变长参数、关键字参数、命名关键字参数(和本⽂的⾏⽂顺序⼀致)
这⾥简单举两个栗⼦
def f1(a, b, c=0, *args, **kw):java调用python模型
print("a = ", a, "b = ", b, "args = ", args, "kw = ",kw)
def f2(a, b, c=0, *, d, **kw):
print("a = ", a, "b = ", b, "c = ", c, "d = ", d, "kw = ", kw)
>>> f1(1, 2)
a = 1
b = 2
c = 0 args =() kw = {}
>>> f1(1, 2, c=3)
a = 1
b = 2
c = 3 args = () kw = {}
>>> f1(1, 2, 3, 'a', 'b')
a = 1
b = 2
c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x = 99)
a = 1
b = 2
c = 3 args = ('a', 'b') kw = {'x':99}
>>> f2(1, 2, d = 99, ext = None)
a = 1
b =2
c = 0
d = 99 kw = {'ext':None}
写在后⾯
关于Python参数传递,有以下⼏点提请注意:
1)参数的传递是通过⾃动将对象赋值给本地变量名来实现的
函数参数在实际中只是Python赋值的另⼀个实例⽽已,因为引⽤可以是以指针的形式来实现的,所有的参数实际上都是通过指针进⾏传递的,作为参数被传递的对象从来不⾃动拷贝
2)在函数内部的参数名的赋值不会影响调⽤者
在函数运⾏时,在函数头部的参数名时⼀个新的、本地的变量名,这个变量名是在函数的本地作⽤域内的,函数参数名和调⽤者作⽤域中的变量是没有区别的
3)改变函数的可变对象参数的值也许会对调⽤者有影响
换句话说,因为参数是简单地赋值给传⼊的对象,函数就能够就地改变传⼊的可变对象,因此其结果会影响调⽤者;可变参数对函数来说可以做输⼊和输出的
Python的通过赋值进⾏传递的机制与C++的引⽤参数选项不完全相同,但是实际中,它与C语⾔的参数传递模型相当类似:1)不可变参数“通过值”进⾏传递
像整数和字符串这样的对象是不可变对象,它们通过对象引⽤⽽不是拷贝进⾏传递的,但是因为⽆论如何都不可能在原处改变不可变对象,实际的效果就很像创建了⼀份拷贝
2)可变对象是通过“指针”进⾏传递的
列表和字典这样的对象也是通过对象引⽤进⾏传递的,这⼀点与C语⾔使⽤指针传递数组很相似,可变对象能够在函数内部进⾏原处的改变,这⼀点和C数组很像
总⽽⾔之,理解Python的变量、函数的关键就是理解『绑定』的概念——绑定就是绑定对象,理解了这⼀点就好办了
以上所述是⼩编给⼤家介绍的Python传⼊参数的⼏种⽅法详解整合,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论