04 函数与模块
函数
函数可以让我们的程序从过程走向模块化,变得更清晰、更可维护
定义与语法
Python 中使用def关键字定义一个函数:
- def后面跟着函数名
- 函数名后面跟着一串形式参数
- 函数声明最后也已冒号结尾
从下一行开始编写函数内代码
传参与返回值
在函数声明中列举的参数被称为形式参数: - 用来接收传入的值 - 占位符,在函数定义时不会有具体的值,直到函数被调用时才赋予实际值
def greet(name): # 这里的 name 就是形式参数
print("Hello, " + name + "!")
在调用函数时传递的参数被称为实际参数: - 用来给形式参数赋值 - 函数外部的数据,被传入到函数内以供函数使用
greet("Alice") # 这里的 Alice 就是实际参数
返回值是函数执行结束后返回的结果:
- 函数可以有返回值,也可以没有
- 使用return语法返回
- 为了传递一些信息给函数外的调用者
def square(number):
return number * number
result = square(4)
print(result) # 16
返回值也可以是多个:
def get_name_and_age():
name = "Alice"
age = 30
return name, age
name, age = get_name_and_age()
print(name) # Alice
print(age) # 30
也可以没有:
def greet(name):
print("Hello, " + name + "!") # 没有return语句
作用域
重要概念
我们的程序就像一座多层的建筑,每一层楼都有自己的房间和钥匙。
在这里,每个变量就像房间中的“物品”,不同的楼层对应不同的作用域。
你可以在某个楼层找到自己需要的物品,但不能随意拿到其他楼层的物品,除非有合适的权限(即作用域规则)。
这栋建筑的作用域分为以下四个“楼层”:
局部作用域 - 私人办公室
一间私人办公室内有一些私人物品,只有在房间内的人才有权力使用,且这个人离开后物品就会消失
def office():
password = "secret123" # 私人办公室里的私密物品
print(password) # 可以在办公室里使用
office()
print(password) # 会报错,因为在办公室外无法访问密码
全局作用域 - 公共区域
是大厅或走廊,所有楼层的员工都可以到达这个区域
你可以把一些公共信息放在大厅里,比如“公告栏”
在任何房间里的人都可以查看公告栏上的信息,因为这是整个建筑公共区域的一部分
假如你在大厅放了一个 “公告” 变量,那么每个办公室的人都可以看到它,不管在哪层楼
notice = "Building will close at 6 PM" # 公告栏
def office():
print(notice) # 在办公室里可以看到公告
office()
嵌套作用域 - 楼层
允许某一层楼所有房间的人访问!其他楼不行
如果某个楼层有一个“咖啡机” 变量,那么这个楼层的所有房间都能使用这个咖啡机
def floor(): # 楼层
coffee_machine = "Coffee machine on Floor 2" # 楼层的共享物品
def room():
print(coffee_machine) # 楼层的共享物品可以被这个房间(内部函数)使用
room()
floor()
内置作用域 - 基础设施
电梯、楼梯,或供电
这些基础设施总是存在,是建筑物设计时就内置好的,所有楼层和房间的人都可以使用
比如Python的内置函数 print()、len() 等,任何代码里都可以调用它们,因为它们是“系统自带的”
就像电梯可以让你上下楼,print() 函数可以在任何地方使用
模块使用
import 语句
- 导入整个模块:使用
import 模块名,模块中的所有函数和变量都可以访问 - 导入模块里的一些内容:使用
from 模块名 import 成员可以只导入模块的特定函数或变量 - 别名:
import 模块名 as 别名给函数取名字,方便写
自定义
- 创建一个 Python 文件
- 在里面写一点函数和变量
- 在其他 Python 文件导入并使用
# mymodule.py
def greet(name):
return f"Hello, {name}!"
pi = 3.14159
import mymodule
print(mymodule.greet("Alice")) # Hello, Alice!
print(mymodule.pi) # 3.14159
练习
函数
- 编写函数 greet(name),输入参数为一个字符串,输出问候语句,例如:Hello, Alice!
- 计算阶乘 编写一个函数 factorial(n),输入参数为正整数 n,返回 n 的阶乘。
模块
- 创建一个名为 geometry 的模块,其中包含计算矩形、圆形面积的函数。rectangle_area(width, height) 和 circle_area(radius)。
- 使用 math 模块中的 sqrt 函数,编写一个计算直角三角形斜边的函数 hypotenuse(a, b),其中 a 和 b 为直角边的长度,返回斜边长度。