别再复制粘贴代码了!

你有没有过这样的经历:

  • 写了一段代码,过几天又需要用,复制粘贴改半天
  • 同样的逻辑写了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一样简单!

继续学下去,马上就能做实用项目了!