Python传入参数的方法有:位置参数、默认参数、可变参数、关键字参数、和命名关键字参数、以及各种参数调用的组合
写在前面
Python唯一支持的参数传递方式是『共享传参』(call by sharing)
多数面向对象语言都采用这一模式,包括Ruby、Smalltalk和Java(Java的引用类型是这样,基本类型按值传递)
共享传参是指函数的各个形式参数获得实参中各个引用的副本;也就是说,函数内部的形参是实参的别名(alias)
这种方案的结果是,函数可能会修改作为参数传入的可变对象,但是无法修改那些对象的标识(即不能把一个对象替换为另一个对象)
本文来源[email protected]搞@^&代*@码)网5位置参数
位置参数是最简单的传入参数的方式,在其它的语言中也常常被使用
演示一:
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