往期回顾:
- [Python] 入门(1):安装 Python 及必要组件
- [Python] 入门(2):Python 基础 – 变量
- [Python] 入门(3):Python 基础 – 内建函数
- [Python] 入门(4):Python 基础 – 列表和词典的方法
- [Python] 入门(5):Python 基础 – 字符串的方法
- [Python] 入门(6):Python 基础 – Python 基础 – 循环,条件和迭代器
- [Python] 入门(7):Python 基础 – 自定义函数(本文)
- [Python] 入门(8):Python 基础 – 解析式,生成器和程序错误
- [Python] 入门(9):Python 基础 – 字符串格式化
- [Python] 入门(10):Python 基础 – 面向对象编程
本文目录
虽然 Python 中内建函数可以满足很多要求,但总是不够用。Python 有个非常强大的功能:允许我们自定义函数。Python 的自定义函数语法如下:
def 函数名():
动作
区区函数,花样不少。下面咱们就来看看函数能玩出什么花来。
没有变量的函数
这是最简单的函数,即函数名后面的括号里什么也不写。请看举例:
>>> def print_num():
... for i in range(3):
... print(i)
>>> print_num()
0
1
2
在定义一个函数以后,就可以随时调出了。
return 声明
如果函数不以一个动作结束,而是返回一个或几个变量,那么就要用到 return
声明。return
声明的作用是”返回给定的变量值“。
>>> def add():
... sum = 1 + 2
... return sum
>>> add()
3
有给定数量的变量的函数
没有变量的函数灵活性太低,因此倒数时候函数是有变量的。把变量名写入函数名的括号里就可以了。我们来把上面打印数字的函数改造一下,让它可以打印指范围的数字。
>>> def print_num(i, j):
... for i in range(i, j):
... print(i)
>>> print_num(i = 0, j = 2) # 名称对应
0
1
>>> print_num(1, 3) # 位置对应
1
2
当变量多于一个的时候,需要指定赋值的变量。指定变量有两种方式,一个是名称对应,一个是位置对应。如果没有提供变量名,Python 会尝试着根据位置猜测变量的对应,但经常不好使,所以推荐无论何时都用名称对应。
可选变量
有时候我们不需要每次都指定所有变量,这时候我们只需要在函数名后面的括号内给某些变量赋值作为默认值就可以了。如果我们调用这个函数时没有给定变量数值,函数会以默认值运行。
>>> def print_num(i, j = 4): # 规定可选变量 j 的默认值是 4
... for i in range(i, j):
... print(i)
>>> print_num(i = 0) # 使用 j 的默认值 4
0
1
2
3
>>> print_num(1, 3) # j 的值被覆盖为 3
1
2
不定变量数量的函数
有时候我们不知道需要多少个变量,这时候我们只需要将变量改为 *变量
即可,通常叫 *arg
。
>>> def cc(*arg, sep = "-"):
... return sep.join(arg)
>>> cc("1", "2", "3", sep = ".")
'1.2.3'
不定变量对数量的函数
有时候我们希望以字典的形式作为函数的变量,这时候我们只需要将变量改为 **变量
,通常叫 **kwarg
。
>>> def print_pair(arg, **kwarg):
... for key, value in kwarg.items():
... print(arg, " have ", key, ": ", value, sep = "")
>>> print_pair("I", apple=1, orange=2)
I have apple: 1
I have orange: 2
字典变量以 =
连接键和值。
lambda 匿名函数
很多时候我们没必要或不方便写一个完整的函数,或者没必要为这个函数命名,lambda 函数应运而生,它可以用一行代码完成。它的语法是:
lambda 变量:变量的动作
老宅在《[Python] 入门(3):Python 基础 – 内建函数》里已经举了一个例子:
>>> list(filter(lambda x:x>1, [0, 1, 2, 3]))
[2, 3]
lambda x:x>1
就是一个匿名函数。
Docstring
很多代码写完了,没几天自己就不知道是干嘛的了。为了避免这个情况,函数中有一个叫做 “Docstring” 的部分用来记录函数的功能。Docstring 的写法是:在函数头的下一行,函数体的上面,用三个单引号或双引号把说明括起来。比如:
>>> def add():
... """两数相加求和"""
... sum = 1 + 2
... return sum
想获得函数的说明,可以通过 函数.__doc__
或 help(函数)
的方法。
>>> help(add)
Help on function add in module __main__:
add()
两数相加求和
>>> add.__doc__
'两数相加求和'
嵌套函数
嵌套函数、嵌套函数和循环、条件都是可以的,能够写出非常复杂的结构。
练习(写出生成如下变量的代码或结果):
写一个函数(取两个变量的函数就行),键为身高,值为体重,在函数内计算 BMI = 体重 / 身高^2(身高的平方),根据如下标准返回结论:BMI 小于 18.5,过瘦; BMI 在 18.5-25 这间,正常;BMI 在 25-30 之间,偏胖;BMI 大于 30,肥胖。
将(身高:1.75,体重:65;身高:1.80,体重:90;身高:1.60,体重:45)代入函数。这三个人的体形如何?
答案下篇文章公布。欢迎把答案留言与老宅交流、互动!
上一篇练习的答案:
给定 1-10,假如可以被 2 整除,打印 foo
;假如可以被 3 整除,打印 bar
;如果可以被 6 整除,打印 foobar
;其它数打印自己。
>>> for i in range(1, 11):
... if i % 6 == 0: # 必须先检验能否被 6 整除,否则会跳过
... print("foobar")
... elif i % 2 == 0:
... print("foo")
... elif i % 3 == 0:
... print("bar")
... else:
... print(i)
1
foo
bar
foo
5
foobar
7
foo
bar
foo