1 格式:
def functionName(参数列表):
方法体
例子1:
>>>def greet_user():
print(“hello”)
>>>greet_user()
hello
例子2:
>>>def greet_user(username): #username形参
print(“hello,”+ username+“!”)
>>>greet_user(“zhangsan”)#zhangsan 实参
hello, zhangsan!
鉴于函数定义中可能包含多个形参,因此在函数调用中也可能包含多个实参。向函数中传递实参的方式很多,可以使用位置实参,这要求实参的顺序和形参的顺序相同;也可以使用关键字形参,其中的每个实参都有变量名和值组成;还可以使用列表和字典。
(1)位置实参
要求实参的顺序和形参的顺序相同
例子:
def describe_pet(animal_type,pet_name):
print(“\n I have a”+animal_type+”.”)
print(“My ”+animal_type+”’sname is ”+pet_name+”.”)
describe_pet(‘hamster’,’harry’)
当两个参数的位置交换后,表达的意思就会出现错误。
这种传参方式应该是最好理解的,大部分语言都是这种传参方式。
(2)默认参数
编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,Python将使用指定实参,否则使用默认值。
123 def describe_pet(pet_name,animal_type=‘dog’):
print(“\n I have a”+animal_type+”.”)
print(“My ”+animal_type+”’sname is ”+pet_name+”.”)
注意:在使用默认参数时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。
当然,默认值不一定是字符串,数字等,同时也支持各种序列。
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
输出结果为
[1]
[1, 2]
[1, 2, 3]
如果你不想调用之间共享的默认设置,你可以这样写
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
感觉有点像Java中单例模式中的懒汉式,虽然不能这么比。
(3)关键字实参
关键字实参是传递给函数的 名称-值对。你直接在实参中将名称和值关联起来,因此向函数传递实参时不会混淆
def parrot(voltage, state='a stiff', action='voom',type='Norwegian Blue'):
print("--This parrot wouldn't", action, end=' ')
print("ifyou put", voltage, "volts through it.")
print("--Lovely plumage, the", type)
print("--It's", state, "!")
parrot(1000) # 1positional argument
parrot(voltage=1000) # 1 keywordargument
parrot(voltage=1000000,action='VOOOOOM') # 2 keywordarguments
parrot(action='VOOOOOM',voltage=1000000) # 2 keywordarguments
parrot('amillion', 'bereft of life', 'jump') # 3 positional arguments
parrot('athousand', state='pushing up the daisies') # 1 positional, 1 keyword
执行后的结果
>>>
===========RESTART: D:/python/pythonLearning/KeywordArguments.py ===========
-- This parrotwouldn't voom if you put 1000 volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's a stiff!
-- This parrotwouldn't voom if you put 1000 volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's a stiff!
-- This parrotwouldn't VOOOOOM if you put 1000000 volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's a stiff!
-- This parrotwouldn't VOOOOOM if you put 1000000 volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's a stiff!
-- This parrotwouldn't jump if you put a million volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's bereftof life !
-- This parrotwouldn't voom if you put a thousand volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's pushingup the daisies !
但是下面的调用方式会报错:
parrot() # 必须的参数没有填入
parrot(voltage=5.0, 'dead') # 关键字传参后面的一定也是关键字传参
parrot(110, voltage=220) # 同一个参数传了不同的实参
parrot(actor='John Cleese') # 函数定义中没有这个形参。
关键字实参后面不能再有位置实参。
当必填参数没有时,会报错。
当必填参数以位置实参的方式传递时,默认参数可以按照关键字实参的方式传递,也可以以位置实参的方式传递,而且此时,必填参数一定在默认参数前面。
当必填参数以关键字实参方式传递的时候,默认参数传递的时候也一定是以关键字实参方式传递,而且此时与位置无关。
关键字实参的关键字必须是形参中有的,否则会报错。
(4)任意多数目的参数“*”
最不常使用的选项是指定可以使用任意数量的参数调用的函数。这些参数将被裹在一个元组中。在可变数目的参数之前, 零个或更多的正常参数可能会发生。
def write_multiple_items(file, separator, *args):
file.write(separator.join(args))