从本节课开始,我们就进入到了高级编程的阶段,这个阶段有两节课:函数 和 类。本节要将的是 函数 相关的知识。
零、什么是函数
函数,通俗的说就是 具有名字的用于完成指定工作的代码块。 使用函数的优点如下:
- 程序的编写、测试和修正更加简单;
- 增加代码的复用,减少了代码的重复;
- And More…
一、定义函数
- 无参函数 无参函数,通俗说就是无需传递参数也可以正确执行的函数。语法如下:
def 函数名():
函数体
我们通过函数来看一下无参函数的定义:
代码语言:javascript复制# 定义一个1 1的函数
def addition():
num1 = 1
num2 = 1
result = num1 num2
print(result)
# 调用函数
addition()
- 有参函数 我们在上一小节学会了无参函数的定义,但是我们会发现一个问题,我们编写的函数只能计算1 1,而不能计算1 2,2 2之类的,因此我们就需要有参函数了。语法如下:
def 函数名称(形参1,形参2,...,形参N):
函数体
我们依然通过例子来看一下:
代码语言:javascript复制def addition(num1,num2):
result = num1 num2
print(result)
# 调用函数
addition(1,3)
这里面有两个概念需要简单讲一下,一个是 形参,一个是 实参。函数中的 num1 和 num2 变量就是形参,而传入函数的 1 和 3 就是实参。
- 带返回值函数 在一些情况下,我们需要得到函数的执行结果,那么我们就可以使用带返回值的函数。语法如下:
def 函数名称([形参]):
函数体
return 返回值
我们通过例子来看一下具体用法:
代码语言:javascript复制def addition(num1,num2):
result = num1 num2
return result
# 调用函数
result =addition(1,2)
print(result)
在Python中,函数可以返回多个值,我们只需将返回值之间以 逗号 分割。我们看个例子:
代码语言:javascript复制# 定义计算函数
def Calculation(num1,num2):
# 加法运算
addition=num1 num2
# 减法运算
subtraction=num1-num2
# 乘法运算
multiplication=num1*num2
# 除法运算
division=num1/num2
# 输出加减乘除的结果
return addition, subtraction, multiplication, division
# 调用函数
addition, subtraction, multiplication, division =Calculation(1,2)
print("加法结果:%s 减法结果:%s 乘法结果:%s 除法结果:%s" %(addition,subtraction,multiplication,division))
注意:在接收函数返回值的时候,我们接收函数返回值的顺序一定要和函数内返回数据的顺序一样。
三、特殊函数
- 关键字实参 我们前面看到的函数的实参都是 位置实参 ,位置实参在传递参数时必须和函数的形参一一对应,顺序不能变。如果需要改变参数传递的顺序,则必须使用关键字实参,关键字实参的格式是:key=value,这样我们就可以不必按照参数顺序传递参数了,我们通过例子来看一下:
# 定义一个函数
def YourNameAndAge(name,age):
print("我的名字是:%s,今年 %s 岁" % (name,age))
# 调用函数,首先传入年龄,再传入姓名
YourNameAndAge(age=20,name="张三")
- 列表实参函数 列表实参可以包含多种类型的内容(数字、字典、字符串等),我们来看一下具体的使用:
# 定义一个打招呼的函数,并修改其中的数据
def hello(names):
names[0]="赵六"
for name in names:
print("你好 %s" % name)
# 定义列表
names=["张三","李四","王五"]
# 调用函数
hello(names)
在上面的例子中我们修改了列表的第一个值,在调用函数后,我们再次打印这个列表,会发现列表的第一个值已经改变。但是在某些情况下,我们不希望传入函数的列表内容被修改,但是函数体必须要修改列表内容,这个时候我们就用到了列表的副本,我们看一下具体怎么用:
代码语言:javascript复制# 定义一个打招呼的函数,并修改其中的数据
def hello(names):
names[0]="赵六"
for name in names:
print("你好 %s" % name)
# 定义列表
names=["张三","李四","王五"]
# 调用函数
hello(names[:])
这时我们在调用函数后,再次打印列表内容,发现列表内容并没有变。因为我们向函数传入列表的时候,传入的是列表的副本(切片),列表的副本用 [:] 表示。
- 默认值函数 在一些函数中,我们可以不传入指定的参数,这是因为我们在函数中使用了默认值,用法如下:
# 定义一个姓名函数
def name(name,age,height="170 CM"):
print("我叫 %s,今年 %s 岁,身高 %s "%(name,age,height))
# 调用函数两次,一次传入heighr,一次不传入
name("张三",30,"1.8 M")
name("李四",25)
我们第一次调用函数时传递了身高的参数,打印出了我们传入的身高,第二次调用函数时没有传递身高参数,因此系统打印出了默认的值
注意:如果形参有默认值,则形参要放在所有形参的后面
- 不定参数函数 有些情况我们不知道需要接收多少个参数,具体参数数量需要从传递的实参获得。这时我们就用到了不定参数,不定参数用 * 表示,我们看一下具体用法:
# 定义一个菜单函数
def menu(*args):
print("我点的菜有:")
for arg in args:
print(arg)
# 调用函数
menu('醋溜白菜','黄焖鸡','干锅牛蛙')
有时候我们及不知道要接受多少个参数,也不知道传递给函数的信息是什么样的,在这种情况下我们可以将函数的形参编写为任意键值对。任意键值对用 ** 表示,我们看一下用法
代码语言:javascript复制# 定义姓名函数
def name_func(**args):
name={}
for key,value in args.items():
name[key]=value
return name
# 调用函数
name=name_func(first_name='托马斯',last_name='张')
print(name)
五、函数扩展
当我们编写的函数很多的时候,可以将同类型的函数存储进 .py 文件中,这个文件就被称为 模块 。当我们要使用这个文件中的函数只需要引入这个模块。我们假设模块名称为: name.py,模块里面包含函数:fun1、fun2
- 导入整个模块
import name
- 导入指定函数
from name import fun1
- 导入所有函数
from name import *
四、小结
本节主要讲了函数的一些知识,这些知识比较多,但大家需要记牢。
五、作业
- 定义一个无参函数,并返回值
- 定义一个参数数量不定的函数,并且函数包含两个形参
- 将上面两个函数保存在模块中,并导入这个模块中的函数。