不管在什么语言中,函数都是极其重要的一个部分
什么是函数,我觉得之前在C++函数讲解中已经尽我所能地说明了
我们的第一个问题无非是:
怎么创建一个 ( 无参数 ) 函数?
Python中我们使用def定义一个函数
(盲猜def是define的缩写啦)
def printHello():
print("Hello world!")
print("Welcome to Python!")
print("This is your first time to create a function.")
>>> printHello()
Hello world!
Welcome to Python!
This is your first time to create a function.
注意
- 在函数定义的时候,函数标签的后边不要忘记添加冒号
- 函数定义时后面的参数列表括号不能省略
- 函数调用时,同样需要写上括号
- 函数调用的时候同样遵循向上查找的原则
函数的实质,是对一系列操作进行封装实现一个小功能,进而能够对此功能进行灵活的调用
而函数相比较于其他的结构,最大的优势就是ta可以传递参数,从而大大提高了ta的灵活性和适用范围
参数可以说是函数的灵魂,那么,
怎么创建一个 ( 有参数 ) 函数?
简直不要太简单:
def printWelcome(name):
print('Welcome,'+name+'!')
>>> printWelcome('Coco_T')
Welcome,Coco_T!
def addThem(a,b):
print(a+b)
>>> addThem(1,2)
3
>>> addThem('love','you')
loveyou
>>> addThem(2.414,3.141)
5.555
我的天,Py简直不要太强!
如果函数合理定义的话,直接就是一个函数模板!
在这里友情提示一下
一般的,定义函数时参数尽量不要太多,三到四个就可以了
同时要养成给函数和参数写好详细注释的习惯
一方面方便自己日后的调试,另一方面也为进入公司参加多人项目打好基础(误)
那我们继续往下走:
怎么创建一个 ( 有返回值 ) 函数?
依赖return我们就可以编写出有返回值的函数,而调用方式也和C++/C大同小异
def addThem(a,b):
return a+b
>>> print(addThem('Hello','World'))
HelloWorld
>>> print( addThem( 'I ' , addThem('love ','you.') ) )
I love you.
有关参数的真理讨论
紧接着我们上一部分的话题,我们深入探讨一下函数的灵魂:参数
细致的来分,函数分为形式参数
(
p
a
r
a
m
e
t
e
r
)
(parameter)
(parameter)和实际参数
(
a
r
g
u
m
e
n
t
)
(argument)
(argument)
形参是函数创建和定义过程中小括号里的参数
实参是函数在调用过程中传递进去的参数
插播一条广告:
函数文档
什么是函数文档?
函数文档就是在函数内书写的一串字符串,在执行函数的时候不会被打印出来,肉眼观测时作用就相当于注释,可以用来解释函数的作用和参数的意义
def test():
'测试函数文档的作用:此函数可以打印程序员的白月光'
print('Hello world!')
>>> test()
Hello world!
既生注释何生函数文档?因为存在即合理!
给函数编写文档,就像是直接把这个条注释写进了函数的户口本里
我们在外部无法观测函数实现代码的时候,可以通过调用默认属性在函数外部获取这条“注释”
>>> test.__doc__
'测试函数文档的作用:此函数可以打印程序员的白月光'
>>> help(test)
Help on function test in module __main__:
test()
测试函数文档的作用:此函数可以打印程序员的白月光
关键字参数
在C++中,对于传参顺序我们都是心照不宣:一定要按照顺序对接实参和形参
而Py作为后起之秀,挣脱了这个讨厌的束缚
关键字参数就是在传递的参数前增加其对应的形参名称,这样就可以避免因为参数过多导致在参数传递时出现对接失败的问题啦
def saySomething(name,word):
print(name+':'+word)
>>> saySomething('C_T','How do u do?')
C_T:How do u do?
>>> saySomething('How do u do?','C_T')
How do u do?:C_T
>>> saySomething(word = 'How do u do?',name = 'C_T')
C_T:How do u do?
默认参数
在C++函数教程中我们介绍了默认参数的定义
简单来说,就是在函数标签中,为形参提前定义一个初始值:
void doit(int x=0,int y=0,int z=0) {...}
Py中的默认参数也是如此
(好吧,小心思暴露无遗。。。)
def saySomething(name = 'C_T',word = 'How do u do?'):
print(name+':'+word)
>>> saySomething()
C_T:How do u do?
>>> saySomething(word = 'Like Mr.C/shy')
C_T:Like Mr.C/shy
>>> saySomething(name = 'Mr.C',word = 'Pardon?')
Mr.C:Pardon?
收集参数
发明这个东西的初衷,大概是因为有些前辈在写函数的时候,自己也搞不清楚到底需要多少个参数(宛如zz)
看一下这个栗子会好解释很多:
def test(*params):
print('The length of params is ',len(params))
print('params[1] = ',params[1])
>>> test(1,'Coco_T',3.14,"I'm all right.",4,5,6)
The length of params is 7
params[1] = Coco_T
我们在定义形参的时候,在形参前面增加了一个星号
这样我们就可以一次性传入多个数据,计算机会帮我们把这些数据打包成一个元组
在接下来的操作中按照元组的规则盘ta就可以啦
如果我们在收集参数的同时,定义一个普通参数,这要怎么办呢?
def test(*params,temp):
print('The length of params is ',len(params))
print('temp = ',temp)
print('params[1] = ',params[1])
>>> test(1,'Coco_T',3.14,"I'm all right",5,6,7,8,9)
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
test(1,'Coco_T',3.14,"I'm all right",5,6,7,8,9)
TypeError: test() missing 1 required keyword-only argument: 'temp'
我们会发现,在调用函数的时候,我们需要采用关键字参数的方法才能成功
>>> test(1,'Coco_T',3.14,"I'm all right",5,6,7,8,temp = 9)
The length of params is 8
temp = 9
params[1] = Coco_T
所以,一般这种情况下
我们会给这个普通参数一个默认初始值(默认参数)
这样就可以有效的避免错误
(突然有一种融会贯通的感jio~)
def test(*params,temp = 9):
print('The length of params is ',len(params))
print('params[1] = ',params[1])
>>> test(1,'Coco_T',3.14,"I'm all right",5,6,7,8)
The length of params is 8
temp = 9
params[1] = Coco_T
啾啾啾!函数初步入门就到这里啦~
接下来还有更富有挑战性的内容等着大家呢!Fight!