Python基础教程6–函数

原文链接: 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函数中最简单的一种模式。

函数的定义

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

函数的调用

从前面的例子可以看到,函数的调用方法就是函数名称加上小括号,小括号内根据函数的定义可以有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.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形成一个整体的认知。

扩展阅读:

好冷的Python~默认参数、可变对象和不可变对象

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注