第六章 函数-上
6.1函数(Python的乐高积木):
- 把代码打包成不同形状的乐高积木,以便可以发挥想象力进行随意拼装和反复使用。
- 在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块。
6.1.1 创建和调用函数
1.创建函数的格式如下,在Python中创建函数使用def关键字:
def 函数名():
代码块
demo:
def myFirstFunction():
print('这是我创建的第一个函数')
print('我好激动')
print('在这里,我要感谢TBB,感谢CCAV!')
创建了一个函数,但是从来都不去调用它,那么这个函数里的代码就永远不会被执行
2.调用函数
myFirstFunction()
函数调用和运行机制:当函数myFirstFunction()发生调用操作的时候,Python会自动往上找到def myFirstFunction()的定义过程,然后依次执行该函数所包含的代码块部分
把刚才的内容打印三次,我只需调用3次函数即可:
>>> for i in range(3):
myFirstFunction()
这是我创建的第一个函数
我好激动
在这里,我要感谢TBB,感谢CCAV!
这是我创建的第一个函数
我好激动
在这里,我要感谢TBB,感谢CCAV!
这是我创建的第一个函数
我好激动
在这里,我要感谢TBB,感谢CCAV!
6.1.2 函数的参数
括号里放的就是函数的参数。为了使用每次调用的函数可以有不同的实现,加入了参数的概念。有了参数的实现,就可以轻松将大炮换成步枪。
一个参数的demo:
def myFunction(name):
print(name + '是小帅锅')
运行的结果:
>>> myFunction('我')
我是小帅锅
多个参数的demo,多个参数只需多好隔开即可:
def add(num1,num2):
print(num1 + num2)
运行结果:
>>> def add(num1,num2):
print(num1 + num2)
>>> add(3,3)
6
6.1.3 函数的返回值
我们函数需要返回值的时候,使用关键字return后边跟着就是指定的要返回的值。
>>> def add(num1,num2):
return(num1 + num2)
>>> add(1,2)
3
6.2 灵活即强大
灵活应该表现为多变的
6.2.1 形参和实参
函数定义时小括号中的参数,用来接收参数用的,称为 “形参”
函数调用时小括号中的参数,用来传递给函数用的,称为 “实参”
>>> def myFunction(name):
print(name + '是小帅锅')
>>> myFunction('我')
我是小帅锅
myFunction(name)的name是形参,因为它只是代表一个位置、一个变量名;
myFunction(‘我’)传递的’我’是实参,因为它是一个具体的内容,是赋值到变量名中的值!
6.2.2 函数文档
函数文档是为了让别人可以更好地理解你的函数,作用描述函数的功能
>>> def exchangeRate(dollar):
'''美元 -- >人民币
汇率暂定为6.5
'''
return dollar * 6.5
>>> exchangeRate(10)
65.0
函数开头写下的字符串是不会打印出来的,但是它会作为函数的一部分存储起来,这个称为函数文档字符串,它的功能跟注释是一样的。
函数文档字符串可以通过特殊属性__doc__
(PS.注意是两条下划线)
>>> exchangeRate.__doc__
'美元 -- >人民币\n\t汇率暂定为6.5\n\t'
想用一个函数却不确定其用法的时候,会通过help()函数来查看函数的文档。
>>> help(exchangeRate)
Help on function exchangeRate in module __main__:
exchangeRate(dollar)
美元 -- >人民币
汇率暂定为6.5
6.2.3 关键字参数
普通的参数叫位置参数,关键字参数就是为了解决粗心的程序员很容易会搞乱位置参数的顺序。
>>> def saySomthing(name,words):
print(name +'->' + words)
>>> saySomthing('让编程改变世界','小甲鱼')
让编程改变世界->小甲鱼
>>> saySomthing(words = '让编程改变世界',name = '小甲鱼')
小甲鱼->让编程改变世界
随着程序规模越来越大、参数越来越多,关键字参数起到的作用就越明显。
6.2.4 默认参数
默认参数是在函数定义的时候赋予了默认值的参数:
>>> def saySomthing(name = '小甲鱼',words = '让编程改变世界'):
print(name +'->' + words)
>>> saySomthing()
小甲鱼->让编程改变世界
默认参数和关键字参数的区别:
关键字参数是在函数调用的时候,通过参数名指定要赋值的参数。
默认参数是在函数定义的过程中,为形参赋初值,当函数调用的时候,不传递实参,则默认使用形参的初始值。
6.2.5 收集参数
收集参数(可变参数):当不知这个函数到底要多少个参数,只需要在参数前边加上星号(*)即可。
>>> def test(*params):
print('有 %d 个参数'%len(params))
print('第二个参数是:',params[1])
>>> test('F','i','s','h','C')
有 5 个参数
第二个参数是: i
Python把标志为收集参数的参数们打包成一个元组。
如果在收集参数后边还要指定其他参数,在调用函数的时候就应该使用关键参数来制定,否则Python会把你的实参都列入到收集参数的范畴。
>>> def test(*params,extra):
print('收集参数是:',params)
print('位置参数是:',extra)
>>> test(1,2,3,4,5,6,7,8)
Traceback (most recent call last):
File "<pyshell#50>", line 1, in <module>
test(1,2,3,4,5,6,7,8)
TypeError: test() missing 1 required keyword-only argument: 'extra'
如果你的参数中带有收集参数,name可将其他参数设置为默认参数,这样不容易出错:
>>> def test(*params,extra = '8'):
print('收集参数是:',params)
print('位置参数是:',extra)
>>> test(1,2,3,4,5,6,7,8)
收集参数是: (1, 2, 3, 4, 5, 6, 7, 8)
位置参数是: 8
星号(*
)其实既可以打包又可以”解包”。”解包”通过一个例子来理解,加入你需要将一个列表a传入test参数的收集参数params中,那么调用test(a)时会报错,这个时候只需在a的前边加上个星号(*
)表示实参需要解包后才能使用:
>>> def test(*params):
print('有 %d 个参数'%len(params))
print('第二个参数是:',params[1])
>>> a = (1,2,3,4,5,6,7,8)
>>> test(a)
有 1 个参数
Traceback (most recent call last):
File "<pyshell#57>", line 1, in <module>
test(a)
File "<pyshell#55>", line 3, in test
print('第二个参数是:',params[1])
IndexError: tuple index out of range
>>> test(*a)
有 8 个参数
第二个参数是: 2
Python还有另外一种收集方式,就是用两个星号(**
)表示,两个星号的收集参数表示为将参数们打包成字典的形式。之后再介绍字典。