函数是带名字的、可被重复使用的代码块,用来完成单一或是相关联的功能。例如Python内置的print()
、len()
、range()
等就是函数,除此之外我们也可以自定义函数。
def hello():
print('hello')
hello()
输出:
hello
我们使用def
关键字来定义函数,具体规则如下:
- 函数代码块以
def
关键词开头,后接函数名称
和圆括号()
。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒
:
号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的
return
相当于返回None
。
例如我们定义一个计算长方形面积的函数:
def x(a,b):
s = a * b
return s
>>> x(4,5)
20
示例中,函数x
可以接受两个参数:形参a
和形参b
。在调用函数x
的时候,我们向其传递了实参4
、5
,结果显示它成功计算除了面积。
函数中可能包含多个形参,因此我们需要传递多个实参,依据不同情况,参数传递的方式很多:位置参数
、默认参数
、关键字参数
、可变参数
等。
位置参数需要按照正确的顺序传入,按照位置关联依次将实参传递给形参的传递方式叫做位置参数
:
如上个例子:
def x(a,b):
s = a * b
return s
>>> x(4,5)
20
值4
、5
按照顺序赋值给参数a
、b
。参数a
、b
都是位置参数。
如果我们想要计算的长方形面积的宽大多时候都是长度为5
,就可以使用默认参数:
def x(a,b=5):
s = a * b
return s
>>> x(4)
20
在示例中,参数b
就是一个默认参数,默认值为2
,当我们调用函数x(4)
时,相当于我们调用了x(4,5)
。设置默认参数时,必选参数在前,默认参数在后。
可变参数就是传入的参数个数是可变的,可以是1
个、2
个到任意个,还可以是0
个。
def x(a,*b):
print(a)
for i in b:
print(i)
x(1)
x(1,1,2,3,4,5,7)
输出:
1
1
1
2
3
4
5
7
如果想把一个列表或元组传入可变参数,可以这样:
>>> nums = [1, 2, 3]
>>> x(1,*nums)
1
1
2
3
*nums
表示把nums
这个list
的所有元素作为可变参数传进去。这种写法相当有用,而且很常见
关键字参数是传递给参数的参数名称-值
对,使用关键字参数时无需考虑传入顺序。
def x(a,b):
s = a * b
return s
>>> x(b=4,a=5)
20
关键字参数可以拓展程序的功能,试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。
def x(a,b,**kw):
s = a * b
print(s,'\n',kw)
x(4,5,other='这是描述')
输出:
20
{'other': '这是描述'}
函数并非总是直接打印输出,有时它需要处理一些数据并返回一个或一组值。返回的值成为返回值
。可以使用return
语句将值返回到调用函数所在的代码行:
def get_full_name(f_name,l_name)
full_name = f_name.title() + ' ' + l_name.title()
return full_name
a = get_full_name('joecy','wang')
print(a)
输出:
Joecy Wang
函数get_full_name
将处理过的姓名返回到调用行,并存储在变量a
中。
返回值可以将复杂工作转移到函数中去,从而简化主程序。
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py
。模块可以被别的程序引入,以使用该模块中的函数等功能。假如我们已经保存了包含函数的模块x.py
。
import x
导入整个模块时,可以使用下面的语法调用模块中的函数:
x.func()
for x inport func1
想要一次性导入更多函数,只需要将函数名用,
号分隔:
for x inport func1,func2,func3...
导入特定函数时,调用它就无需使用句点法。
func1() # 无需使用句点法,直接调用
for x inport func1 as f
这样,我们在调用函数func1
时,可以简写:
f() # 等同于func1()
可以通过给导入的函数指定别名避免与主程序中的函数重名。
import module as x
这样我们就将模块module
指定了别名x
,在调用其中函数时,也可以简写:
x.func1() #等同于module.func1()
给模块指定别名可以让我们专注函数名而忽略模块名。
from x inport*
这种导入方式,将把模块中的所有函数都导入进来,且无需使用句点法
调用。但是不推荐。