四、python的函数基础--附代码案例

4.1 函数概述

定义:是组织好、可重复使用的、用来实现特定功能的代码段。
分类:python的内置函数和用户自定函数。①内置函数,即系统函数:这是由python提供的,用户不必自己定义这些函数,可以直接使用,如常用的统计长度的函数len();②用户定义函数:用以解决用户的专门需要。
举例:len()函数是Python内置的函数,是提前写好的,可以重复使用,实现统计长度这一特定功能的代码段。如果不用函数,也可以通过for循环+计数累加的方式来统计长度,但是会导致代码重复。
作用:提高程序的复用性,减少重复性代码,提高开发效率。

# 使用python的内置函数
str1 = "是组织好"
str2 = "可重复使用的"
str3 = "用来实现特定功能的代码段"
print("str1的长度=",len(str1))
print("str2的长度=",len(str2))
print("str3的长度=",len(str3))
# 不使用函数
str1 = "是组织好"
str2 = "可重复使用的"
str3 = "用来实现特定功能的代码段"

count = 0
for i in str1:
	count += 1
print("str1的长度=",count)

count = 0
for i in str2:
	count += 1
print("str2的长度=",count)

count = 0
for i in str3:
	count += 1
print("str3的长度=",count)
# 用户自定函数
def my_len(string):
	count = 0
	for i in str1:
		count += 1
	print(count)

str1 = "是组织好"
str2 = "可重复使用的"
str3 = "用来实现特定功能的代码段"
print(my_len(str1))
print(my_len(str2))
print(my_len(str3))

4.2 函数的定义

# 语法:
def 函数名(形参1,形参2......):		# def是定义一个函数体的关键字,()区分变量和函数标志,即使没有形式参数,也不能省略。形参之间用英文逗号分开
	函数体
	return 返回值

4.3 函数的要素

函数要素说明
①函数名字函数名字必须和头文件声明的名字一样
②库包含指定的函数的包
③形式参数参数类型要匹配
④功能需要知道此函数能干嘛后才调用
⑤返回值根据需要接收返回值

4.3.1 函数名

是用户定义标识符,命名规则同变量一致。注意,函数名的后面有个圆换号(),代表这个为函数,不是普通的变量名。()区分变量和函数标志,即使没有形式参数,也不能省略。

4.3.2 库

使用一些python的内置函数时,这些函数存在于一些库(包)里面,要先import导入包才能使用这些内置函数。比如随机库random里面的生成随机数randint函数。

4.3.3 形式参数

在定义函数时指定的形参,在未出现函数调用时,它们并不占内存中的存储单元,因此称它们是形式参数或虚拟参数,简称形参,表示它们并不是实际存在的数据,所以形参里的变量不能赋值

4.3.4 返回值

定义:通过return关键字,把函数计算的结果返回给函数调用者。
语法:return 结果/表达式
注意:①return是结束函数的执行,因此return后面的语句不会被执行。
②如果函数没有使用return语句返回数据,函数也有返回值None,其类型是无返回值的函数<class ‘NoneType’>。None表示空的、无实际意义的意思。函数返回的None表示这个函数没有返回什么有意义的内容,也就是返回了空的意思。
③None的应用场景:A、用在函数无返回值上;B、用在if判断上,在if判断中,None等同于False。一般用于在函数中主动返回None,配合if判断做相关处理;C、用于声明无内容的变量上,定义变量,但暂时不需要变量有具体值,可以用None来代替。

def say_hi():			# 无return语句的函数返回值
    print("你好呀")

result = say_hi()											# 变量result接收say_hi函数的返回值
print(f"无返回值函数,返回的内容是:{result}")				# None
print(f"无返回值函数,返回的内容类型是:{type(result)}")		# <class 'NoneType'>

# None可以主动使用return返回,效果等同于不写return语句:
def say_hi2():
    print("你好呀")
    return None			# 主动返回None的函数

result = say_hi2()
print(f"无返回值函数,返回的内容是:{result}")				# None
print(f"无返回值函数,返回的内容类型是:{type(result)}")		# <class 'NoneType'>

# None用于if判断
def check_age(age):
    if age > 18:
        return "SUCCESS"
    else:
        return None

result = check_age(16)
if not result:
    # 进入if表示result是None值 也就是False
    print("未成年,不可以进入")

# None用于声明无初始内容的变量
name = None

因此,也可以根据函数的参数和返回值的有无对函数进行分类:①无参无返回值函数;②有参数无返回值函数;③无参有返回值函数;④有参有返回值函数;

4.4 函数的调用

定义:定义函数后,需要调用此函数才能执行到这个函数里的代码段。
语法:函数名(实际参数)
注意:函数必须是先定义,后使用。

4.5 函数执行流程

4.5.1 函数执行流程

在这里插入图片描述
首先进入没有def开头的代码块r = add(1, 2),由于python内部没有内置add函数,则会去查询有没有用户自定函数,如果没有,就会报错- -函数名add不存在;
②如果有,调用add(x, y)函数,函数在add(1, 2)处中断,等待被调用函数运行完成并产生返回值时,才会执行r = add(1, 2)
③接着检查函数的参数有没有传参,如果有,按照顺序将实参的值传递给形参,执行add(x, y)函数;
再检查函数的参数有没有返回值,如果有,按返回值的结果给函数调用者 add(1,2),并用变量r接收;
⑤打印r的值,代码全部执行,程序结束。

4.5.2 函数的形参和实参

①形参出现在函数定义中,实参出现在函数调用中;
②调用时实参的值按照形参的顺序逐个对应传给形参,而不能由形参传回来给实参,即单向传递;
③调用函数时,编译系统临时给形参分配存储单元(实参与形参是不同单元存储)。调用结束后,形参单元被销毁,实参单元仍保留并维持原值;

4.6 函数的说明文档

问题:函数是纯代码语言,想要理解其含义,就需要一行行的去阅读理解代码,效率比较低。可以给函数添加说明文档,辅助理解函数的作用。
解决:通过多行注释的形式,对函数进行说明解释,内容应写在函数体之前。规范说明如下图,在pycharm工具下写个多行注释后回车,会自动提供格式给开发者。
在这里插入图片描述
在PyCharm编写代码时,可以通过鼠标悬停,查看调用函数的说明文档。
在这里插入图片描述

4.7 函数的嵌套调用

定义:一个函数里面又调用了另外一个函数。
在这里插入图片描述
结果如下:
在这里插入图片描述

4.8 函数变量的作用域

定义:即变量的作用范围,说明变量在哪里可用,在哪里不可用。
分类:局部变量和全局变量。

4.8.1 局部变量

定义:定义在函数体内部的变量,即只在函数体内部生效。
举例:变量num是定义在testA函数内部的变量,在函数外部访问则立即报错。

在这里插入图片描述
作用:在函数体内部,临时保存数据,当函数调用完成后销毁局部变量。

4.8.2 全局变量

定义:定义在函数体外部的变量,在函数体内、外都能生效。
举例:变量num是定义在testA和testB函数外部的变量,在函数A、B都能使用

在这里插入图片描述
问题:testB函数内部修改全局变量num的值为200,如何修改程序?
结果:如果是直接在testB函数内部修改num = 200,只是定义了一个局部变量num,并不影响全局变量num的值。
在这里插入图片描述
解决:使用 global 变量可以在函数内部声明变量为全局变量,如下所示:
在这里插入图片描述

4.9 综合案例

定义一个全局变量:money,用来记录银行卡余额(默认5000000);
定义一个全局变量:name,用来记录客户姓名(启动程序时输入);
定义如下的函数:
①查询余额函数
②存款函数
③取款函数
④主菜单函数
要求:
①程序启动后要求输入客户姓名
②查询余额、存款、取款后都会返回主菜单
③存款、取款后,都应显示一下当前余额
④客户选择退出或输入错误,程序会退出,否则一直运行
主菜单效果:
在这里插入图片描述
查询余额效果:
在这里插入图片描述
存、取款效果:
在这里插入图片描述
在这里插入图片描述

money = 5000000                  # 定义一个全局变量:money,用来记录银行卡余额(默认5000000)
name = input("请输入您的姓名:")    # 定义一个全局变量:name,用来记录客户姓名(启动程序时输入)

def query(show_header):          # 定义查询余额函数
    if show_header:              # 取款、存款后应显示一下当前余额,调用query函数查询余额,要想不显示表头,调用函数传入False参数即可
        print("-------------查询余额------------")
    print(f"{name},您好,您的余额剩余:{money}元")

def saving(num):                # 定义存款函数
    global money                # money在函数内部定义为全局变量
    money += num
    print("-------------存款------------")
    print(f"{name},您好,您存款{num}元成功。")
    query(False)

def get_money(num):             # 定义取款函数
    global money                # 定义global,使得money在函数内部定义为全局变量
    money -= num
    print("-------------取款------------")
    print(f"{name},您好,您取款{num}元成功。")
    query(False)                # 取款后应显示一下当前余额,调用query函数查询余额

def main_menu():               # 定义主菜单函数
    print("-------------主菜单------------")
    print(f"{name},您好,欢迎来到黑马银行ATM。请选择操作:")
    print("查询余额\t[输入1]")
    print("存款\t\t[输入2]")
    print("取款\t\t[输入3]")    # 通过\t制表符对齐输出
    print("退出\t\t[输入4]")
    return input("请输入您的选择:")


# 只要ATM不退出程序,可以随便查询
while True:                         # 设置无限循环,确保程序不退出
    keyboard_input = main_menu()    # 先显示主菜单
    if keyboard_input == "1":
        query(True)                 # 查询界面需要显示表头
        continue                    # 除了退出程序,其他步骤都是要返回到主界面,通过continue继续下一次循环,返回到主菜单
    elif keyboard_input == "2":
        num = int(input("您想要存多少钱?请输入:"))
        saving(num)
        continue    # 查询余额、存款、取款后都会返回主菜单
    elif keyboard_input == "3":
        num = int(input("您想要取多少钱?请输入:"))
        get_money(num)
        continue    # 查询余额、存款、取款后都会返回主菜单
    else:           # 客户选择退出或输入错误,程序会退出,否则一直运行
        print("程序退出啦")
        break       # 通过break退出循环

码字不易,如果大家觉得有用,请高抬贵手给一个赞让文章上推荐让更多的人看到吧,也可以评论提出意见让后面的文章内容越来越生动丰富。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值