- Python函數(shù)式編程(第2版)
- (美)史蒂文·洛特
- 775字
- 2020-04-22 12:28:27
1.1 編程范式
編程范式并沒有統(tǒng)一的劃分標(biāo)準(zhǔn)。本書重點(diǎn)分析其中兩個(gè)范式:函數(shù)式編程和命令式編程。二者最重要的特征區(qū)別是狀態(tài)。
在命令式語言(比如Python)中,計(jì)算的狀態(tài)是通過不同命名空間中變量的值反映的。變量的值決定計(jì)算的當(dāng)前狀態(tài),一條語句通過增加或改變(甚至是刪除)變量來改變當(dāng)前狀態(tài)?!懊钍健闭Z言的每一條語句都是一個(gè)通過某種方式改變狀態(tài)的命令。
本書主要關(guān)注賦值語句以及它如何改變狀態(tài)。除此之外,Python中的其他語句包括用于在命令空間中改變變量規(guī)則的global、nonlocal等,用于改變變量所處語境的def、class和import等,用作判斷條件確定一組語句如何改變計(jì)算狀態(tài)的try、except、if、elif和else等。而循環(huán)語句,如for和while,則是將一組語句作為整體以重復(fù)改變計(jì)算狀態(tài)??梢娝羞@些語句都是通過某種方式改變變量狀態(tài)的。
理想狀態(tài)下,每一條語句通過改變狀態(tài),推動(dòng)計(jì)算從初始狀態(tài)向期望的最終結(jié)果不斷靠近。然而,這種“推動(dòng)計(jì)算一步步向前”的模式難以驗(yàn)證。需要首先定義出最終狀態(tài),找到能達(dá)到該狀態(tài)的語句,從而推導(dǎo)出達(dá)到該狀態(tài)需要的前提條件,然后重復(fù)上述步驟,直到找到一個(gè)可接受的初始狀態(tài)。
在函數(shù)式語言中,使用“對函數(shù)求值”這一更簡單的概念代替改變變量值的“狀態(tài)”,每次對函數(shù)求值都會(huì)在現(xiàn)有對象的基礎(chǔ)上創(chuàng)建一個(gè)或多個(gè)新對象。函數(shù)式程序即函數(shù)的組合,相應(yīng)的開發(fā)過程是:首先設(shè)計(jì)一組易于理解的底層函數(shù),然后在此基礎(chǔ)上設(shè)計(jì)符合業(yè)務(wù)需求的高級函數(shù)。相比于由復(fù)雜的流程控制組成的指令集合,高級函數(shù)更容易可視化。
形式上,函數(shù)求值更接近算法的數(shù)學(xué)表達(dá)。以簡單的代數(shù)形式設(shè)計(jì)算法,便于處理特殊情況和邊界條件,而且函數(shù)更有可能按照預(yù)期工作,也便于編寫單元測試用例。
請注意,通常函數(shù)式程序比功能相同的命令式(面向?qū)ο蠡蛘哌^程式的)程序更加簡潔明了和高效,但這些優(yōu)點(diǎn)并不是自然而然的,需要仔細(xì)地設(shè)計(jì),但付出的努力通常少于設(shè)計(jì)功能類似的過程式程序。
- Spring Cloud Alibaba核心技術(shù)與實(shí)戰(zhàn)案例
- 復(fù)雜軟件設(shè)計(jì)之道:領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)全面解析與實(shí)戰(zhàn)
- JavaScript語言精髓與編程實(shí)踐(第3版)
- PaaS程序設(shè)計(jì)
- Mastering QGIS
- Java深入解析:透析Java本質(zhì)的36個(gè)話題
- R Deep Learning Cookbook
- C和C++游戲趣味編程
- 深入淺出React和Redux
- C語言程序設(shè)計(jì)
- 微服務(wù)架構(gòu)深度解析:原理、實(shí)踐與進(jìn)階
- 小型編譯器設(shè)計(jì)實(shí)踐
- Mudbox 2013 Cookbook
- Mobile Forensics:Advanced Investigative Strategies
- Solr權(quán)威指南(下卷)