【Python学习笔记】Day06 - 函数

【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语句,返回到的内容是Nonereturn语句,返回到的内容类型是<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

        以上就是函数的相关内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值