建立函数就是将复杂的代码重新组织,提高代码可读性.
创建和调用函数
创建函数关键字def
>>>def go():
print('going')
调用函数
>>>go()
going
函数调用及运行机制:发生函数调用时,自动向上找到该函数定义过程,再依次执行函数体内代码(缩进部分)
重复调用函数示例
>>>for i in range(2):
go()
going
going
going
函数的参数和返回值
>>>def add(num1,num2):
print(num1+num2)
return num1 + num2 #返回值的关键字为return
>>>add(1,2) #调用过程:函数名和括号
3
3
形参和实参
形参是函数定义过程的参数,只代表变量名,实参是调用时传递来的参数,是具体的内容,赋值到变量名的值,如上述num1和num2为形参,1和2为实参
函数文档
解释说明作用,描述函数功能及用法,但不同于注释
>>>def exchangeRate(dollar):
"""dollar - >RMB
汇率定为6.5
"""
return dollar * 6.5
>>>exchangeRate(10)
65.0
一对"""内的字符串不会打印出来,而作为函数的一部分存储,称为函数文档字符串,该类字符串不同于简单的注释,可通过特殊属性_ _doc_ _(两条下划线)获取.
>>>exchangeRate.__doc__
'dollar - >RMB\n\t汇率定为6.5'
通过help查看自建函数用法
>>>help(exchangeRate)
Help on function exchangeRate in module __main__:
exchangeRate(dollar)
dollar - >RMB
汇率定为6.5
位置参数和关键字参数
普通参数称为位置参数,关键字参数主要是为了避免参数顺序错误而产生,通过在传入实参时指定形参的变量名,如下所示
>>>def say(name,words):
print(name + words)
>>>say('happy','I am')
happy I am
>>>say(words='happy',name='I am')
I am happy
默认参数
默认参数指的是在定义时赋予了默认值的参数
>>>def say(name='Jack',words='is jumping'):
print(name + words)
>>>def say()
Jack is jumping
>>>say('happy','I am')
happy I am
收集参数(可变参数)
通过在参数前加上星号(*)即可,Python处理过程就是把标志为收集参数的参数们打包成一个元组,但需注意若在收集参数后仍有其他参数,应该用关键字参数指定,否则Python会把所有实参都作为收集参数.如下所示:
>>>def test(*params):
print('有%d个参数' % len(params))
print(params[1])
>>>test('g','o','e','d')
有4个参数
o
>>>test('人',123,3.14)
有3个参数
123
>>>def test(*params,extra):
print(params)
print(extra)
>>>test(1,2,3,4) #报错,因为Python把所有实参都作为收集参数
>>>test(1,2,3,4,extra=31)
(1,2,3,4) #元组
31
如果函数参数带有收集参数,建议将其他参数设置为默认参数
>>>def test(*params,extra="31"):
print(params)
print(extra)
>>>test(1,2,3,4)
(1,2,3,4)
31
星号(*)用法
星号(*)既可以打包又可以解包,如将一个列表传入test参数的收集参数*param,则调用test(a)会出错,需要在a前面加上星号(*)表示实参需要解包后才能使用:
>>>def test(*params):
print('有%d个参数' % len(params))
print(params[1])
>>>a=[1,2,3,4]
>>>test(a) #直接将列表名a作为实参将出错
有1个参数
Traceback(most recent call last):
.......
IndexError:tuple index out of range #a打包成元组,成为元组的元组,元素个数为1
>>>test(*a) #实参前加上星号(*)表示解包
1
2
Python还有另一种收集方式,用两个星号(**)表示,表示将参数打包成字典形式,以后再叙.