python11_函数 实参和形参 全局变量和局部变量 匿名函数 递归函数

本文详细介绍了Python中的函数,包括函数的创建、调用和空函数,变量的作用域如全局变量和局部变量,以及如何在函数内部修改全局变量。还探讨了函数参数传递,形参和实参的概念,强调了不同数据类型的变量修改时的注意事项。此外,文章还阐述了匿名函数(lambda函数)的定义和应用,以及递归函数的原理和实例,如阶乘、斐波那契数列和汉诺塔问题的解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 函数的引入

如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块这就是函数
在这里插入图片描述

# 1. 函数的引入
# 常用的内置函数:max min sum divmod
# 函数必须有输入和输出
# 专业的术语:输入=参数,输出=返回值
max_num = max(1, 2, 3)
print(max_num)          # 3

在这里插入图片描述

2. 函数的创建

2.1 定义函数

  • 定义函数:
    定义函数,也就是创建一个函数,可以理解为创建一个具有某些用途的工具。定义函数需要用 def 关键字实现
    函数的输入 = 参数,函数的输出 = 返回值
    在这里插入图片描述

  • 重点:

    • 形参:形式参数,不是真实的值(定义函数时的参数)
    • 实参:实际参数,是真实的值(调用函数时的参数)
# 2. 如何创建函数?
# 2-1). 定义函数
#       定义函数,函数内容并不会执行
#       函数的输入 = 参数,函数的输出 = 返回值
# 重点:
#       - 形参:形式参数,不是真实的值(定义函数时的参数)
#       - 实参:实际参数,是真实的值(调用函数时的参数)
def get_max(num1, num2):    # def:定义函数,num1和num2是形参
    result = num1 if num1 > num2 else num2
    return result           # return返回一个结果

2.2 调用函数

在这里插入图片描述

# 2-1). 调用函数
max_num = get_max(30, 80)
print(max_num)              # 80

2.3 空函数

  • 定义一个什么事也不做的空函数,可以用 pass 语句;
    pass 可以用来作为占位符,还没想好怎么写函数的代码,
    就可以先放一个 pass ,让代码能运行起来。

3. 变量的作用域

3.1 全局变量

在这里插入图片描述

# 1. 全局变量:全局生效的变量。在函数外面创建的变量
name = 'admin'
def login():
    print(name)
login()         # admin

3.2 局部变量

在这里插入图片描述

# 2. 局部变量:局部生效的变量,在函数内部创建的变量
def logout():
    age = 21
logout()
print(age)  # 报错:NameError: name 'age' is not defined

在这里插入图片描述

3.3 函数内部修改全局变量

  1. 如果在函数中修改全局变量,不能直接修改
# 3. 函数内部修改全局变量
"""
回顾:
    不可变数据类型:int   str  tuple  namedtuple
    可变数据类型:  list  set  dict
"""
# 3-1). 如果在函数中修改全局变量,不能直接修改
# 案例1:打印的返回值是局部变量
furit = 'apple'
def eat():
    furit = 'banana'
    print(furit)       # banana
eat()
# 案例2:报错,
#   UnboundLocalError: local variable 'money' referenced before assignment
# money是全局变量,需要声明后才能在函数中修改
def hello():
    money += 1
    print(money)
money = 100
hello()
  1. 在函数中声明全局变量
  • 在函数中声明全局变量
    如果要在函数中修改全局的变量,不能直接修改。
    需要用 关键字global 声明修改的变量是全局变量
  • 重要重要
    不可变数据类型修改全局变量时,一定要global声明。可变数据类型不需要
    Q1: 为什么不可变数据类型需要声明全局变量呢?
    A1: 因为一旦修改了不可变数据类型的值,那么其内存地址空间会发生变化
    Q2: 为什么可变数据类型不需要声明全局变量呢?
    A2: 因为可变数据类型的修改都在同一个内存地址空间中完成

在这里插入图片描述

# 3-2). 在函数中声明全局变量
#       如果要在函数中修改全局的变量,不能直接修改。
#       需要用 关键字global 声明修改的变量是全局变量
# 重要重要:
#       不可变数据类型修改全局变量时,一定要global声明,可变数据类型不需要
# Q1: 为什么不可变数据类型需要声明全局变量呢?
# A1: 因为一旦修改了不可变数据类型的值,那么其内存地址空间会发生变化
# Q2: 为什么可变数据类型不需要声明全局变量呢?
# A2: 因为可变数据类型的修改都在同一个内存地址空间中完成
def hello():
    global money    # 不可变数据类型,声明全局变量
    money += 1
    users.append('users')   # 可变数据类型不需要声明
    print(money, users)
money = 100     # 不可变数据类型
users = []      # 可变数据类型
hello()         # 101  ['users']

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值