函数

函数是带名字的、可被重复使用的代码块,用来完成单一或是相关联的功能。例如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的时候,我们向其传递了实参45,结果显示它成功计算除了面积。

参数传递

函数中可能包含多个形参,因此我们需要传递多个实参,依据不同情况,参数传递的方式很多:位置参数默认参数关键字参数可变参数等。

位置参数

位置参数需要按照正确的顺序传入,按照位置关联依次将实参传递给形参的传递方式叫做位置参数

如上个例子:

def x(a,b):
    s = a * b
    return s
>>> x(4,5)
20

45按照顺序赋值给参数ab。参数ab都是位置参数。

默认参数

如果我们想要计算的长方形面积的宽大多时候都是长度为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()  # 无需使用句点法,直接调用

使用as给函数指定别名

for x inport func1 as f

这样,我们在调用函数func1时,可以简写:

f()  # 等同于func1()

可以通过给导入的函数指定别名避免与主程序中的函数重名。

使用as给模块指定别名

import module as x

这样我们就将模块module指定了别名x,在调用其中函数时,也可以简写:

x.func1()  #等同于module.func1()

给模块指定别名可以让我们专注函数名而忽略模块名。

导入模块中所有函数

from x inport*

这种导入方式,将把模块中的所有函数都导入进来,且无需使用句点法调用。但是不推荐。