标签 函数 下的文章

在生活中,我们通过特征与功能来描述一个具体对象,转换到代码中就变成了数据与函数。
回顾已经学过的内容,我们学习了用来存储数据的变量与用来存储代码的函数。
现在让我们把变量与函数打包,来学习在程序中创建类与对象。

类代表着一类事物,比如人类,鸟类,汽车,电脑。当我们提起这些事物的时候,我们并不特指某一个具体的东西,比如人类是泛指抽象的全人类

而对象指的是类的实例,比如人类的对象是某个具体的人,如张三,李四,tony和kevin。

类与对象

类代表一些拥有相同特性与功能的事物,如鸟类,人类,猫类等。

类中的某一个具体实例称为这个类的实例对象,简称为对象。

若请你介绍一下自己的手机,你会如何去做?
你可以通过颜色、型号、容量大小,屏幕尺寸等数据来描述它的特征;
也可以用拍照、安装应用、打电话等操作来描述它的功能。

我们可以把拥有上述特性的设备都归类于手机,即手机就是一个类。

手机的特征称为这个类的属性,手机的功能称为这个类的方法。

属性与方法

定义:
属性用来描述这个类的一些特征,如品牌,颜色,型号是手机的属性。

方法用来表现这个类的一些功能,如拍照,打电话等是手机的方法。

在Python中通过class关键字来创建一个类。
为了方便理解,接下来在程序中定义一个手机类。
并为手机设定两个方法:打电话,发短信。

类的定义

class Phone():
    def makeCall(self, who):
        return f"正在拨打电话给{who}"

    def sendMsg(self, who, txt):
        return f"正在发送短信给{who}, 内容为{txt}"

代码的作用
class定义一个类,并命名为Phone

第2~6行,为该类添加了打电话和发短信两个功能。即定义了两个方法makeCallsendMsg

第2,3行,makeCall方法接收联系人的名字为参数,并将文字格式化输出。

第5,6行,sendMsg方法接收联系人的名字与短信内容为参数,并将文字格式化输出。

关键字
class,在程序中定义类的关键字。

类名
一串文字,为类定义的名称。
为了区分类与函数,类的名称首字母建议大写。

括号
一对括号,定义类的标准写法。

:
一个冒号,表明接下来缩进的代码是属于这个类的。

四个空格
一个缩进,表示该代码块属于Phone这个类。

方法名
类中的两个特殊函数,称为方法。
方法又被称为成员函数,用来表现这个类的一些功能。

成员函数的第一个参数为self

特殊的参数
self参数,由程序自动传入的参数,指调用该方法的对象。

第一个参数为self,是定义实例方法的固定写法。

代码小结
当我们要定义一个类时就需要这几个部分

类是抽象的,我们要使用类,就需要实例化一个对象。

对象是以类为模板创建的。

这个过程类似于以人类的共同特性为模板,创造一个特定的人。
可以这样说,你就是人类的一个实例对象。

接下来学习一下如何通过类来实例一个具体的对象。
用Phone类来实例化两个对象表示我的手机与你的手机。

实例化对象

class Phone():

    def makeCall(self, who):
        return f"正在拨打电话给{who}"

    def sendMsg(self, who, txt):
        return f"正在发送短信给{who}, 内容为{txt}"

myPhone = Phone()
yourPhone = Phone()

ret = myPhone.makeCall("Tony")
print(ret)
ret2 = yourPhone.sendMsg("Jeremy", "中午吃啥?")
print(ret2)

代码的作用
将刚才定义好的Phone类拿过来,并实例化两个对象myPhoneyourPhone

第9,10行,创建Phone的对象myPhoneyourPhone

第12行,调用myPhone的方法makeCall,把结果存储到ret中。

第14行,调用yourPhone的方法sendMsg,把结果存储到ret2

对象名
一个变量名,为对象设定的名称。

类名
定义好的类名。

括号
括号,表示调用Phone类实例化一个对象。

对象
对象名称,用对象名调用指定的方法。

句点
一个句点【.】。

用句点连接对象名与对象的方法,称为句点表示法。

例如第11行,表示myPhone使用了他的方法(功能)makeCall(打电话)。

方法名
方法名,对象要调用的方法名称。

实参
调用方法时传递的实参。

调用对象的方法时,不需要为self参数传递实参。

这里,第11行的“Tony”实参传递给makeCall“who”形参。

第13行的“Jeremy”实参传递给sendMsg“who”形参,“中午吃啥”传递给sendMsg“txt”形参。

代码小结
当我们要实例化对象时就需要这几个部分

小练习

实例化对象
为Cat实例化一个对象mimi,并使用该对象调用talk方法。

class Cat():
    def talk(self):
        print("喵喵喵")

# 创建一个Cat对象,并存储在mimi中
mimi = Cat()
# 调用mimi的方法talk
mimi.talk()

类的属性与初始化

在刚才的代码中,创建了一个包含两个方法的Phone类,并且创建两个不同的实例对象去调用这些方法。

现在让我们为类设置属性,并在创建实例化对象时,初始化该属性的值。

手机的属性有:颜色,品牌。

class Phone():
    def __init__(self, bd, clr):
        print("创建实例对象时,自动调用此方法")
        self.brand = bd
        self.color = clr

myPhone = Phone("华为", "白色")
yourPhone = Phone("苹果", "黑色")
print(f"我有一个{myPhone.color}的{myPhone.brand}手机")
print(f"你有一个{yourPhone.color}的{yourPhone.brand}手机")

代码的作用
Phone类添加品牌(brand)与颜色(color)两个属性。

第2行,定义初始化方法__init__并设定两个参数bdclr

第8,9行,创建实例化对象myPhoneyourPhone,并为__init__方法传递参数两组不同的参数。

第10,11行,分别格式化输出实例对象的colorbrand属性

初始化方法
初始化方法__init__,是一个特殊的方法。

init左右两边各有两个下划线,即整个名称共有四个下划线。

初始化类似于出厂设置,表示“开始时做好准备”,会在创建对象时自动被调用

特殊的参数
self参数,是调用方法时由程序自动传入的参数,指实例化后的对象。

句点
一个句点,用来连接对象名与属性。

因为这里还没有创建对象,所有对象名用self参数代替。

属性
对象的两个变量,称为属性。

与之前创建的变量不同,brandcolor是专属于该类对象的变量,只能被类的对象使用。

参数
初始化函数的两个形参名。接收传递的数据后赋值给对象的两个属性brandcolor

实参
两组数据。在创建对象时,为初始化函数中的brandcolor传递的数据。

使用属性
两个对象分别使用它们的属性,并格式化输出内容。

代码小结
当我们初始化属性时需要这几个部分

特殊的self参数

通过前面的内容知道,对象的属性与方法需要用句点表示法将对象名与方法名连接在一起。

但是在定义类时,我们还不知道要创建哪些对象,所以self的作用就是将实例化的对象名称(引用)传递到方法中。

比如在myPhone对象中,self.brand 代表的是myPhone.brand

初始化过程
在创建一个实例对象时,程序会自动调用init方法。

最后

总结一下类与对象的注意事项。

方法与属性只能被实例对象调用

就像append只能被列表使用一样,方法与属性只能用句点表示法被该类的实例使用,否则就会出错。

函数与方法
在Python中有着一切皆对象的说法,我们创建的字符串、列表、元组等本质上都是该类型的一个对象。

所以直接调用的print()range()为函数,用句点表示调用的append()keys()等为某个对象的方法。

小练习

属性的使用
现有一个Cat类,并为该类初始化了两个属性名称(name)与品种(breed)。

假设我有一只“橘猫”叫做“大黄”,实例化一个Cat对象存储到myCat中,并传递参数"大黄", "橘猫"。

假设你有一只"布偶猫"叫做“土豆”,实例化一个Cat对象存储到yourCat中,并传递参数"土豆", "布偶猫"

最后分别按照“有一只xx叫做xxx”的格式输出(需要用到格式化输出)。

class Cat():
    def __init__(self, name, breed):
        self.name = name
        self.breed = breed
    def talk(self):
        print("喵喵喵")

# 实例化一个Cat对象存储到myCat中,并传递参数"大黄", "橘猫"
myCat = Cat("大黄", "橘猫")
# 实例化一个Cat对象存储到yourCat中,并传递参数"土豆", "布偶猫"
yourCat = Cat("土豆", "布偶猫")
# 分别按照格式输出字符串
print(f"有一只{myCat.breed}叫做{myCat.name}")
print(f"有一只{yourCat.breed}叫做{yourCat.name}")

判断用户是否为会员
现有一个User类,并为该类初始化了两个属性用户名(name)与是否为会员(isVIP)。

实例化一个User对象存储到tony中,并传递参数"Tony", True
实例化一个User对象存储到jeremy中,并传递参数"Jeremy", False
最后分别调用tony与jeremy的sayHi方法。

class User():
    def __init__(self, name, isVIP):
        self.name = name
        self.isVip = isVIP

    def sayHi(self):
        if self.isVip:
            print(f'尊贵的会员{self.name},欢迎您!')
        else:
            print(f'{self.name},欢迎您!')

# 实例化一个User对象存储到tony中,并传递参数"Tony", True
tony = User("Tony", True)
# 实例化一个User对象存储到jeremy中,并传递参数"Jeremy", False
jeremy = User("Jeremy", False)
# 分别调用tony与jeremy的sayHi方法
tony.sayHi()
jeremy.sayHi()

计算学生平均成绩
现有一个MathScore类,并为该类初始化了两个属性班级名称(name)与本学期数学成绩列表(scoreList)。

实例化一个MathScore对象存储到class32 中,并传递参数"三年级二班", [78, 99, 88, 87, 67]
最后调用class32的showMsg方法

class MathScore():
    def __init__(self, className, scoreList):
        self.className = className
        self.scoreList = scoreList
        self.studentNums = len(self.scoreList)

    def getSum(self):
        # 计算成绩总和
        s = 0
        for score in self.scoreList:
            # 注:s += score 为 s = s + score 的简写
            s += score
        return s

    def mean(self):
        # 计算成绩平均数
        return self.getSum()/self.studentNums

    def showMsg(self):
        print(f"{self.className}共有{self.studentNums}人,数学平均成绩为{self.mean()}")

# 实例化一个MathScore对象存储到class32 中,并传递参数"三年级二班", [78, 99, 88, 87, 67]
class32 = MathScore("三年级二班", [78, 99, 88, 87, 67])
# 调用class32的showMsg方法
class32.showMsg()

在 Python 中,我们可以使用【def 函数名(参数):】的方式定义函数。

如果我们把 def 定义的函数看作“有名字函数”,那么还有一类函数,其不需要显示定义函数名。

这就是匿名函数。

匿名函数

匿名函数是一种不需要为函数命名的函数定义方式,以 lambda 关键字开头。

匿名函数之所以叫匿名函数,是因为它没有函数名称。
本例中,我们是把一个匿名函数赋值给了变量 square,该变量就可以调用函数。

匿名函数的结构

square = lambda x:x*x
result = square(9)
print(result)

multiply = lambda x,y:x*y
newResult = multiply(9,10)
print(newResult)

代码的作用
这两段代码创建两个匿名函数,并且使用变量调用,传入参数,输出了结果。

lambda
一个关键字 lambda,用来创建匿名函数。

空格
一个空格,固定格式,关键字 lambda 和具体计算式之间的空格。

参数
这个位置表示该匿名函数的参数,为形参。
如果传入多个参数,需要使用“逗号”隔开。

冒号:
一个冒号是“匿名函数”的固定格式,冒号后面是具体如何计算冒号前面的输入数值。

表达式
冒号后面是函数的返回值,注意这里不需使用 return 关键字。

变量
将匿名函数赋给一个变量,再由该变量来调用函数。

调用函数
匿名函数同样需要被调用才能执行,调用仍然使用 ( ) 传参的方式实现。

变量
变量,这个变量会“接受”匿名函数返回出来的值。

代码小结
当要定义匿名函数时,可以使用这样的格式

小练习


定义一个“匿名函数”,它的功能是计算一个输入值的3次幂,将匿名函数赋值给变量power,然后输入一个数值 5,并输出计算结果。

power = lambda number:number*number*number
print(power(5))

立方体体积
定义一个“匿名函数”,它的功能是计算立方体的体积,其公式为:长高,将匿名函数赋值给变量 area。

然后传入参数10, 8, 6,并输出计算结果。

area = lambda length,width,height:length*width*height

print(area(10, 8, 6))

匿名函数使用起来比较方便,但是它也有局限性。
lambda 的主体是一个表达式,而不是一个代码块,不适合处理复杂的逻辑情况。
我们在创建函数时,如果需要处理较为复杂的逻辑,建议使用 def 创建函数,如本例所示,计算列表各元素的累加。

在之前的学习中,都是先定义函数以后,在代码的其他地方调用这个函数。
其实,在函数的内部还可以调用自己,这种调用自己函数就是递归函数

递归

一段程序调用自身的过程我们叫做递归,多见于函数调用函数自身。

当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程

语言例子
如果我们用语言的形式表示递归的话,这个通俗的故事最能体现:

从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……

接下来,就在案例中,学习递归的使用方法和其中的程序运行逻辑。

递归

递归概念比较抽象,我们来一起梳理下。

假设创建一个递归函数,用于计算数字累加,传入数字 5 ,计算 5 以内的数字累加。
5+4+3+2+1+0

由于 5 大于 0,程序不会执行函数中 if 判断的代码块,而是返回 5 + sum(4)
这里的 sum(4) 又是一次 sum() 函数的调用,程序就会返回 4 + sum(3)

程序就一直调用自己,直到 sum(0),因为 if 语句的存在,它不需要等待 sum(0) 的计算了,而是直接给出结果 0
然后程序一路返回,回到最初的 sum(5),并给出最终的答案:5+4+3+2+1+0 = 15

递归函数会终止么?

在递归函数中,if 判断就是终止条件,在本例中当 n 小于等于 0,就返回 0 ,递归就终止了。
如果不加这个终止条件会无休止的递归下去,最终造成程序报错。

类似的,我们要算一个数的阶乘,一个正整数的阶乘是所有小于及等于该数的正整数的积,例如
5! = 5×4×3×2×1

我们可以用图中的代码,当 n > 0 的时候,函数会调用它本身,直到 n <= 0

小练习

200以内求和
写一个递归函数可以实现 200 以内的整数和。

将函数名命名为 sum,传入参数为 n。

# 定义名为sum()函数,传入参数n
def sum(n):
    # 如果n小于等于0
    if n <= 0:
        # 返回0
        return 0
    # 返回n加上sum(n-1)
    return n + sum(n-1)

# 调用sum()传入200并输出
print(sum(200))

必选参数

函数的一种参数类型,在调用这个函数的时候必须传入数据的参数。

传递实参时的顺序

在传递必选参数时,形参会按照定义的顺序依次接收数据。

调用函数时第一个参数传递给name,第二个参数传递给pet。

缺少实参

在调用函数时,缺少或超出对必选参数的传递会导致程序错误。

也就是说,在函数中定义了多少个必选参数就要传递多少个实参。

关键字传递

当我们忘记了传递顺序时,可以利用“形参名=实参名”的方式传递实参。

这样以关键字传递实参的形式,简称为关键字实参。

小练习

定义一个函数getArea,设定参数width与height分别接收矩形的宽高,计算矩形的面积并返回。

调用该函数,用关键字的形式传递参数宽为5、高为3,并按照“矩形的面积为xx”的格式输出结果。

def getArea(width, height):
    return width*height

ret = getArea(width=5, height=3)
print(f"矩形的面积为{ret}")

若定义一个计算圆形面积的函数,设定参数为半径(radius)与圆周率(pi)。

多数情况下,圆周率都会近似为3.14。

若pi不是必选参数,设其默认为3.14。只在需要修改圆周率时传递数据,函数调用起来会方便很多。

必选参数定义起来虽然简单,在调用函数时经常会因为缺少实参造成程序错误。

接下来学习给形参设置默认值。

默认值参数

def getArea(radius, pi=3.14):
    ret = radius * radius * pi
    return ret

ret1 = getArea(2)
print(ret1)
ret2 = getArea(2, 3.14159)
print(ret2)

代码的作用

定义一个函数getArea,根据传递的半径与圆周率,计算圆的面积并输出。

在第1行,定义形参radius与pi,并为pi设定默认值为3.14。

在第5行,调用函数getArea,并传递数据2。

在第7行,调用函数getArea,并传递数据2与3.14159。

关键字

一个关键字,def函数定义的关键字,是define的缩写。

括号
括号与冒号,这是函数定义的固定格式。

逗号
一个逗号,用来分割多个参数。

必选参数
一串字母radius,必选参数。

必选参数要定义在默认值参数之前。

默认参数
一串字母pi,默认值参数。

默认参数可以有任意个,但必须定义在必选参数之后(若必选参数存在)。

等号
一个等号,赋值符号。

默认值
一组数据,为参数pi设置默认值。

若在调用函数时,没有为参数pi传递实参,参数pi默认为3.14。

传递一个实参
调用函数,只为必选参数传递整数2。

因为pi没有接收到参数,所以pi将使用默认值3.14。

传递两个实参
调用函数,传递参数2与3.14159。

此时pi接收到的实参数据3.14159会覆盖默认值3.14。

代码小结
当我们定义一个默认值参数时就需要这几个部分

目前学习了两种类型的参数,必选参数与默认值参数。这两种参数形式涵盖了80%以上的函数使用。
在定义不同的参数时,需要注意避免一些常见的错误。

1.定义参数的顺序

在定义函数时,定义形参的顺序是:1,必选参数;2,默认参数。
当有必选参数和默认参数的时候,必选参数必须写在默认参数的前面,否则程序会出错

2.参数名避免使用无意义的字母

在传递实参给函数时,若忘记定义顺序可以使用“形参名=实参”的方式。
但如果定义的形参名是诸如a,abc这样无意义的名字,会减少代码可读性,容易混淆。
所以设定参数名时,尽量使用有意义的名称。

最后,对这两种参数的差异性做一个总结。

初识函数

定义
函数是指封装了某一特定功能的代码块。

简单的讲,函数就是用来存储代码的“特殊变量”。

前面接触过的很多“功能”都是函数。

比如在屏幕上输出一些数据的print(),生成一个指定范围整数序列的range()等。

函数的功能是如何定义的呢?

定义函数

def sayWelcome():
    print("欢迎光临")
    print("商品一律九折")

代码的作用
这3行代码做的事情是定义了一个叫做“sayWelcome”的函数。

这个函数的功能是输出欢迎语内容。

def
一个关键字,def函数定义的关键字,是define的缩写。

sayWelcome
一个名称,函数名。
这里的名称其实就是变量名,只不过需要存储的不再是数据,而是代码,我们称为函数名。

括号
一对括号,是函数定义的标准格式。

冒号
一个冒号,表明接下来缩进的代码是属于这个函数的。

缩进
四个空格。

和判断、循环一样,函数内部的代码也需要缩进相应的空格。

函数体
几行代码组成的代码块。

实现该函数功能的代码块,称为函数体。

代码小结
当我们要定义函数时就需要这几个部分。

现在我们已经将输出欢迎语的代码打包,并为它贴上了sayWelcome的标签。当我们需要展示欢迎语时,只需要“打电话”(call)给电脑,让它在此处执行sayWelcome的代码。

在代码中使用我们已经定义好的函数,这个过程称为调用函数(Call Function)。

调用函数

def sayWelcome():
    print("欢迎光临")
    print("商品一律九折")

sayWelcome()
sayWelcome()

代码的作用
定义一个sayWelcome函数,实现输出欢迎语的功能。

第5、6行代码,调用了sayWelcome函数。

sayWelcome
一个名称,被调用的函数名。

程序通过函数名来定位函数体中的代码。

括号
一对括号,调用符号。

表示在此处执行该函数中的代码,是调用函数的标准格式。

代码小结
当我们要调用函数时就需要这几个部分。

代码执行顺序
函数体中的代码不是立刻执行的,而是等到该函数被调用时才执行。

我们可以理解为:函数的调用是一个迂回的路径。

当程序执行到第七行代码时,开始调用setWatermark函数时,并不会继续执行第八行代码,而是跳转到定义函数setWatermark()的内部

从第二行开始执行

直到第2,3,4行代码结束

再跳回到第7行代码,从而继续执行第8行代码

现在我们可以把需要重复使用的代码定义为一个函数,就像刚才的sayWelcome函数。

若我们希望修改函数中的内容怎么办呢?

若定义函数时预留一个位置接收数据。根据不同的情况传递不同的数据,就能更加灵活的解决刚才的问题。

这时候我们需要为函数“挖空”,并在调用函数时“填空”,即设置参数。

我们把提前挖好的“空”称为形参,把用来填空的数据称为实参。

形参与实参

定义
形参是形式参数的简称,指定义函数时设置的参数名称。

实参是实际参数的简称,指调用函数时实际传递的数据。

为函数设置参数

def sayWelcome(discount):
    print("欢迎光临")
    print(f"商品一律{discount}")

sayWelcome("九折")
sayWelcome("五折")

代码的作用
定义sayWelcome函数,并为它们设置一个参数discount。

第1行,定义sayWelcome函数并在括号中设置形参名称discount。

第3行,将discount形参放到函数体中使用,使discount中的数据按照指定的格式输出。

第5~6行,多次调用sayWelcome函数,并分别为discount形参传递实参数据“九折”、“五折”。

形参
定义一个形参,用来接收数据的参数名称。

形参
在代码中使用形参,接收到的数据会被传递到此处使用。

实参
实参,调用函数时传递给形参discount的数据。

代码小结
我们通过下面的代码为函数设置参数。

形参
形参是定义函数时设置的参数名称。

相当于我们定义了一个变量,但不需要给该变量赋值。

实参
实参是调用函数时传递给形参的数据。

相当于为形参变量赋值的数据。

参数可以定义多个,也可以不定义。

如果参数不止一个,多个参数之间可以用英文逗号“,”隔开。

根据函数的功能不同,我们可以传递不同类型的实参数据。

比如,我们可以把店铺名称与产品折扣都设置为参数。

小练习

计算BMI指数
请定义一个叫做“getBMI()”的函数,该函数包括2个参数height, weight,分别代表身高和体重。

这个函数的功能是通过一个人的身高和体重计算BMI指数,并用print输出结果。

BMI指数的计算公式为:BMI = 体重 /(身高X身高)

然后分两次调用这个函数:

第一次传入参数(1.83, 60)。

第二次传入参数(1.60, 50)。

def getBMI(height, weight):
    BMI = weight / (height * height)
    print(BMI)

getBMI(1.83, 60)
getBMI(1.60, 50)

请定义一个叫做“isOdd”的函数,该函数包括1个参数number,代表一个整数。

这个函数的功能是通过if语句判断number中的数字是否为奇数,并用print输出结果。

若此数为奇数,输出“奇数”,否则输出“偶数”。 然后分两次调用这个函数:

第一次传入参数25。

第二次传入参数10。

# 定义isOdd函数
def isOdd(number):
    # 判断number是否为奇数
    if number % 2 == 1 :
        print("奇数")
    else :
        print("偶数")

# 调用isOdd函数
isOdd(25)
isOdd(10)

函数结构

假设,一位农场主想要统计自己的圈地面积有多少,面对大大小小的多个圈地,用代码该如何实现呢?

可以设定⼀个计算⾯积的函数,多次调⽤。

农场主的圈地均为正方形,测量面积的函数编写好后,如代码所示。

第 1 到第 3 行代码,定义了一个名为 getArea 的函数,用于计算正方形面积并输出。
第 5 和第 6 行代码,调用这个函数,传入参数,就可以获得不同边长的正方形面积大小。

def getArea(length):
    area = length*length
    print(area)

getArea(13)
getArea(7)

计算好了圈地的⾯积,想要计算边长为 13 的圈地⾯积是不是大于 160,如果大于 160 就用来种⻄⽠。

如本例所示,程序虽然输出了⾯积大小,但是不能在函数外比较数据的大小。
这是因为函数内输出的数据,没有传递到函数外。这时候,我们就需要设置函数返回值。

函数返回值

def getArea(length):
    area = length*length
    return area

result = getArea(13)
print(result)

代码的作用:
在本例中,第 1 到第 3 行代码定义了一个名为 getArea 的函数,其功能为计算正方形面积,并将结果返回。

第 5 行调用函数 getArea() 传入参数,将返回值赋值给变量 result

第 6 行代码,输出变量 result

return
在函数中,使⽤关键字 return 设置要返回的数据。
return 位置一般都是在函数的末尾,这样才能停止函数内的代码运行并将 return 后的值返回。

返回值
return 后面是指定的返回值,返回值会返回到调用的地方。

变量
调用函数 getArea(),传入参数 13,函数将运算结果 169 返回,并赋值给变量 result

代码小结
要定义函数和调用函数就需要这几个部分

在函数中使用关键字 return 时,要注意它的位置。
函数内部程序按照从上到下的顺序执行,如本例所示,函数内部有 for 循环,程序会等 for 循环执行完毕后,再执行 return 语句。
这样就可以得到传入列表中全部元素的累加值。

如果 return 的位置在函数的循环内部,函数内的循环只会执行一次。
因为执行到 return 语句,函数就返回当时的值,并且停止此次调用。

函数经过内部代码的执⾏会产⽣⼀个结果,这个结果可以是⼀个具体的值也可以是多个值。
在本例中,函数计算出正⽅形的周长和面积,函数返回了两个值。
当函数同时返回多个值时,以逗号 "," 隔开,并且返回值以元组的格式返回。

再来看这个案例。如图所示,左边的函数计算出正方形的面积,但是函数中没有 return 语句
此时,函数运行结束会返回一个空值(也就是None),作为返回值。

小练习

定义了一个叫做 "getSize" 的函数,该函数包含 1 个参数 length。

这个函数的功能是计算正方形周长和面积,并将两个结果作为函数的返回值返回。

现在分两次调用这个函数:
第一次传入参数 6 并输出结果。
第二次传入参数 8 并输出结果。

正方形周长 = 4 边长 正方形面积 = 边长 边长

def getSize(length):
    perimeter = 4*length
    area = length*length
    return perimeter,area

result = getSize(6)
print(result)
result = getSize(8)
print(result)

刚才农场主在函数中使用了 print(),程序输出了圈地面积,但是不能在函数外比较数据的大小。
在函数内使用 print() 可以得到数据,但是这个数据不能在函数外使用。
在函数内使用 return 可以将数据传递到函数外。

学完了函数结构中的每个部分,总结⼀下函数的结构。

函数名
为函数取名是为了方便我们重复使用。在 Python 中,函数的命名规则和变量类似。

参数
参数可以理解为函数的输入。
形参指定义函数时设置的参数名称,实参指调用函数时实际传递的数据。在本例中,num 为形参,8 为实参。
参数可以定义多个,也可以不定义。如果参数不止一个,多个参数之间用英文逗号 “,” 隔开。

函数体
函数体是函数内部实现特定功能的代码。就像做菜之前需要先想好具体的烹饪方式,等到做菜的时候再使用一样。
在本例中,函数体是为了计算一个数的二次幂(平方)和三次幂(立方)。

返回值
返回值可以理解为函数的输出。
就像对做菜的原材料进行烹饪加工,最后会得到我们想要的菜品一样,函数经过内部代码的执行也会产生一个结果。
这个结果可以是具体的值,也可以是一项具体的操作。

调用函数
在代码中使用我们已经定义好的函数,这个过程称为调用函数。
调用函数获得的返回值,可以用一个变量存储下来,就可以在函数外使用这个数据了。

代码小结
函数的结构

学习了函数结构后,还有一类函数就不得不提。
既然函数的使用顺序是先定义后调用,之前使用的很多函数, 比如 print()range()append() 等等,它们没有被我们定义,为什么还能直接被使用呢?
是因为,在 Python 中还有一类函数叫内置函数。

内置函数

和其他编程语言一样,Python也会将一些经常使用的函数预先写好,内置在编程环境中,提供许多常用的基本功能。
这些函数不需要我们去定义,可以直接使用,也被称为内置函数。

程序中使用内置函数也就是在调用函数。
例如,调用 len() 函数,它可以返回字符、列表、元组等长度或元素个数。

如图所示:
len 为函数名;
() 为调用符号,在此处执行该函数中的代码;
列表 ["a","b","c","d"] 为实参。

程序将 len(["a","b","c","d"]) 的返回值 4 ,赋值给变量data;接着,输出变量data。