函数是带有名字的代码块,能够执行特定的任务。当咱们须要执行这一特定任务时,调用该函数。固然若是须要屡次执行该任务,只需屡次调用该函数便可。定义函数的时候,咱们把参数的名字和位置肯定下来,函数的接口定义就完成了。对于函数的调用者来讲,只须要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。python
函数定义的时候使用的参数叫形参,函数调用的时候使用的参数叫实参。函数
def f(n): # 在函数定义过程当中使用的参数是形参:n print('The argument is:',n) #该函数仅仅打印一句话 return None # 函数反馈空值None # 如下为函数的调用,支持多种数据类型: >>> f(100) # 实参为Number型 The argument is: 100 >>> f('It is funny') # 实参为str型 The argument is: It is funny >>> f((1,2,3)) # 实参为tuple型 The argument is: (1, 2, 3) >>> f([1,2,3]) # 实参为list型 The argument is: [1, 2, 3] >>> f({'name':'Adam','age':18}) # 实参为dict型 The argument is: {'name': 'Adam', 'age': 18}
在函数定义的时候,形参能够有默认值,以上代码能够修改成:code
def f(n=1): # 形参n的默认值为1,表示在函数调用不输入实参时,实参则取默认值 print('The argument is:',n) #该函数仅仅打印一句话 return None # 函数反馈空值None # 函数调用: >>> f() # 能够不输入实参直接调用函数,实参则取默认值 The argument is: 1
函数调用中的实参与函数定义中形参以相同的顺序关联,这种关联方式称为位置实参。使用位置实参调用函数时,若是实参的顺序不正确,结果可能出乎意料,乃至出错。接口
# 函数定义 def f(name,age): print(name) print(age) # 函数调用 >>> f('Cathy',18) Cathy 18
关键字实参,在函数调用时直接将实参的名称与值关联起来,所以向函数传递的实参不会混淆。关键字实参能够让函数调用无需考虑实参的顺序。it
# 函数定义 def f(name,age): print(name) print(age) # 函数调用 >>> f(age=18,name='Cathy') Cathy 18
# 函数定义 def f_lt(*n): print(type(n)) # *号将传进来的参数变成了tuple类型 for i in n: print(i) # 函数调用 # 第一次调用 f_lt(1,2,3,4,5) print('_ '*20) # 第二次调用,参数为list类型 l = [1,2,3,4,5] f_lt(*l) print('_ '*20) # 第三次调用,参数为tuple类型 t = (1,2,3,4,5) f_lt(*t) print('_ '*20) # 返回结果 <class 'tuple'> 1 2 3 4 5 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ <class 'tuple'> 1 2 3 4 5 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ <class 'tuple'> 1 2 3 4 5 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
# 函数定义 def f_d(**kw): print(type(kw)) # **号将传进来的参数变成了dict类型 print(kw) for k,v in kw.items(): print(k,': ',v) # 函数调用 # 第一次调用 f_d(name='Adam',age=18) print('_ '*20) # 第二次调用,参数为dict类型 d = {'name':'Bob','Age':19} f_d(**d) print('_ '*20) # 返回结果 <class 'dict'> {'name': 'Adam', 'age': 18} name : Adam age : 18 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ <class 'dict'> {'name': 'Bob', 'Age': 19} name : Bob Age : 19 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _