書名: 機械工程師Python編程:入門、實戰與進階作者名: (西)安琪兒·索拉·奧爾巴塞塔本章字數: 694字更新時間: 2024-09-10 16:13:07
2.1.2 不可變性
正如前面的例子所示,函數式編程的一個關鍵特性是不可變性。如果某樣東西不隨時間變化,那么它就是不可變的。如果決定以函數式編程的方式編寫代碼,我們必須避免可變數據,使用純函數對程序進行建模。
讓我們來看一個例子。假設,我們使用字典在平面上定義了一個點和向量:

如果想計算用向量移動該點后所生成的點,我們可以用函數式編程的方式,用函數創建一個新點。示例如下:

這個函數是純函數:給定相同的點和向量作為輸入,得到的位移點總是相同,而且函數處理的數據沒有任何改變,也包括函數參數。
運行這個函數,將之前定義的point和vector傳入,結果如下:

與之相反,非函數式編程的解決方法可能需要使用如下函數來改變原來的點:

這個函數修改了作為參數輸入的point,違反了函數式編程的關鍵規則。
請注意,函數名稱中使用了in_place,這是一種常用的命名約定,它意味著原對象將被修改。我們將在全書中遵循這種命名約定。
現在,讓我們看看使用displace_point_in_place函數會發生什么:

如你所見,函數沒有返回任何東西,這是非純函數的標志,因為函數發揮作用時,必然在某個地方改變了某些東西。在本例中,“某些東西”是點,其坐標已被更新。
函數式風格的一個重要優點是,通過恪守數據結構的不可變性,我們可以避免意料之外的副作用。當修改某個對象時,你可能并不知道代碼中引用該對象的所有位置。如果有其他部分代碼依賴于該對象的狀態,就可能出現難以預料的副作用。因此,在對象發生改變之后,程序的行為可能與預期的不同。這類錯誤非常難發現,甚至可能需要數小時的調試。
在項目中盡量減少可變對象的數量,可以使其更可靠,更不容易出錯。
現在讓我們來看看一類特殊的函數——lambda函數,它在函數式編程中起著關鍵作用。
推薦閱讀
- 深入核心的敏捷開發:ThoughtWorks五大關鍵實踐
- Spring Boot 2實戰之旅
- Python編程自學手冊
- Spring 5.0 By Example
- TypeScript圖形渲染實戰:基于WebGL的3D架構與實現
- Reactive Programming With Java 9
- Haxe Game Development Essentials
- RISC-V體系結構編程與實踐(第2版)
- Mastering C++ Multithreading
- MySQL入門很輕松(微課超值版)
- C++ Fundamentals
- Python Machine Learning Blueprints:Intuitive data projects you can relate to
- Scala Functional Programming Patterns
- Software Development on the SAP HANA Platform
- Selenium WebDriver Practical Guide