从前面的几篇博客中,我们已经熟悉了print()、input()和len()函数。Python提供了这样一些内建函数,但你也可以编写自己的函数。"函数"就像一个程序内的小程序一样。
在之前的学习中,只是用Python实现了一些简单的功能,这些功能也只是由简单的流程控制语句配合数据类型(如列表、字典)实现,但是这些程序有着无法避免的缺陷,比如说:
- 代码耦合性太高,各功能都糅合在一起,“干湿”不分离。
- 扩展性差,由于代码都揉在一起,如果要添加新的功能,可能就要费一番功夫了。
- 代码冗余,比如实现一个加法功能,那么当别处还需要这个功能的话,还要重新实现这个功能,这种情况多了,就是在重复的造轮子,这种情况是不可取的。
- 可读性差,经过如上的几种不可避免操作之后,代码可读性就变得非常差。
列举了如上的几种目前代码的弊端之后,该如何解决呢?解决方法就是使用函数。其实我们在之前的学习中已经体会到函数的好处了,比如要计算一个列表的长度,可能想到用for循环解决问题:
count = 0
li = ['曹操','吕布','周瑜','孙权','马超','郭嘉']
for i in li:
count += 1
print(count)
# 结果为:
6
当要计算一串字符串、元组的长度,此时不可避免的陷入重复造轮子的过程。知道学习了len()函数之后。
li = ['曹操','吕布','周瑜','孙权','马超','郭嘉']
print(len(li))
# 结果为:
6
函数的定义与调用
创建(定义)函数
def <function_name>([arg1,arg2,...argn]):
'''
functional annotation
'''
pass
return
通过def关键字来定义函数,空格之后的function_name 为函数名(必须有),函数的命名规则参考变量的命名。括号(必须有)内的参数是可选的,括号后面的 : 也是必须的。注释部分为可选的(但强烈建议有注释,就像功能说明书一样),pass部分为函数的具体功能实现代码。执行结果视情况可以选择用return返回,如果没有显式的return具体内容的话,默认返货None。
虽然def 为关键字,但def也是可执行的语句,就是说当定义完函数之前,这个函数此时是不存在的:
print(dir())
def fun():
pass
print(dir)
# 结果为:
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__',