位置: 文档库 > Python > 文档下载预览

《python语言中函数的传参与基本练习 .doc》

1. 下载的文档为doc格式,下载后可用word或者wps进行编辑;

2. 将本文以doc文档格式下载到电脑,方便收藏和打印;

3. 下载后的文档,内容与下面显示的完全一致,下载之前请确认下面内容是否您想要的,是否完整.

点击下载文档

python语言中函数的传参与基本练习 .doc

《Python语言中函数的传参与基本练习》

在Python编程中,函数是组织代码的核心工具,而参数传递机制则是函数与外部数据交互的关键。本文将系统梳理Python函数的传参方式,结合基础练习深入理解其原理,帮助读者掌握参数传递的核心概念与实际应用。

一、Python函数参数传递的本质

Python采用"对象引用传递"机制,即函数接收的是对象的引用而非对象本身。这一机制决定了参数传递的两大核心特性:

  • 可变对象与不可变对象的差异:修改可变对象(如列表、字典)会影响原始数据,而修改不可变对象(如整数、字符串)会创建新对象
  • 赋值操作的特殊性:在函数内部对参数重新赋值不会影响外部变量

二、参数传递的四大模式

1. 位置参数(Positional Arguments)

最基本的参数传递方式,按函数定义时的顺序传递参数值。

def greet(name, message):
    print(f"{message}, {name}!")

greet("Alice", "Hello")  # 输出:Hello, Alice!

特点:参数顺序必须与定义一致,数量必须匹配。

2. 默认参数(Default Arguments)

为参数指定默认值,当调用时不提供该参数则使用默认值。

def power(base, exponent=2):
    return base ** exponent

print(power(3))     # 输出:9 (使用默认exponent=2)
print(power(3, 4))  # 输出:81

注意事项:默认参数应在参数列表末尾,且默认值应为不可变对象(避免动态默认值陷阱)。

3. 可变参数(Variable-length Arguments)

处理不确定数量的参数,分为*args(位置可变参数)和**kwargs(关键字可变参数)。

*args示例

def sum_all(*numbers):
    total = 0
    for num in numbers:
        total += num
    return total

print(sum_all(1, 2, 3))      # 输出:6
print(sum_all(10, 20, 30, 40)) # 输出:100

**kwargs示例

def print_info(**info):
    for key, value in info.items():
        print(f"{key}: {value}")

print_info(name="Bob", age=25, city="New York")
# 输出:
# name: Bob
# age: 25
# city: New York

4. 关键字参数(Keyword Arguments)

通过参数名显式传递值,提高代码可读性。

def create_user(username, password, email=None):
    print(f"User {username} created with email {email}")

create_user(username="john_doe", password="12345", email="john@example.com")

三、参数传递的深度解析

1. 不可变对象的传递

整数、字符串、元组等不可变对象在函数内修改会创建新对象:

def modify_immutable(x):
    print(f"函数内初始值: {x}")  # 10
    x = 20
    print(f"函数内修改后: {x}")  # 20

num = 10
modify_immutable(num)
print(f"函数外值: {num}")      # 10

2. 可变对象的传递

列表、字典等可变对象在函数内的修改会影响原始对象:

def modify_mutable(lst):
    print(f"函数内初始列表: {lst}")  # [1, 2, 3]
    lst.append(4)
    print(f"函数内修改后: {lst}")  # [1, 2, 3, 4]

my_list = [1, 2, 3]
modify_mutable(my_list)
print(f"函数外列表: {my_list}")    # [1, 2, 3, 4]

但直接赋值不会影响外部变量:

def try_reassign(lst):
    lst = [5, 6, 7]  # 创建新列表
    print(f"函数内新列表: {lst}")  # [5, 6, 7]

modify_mutable(my_list)  # 先执行上面的修改
try_reassign(my_list)
print(f"函数外最终列表: {my_list}")  # [1, 2, 3, 4]

3. 参数解包(Unpacking)

使用*和**操作符解包序列和字典:

def calculate(a, b, c):
    return a + b * c

numbers = [2, 3, 4]
print(calculate(*numbers))  # 等同于calculate(2, 3, 4) → 14

params = {"b": 5, "c": 6, "a": 1}
print(calculate(**params))  # 等同于calculate(a=1, b=5, c=6) → 31

四、基础练习与实战案例

练习1:计算器函数

实现支持加减乘除和幂运算的计算器,使用关键字参数和默认参数:

def calculator(a, b, operation="add"):
    operations = {
        "add": lambda x, y: x + y,
        "subtract": lambda x, y: x - y,
        "multiply": lambda x, y: x * y,
        "divide": lambda x, y: x / y if y != 0 else "Error",
        "power": lambda x, y: x ** y
    }
    return operations.get(operation, lambda x, y: "Invalid operation")(a, b)

print(calculator(5, 3))               # 8 (add)
print(calculator(5, 3, "multiply"))   # 15
print(calculator(2, 4, "power"))      # 16

练习2:数据统计函数

实现同时计算平均值、最大值和最小值的函数,使用*args接收可变数量参数:

def data_stats(*numbers):
    if not numbers:
        return "No data provided"
    stats = {
        "average": sum(numbers)/len(numbers),
        "max": max(numbers),
        "min": min(numbers)
    }
    return stats

print(data_stats(10, 20, 30, 40, 50))
# 输出:{'average': 30.0, 'max': 50, 'min': 10}

练习3:配置处理器

使用**kwargs处理灵活的配置参数,设置默认配置并允许覆盖:

def configure_system(default_config, **custom_config):
    config = default_config.copy()
    config.update(custom_config)
    return config

defaults = {
    "timeout": 30,
    "retries": 3,
    "verbose": False
}

custom = configure_system(defaults, retries=5, verbose=True)
print(custom)
# 输出:{'timeout': 30, 'retries': 5, 'verbose': True}

练习4:安全修改列表

实现安全修改列表的函数,避免直接修改原始列表:

def safe_modify(original, *args, operation="append"):
    new_list = original.copy()
    if operation == "append":
        for item in args:
            new_list.append(item)
    elif operation == "extend":
        new_list.extend(args[0] if args else [])
    elif operation == "filter":
        new_list = [x for x in new_list if x in args[0]]
    return new_list

original = [1, 2, 3]
modified = safe_modify(original, 4, 5, operation="append")
print(modified)  # [1, 2, 3, 4, 5]
print(original)  # [1, 2, 3] (未改变)

五、常见误区与最佳实践

1. 默认参数陷阱

错误示例:动态默认值导致意外行为

def append_to(element, target=[]):  # 危险!
    target.append(element)
    return target

print(append_to(1))      # [1]
print(append_to(2))      # [1, 2] (不是预期的[2])

正确做法:使用None作为默认值

def safe_append(element, target=None):
    if target is None:
        target = []
    target.append(element)
    return target

2. 参数顺序规范

推荐参数顺序:

  1. 必需位置参数
  2. 可选位置参数(*args)
  3. 关键字默认参数
  4. 可变关键字参数(**kwargs)
def example_func(a, b, *args, c=10, d=20, **kwargs):
    pass

3. 类型提示(Python 3.5+)

使用类型注解提高代码可读性:

from typing import List, Dict, Any

def process_data(
    data: List[int], 
    config: Dict[str, Any], 
    *,  # 强制关键字参数
    verbose: bool = False
) -> Dict[str, float]:
    """处理数据并返回统计结果"""
    # 函数实现...

六、高级应用场景

1. 装饰器中的参数传递

装饰器接收额外参数的典型模式:

def repeat(times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(times=3)
def greet(name):
    print(f"Hello, {name}!")

greet("World")  # 会打印三次

2. 函数作为参数传递

实现高阶函数处理不同操作:

def apply_operation(data, operation):
    return operation(data)

def square(x):
    return x ** 2

def cube(x):
    return x ** 3

numbers = [1, 2, 3, 4]
squared = apply_operation(numbers, lambda lst: [x**2 for x in lst])
cubed = apply_operation(numbers, lambda lst: [x**3 for x in lst])
print(squared)  # [1, 4, 9, 16]
print(cubed)    # [1, 8, 27, 64]

3. 链式调用设计

通过返回self实现方法链:

class DataProcessor:
    def __init__(self, data):
        self.data = data
    
    def filter(self, condition):
        self.data = [x for x in self.data if condition(x)]
        return self
    
    def map(self, transform):
        self.data = [transform(x) for x in self.data]
        return self
    
    def get(self):
        return self.data

result = DataProcessor([1, 2, 3, 4]) \
    .filter(lambda x: x % 2 == 0) \
    .map(lambda x: x * 10) \
    .get()
print(result)  # [20, 40]

关键词:Python函数、参数传递、位置参数、默认参数、可变参数、关键字参数、参数解包、不可变对象、可变对象、类型提示、装饰器、高阶函数

简介:本文系统讲解Python函数参数传递机制,涵盖位置参数、默认参数、*args/**kwargs可变参数、关键字参数四大模式,深入分析不可变/可变对象传递差异,通过计算器、数据统计、配置处理等实战案例巩固理解,最后探讨装饰器、高阶函数等高级应用,帮助读者全面掌握Python函数传参技术。

《python语言中函数的传参与基本练习 .doc》
将本文以doc文档格式下载到电脑,方便收藏和打印
推荐度:
点击下载文档