文章目录
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 函数内部修改全局变量
- 如果在函数中修改全局变量,不能直接修改
# 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()
- 在函数中声明全局变量
- 在函数中声明全局变量
如果要在函数中修改全局的变量,不能直接修改。
需要用 关键字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']