原文链接: http://www.juzicode.com/python-tutorial-function/
函数在数学意义上的定义是这样的:“函数的近代定义是给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y=f(x)表示,函数概念含有三个要素:定义域A、值域B和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。”(摘自百度百科:https://baike.baidu.com/item/函数/301912?fr=aladdin)。通俗讲函数的作用就是输入一个x,会有一个对应的输出y,计算机语言里的函数也是借用了数学意义上的函数概念,给定一个或多个输入变量,得到一个或多个结果。也可以把函数看成一个有输入有输出的黑盒子,这个黑盒子里封装了将x变成y的实现方法。来看一个简单的函数y=5x+1,如果用Python写出来就是这样子的:
def f(x):
temp = 5*x + 1
return temp
在使用这个函数的时候,就可以这样调用:
y = f(x) |
这种调用形式就是和数学意义上的函数形式是一样的了,当然在Python中只是借用了函数的概念,这种模式也是Python函数中最简单的一种模式。
1 函数的定义
Python中通用的函数定义形式是这样的:
def 函数名称(入参1,入参2,.....):
函数体语句
return 返回值1,返回值2,......
其中入参可以有0个到多个,函数体语句要在def的基础上缩进一层,return语句后面跟的是返回值,当然return语句也不是必须的,根据实际情况可能并不需要返回值,比如print()函数就是没有返回值的一种函数,而计算list元素个数的len()函数就是有返回值的函数。
1)下面从简入繁介绍函数,先介绍没有入参,没有返回值的函数,虽然这种形式上的函数没有多大的实际意义,但是仍然是合法的函数形式:
def 函数名称():
函数体语句
def func_just_print():
print('这个函数不做其他的,就只打印juzicode')
func_just_print()
2)再进一步的,定义一个函数带一个入参,仍然没有返回值:
def func_1(x):
print('只有1个入参x:',x)
func_1('桔子code')
func_1('juzicode')
func_1(3.14159265)
执行3次func_1,分别输入不同的入参:
结果 | 只有1个入参x: 桔子code 只有1个入参x: juzicode 只有1个入参x: 3.14159265 |
- 3)再进一步的,定义一个函数带2个入参,仍然没有返回值:
def func_2(x,y):
print('2个入参x:',x)
print('2个入参y:',y)
func_2('桔子code','juzicode')
func_2(3.14159265,2.718281828459)
结果 | 2个入参x: 桔子code 2个入参y: juzicode 2个入参x: 3.14159265 2个入参y: 2.718281828459 |
4)定义一个函数,带一个入参并且有返回值。这个函数的入参x表示半径,函数名称circum,函数体计算以x为半径的圆的周长,返回值就是这个圆的周长:
def circum(x):
print('1个入参x:',x)
temp = 2*3.14*x
return temp
y = circum(5)
print('半径为5的圆形周长为:',y)
结果 | 1个入参x: 5 半径为5的圆形周长为:31.400000000000002 |
2 函数的调用
从前面的例子可以看到,函数的调用方法就是函数名称加上小括号,小括号内根据函数的定义可以有0或多个入参,如果函数有返回值还可以用一个变量保存这个函数执行后返回的值:y = circum(5)。当然这种保存返回值的用法并不是必须的,比如前面计算圆形周长的函数,也可以直接用“circum(5)”这种方法直接调用,从语法上来讲是不会有任何错误的,只是计算的结果没有保留下来。
另外一种使用方法就是将函数执行后作为一个变量放在一个语句中,比如下面这个例子,就是将半径为5的园的周长计算后作为一个变量放在一个if语句中进行判断:
def circum(x):
print('1个入参x:',x)
temp = 2*3.14*x
return temp
if circum(5)>30:
print('半径为5的圆周长大于30')
else:
print('半径为5的圆周长不大于30')
结果 | 半径为5的圆周长大于30 |
3 函数的返回值
3.1 1个返回值
前面的circum()函数的就是只有一个返回值的例子,这种是比较常见的情形。
3.2 “0个”返回值
函数还可以没有返回值,我们可以看下前面定义的func_2()函数,用type打印func_2()函数调用后的类型和值:
def func_2(x,y):
print('2个入参x:',x)
print('2个入参y:',y)
y=func_2('桔子code','juzicode')
print('func_2()返回值值:',y)
print('func_2()返回值类型:',type(y)) #在这里func_2函数调用后得到的y值作为变量,作为type()函数入参
结果 | 2个入参x: 桔子code 2个入参y: juzicode func_2()返回值: None func_2()返回值类型: <class ‘NoneType’> |
从执行结果可以看到,func_2()函数执行后实际上仍然返回了一个None(类型’NoneType’),所以在函数体没有显示地使用return语句时,函数仍然是返回了一个None数据。
3.3 “多个”返回值
函数也可以有多个返回值,这一点形式上看起来与C/C++等计算机语言有很大的差别,函数返回多个返回值用“return X,Y,Z”这种形式表示,下面通过一个例子来看下返回多个值的情况:
########1个入参,计算圆形的周长和面积
def circum_area(x):
print('1个入参x:',x)
temp = 2*3.14*x
area = 3.14 * x * x
return temp,area #多个参数之间用逗号分隔
y = circum_area(5)
print('circum_area(5)返回值:',y)
print('circum_area的返回值类型:',type(y))
结果 | 1个入参x: 5 circum_area(5)返回值: (31.400000000000002, 78.5) circum_area的返回值类型: <class ‘tuple’> |
从执行结果可以看出,返回的多个值实际存储在一个tuple数据类型中,所以形式上的“多个返回值”本质上仍然只返回一个tuple值。
3.4 总结
从前面的3个实验可以看出,函数没有返回值,1个返回值,多个返回值,其本质上都是返回一个值。
【学习方法】化整为零:在研究一个复杂的学习对象时,根据其组成的要素,先单个要素进行研究,最后再逐渐形成整体的认知。在本文函数的学习中,知道函数由入参,函数体,返回值等要素组成,我们先研究各种入参的情形,再研究不同的返回值类型,逐个要素进行研究,最后对函数有了一个完整的认识。在前面研究dict数据类型的时候,也是采用了一样的方法,认识到dict数据类型的每个元素由一个key和一个value组成,我们先研究各种数据类型的key值,再研究各种数据类型的value值,最后就会对dict形成一个整体的认知。