Python 纯函数与副作用,可变参数与不可变参数

简介: 在Python的函数式编程中,Python既可以在调用时对实参进行修改,也可以通过返回值返回函数调用结果。这样的既有返回值又能修改传参的模式,在进行编程开发时,容易遗漏修改传参对结果的影响

纯函数与副作用

在Python的函数式编程中,Python既可以在调用时对实参进行修改,也可以通过返回值返回函数调用结果。这样的既有返回值又能修改传参的模式,在进行编程开发时,容易遗漏修改传参对结果的影响。

纯函数

纯函数:调用函数时不对传参进行修改,函数的调用结果都在函数返回值中体现。

  • 相同的输入返回相同的输出
  • 使用纯函数的优势在于概念简单、测试方便
  • 编写纯函数时要求代码的作用域为本地。具体而言,就是避免使用 globalnonlocal等语句

副作用

副作用:简单来说,使函数结果变得不纯的因素都是副作用。

如果函数的调用依赖于外部的状态就无法保证相同的输出。所以,所有的外部交互都有可能带来副作用。

副作用也是方法通用性下降的重要因素,同时副作用也会给程序带来安全隐患和不确定性。副作用不可能完全禁止,但也应尽量控制在可控的范围内。

很多人在编写函数时,通过对调用参数进行修改来返回调用结果,这种方式的函数与外部进行了交互。属于副作用式函数编程。

  • 副作用的来源:
    • 用户的输入
    • 配置文件
    • 数据库
    • 调用外部作用域的变量
    • 与外部进行交互
    • ...

参数传递

Python作为一个一切皆对象的动态型编程语言,其对象可以分为可变对象和不可变对象。

不可变对象(值类型)

  • Numbers:数值类型
    • int: 整型数
    • float: 浮点数
    • complex: 复数
  • bool: 布尔类型
  • str: 字符型
  • tuple: 元组
  • range: 范围对象
  • frozenset: 不可变集合
  • bytes: 不可变字节数组

可变对象(引用类型)

  • list: 列表
  • dict: 字典
  • set: 可变集合
  • bytearray: 可变字节数组
  • 用户自定义类

参数传递方式

函数按照传值的方式分为:

  • 值传递:把调用函数时传递的值赋值到形参当中,对形参的操作不会影响外部的实参变量。
  • 引用传递:把实参引用的内存地址赋值给形参,当对该内存的值进行修改时,会相应的影响到外部实参变量。

    参数传递方式还包括地址传递,在Python这种无指针的高级语言中,不考虑辨别区分地址传递这种类型
    ```python
    a = 123
    b = [1, 2, 3]

print(f"id(a) = {id(a)}, id(b) = {id(b)}")

def test(a, b):
print(f"func id(a) = {id(a)}, id(b) = {id(b)}")

test(a, b)

id(a) = 140362719137840, id(b) = 140362724287744

func id(a) = 140362719137840, id(b) = 140362724287744

```
通过上面的代码,可以看到Python可变对象和不可变对象在传递参数时,都是传递的变量指向的内存地址而不是进行的值传递。

Python为了方便内存的管理,都是采用的引用传递。在传递参数时,都传递的是对应的内存地址,所以在Python中对可变对象的修改,会引起外部对象的改变。不可变对象因为其特性,对不可变对象的操作效果和值传递具有相同的效果。

相关文章
|
2月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
186 1
|
2月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
289 1
|
2月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
167 0
|
3月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
275 101
|
3月前
|
缓存 测试技术 Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
221 99
|
3月前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
194 98
|
3月前
|
缓存 Python
Python中的装饰器:优雅地增强函数功能
Python中的装饰器:优雅地增强函数功能
|
4月前
|
Python
Python 函数定义
Python 函数定义
538 155
|
5月前
|
PHP Python
Python format()函数高级字符串格式化详解
在 Python 中,字符串格式化是一个重要的主题,format() 函数作为一种灵活且强大的字符串格式化方法,被广泛应用。format() 函数不仅能实现基本的插入变量,还支持更多高级的格式化功能,包括数字格式、对齐、填充、日期时间格式、嵌套字段等。 今天我们将深入解析 format() 函数的高级用法,帮助你在实际编程中更高效地处理字符串格式化。
564 0
|
3月前
|
JSON 缓存 开发者
淘宝商品详情接口(item_get)企业级全解析:参数配置、签名机制与 Python 代码实战
本文详解淘宝开放平台taobao.item_get接口对接全流程,涵盖参数配置、MD5签名生成、Python企业级代码实现及高频问题排查,提供可落地的实战方案,助你高效稳定获取商品数据。

推荐镜像

更多