2.2 函数、缩进、注释
我们知道数学上有函数,表示为y=f(x)的形式,编程语言上也有函数,表示形式也差不多。编程语言上的函数就是一个子程序块,为了让程序更加的模块化,通俗上来讲,如果把一个大的程序全部一股脑的从头写到尾,可能还没写到一半,前面的东西写了什么就忘了,维护起来特别困难。我们知道在公司里都是团队协作,如果没有清晰的模块化处理,别人也很难看懂。而且最重要的是模块化有一个好处就是可复用性。
比如说,我们想做一个养宠物的小游戏,其中有一只宠物是一只狗,名字叫“阿狗”。那么我们简单的写一下Python可以怎么写:
dog_name = "阿狗"
那这只狗需要吃东西,我们就可以写:
print("开始吃了")
print("吃一半了")
print("吃饱了")
如果我们再养一只宠物,是只猫,也需要吃东西,那我们也需要写:
cat_name = "阿猫"
print("开始吃了")
print("吃一半了")
print("吃饱了")
我们就会发现,吃罐头的动作是我们饲养动物的游戏里面必须的,如果每一只都要写一句那岂不是很麻烦。这时候模块化有个好处了,就是可以把一样的东西合在一起。我们用函数来使我们的代码更加模块化,Python跟很多编程语言一样,需要先定义我们的函数,就是告诉计算机我们的函数是什么,再使用我们的函数。我们先定义吃东西的函数:
def eat_food():
print("开始吃了")
print("吃一半了")
print("吃饱了")
函数有以下一些特点:
① 函数定义以“def”关键词开头(define),后接函数标识符名,在接英文圆括号()
② 函数可以在圆括号内传入参数
③ 函数内容以冒号起始,并且缩进
④ 可以使用return回调一个值给调用者,如果不写return,则返回None。
我们逐个解释一下。第一点和第三点就是函数定义的规范,在上面代码可以看到。缩进就是按tab键,表示在下一层级内,这个层级是相互嵌套的,如果里面有条件语句之类的,还会继续缩进,比如下面的例子,层级是相互嵌套的:
def example():
if 1 + 1 == 2:
print("1+1=2")
有些计算机语言是使用花括号{}来表示层级关系的,比如java,使用缩进有个好处,就是不用担心花括号会不会漏写左括号还是漏写右括号,也能节省代码行数,强制性的缩进还能使代码更加简洁易读。
我们编写了eat_food()函数之后,我们写猫狗吃饭的函数就可以简化了,像下面一样:
def eat_food():
print("开始吃了")
print("吃一半了")
print("吃饱了")
dog_name = "阿狗"
eat_food()
cat_name = "阿猫"
eat_food()
再想一下,我们不知道吃的主语是什么,这就是函数的第二点,函数是可以传参的,传入什么就会变成什么,我们修改一下我们的函数并实验一下:
def eat_food(animal_name):
print(animal_name)
print(animal_name + "开始吃了")
print(animal_name + "吃一半了")
print(animal_name + "吃饱了")
dog_name = "阿狗"
eat_food(dog_name)
cat_name = "阿猫"
eat_food(cat_name)
![](https://img2018.cnblogs.com/blog/761788/202002/761788-20200223184937361-1472780088.png)
我们可以看到,参数传入的值是阿猫,animal_name就变成阿猫,传入阿狗,animal_name就是阿狗。
那第四点return是什么?就是返回值,比如我们可以将eat_food状态返回,代码可以修改成这样:
def eat_food(animal_name):
print(animal_name)
print(animal_name + "开始吃了")
print(animal_name + "吃一半了")
print(animal_name + "吃饱了")
return animal_name + "心情愉悦,爱心值 +100,差100可升级进化"
dog_name = "阿狗"
dog_mood = eat_food(dog_name)
print(dog_mood)
cat_name = "阿猫"
cat_mood = eat_food(cat_name)
print(cat_mood)
我们用一个py文件来验证这个结果。
![](https://img2018.cnblogs.com/blog/761788/202002/761788-20200223184937783-294228057.png)
![](https://img2018.cnblogs.com/blog/761788/202002/761788-20200223184938059-437323507.png)
其结果被打印出来,return的作用就是返回一个对象,我们如果用一个变量去“承接”这个返回值,就能去利用得到的这个变量。这样看起来,python的函数其实跟数学的函数y=f(x)是类似的。另外,再Java中,函数被叫做方法,知道指的是函数就行。
说完这个函数和缩进,我们在讲一些注释。顾名思义,就是给代码增加注释,使得让代码更加容易理解。Python有三种注释方式,分别使用符号#号,'''和"""(三个英文单引号和三个英文双引号)。#号可以用来注释一行文字,'''和"""可以用来注释包含区域内的文字。#号用于所需要注释的文字的前面(可以跟一个空格,比较美观),'''和"""没什么区别,都需要前后都加。
# 第一个注释
# 第二个注释
'''
第三注释
第四注释
'''
"""
第五注释
第六注释
"""
我们刚才写的代码可以在修改一下,加一些注释:
def eat_food(animal_name):
""" 用来表示动物的吃饭动作
:param animal_name: 动物的名字
:type animal_name: string
:return: 动物吃完饭的状态
:rtype: string
Usage::
>>> eat_food('小强')
小强心情愉悦,爱心值 +100,差100可升级进化
>>> eat_food('大强')
大强心情愉悦,爱心值 +100,差100可升级进化
"""
print(animal_name)
print(animal_name + "开始吃了")
print(animal_name + "吃一半了")
print(animal_name + "吃饱了")
return animal_name + "心情愉悦,爱心值 +100,差100可升级进化"
dog_name = "阿狗" # 一只狗的名字
dog_mood = eat_food(dog_name)
print(dog_mood)
cat_name = "阿猫" # 一只猫的名字
cat_mood = eat_food(cat_name)
print(cat_mood)
# 如果不在这里做一个输入,使用py文件打印数据的窗口就会一闪而过,用输入做一个等待
input("请按任意键关闭窗口")
大家可以看到,#号是注释后面的内容的,可以放在语句后面,也可以重开一行放语句的前面。然后在留意一下函数的注释方式,虽然我们规范要求,但是很多IDE会自动读取注释,再调用时做提示,我们按照这样的格式编写函数,可以记录函数的一些属性,免得使用出错。内容比较好理解,这里就不多解释了,Python3还提供了另一种为函数注释的方法,使用:(冒号)对参数类型做注释,使用->横线加箭头对返回值类型做注释。如下所示,但个人认为影响阅读,个人不推荐使用。
def text(a:'int 写啥都行,不写也可以') -> 'str':
pass # pass的意思是跳过,什么都不做。如果这个函数没有内容,编译会报错,可以用pass来占据位置,但什么都不做。
【
这里补充一个知识点,python里面的变量名、函数名的命名方式问题,也就是标识符的命名方式。一般来说标识符的命名没有硬性要求,胡乱命名大多也能编译,但是代码不单单是给机器看的,我们自己或者同事也是需要阅读到代码的,所以需要规范一下命名,否则很难读懂。比如用来表示一只狗的变量命名为dog就一看即懂,如果命名为a,一个字母,也能编译成功,但是阅读性就超差。
一般来说,标识符的命名有几个要求:
① 名字需要有见名知义的效果
② 标识符可以由字母、下划线和数字组成
③ 不能以数字开头
④ 不能与关键字重名
关键字,就是在python内部已经使用的标识符,比如说如果使用“print”做变量名就编译不通过。另外需要注意的是,python是区分大小写的,比如说用dog命名的变量,和dOg命名的变量,是不同的变量。
比较常见的一种命名规则,很多常用编程语言比较推荐的,就是“驼峰命名法”。“驼峰命名法”又分“小驼峰”和“大驼峰”。“小驼峰”就是除了第一个单词之外,其他单词首字母大写,比如说myStudentName。可以看到这个没有下划线,但也见名知义,常用于变量名。“大驼峰”就是每个单词的首字母都使用大写字母,常用于类名、属性、函数名、命名空间等。
Python的变量名和函数名推荐使用的命名规则是“下划线命名法”,就是在单词直接用下划线连接起来,所有字母都用小写。比如说dog_name的变量,一看就知道是用来存储狗名字的。常量名一般全部大写,如用多个单词则用下划线隔开,比如说MAX_CLIENT = 100。如果是私有函数,则在函数前加多一个下划线。类名则推荐使用大驼峰命名法,私有类也是在命名前加一个下划线。
命名规则看起来挺多的,但是用起来就没感觉有多复杂,多写代码就熟悉了。
】
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">