06-函数-把代码打包成工具
别再复制粘贴代码了!
你有没有过这样的经历:
- 写了一段代码,过几天又需要用,复制粘贴改半天
- 同样的逻辑写了5遍,后来发现有个bug,要改5个地方
- 代码写到几百行,自己都看不懂是干嘛的
别再假装你能记住所有代码了,用函数吧!
函数就是把你的一段代码打包成一个工具,以后直接调用,不用重复写。
函数的基本语法
def 函数名(参数1, 参数2, ...):
# 函数体:要执行的代码
pass
return 返回值
无参无返回值
def say_hello():
print("你好!")
print("欢迎学习Python!")
# 调用函数
say_hello()
say_hello() # 可以调用多次
有参无返回值
def say_hi(name):
print("你好," + name + "!")
say_hi("小明") # 输出:你好,小明!
say_hi("小红") # 输出:你好,小红!
有参有返回值
def add(a, b):
return a + b
result = add(3, 5)
print(result) # 输出:8
# 也可以直接用
print(add(10, 20)) # 输出:30
函数的优点
1. 代码复用
# 不用函数,代码重复
print("小明")
print("小红")
print("小刚")
# 用函数,一次写好,重复调用
def print_names(name):
print(name)
print_names("小明")
print_names("小红")
print_names("小刚")
2. 便于修改
# 原来打印名字
def show_info(name):
print("姓名:" + name)
show_info("小明")
# 现在要改成显示更多信息,只需要改一个地方
def show_info(name, age, job):
print(f"姓名:{name}")
print(f"年龄:{age}")
print(f"职业:{job}")
show_info("小明", 25, "程序员")
3. 代码清晰
# 不用函数,一坨代码
num1 = float(input("输入第一个数字:"))
num2 = float(input("输入第二个数字:"))
operator = input("输入运算符:")
if operator == "+":
result = num1 + num2
print(f"{num1} + {num2} = {result}")
elif operator == "-":
result = num1 - num2
print(f"{num1} - {num2} = {result}")
elif operator == "*":
result = num1 * num2
print(f"{num1} * {num2} = {result}")
elif operator == "/":
if num2 == 0:
print("除数不能为0!")
else:
result = num1 / num2
print(f"{num1} / {num2} = {result}")
else:
print("不支持的运算符!")
# 用函数,逻辑清晰
def calculate(num1, num2, operator):
if operator == "+":
return num1 + num2
elif operator == "-":
return num1 - num2
elif operator == "*":
return num1 * num2
elif operator == "/":
if num2 == 0:
return None
return num1 / num2
else:
return None
def main():
num1 = float(input("输入第一个数字:"))
num2 = float(input("输入第二个数字:"))
operator = input("输入运算符:")
result = calculate(num1, num2, operator)
if result is not None:
print(f"{num1} {operator} {num2} = {result}")
elif num2 == 0:
print("除数不能为0!")
else:
print("不支持的运算符!")
main() # 主程序入口
函数的参数
必需参数
def greet(name, age):
print(f"你好,{name},你今年{age}岁了!")
# 必须按顺序传入所有参数
greet("小明", 25) # 正确
greet("小明") # 报错!缺少参数
默认参数
def greet(name, age=18):
print(f"你好,{name},你今年{age}岁了!")
greet("小明") # 输出:你好,小明,你今年18岁了!
greet("小明", 25) # 输出:你好,小明,你今年25岁了!
关键字参数
def greet(name, age):
print(f"你好,{name},你今年{age}岁了!")
# 可以不按顺序,用关键字指定
greet(age=25, name="小明") # 输出:你好,小明,你今年25岁了!
可变参数(*args)
def sum_all(*args):
total = 0
for num in args:
total += num
return total
print(sum_all(1, 2, 3)) # 输出:6
print(sum_all(1, 2, 3, 4, 5)) # 输出:15
函数的返回值
返回单个值
def square(x):
return x * x
result = square(5)
print(result) # 输出:25
返回多个值(返回元组)
def get_info(name):
age = 25
job = "程序员"
return name, age, job
name, age, job = get_info("小明")
print(f"姓名:{name},年龄:{age},职业:{job}")
没有return语句
def say_hello():
print("你好!")
result = say_hello() # 返回None
print(result) # 输出:None
变量的作用域
局部变量
def my_function():
local_var = "我是局部变量"
print(local_var) # 可以访问
my_function()
# print(local_var) # 报错!外部无法访问局部变量
全局变量
global_var = "我是全局变量"
def my_function():
print(global_var) # 可以访问全局变量
my_function()
print(global_var) # 也可以在外部访问
在函数内修改全局变量(用global关键字)
count = 0
def increment():
global count # 声明要用全局变量
count += 1
increment()
print(count) # 输出:1
常用内置函数
# len():计算长度
print(len("Python")) # 输出:6
print(len([1, 2, 3])) # 输出:3
# max()、min():最大值和最小值
print(max(1, 5, 3)) # 输出:5
print(min(1, 5, 3)) # 输出:1
# sum():求和
print(sum([1, 2, 3, 4, 5])) # 输出:15
# type():查看类型
print(type("Hello")) # 输出:<class 'str'>
# int()、float()、str():类型转换
print(int("123")) # 输出:123
print(float("3.14")) # 输出:3.14
print(str(123)) # 输出:"123"
# input():用户输入
name = input("请输入你的名字:")
print("你好," + name)
实战小项目1:计算器
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
if b == 0:
return "除数不能为0!"
return a / b
def calculator():
print("=== 简易计算器 ===")
print("1. 加法")
print("2. 减法")
print("3. 乘法")
print("4. 除法")
choice = input("请选择操作(1-4):")
num1 = float(input("请输入第一个数字:"))
num2 = float(input("请输入第二个数字:"))
if choice == "1":
result = add(num1, num2)
print(f"{num1} + {num2} = {result}")
elif choice == "2":
result = subtract(num1, num2)
print(f"{num1} - {num2} = {result}")
elif choice == "3":
result = multiply(num1, num2)
print(f"{num1} * {num2} = {result}")
elif choice == "4":
result = divide(num1, num2)
print(f"{num1} / {num2} = {result}")
else:
print("无效的选择!")
calculator()
实战小项目2:BMI计算器
def calculate_bmi(height, weight):
"""计算BMI"""
return weight / (height * height)
def get_bmi_status(bmi):
"""根据BMI返回状态"""
if bmi < 18.5:
return "偏瘦"
elif bmi < 24:
return "正常"
elif bmi < 28:
return "偏胖"
else:
return "肥胖"
def bmi_calculator():
print("=== BMI计算器 ===")
height = float(input("请输入你的身高(米):"))
weight = float(input("请输入你的体重(公斤):"))
bmi = calculate_bmi(height, weight)
status = get_bmi_status(bmi)
print(f"\n你的BMI是:{bmi:.2f}")
print(f"你的体重状态是:{status}")
bmi_calculator()
常见坑及解决方案
坑1:忘记return
def add(a, b):
a + b # 没有return,返回None
result = add(1, 2)
print(result) # 输出:None
解决: 记得用return返回值!
坑2:可变参数的坑
def add_to_list(lst, item):
lst.append(item)
my_list = [1, 2, 3]
add_to_list(my_list, 4)
print(my_list) # 输出:[1, 2, 3, 4],列表被修改了!
解决: 如果不想修改原列表,先复制一份
def add_to_list(lst, item):
new_list = lst.copy() # 复制列表
new_list.append(item)
return new_list
本章小结
- 函数:把代码打包成工具,重复使用
- 参数:必需参数、默认参数、关键字参数、可变参数
- 返回值:用
return返回,可以返回多个值 - 作用域:局部变量和全局变量
- 内置函数:len()、max()、min()、sum()、type()等
函数让你的代码更清晰、更易维护。下一章我们学习字符串操作,处理文字,像处理Excel一样简单!
继续学下去,马上就能做实用项目了!