在学习Python函数的时候,函数本身的定义和调用并不是很复杂,但是函数的参数类型和用法的确有些复杂。在此做一个小结,加深理解。
Python参数的定义
负责给函数提供一些必要的数据或信息,以保证函数的正常运行。
形式参数(parameter):在函数定义的时候使用到的参数,一般没有赋值(默认参数除外)。
实参(argument):在函数调用的时候实际赋予的值。
如果在函数定义时给定了形式参数,并且没有给该参数默认值,则在调用的时候必须给定一个实参
def SayHello(person):
print("Hi {0},nice to meet you!".format(person))
print('Nice to meet you too!')
SayHello('TOM')
Hi TOM,nice to meet you!
Nice to meet you too!
Python参数的类型
•普通参数 ◦普通参数是Python函数中最常见的参数,也叫做位置参数;
◦在函数定义的时候直接给定参数的名称,调用时按照参数的位置赋予参数值
◦注意,如果在一个函数中定义了多个普通参数,在调用赋值的时候,必须按照定义的顺序依次赋值。
◦
# Python函数的定义和调用语法
def func_name(parameter1,parameter2,...):
function_body
#调用
func_name(value1,value2,...)
•默认参数 ◦在函数定义的时候,给形式参数赋予一个默认值;调用函数的时候,如果没有给该参数赋新值,则使用函数定义时的默认值
◦如果位置参数和默认参数都存在,则必须将位置参数放在默认参数前
◦
# 使用默认参数
def Student(name,age,gender='male'):
if gender == 'male':
print("{0} is {1} years old, and he is a good student.".format(name,age))
else:
print("{0} is {1} years old, and she is a good student.".format(name,age))
# 调用上述函数Student
Student('WangXiaoli',20,'female')
Student('ZhangDayong',22)
WangXiaoli is 20 years old, and she is a good student.
ZhangDayong is 22 years old, and he is a good student.
•关键字参数 ◦定义的方式和默认参数一样,只不过像多个默认参数的集合
◦关键字参数是以键值对的形式,再调用的时候,并不需要考虑参数的位置
◦如果关键字参数函数中还有普通的位置参数,则在函数定义时,需要把普通参数放在前面。并且调用的时候,普通参数也必须放在前面
◦
# 使用关键字参数
def func_name(name='TOM',age=20,addr='No addr'):
print('I am a student.')
print("My name is {0}, and I am {1} years old, I come from {2}.".format(name,age,addr))
# 调用
# 关键字参数调用时,参数的位置是不重要的
func_name(name='WangMeili',addr='China',age=23)
# 关键字参数也属于特殊的默认参数
func_name()
I am a student.
My name is WangMeili, and I am 23 years old, I come from China.
I am a student.
My name is TOM, and I am 20 years old, I come from No addr.
# 同普通参数的混用
# 如果关键字参数函数中还有普通的位置参数,则在函数定义时,需要把普通参数放在前面
# 调用的时候,普通参数,也必须放在前面
# 否者就会报下面的定义错误
def func_name(age,name='TOM',addr='No addr'):
print('I am a student.')
print("My name is {0}, and I am {1} years old, I come from {2}.".format(name,age,addr))
File "<ipython-input-13-0663557d1e59>", line 5
def func_name(name='TOM',age,addr='No addr'):
^
SyntaxError: non-default argument follows default argument
# 调用错误
# 强调位置参数必须放在前面
def func_name(name,age=20,addr='No addr'):
print('I am a student.')
print("My name is {0}, and I am {1} years old, I come from {2}.".format(name,age,addr))
# 错误的调用方法
func_name(age=22,'JACK',addr='China')
File "<ipython-input-16-e8faf29fa701>", line 7
func_name(age=22,'JACK',addr='China')
^
IndentationError: unindent does not match any outer indentation level
•收集参数 ◦把没有名称,也没有位置,没有对应关系的参数放入到一个集合中(tuple),称为收集参数
◦实际传入的参数可以是任意多个,也可以没有
◦
语法结构
def func_name(*args):
function_body
按照tuple的使用方法定义*args,得到传入的参数
调用:
func_name(p1,p2,p3,...)
#参数名args是约定俗称的写法,前面必须加*
# 使用收集参数
# 函数模拟学生的自我介绍,介绍的内容不确定
# args可一看作是一个元组tuple