0.前言
这篇文章将介绍Python中的函数构造及调用,包括一些细节上需要注意的问题。
1.函数的基本概念
1.函数的特点:
- ①函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
- ②函数能提高应用的模块性,和代码的重复利用率。
- ③函数分为库函数(如print等)和自定义函数
2.自定义函数定义规则:
- ①函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- ②任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- ③函数的第一行语句可以选择性地使用文档字符串用于存放函数说明。
- ④函数内容以冒号起始,并且缩进。
- ⑤return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
2.定义一个函数并调用它
基本语法:
def 函数名(参数列表):
函数体
实例:创建一个求积函数,并使用它。
def multiply(a, b):
print("a * b =", a*b)
return
multiply(2, 3)
multiply('*', 3)
运行结果:
a * b = 6
a * b = ***
注意:
函数体与其他代码之间应有两个空行,从上面代码可以看出参数可以是任意类型的。
3.自定义函数参数
- 函数的参数可以是任何类型的数据,包括字符串、列表、元组、字典和集合。
- 函数的参数分为:必需参数、关键字参数、默认参数、不定长参数
1.必须参数:调用带参数的函数时,参数的数量必须和声明时的一样。
def text(str_a, int_b):
print(str_a * int_b)
return
text('*', 5)
运行结果:
*****
注意:
创建函数时,声明了str_a和int_b两个参数,所以调用text函数的时候,也应该传入两个参数。
2.关键字参数:函数调用使用关键字参数来确定传入的参数值,可以不用指定传入顺序。
def text(name, age):
print("姓名:%s" % name)
print("年龄:%d" % age)
return
text(age=18, name='CainCary')
运行结果:
姓名:CainCary
年龄:18
注意:
这个函数的关键字为name和age,当用关键字确定传入值时,可以不用考虑顺序。
3.默认参数:调用函数时,如果没有传递参数,则会使用默认参数。
def text(name, age=15):
print("姓名:%s" % name, end=" ")
print("年龄:%d" % age)
return
text(age=18, name='CainCary')
text(name='Cain')
运行结果:
姓名:CainCary 年龄:18
姓名:Cain 年龄:15
注意:
可以看出,定义函数时,可以指定参数的值,调用函数时也能修改参数。当没有指定参数时,函数就会使用声明时定义的默认参数。
若未给参数设定初值,则必须传入参数,否则会报错。
4.不定长参数:当需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。
看下面实例:带(*)号的参数
def stu(*student):
print(student)
print(type(student))
return
stu('Cain', 5320, 18, 'man')
运行结果:
(‘Cain’, 5320, 18, ‘man’)
<class ‘tuple’>
注意:
加了星号(*) 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
看下面实例:带(**)双星号的参数
def stu(**student):
del student["年龄"]
print(student)
print(type(student))
return
stu(姓名='Cain', 年龄=18, 性别='男')
运行结果
{‘姓名’: ‘Cain’, ‘性别’: ‘男’}
<class ‘dict’>
注意:
带(**)的参数将传入字典类型,传入参数的形式应该是(key=value,…),函数体可以使用字典相关的处理操作,前提是你传入的参数中要带这个键,否则会报错。
对比带(*)和(**)的参数
参数类型 | *argument | **argument |
传入数据类型 | 元组 | 字典 |
调用函数格式 | 可以是任意的基础类型,用逗号隔开 | 必须是赋值形式,表示键值对 |
例子 | stu(‘Cain’, 5320, 18, ‘man’) | stu(姓名=‘Cain’, 年龄=18, 性别=‘男’) |
相同之处:
每个函数最多只允许存在一个带(*)或(**)的参数,但它们可以同时存在,并且都能进行相关数据类型的处理,单星参数可直接看成元组,双星参数可直接看成字典。
def stu(*stut, **student):
print(stut)
print(stut[0]*stut[1])
print(student)
return
stu('*', 10, 姓名='Cain', 年龄=18, 性别='男')
运行结果:
(’*’, 10)
**********
{‘姓名’: ‘Cain’, ‘年龄’: 18, ‘性别’: ‘男’}
如果是多种类型参数混合,又是怎么处理的呢?看下面例子:
def stu(a, *st1, b, **st2):
print("a传入的值:", a)
print("*st1传入的值:", st1)
print("b传入的值:", b)
print("**st2传入的值:", st2)
return
stu('a', 1, 2, 3, b=2, name='cain', age=18)
运行结果:
a传入的值: a
*st1传入的值: (1, 2, 3)
b传入的值: 2
**st2传入的值: {‘name’: ‘cain’, ‘age’: 18}
注意:
普通参数只能放在(**)参数之前,可以放在(*)参数之后,若放在(*)参数之后,必须用关键字参数的方法传入。
当多种类型参数混搭时,要注意参数的顺序问题,不能混插。