【Python学习笔记】Day06 - 函数
文章目录
函数是组织好的,可重复使用的,用来实现特定功能的代码段。
一、尝试写出一个函数并调用
Python里有一个统计字符串长度的内部函数 len( ) ,而我们可以自己定义一个统计字符串长度的函数 my_len( ) ,写出自己的函数。
def my_len(data):
count = 0
for i in data:
count += 1
print(f"字符串{data}的长度是{count}")
调用函数:
my_len(str1)
my_len(str2)
函数可以避免大量重复的代码,在需要做重复运算时,直接调用函数即可,从而提高程序复用性、减少复用性代码、提高编程效率。
二、函数的定义
函数的基础定义语法如下:
def 函数名(传入参数):
函数体
return 返回值
一个函数不一定要有传入参数,但必须要有括号。返回值并不必须有。函数必须先定义再调用。
函数的调用语法如下:
函数名(参数)
因此,一个完整的函数定义和调用代码如下:
def 函数名(传入参数):
函数体
return 返回值
函数名(参数)
三、函数的参数
传入参数的功能是,在函数进行计算的时候,接受外部(调用时)提供的数据。
例1,利用传入参数计算两数之和:
def add(x, y):
result = x + y
print(f"{x} + {y} = {result} ")
add(25, 36)
输出:
25 + 36 = 61
- 函数定义中,提供的 x 和 y,称之为形式参数(形参),表示函数声明将要使用2个参数,参数之间用逗号分隔。
- 函数调用中,提供的25和36,称之为实际参数(实参),表示函数执行时真正使用的参数值,传入时要按照形参顺序一一对应传入数据,使用逗号分隔。
四、函数的返回值
返回值就是程序中函数完成事情后,最后给调用者的结果。以一个简单的加法函数为例:
def add(a, b):
result = a + b
return result
r = add(1, 2)
print(r)
输出:
3
通过上述的例子,我么看到,函数通过 return 语句把内部的局部变量值传回给了外部变量 r ,这就是函数返回值的用途。
函数返回值的语法格式如下:
def 函数(参数...):
函数体
return 返回值
变量 = 函数(参数)
要注意,函数一旦执行了 return 语句,就会移交计算机控制权,因此函数体在遇到return后就结束了,所以在 return 后的代码不会执行。
如果没有使用return语句返回数据,函数有返回值吗?答案是肯定的。Python中有一个特殊的字面量:None,其类型为<class ‘NoneType’>,表示空的,无实际意义,当你不写 return 语句时,函数返回None,表示这个函数没有返回有意义的东西。
def say_hi():
print("Hi!")
result = say_hi()
print(f"无return语句,返回到的内容是{result}")
print(f"无return语句,返回到的内容类型是{type(result)}")
输出:
Hi!
无return语句,返回到的内容是None
无return语句,返回到的内容类型是<class 'NoneType'>
None作为一个特殊的字面量,还有着其他的应用场景。比如:
- 就用在函数无返回值的情况上。
- 在 if 判断中,None 等同于 False。
- 还可以在函数中主动返回 None,配合 if 判断语句。
def check_age(age):
if age > 18:
return "SUCCESS"
else:
return None
age_adult = check_age(16)
if not age_adult:
#age_adult == None,not None = True,触发
print("YOU ARE NOT AN ANDULT !")
输出:
YOU ARE NOT AN ANDULT !
- 利用None定义一些(暂时)不需要具体值的变量 。
#暂不赋予变量具体值
name = None
五、函数的说明文档
函数是纯代码语言,想要理解其含义,就要一行行地去阅读理解代码,效率较低,我们可以给函数添加注释(说明文档),辅助理解函数的作用,通常格式如下:
def func(x, y):
"""
函数说明
:param x: 形参x的说明
:param y: 形参y的说明
:return: 返回值的说明
"""
函数体
return 返回值
我们写一个实际例子:
def add(x, y):
"""
add函数接收2个参数,进行两数相加的功能
:param x: 形参x表示其中一个被加数
:param y: 形参y表示其中另一个加数
:return: 返回值是2数相加的结果
"""
result = x + y
print(f"2数相加的结果是:{result}")
return result
这就是一个常用的说明文档的语法格式。为什么强调这个格式,因为在Pycharm中,如果按格式写了说明文档,在调用时,鼠标指针移动上去,可以看到说明文档的内容:
这个功能是非常有用的。
六、函数的嵌套调用
所谓的函数嵌套调用指的是一个函数里又调用了另外一个函数。
def func_b():
print("---2---")
def func_a():
print("---1---")
func_b()
print("---3---")
# 调用函数func_a
func_a()
输出:
---1---
---2---
---3---
七、变量在函数中的作用域
变量作用域指的是变量的作用范围(变量在哪里可用,在那里不可用),主要分为两类:局部变量和全局变量。
所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效。
def testA():
num = 100
print(num)
testA() # 100
print(num) # 报错:name 'num' is not defined
输出:
print(num) # 报错:name 'num' is not defined
NameError: name 'num' is not defined. Did you mean: 'sum'?
局部变量定义在函数体的内部,在函数执行完毕后,即被销毁。因此在函数外使用会报错。
所谓全局变量,指的是在函数体内外都能生效的变量。如果有一个数据,在函数A和函数B中都要使用,那么就可以把这个数据存储在一个全局变量里面。
# 定义全局变量
num = 100
def testA():
print(num)
def testB():
print(num)
testA()
testB()
输出:
100
100
那如果在函数外面定义了一个全局变量,在函数内部定义了一个同名变量且赋值,会发生什么?外面的全局变量值会改变吗?
# 定义全局变量
num = 200
def testA():
print(f"test_a:{num}")
def testB():
num = 500
print(f"test_b:{num}")
testA()
testB()
print(num)
输出:
test_a:200
test_b:500
200
结果发现,testB( )函数里定义的num其实只是一个同名的局部变量,在该函数中修改了它的值,没有影响到刚才定义的全局变量num。那如果想要在函数内部使用全局变量,就要使用关键字global。
# 定义全局变量
num = 200
def testA():
print(f"test_a:{num}")
def testB():
#global关键字声明num是全局变量
global num
num = 500
print(f"test_b:{num}")
testA()
testB()
print(num)
输出:
test_a:200
test_b:500
500
可以看到全局变量num的值也被改变了。
附:实战 - 写一个简单的银行程序
利用函数相关知识,写一个简单的银行程序。定义两个全局变量money - 用来记录银行卡余额(默认5000000),name - 用来记录客户姓名(程序启动时输入),定义如下函数:
- 查询余额函数
- 存款函数
- 取款函数
- 主菜单函数
要求:启动程序后输入客户姓名,查询余额、存款、取款后都会返回主菜单;存款、取款后,显示一下当前余额;客户选择退出或输入错误数据后,程序能循环运行不会报错。
#全局变量 余额 、 客户名
money = 5000000
name = None
# 要求客户输入姓名
name = input("请输入您的姓名:")
#定义查询函数
def query(show_header):
if show_header:
print("------------查询余额------------")
print(f"{name},您好,您的余额剩余:{money}元。")
# 定义存款函数
def saving(num):
print("-------------存款-------------")
global money
money += num
print(f"{name},您好,您已存入{num}元。")
query(False) #传入False参数,不输出表头,直接显示余额
# 定义取款函数
def get_money(num):
print("-------------取款-------------")
global money
if (money - num) < 0:
print(f"余额不足,取款失败")
return None
money -= num
print(f"{name},您好,您取款{num}元。")
query(False)
# 定义主函数
def main():
print("------------主菜单-------------")
print(f"{name},您好,欢迎来到银行自助ATM机。")
print("查询余额\t[输入1]")
print("存款\t\t[输入2]")
print("取款\t\t[输入3]")
print("退出\t\t[输入4]")
return int(input("请输入您的选择:"))
#调用main函数,且循环执行
while True:
keyboard_input = main()
if keyboard_input == 1: #查询余额
query(True)
elif keyboard_input == 2: #存款
saving(int(input("请输入存款金额:")))
elif keyboard_input == 3: #取款
get_money(int(input("请输入取款金额:")))
else:
exit(0)
输出:
请输入您的姓名:Lee
------------主菜单-------------
Lee,您好,欢迎来到银行自助ATM机。
查询余额 [输入1]
存款 [输入2]
取款 [输入3]
退出 [输入4]
请输入您的选择:1
------------查询余额------------
Lee,您好,您的余额剩余:5000000元。
------------主菜单-------------
Lee,您好,欢迎来到银行自助ATM机。
查询余额 [输入1]
存款 [输入2]
取款 [输入3]
退出 [输入4]
请输入您的选择:2
请输入存款金额:300
-------------存款-------------
Lee,您好,您已存入300元。
Lee,您好,您的余额剩余:5000300元。
------------主菜单-------------
Lee,您好,欢迎来到银行自助ATM机。
查询余额 [输入1]
存款 [输入2]
取款 [输入3]
退出 [输入4]
请输入您的选择:3
请输入取款金额:500000000
-------------取款-------------
余额不足,取款失败
------------主菜单-------------
Lee,您好,欢迎来到银行自助ATM机。
查询余额 [输入1]
存款 [输入2]
取款 [输入3]
退出 [输入4]
请输入您的选择:1
------------查询余额------------
Lee,您好,您的余额剩余:5000300元。
------------主菜单-------------
Lee,您好,欢迎来到银行自助ATM机。
查询余额 [输入1]
存款 [输入2]
取款 [输入3]
退出 [输入4]
请输入您的选择:4
Process finished with exit code 0
以上就是函数的相关内容。