python基础课程 第4章 毁灭行星的函数

python基础课程 第4章 毁灭行星的函数

首页枪战射击毁灭行星更新时间:2024-04-30

对于合格程序员而言,假如有一天上帝要求我们设计一个摧毁地球的程序,那么我们第一步肯定设计一个叫做 “摧毁行星” 的函数,然后把地球作为一个参数传递给它,这样我们可以拿着这个函数走遍整个宇宙,化身为三体里的二向箔,走到哪,清理到哪。


本章知识点:函数的解释

常规解释为 函数是组织好的、可重复使用的、用来实现单一、或相关联功能的代码片段。

按照我们通俗的解释,函数可以理解为将一段程序组装打包成一个通用的模块。有点类似于Excel中的模版,我们可以拿着模版,只需要往里面填充数据,它就可以生成我们预先希望的格式数据。

再通俗点函数就是我们做月饼时用的模具,往模具里填充食材的过程就是在传递参数给函数,希望它返回给我们一个月饼。

定义一个函数

下面我们来编写学习python以来的第一个函数 (摧毁行星)。

在编写函数之前,我们先尝试编写摧毁行星的具体功能代码。



在经过一番折腾之后,我们成功的摧毁了太阳系的两颗行星,当然我觉得它们应该处于另一个位面,并不影响我们当前的时空。

我们通过这20行代码可以发现我们重复的写了很多print()函数,用于打印摧毁行星的文字,同时也做了条件判断,如果是太阳就打印摧毁失败,也就是摧毁一颗行星起码要用6行代码,而且这些代码看起来极为相似,显然是重复性非常高的代码。

如果我们要把宇宙挨个清理一遍,估计首先是代码函数突破了天际,还没来得及走出银河系就把我们的硬盘撑爆了吧?

我们该如何精简我们的代码呢?


我在上面定义了一个名为 destory_planet的函数,然后把之前重复的代码进行了封装,它就像一个模版一样,等待着接受不同名称的参数,然后输出不同的结果,这样就实现了我在文章最开始说的那样,我们会定义一个摧毁行星的函数,把地球作为参数传给它。

函数的基本语法


函数以def 关键词开头,空格后接上函数名称和一对圆括号()和一个冒号。

def fun1():

函数可以接受参数,所有传入的参数必须放在圆括号内,参数数量可以是0至多个。

def fun1(参数1, 参数2, 参数3):

函数第一行内容通常写注释,可以用来对函数进行说明,非强制要求,约定俗成而已。

def fun1():

"""注释"""

函数的内容以冒号起始,并且需要进行缩进。

return 语句用于结束函数,并且可以选择返回一个值给调用方,不带任何返回值相当于返回了None(python中的空对象)。


函数的完整语法。

def fun1(parameters): """函数注释""" 函数功能balabalabala return obj

函数的命名与变量的命名一致。

函数调用和参数传递

我们在那个摧毁行星的函数里还了解到了,函数的调用和参数的传递。

当我们在代码的任意位置想要调用函数时,直接输入函数名然后加上圆括号即可。

fun1()

当我们的fun1函数定义了参数时,我们需要在调用函数时传递参数的值给这个函数。

fun1(a=1)

如果一个函数定义了参数,我们调用时不传递参数值给它,会报错。

如果一个函数没有定义参数,我们调用时传递参数值给它,也会报错。

如果我们在调用时传递参数值的数量不等于函数定义的参数数量,也会报错。


这是调用时缺少参数的错误。

这是调用时参数数量不对的错误。

这是未定义参数,但是调用时传递了参数的错误。

下面我们来一个正确的范例。

参数在传递时可以是具体的数据,也可以是一个变量。

值传递和引用传递

在参数传递上,我们会遇到一个值传递和引用传递的问题,python中一切皆为对象,所以我们在传递参数值给函数后,函数会根据我们传递对象数据类型来决定哪些值属于值传递,哪些属于引用传递。

不可变对象类型: int(整型)、float(浮点数)、str(字符串), tuples(元组)

可变对象类型: list(列表)、 dict(字典)

在python中,当我们传递一个不可被改变的对象给函数时,传递的就是它本身,这就所谓叫值传递。

具体解释就是我调用函数时传递给它一个 a=1这个变量,在函数内它可以把a这个变量的值再进行处理,但是再次处理之后得到的对象不再是我开始传递给它的对象了,而是向内存申请空间产生了一个新的对象,原来的a已经被当前的调用丢掉了。

上面这个例子,我定义了一个值为1的变量a,第一次打印它的值和内存地址。

id()函数用于获取对象内存地址。

然后在函数内第二次打印时,因为我们还没有对a的值做任何改变,所以它打印的结果跟第一次没有任何区别。

当我们对a做了一个 1的操作,第三次打印时值变了,同时内存地址也变了,原来的那个4299092112内存地址所代表那个a不见了,转而被新的4299092144这个a 所取代。

这就叫做不可变对象,意思就是你可以直接用我的数据但是别改变我的数据,如果硬要改变、那么对不起、你需要创造一个新的变量出来。

所以在我们第四次打印时,a的值跟第一次和第二次一样,因为它的并没有做出任何改变。


注意: 函数内的变量名跟外面没有任何关联。

上面的例子可以说明,函数内的变量名跟外部没有半毛钱关系的、没有冲突、也没有交融、仅仅作用与函数内部。

另外内存地址在代码每次运行时都会重新申请并产生,不用纠结它为什么跟上次不一样。

如果我们传递一个可变对象给函数时,那么传递的是它的引用地址,如果在函数内,我对这个对象的内容进行了修改,那么当函数运行完毕后,它的值也保留我在函数内的修改,这就叫做引用传递,跟值传递相比我传递进去的就是一个名字,而非身体。


以上代码我们可以发现,无论是在函数内还是函数外,我修改的都是a这个变量的值,它始终如一跟着我们进出函数,身体虽然都被改变了,但是名字和灵魂始终如一。

关于自定义函数的基本用法我们暂时讲到这,将来会有更多复杂高级的用法教给大家,下一章我们讲python的内置函数。

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved