函数:是组织好的,可重复使用的,用来实现特定功能的代码段。

定义函数

语法

def 函数名(传入参数):
	函数体
	return 返回值

调用:函数名(参数)

注意:

  • 参数如不需要,可以省略(后续章节讲解)
  • 返回值如不需要,可以省略(后续章节讲解)
  • 函数必须先定义后使用

函数的参数

函数的传入参数:在函数进行计算的时候,接受外部(调用时)提供的数据

举例

# 定义函数  
def add(x, y):  
    result = x + y  
    print(f'{x} + {y} 的结果是:{result}')  
      
      
# 调用函数  
add(1, 2)

函数定义中,提供的 x 和 y,称之为:形式参数(形参),表示函数声明将要使用 2 个参数,参数之间使用逗号进行分隔 函数调用中,提供的 1 和 2,称之为:实际参数(实参),表示函数执行时真正使用的参数值,传入的时候,按照顺序传入数据,使用逗号分隔

传入参数的数量是不受限制的。

  • 可以不使用参数
  • 也可以仅使用任意 N 个参数

函数的返回值

通过 return 关键字,就能向调用者返回数据。函数体在遇到 return 后就结束了,所以写在 return 后的代码不会执行。

语法格式

def 函数(参数):
	函数体
	return 返回值
 
 
变量 = 函数(参数)

特殊返回值:None Python 中有一个特殊的字面量:None,其类型是:<class ‘NoneType’> 无返回值的函数,实际上就是返回了:None 这个字面量 None 可以主动使用 return 返回,效果等同于不写 return 语句

None 类型的应用场景

  • 用在函数无返回值上
  • 用在 if 判断上
    • 在 if 判断中,None 等同于 False
    • 一般用于在函数中主动返回 None,配合 if 判断做相关处理
def check_age(age):  
    if age > 18:  
        print('请进')  
        return "Yes"  
    return None  
  
  
result = check_age(int(input('请输入您的年龄:')))  
if not result:  
    print('未成年勿入')
  • 用于声明无内容的变量上:定义变量,但暂时不需要变量有具体值,可以用 None 来代替

函数说明文档

语法格式

def add(x, y):  
    """  
    :param x: 加数1  
    :param y: 加数2  
    :return: 和  
    """    return x + y  
  
  
add(1, 2)

在 Pycharm 里输入三引号后会自动补全

函数的嵌套调用

在一个函数中,调用另外一个函数

变量的作用域

变量作用域指的是变量的作用范围(变量在哪里可用,在哪里不可用) 主要分为两类:局部变量全局变量

  • 局部变量是定义在函数体内部的变量,即只在函数体内部生效
  • 局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量
  • 全局变量,指的是在函数体内、外都能生效的变量

使用 global 关键字 可以在函数内部声明变量为全局变量

综合案例 - 简易 ATM

提示: 定义一个全局变量:money,用来记录银行卡余额(默认 5000000) 定义一个全局变量:name,用来记录客户姓名(启动程序时输入) 定义如下的函数:

  • 查询余额函数
  • 存款函数
  • 取款函数
  • 主菜单函数

要求: 程序启动后要求输入客户姓名 查询余额、存款、取款后都会返回主菜单 存款、取款后,都应显示一下当前余额 客户选择退出或输入错误,程序会退出,否则一直运行

参考代码

"""  
演示函数综合案例开发  
"""  
  
# 定义全局变量money name  
money = 5000000  
name = None  
# 要求客户输入姓名  
name = input("请输入您的姓名:")  
# 定义查询函数  
def query(show_header):  
    if show_header:  
        print("-------------查询余额------------")  
    print(f"{name},您好,您的余额剩余:{money}元")  
  
  
# 定义存款函数  
def saving(num):  
    global money    # money在函数内部定义为全局变量  
    money += num  
    print("-------------存款------------")  
    print(f"{name},您好,您存款{num}元成功。")  
  
    # 调用query函数查询余额  
    query(False)  
  
# 定义取款函数  
def get_money(num):  
    global money  
    money -= num  
    print("-------------取款------------")  
    print(f"{name},您好,您取款{num}元成功。")  
  
    # 调用query函数查询余额  
    query(False)  
# 定义主菜单函数  
def main():  
    print("-------------主菜单------------")  
    print(f"{name},您好,欢迎来到黑马银行ATM。请选择操作:")  
    print("查询余额\t[输入1]")  
    print("存款\t\t[输入2]")  
    print("取款\t\t[输入3]")    # 通过\t制表符对齐输出  
    print("退出\t\t[输入4]")  
    return input("请输入您的选择:")  
  
# 设置无限循环,确保程序不退出  
while True:  
    keyboard_input = main()  
    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退出循环

函数多返回值

如果函数有两个 return,只执行了第一个 return,原因是因为 return 可以退出当前函数,导致 return 下方的代码不执行。

如果一个函数要有多个返回值,要按照返回值的顺序,写对应顺序的多个变量接收

  • 变量之间用逗号隔开
  • 支持不同类型的数据

函数多种传参方式

4 种常见参数使用方式

位置参数

位置参数:调用函数时根据函数定义的参数位置来传递参数。传递的参数和定义的参数的顺序及个数必须一致

代码示例

def user_info(name, age, gender):  
    print(f'本人名为 {name},年龄{age},性别{gender}')  
  
  
user_info('Wesley', 18, '男')

关键字参数

关键字参数:函数调用时通过“键=值”形式传递参数. 作用: 可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求.

注意: 函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序

代码示例

def user_info(name, age, gender):  
    print(f"姓名是:{name}, 年龄是:{age}, 性别是:{gender}")  
# 位置参数 - 默认使用形式  
user_info('小明', 20, '男')  
  
# 关键字参数  
user_info(name='小王', age=11, gender='女')  
user_info(age=10, gender='女', name='潇潇')  # 可以不按照参数的定义顺序传参  
user_info('甜甜', gender='女', age=9)

缺省参数

缺省参数:缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。 作用: 当调用函数时没有传递参数,就会使用默认是用缺省参数对应的值.

注意: 函数调用时,如果为缺省参数传值则修改默认参数值,否则使用这个默认值

代码示例

# 缺省参数(默认值)  
def user_info(name, age, gender = "男"):  
    print(f"姓名是:{name}, 年龄是:{age}, 性别是:{gender}")  
  
  
user_info('小天', 13, '男') 
user_info('甜甜', 9)

不定长参数

不定长参数:不定长参数也叫可变参数. 用于不确定调用的时候会传递多少个参数 (不传参也可以) 的场景. 作用: 当调用函数时不确定参数个数时, 可以使用不定长参数

不定长参数的类型:

  • 位置传递
    • 传进的所有参数都会被 args 变量收集,它会根据传进参数的位置合并为一个元组 (tuple),args 是元组类型,这就是位置传递
  • 关键字传递
    • 参数是“键=值”形式的形式的情况下, 所有的“键=值”都会被 kwargs 接受, 同时会根据“键=值”组成字典.

示例代码:

# 不定长 - 位置不定长, *号  
# 不定长定义的形式参数会作为元组存在,接收不定长数量的参数传入  
def user_info(*args):  
    print(f"args参数的类型是:{type(args)},内容是:{args}")  
  
user_info(1, 2, 3, '小明', '男孩')  
  
# 不定长 - 关键字不定长, **号  
def user_info(**kwargs):  
    print(f"args参数的类型是:{type(kwargs)},内容是:{kwargs}")  
user_info(name='小王', age=11, gender='男孩')

匿名函数

函数作为参数传递

这是一种计算逻辑的传递,而非数据的传递。 任何逻辑都可以自行定义并作为函数传入。

lambda 匿名函数

函数的定义中

  • def 关键字,可以定义带有名称的函数,可基于该名称重复使用。
  • lambda 关键字,可以定义匿名函数(无名称),匿名函数只可临时使用一次。

匿名函数定义语法:Iambda 传入参数: 函数体(一行代码)

lambda 是关键字,表示定义匿名函数 传入参数表示匿名函数的形式参数,如 lambda x, y: x + y:x, y 表示接收 2 个形式参数 函数体,就是函数的执行逻辑,要注意:只能写一行,无法写多行代码