当前位置: 首页 > news >正文

Python--函数进阶(上)

1. 参数深入理解

1.1 参数传递的内存机制

Python中参数传递的是内存地址(引用传递),而非值拷贝。这意味着:

  • 可变对象(列表、字典)在函数内修改会影响外部变量。
  • 不可变对象(数字、字符串)在函数内重新赋值会创建新对象。
def modify_list(lst):
    lst.append(4)  # 修改原列表

my_list = [1, 2, 3]
modify_list(my_list)
print(my_list)  # 输出:[1, 2, 3, 4]
def reassign_str(s):
    s = "新字符串"  # 创建新对象

my_str = "原字符串"
reassign_str(my_str)
print(my_str)  # 输出:原字符串

1.2 默认参数的陷阱

当默认参数为可变对象时,多次调用会共享同一内存地址:

def buggy_func(data=[]):
    data.append(1)
    return data

print(buggy_func())  # [1]
print(buggy_func())  # [1, 1](非预期结果)

解决方案:使用不可变类型(如None​)作为默认值,并在函数内创建新对象:

def fixed_func(data=None):
    data = data or []
    data.append(1)
    return data

1.3 动态参数(*args​与**kwargs​)

  • *args​:接收任意数量的位置参数,存储为元组。
  • **kwargs​:接收任意数量的关键字参数,存储为字典。
def dynamic_args(*args, **kwargs):
    print(f"位置参数: {args}")
    print(f"关键字参数: {kwargs}")

dynamic_args(1, 2, name="Alex", age=18)
# 输出:
# 位置参数: (1, 2)
# 关键字参数: {'name': 'Alex', 'age': 18}

应用场景:格式化字符串、批量处理数据:

values = [11, 22, 33]
print("和为:", *values)  # 解包为 print("和为:", 11, 22, 33)

2. 函数名的本质与使用

2.1 函数名作为变量

函数名本质是一个指向函数对象的变量

def greet():
    print("Hello!")

alias = greet
alias()  # 输出:Hello!

2.2 函数作为参数与返回值

函数作为参数

def apply(func, x, y):
    return func(x, y)

result = apply(lambda a, b: a * b, 3, 4)
print(result)  # 输出:12

函数作为返回值

def multiplier(factor):
    def inner(x):
        return x * factor
    return inner

double = multiplier(2)
print(double(5))  # 输出:10

2.3 高阶函数应用

  • map​:对可迭代对象应用函数:

    numbers = [1, 2, 3]
    squared = list(map(lambda x: x**2, numbers))  # [1, 4, 9]
    
  • filter​:过滤元素:

    even = list(filter(lambda x: x % 2 == 0, numbers))  # [2]
    

相关文章:

  • Unity制作游戏——前期准备:Unity2023和VS2022下载和安装配置——附安装包
  • ESP32S3:解决RWDT无法触发中断问题,二次开发者怎么才能使用内部RTC看门狗中断RWDT呢?
  • 力扣热题100——滑动窗口
  • 【java】类和对象
  • 使用 AndroidNativeEmu 调用 JNI 函数
  • k8s学习记录:环境搭建(基于Kubeadmin)
  • 从入门到精通Rust:资源库整理
  • 【YOLOv11改进- 主干网络】YOLOv11+RepViT: 从ViT的角度重新审视Mobile的CNN助力YOLOv11有效涨点;
  • 解决Spring Boot中Druid连接池“discard long time none received connection“警告
  • DeepSeek R1的崛起与挑战:技术创新 与 普通人的反思
  • HTML之JavaScript DOM编程获取元素的方式
  • 制造业革命:数字化转型从哪里开始?
  • 【大模型系列】使用docker安装向量数据库Milvus问题备忘
  • Docker 与 Serverless(无服务器架构)
  • 玩客云OneCloud部署Zerotier虚拟局域网
  • 跨平台公式兼容性大模型提示词模板(飞书 + CSDN + Microsoft Word)
  • C++ 编程语言简介
  • P56 auto类型
  • ThinkPHP:配置Redis并使用
  • Python常用的函数和功能
  • 受天气等影响SC8041航班三次备降延误超12小时,山航致歉
  • 解放日报:这是一场需要定力和实力的“科技长征”
  • 辽宁省委书记郝鹏、省长王新伟赶到辽阳火灾事故现场指导善后处置工作
  • 阿里开源首个“混合推理模型”:集成“快思考”、“慢思考”能力
  • 苏州一季度GDP为6095.68亿元,同比增长6%
  • 从“网点适老化”到“社区嵌入式”,“金融为老上海模式”如何探索?