文章目录
一 函数的定义和调用
1. 什么是函数
函数对我们来说应该是比较熟悉了,因为我们初中就开始学函数了!函数可以这么理解,即具有某种特定功能的表达式或者方程式,用它可以完成某些特定功能。在python,中函数也是一样,即用来完成某些特定的功能,只不过把数学中的表达式或方程式换成了代码块,不同的函数或者不同的代码块实现不同的功能。
使用函数最大的好处就在于避免重复编写实现相同功能的代码,从而提升编程效率。
2. python中的函数的语法格式
def 函数名(参数1,参数2,...):
函数体
在python中用关键字def来定义函数,接着跟函数名,括号里是参数,函数体为实现某功能的代码块。
3. 函数的调用
编写好函数块后,要通过调用才能使函数运行,如下
def ceshi():
#这是一个简单的函数
print("键盘敲烂,工资过万")
ceshi()#调用函数
结果
二 函数的参数
1. 形参和实参
我们在刚刚接触函数编程的应该都会学到什么是形参和实参,说实话,大学的时候,刚刚基础编程的我还理解了好久呢!这里再来温习一下。
- 形参:在我们定义函数的时候,括号里的参数就叫形参
- 实参:在我们调用函数的时候,传入的参数就是实参
如下
这其中,name1和name2就是形参,‘A’和‘B’就是实参。形参是我们定义函数的时候有的,而实参是我们调用函数传入的。
2. 必须参数
python函数参数大致可以分为4种,即必须参数,关键字参数,默认参数和不定长参数。先来说说必须参数,必须参数是在函数调用时必须要传入的参数,而且传入的实参要和定义时的形参位置要一一对应,不然会报错或者结果不符合预期。如下
def add(a, b):
"""实现两个数相加"""
total = a - b
print(total)
#a,b是必传参数,不传或者不全都会报错
add(1)
结果报错,缺少一个b参数
def add(a, b):
"""实现两个数相加"""
total = a - b
print(total)
#传入的实参和形参位置不对,结果不同
add(1, 3)
add(3, 1)
传入的实参和形参位置不对,结果不同。因此,对于必须参数来说,传入的实参个数和形参个数一定要相同,而且位置也要一一对应。
3. 关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时实参顺序与形参顺序不一致,因为 Python 解释器能够用参数名匹配参数值。如下
def user(name, age):
"""储存用户信息"""
print("name", name)
print("age", age)
#改变传入实参与对应形参的位置,不影响输出结果
user('刘德华', 55)
user(age=55, name='刘德华')
结果
4. 默认参数
在调用函数时,如果形参有默认值,而在传实参的时候没有对应的参数,则会取形参的默认值。如果传了,就以为实参的值为准。
使用默认参数是要特别注意**默认参数一定要放在命名参数后面,不然会报错。**如下
def user(name='刘德华', age):
"""储存用户信息"""
print("name", name)
print("age", age)
#默认参数没有放在最后面,报错
user(55)
结果
D:\Anconda3\python.exe D:/python/python基础/python基础/函数.py
File "D:/python/python基础/python基础/函数.py", line 23
def user(name='刘德华', age):
^
SyntaxError: non-default argument follows default argument
结果
def user(name, age=55):
"""储存用户信息"""
print("name", name)
print("age", age)
#默认参数放在最后面,正确输出
user('刘德华')
D:\Anconda3\python.exe D:/python/python基础/python基础/函数.py
name 刘德华
age 55
5. 不定长参数
当我们不确定要传入的参数个数时,可以使用不定长参数,不定长参数有两种格式,与上面两种参数略有不同,如下
- *args:加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
- **kargs: 加了两个星号 ** 的参数会以字典的形式导入,即key=value的形式
def add(a, *args, **kwargs):
#不定长参数
print("我是命名参数:", a)
print("我是可变参数1,以元组形式传入:", args)
print("我是可变参数2,以字典形式传入:", kwargs)
#只传命名参数
add(1)
D:\Anconda3\python.exe D:/python/python基础/python基础/函数.py
我是命名参数: 1
我是可变参数1,以元组形式传入: ()
我是可变参数2,以字典形式传入: {}
def add(a, *args, **kwargs):
#不定长参数
print("我是命名参数:", a)
print("我是可变参数1,以元组形式传入:", args)
print("我是可变参数2,以字典形式传入:", kwargs)
#传入命名参数和不定长参数
add(1,2,3,b=4,c=5)
D:\Anconda3\python.exe D:/python/python基础/python基础/函数.py
我是命名参数: 1
我是可变参数1,以元组形式传入: (2, 3)
我是可变参数2,以字典形式传入: {'b': 4, 'c': 5}
6. 函数参数位置顺序
命名参数(必须参数) > 默认参数(*args参数)> **kwargs参数
三 匿名函数(lambda函数)
1. 定义及特点语法格式
所谓匿名函数,就是没有函数名,也就不需要用def关键字来定义,它只是一个表达式,比起def函数要简单的多,一般也只用于处理一些简单的逻辑。语法格式如下
lambda 参数1,参数2,... 参数n: 表达式
例子
#定义一个lambda函数,实现两个数的加法运算
sum_data = lambda a, b: a + b
print(sum_data(12, 3))
print(sum_data(4, -3))
2. lambda函数的特点
lambda函数以下几个特点
- lambda 只是一个表达式,函数体比 def 简单很多
- lambda函数的主体是一个表达式,而不是代码块;也仅仅只能在lambda表达式中封装有限的逻辑
- lambda函数有自己的命名空间,不能访问表达式之外的参数
在处理一些简单逻辑但又不想用def定义函数时,就可以使用lambda函数,如果处理的逻辑比较复杂代码比较多时,还是使用def较好。
四 函数返回值return
在编程规范里,函数都是有返回值的!上面说了函数是实现某一特定功能的代码块,既然是做一件事,那么就得有反馈结果,成功或者失败,亦或其他;就像 y=ax + b一样,只要你给一个x就会有一个对应的y返回。上面的反馈结果即就是函数的返回值。
- 不带return的函数,返回值为控
def add(a, b):
result = a + b
#返回空值
print(add(2, 4))
- 带return的函数
def add(a, b):
result = a + b
return result
#返回result
print(add(2, 4))
- 返回多个值
return可以同时返回多个值,下面函数有两个return语句,那么会返回两个值吗?
def add(a, b, c, d):
result1 = a + b
#第一个return
return result1
result2 = c + d
#第二个return
return result2
re1 = add(1, 2, 3, 4)
print(re1)
在写一个函数,也包含两个return语句,如下
def guessNumber(a):
if a > 3:
return 1
else:
return 2
print(guessNumber(5))
print(guessNumber(2))
通过上面的结果可以看出,第一个函数,我们想要的是返回两个值,即result1和result2,但结果只返回了result1;再看第二个函数,我们分别传了a=5(a>3,希望返回1)和a=2(a<3,希望返回2),调用函数结果输出和预期的一样。为什么会这样呢?这就是return语句的特点了,如下
- 返回函数的结果值
- 当函数执行return语句后就表示该函数已经执行完毕,不在执行后面的代码
- 一个函数只能执行一次return
这样,函数1和函数2为什么输出那么样的结果就很明确了。要使函数一返回result1和result2,其实应该这样写
def add(a, b, c, d):
result1 = a + b
result2 = c + d
return result1, result2
re1 = add(1, 2, 3, 4)
print(re1)
结果以为元组的形式返回result1和result2
这里要注意:return 是以元组的形式返回值的
五 局部变量与全局变量
1. 局部变量
什么是局部变量呢?顾名思义,局部变量只能该函数内(局部)使用。有如下几个特点
- 局部变量,是在函数内部定义的变量
- 局部变量使用的范围是本函数内部,其他函数以及外部访问一律无效
- 当函数被调用是,局部变量被创建,函数调用结束时,局部变量又被释放
如下
def number():
#定义局部变量a, b
a = 1
b = 2
print(a, b)
#调用时局部变量生效
number()
#不调用时,进行外部访问无效
print(a, b)
2. 全局变量
那什么又是全局变量呢?全局变量与局部变量相反,即既能够在函数内部调用,也能在外部其他地方调用。如下
a = 1
b = 2
def number():
#定义局部变量c,d
c = 1
d = 2
#函数内部调用a,b
su = a + c
st = b + d
print("su:", su)
print("st:", st)
#调用函数
number()
#打印全局变量a,b
print("a b:", a, b)
结果如下
3. 当全局变量遇到局部变量
先说结论,当局部变量和全局变量的变量名字一样时,局部变量的作用域以为局部变量值为准,此时改变局部变量的值不会影响全局变量的值,如下
#定义全局变量a,b
a = 1
b = 2
def number():
#定义局部变量c,d
a = 3
b = 4
print("函数内部的局部变量a:", a)
print("函数内部的局部变量b:", b)
#调用函数
number()
print("--------------------------")
#全局变量a,b的值不会变
print("全局部变量a:", a)
print("全局部变量b:", b)
结果全局变量a,b的值不会改变,如下
4. 用global在函数内部修改全局变量
如果想在函数内部修改全局变量,怎么办?用global。**如果你在函数内部对某个变量使用了global,那么它就成为了全局变量,你在函数内部对它的任何修改都会作用于全局。**如下
#定义全局变量a,b
a = 1
b = 2
def number():
#用global修改全局变量
global a, b#声明这是全局变量,而非局部变量了
a = 3
b = 4
print("函数内部的修改后的a:", a)
print("函数内部的修改后的b:", b)
#调用函数
number()
print("--------------------------")
#全局变量a,b的值会变,因为被函数number改了
print("全局部变量a:", a)
print("全局部变量b:", b)
结果如下,全局变量a,b的值回跟着边,因为被函数number改了