成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

SICP Python 描述 1.2 編程元素

CoorChice / 2042人閱讀

摘要:程序用于在編程社群的成員之間交流這些想法。在編程中,我們處理兩種元素函數(shù)和數(shù)據(jù)。在中,我們可以使用賦值語句來建立新的綁定,它包含左邊的名稱和右邊的值。例如,它并不能處理賦值語句。這些圖解的必要部分是函數(shù)的表示。

1.2 編程元素

來源:1.2 The Elements of Programming

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

編程語言是操作計(jì)算機(jī)來執(zhí)行任務(wù)的手段,它也在我們組織關(guān)于過程的想法中,作為一種框架。程序用于在編程社群的成員之間交流這些想法。所以,程序必須為人類閱讀而編寫,并且僅僅碰巧可以讓機(jī)器執(zhí)行。

當(dāng)我們描述一種語言時(shí),我們應(yīng)該特別注意這種語言的手段,來將簡單的想法組合為更復(fù)雜的想法。每個(gè)強(qiáng)大的語言都擁有用于完成下列任務(wù)的機(jī)制:

基本的表達(dá)式和語句,它們由語言提供,表示最簡單的構(gòu)建代碼塊。

組合的手段,復(fù)雜的元素由簡單的元素通過它來構(gòu)建,以及

抽象的手段,復(fù)雜的元素可以通過它來命名,以及作為整體來操作。

在編程中,我們處理兩種元素:函數(shù)和數(shù)據(jù)。(不久之后我們就會探索它們并不是真的非常不同。)不正式地說,數(shù)據(jù)是我們想要操作的東西,函數(shù)描述了操作數(shù)據(jù)的規(guī)則。所以,任何強(qiáng)大的編程語言都應(yīng)該能描述基本數(shù)據(jù)和基本函數(shù),并且應(yīng)該擁有組合和抽象二者的方式。

1.2.1 表達(dá)式

在實(shí)驗(yàn) Python 解釋器之后,我們現(xiàn)在必須重新開始,按照順序一步步地探索 Python 語言。如果示例看上去很簡單,要有耐心 -- 更刺激的東西還在后面。

我們以基本表達(dá)式作為開始。一種基本表達(dá)式就是數(shù)值。更精確地說,是你鍵入的,由 10 進(jìn)制數(shù)字表示的數(shù)值組成的表達(dá)式。

>>> 42
42

表達(dá)式表示的數(shù)值也許會和算數(shù)運(yùn)算符組合,來形成復(fù)合表達(dá)式,解釋器會求出它:

>>> -1 - -1
0
>>> 1/2 + 1/4 + 1/8 + 1/16 + 1/32 + 1/64 + 1/128
0.9921875

這些算術(shù)表達(dá)式使用了中綴符號,其中運(yùn)算符(例如+-、*、/)出現(xiàn)在操作數(shù)(數(shù)值)中間。Python包含許多方法來形成復(fù)合表達(dá)式。我們不會嘗試立即將它們列舉出來,而是在進(jìn)行中介紹新的表達(dá)式形式,以及它們支持的語言特性。

1.2.2 調(diào)用表達(dá)式

最重要的復(fù)合表達(dá)式就是調(diào)用表達(dá)式,它在一些參數(shù)上調(diào)用函數(shù)?;貞洿鷶?shù)中,函數(shù)的數(shù)學(xué)概念是一些輸入值到輸出值的映射。例如,max函數(shù)將它的輸入映射到單個(gè)輸出,輸出是輸入中的最大值。Python 中的函數(shù)不僅僅是輸入輸出的映射,它表述了計(jì)算過程。但是,Python 表示函數(shù)的方式和數(shù)學(xué)中相同。

>>> max(7.5, 9.5)
9.5

調(diào)用表達(dá)式擁有子表達(dá)式:運(yùn)算符在圓括號之前,圓括號包含逗號分隔的操作數(shù)。運(yùn)算符必須是個(gè)函數(shù),操作數(shù)可以是任何值。這里它們都是數(shù)值。當(dāng)求解這個(gè)調(diào)用表達(dá)式時(shí),我們說max函數(shù)以參數(shù) 7.5 和 9.5 調(diào)用,并且返回 9.5。

調(diào)用表達(dá)式中的參數(shù)的順序極其重要。例如,函數(shù)pow計(jì)算第一個(gè)參數(shù)的第二個(gè)參數(shù)次方。

>>> pow(100, 2)
10000
>>> pow(2, 100)
1267650600228229401496703205376

函數(shù)符號比中綴符號的數(shù)學(xué)慣例有很多優(yōu)點(diǎn)。首先,函數(shù)可以接受任何數(shù)量的參數(shù):

>>> max(1, -2, 3, -4)
3

不會產(chǎn)生任何歧義,因?yàn)楹瘮?shù)的名稱永遠(yuǎn)在參數(shù)前面。

其次,函數(shù)符號可以以直接的方式擴(kuò)展為嵌套表達(dá)式,其中元素本身是復(fù)合表達(dá)式。在嵌套的調(diào)用表達(dá)式中,不像嵌套的中綴表達(dá)式,嵌套結(jié)構(gòu)在圓括號中非常明顯。

>>> max(min(1, -2), min(pow(3, 5), -4))
-2

(理論上)這種嵌套沒有任何限制,并且 Python 解釋器可以解釋任何復(fù)雜的表達(dá)式。然而,人們可能會被多級嵌套搞暈。你作為程序員的一個(gè)重要作用就是構(gòu)造你自己、你的同伴以及其它在未來可能會閱讀你代碼的人可以解釋的表達(dá)式。

最后,數(shù)學(xué)符號在形式上多種多樣:星號表示乘法,上標(biāo)表示乘方,橫杠表示除法,屋頂和側(cè)壁表示開方。這些符號中一些非常難以打出來。但是,所有這些復(fù)雜事物可以通過調(diào)用表達(dá)式的符號來統(tǒng)一。雖然 Python 通過中綴符號(比如+-)支持常見的數(shù)學(xué)運(yùn)算符,任何運(yùn)算符都可以表示為帶有名字的函數(shù)。

1.2.3 導(dǎo)入庫函數(shù)

Python 定義了大量的函數(shù),包括上一節(jié)提到的運(yùn)算符函數(shù),但是通常不能使用它們的名字,這樣做是為了避免混亂。反之,它將已知的函數(shù)和其它東西組織在模塊中,這些模塊組成了 Python 庫。需要導(dǎo)入它們來使用這些元素。例如,math模塊提供了大量的常用數(shù)學(xué)函數(shù):

>>> from math import sqrt, exp
>>> sqrt(256)
16.0
>>> exp(1)
2.718281828459045

operator模塊提供了中綴運(yùn)算符對應(yīng)的函數(shù):

>>> from operator import add, sub, mul
>>> add(14, 28)
42
>>> sub(100, mul(7, add(8, 4)))
16

import語句標(biāo)明了模塊名稱(例如operatormath),之后列出被導(dǎo)入模塊的具名屬性(例如sqrtexp)。

Python 3 庫文檔列出了定義在每個(gè)模塊中的函數(shù),例如數(shù)學(xué)模塊。然而,這個(gè)文檔為了解整個(gè)語言的開發(fā)者編寫。到現(xiàn)在為止,你可能發(fā)現(xiàn)使用函數(shù)做實(shí)驗(yàn)會比閱讀文檔告訴你更多它的行為。當(dāng)你更熟悉 Python 語言和詞匯時(shí),這個(gè)文檔就變成了一份有價(jià)值的參考來源。

1.2.4 名稱和環(huán)境

編程語言的要素之一是它提供的手段,用于使用名稱來引用計(jì)算對象。如果一個(gè)值被給予了名稱,我們就說這個(gè)名稱綁定到了值上面。

在 Python 中,我們可以使用賦值語句來建立新的綁定,它包含=左邊的名稱和右邊的值。

>>> radius = 10
>>> radius
10
>>> 2 * radius
20

名稱也可以通過import語句綁定:

>>> from math import pi
>>> pi * 71 / 223
1.0002380197528042

我們也可以在一個(gè)語句中將多個(gè)值賦給多個(gè)名稱,其中名稱和表達(dá)式由逗號分隔:

>>> area, circumference = pi * radius * radius, 2 * pi * radius
>>> area
314.1592653589793
>>> circumference
62.83185307179586

=符號在 Python(以及許多其它語言)中叫做賦值運(yùn)算符。賦值是 Python 中的最簡單的抽象手段,因?yàn)樗刮覀兛梢允褂米詈唵蔚拿Q來引用復(fù)合操作的結(jié)果,例如上面計(jì)算的area。這樣,復(fù)雜的程序可以由復(fù)雜性遞增的計(jì)算對象一步一步構(gòu)建,

將名稱綁定到值上,以及隨后通過名稱來檢索這些值的可能,意味著解釋器必須維護(hù)某種內(nèi)存來跟蹤這些名稱和值的綁定。這些內(nèi)存叫做環(huán)境。

名稱也可以綁定到函數(shù)。例如,名稱max綁定到了我們曾經(jīng)用過的max函數(shù)上。函數(shù)不像數(shù)值,不易于渲染成文本,所以 Python 使用識別描述來代替,當(dāng)我們打印函數(shù)時(shí):

>>> max

我們可以使用賦值運(yùn)算符來給現(xiàn)有函數(shù)起新的名字:

>>> f = max
>>> f

>>> f(3, 4)
4

成功的賦值語句可以將名稱綁定到新的值:

>>> f = 2
>>> f
2

在 Python 中,通過賦值綁定的名稱通常叫做變量名稱,因?yàn)樗鼈冊趫?zhí)行程序期間可以綁定到許多不同的值上面。

1.2.5 嵌套表達(dá)式的求解

我們這章的目標(biāo)之一是隔離程序化思考相關(guān)的問題。作為一個(gè)例子,考慮嵌套表達(dá)式的求解,解釋器自己會遵循一個(gè)過程:

為了求出調(diào)用表達(dá)式,Python 會執(zhí)行下列事情:

求出運(yùn)算符和操作數(shù)子表達(dá)式,之后

在值為操作數(shù)子表達(dá)式的參數(shù)上調(diào)用值為運(yùn)算符子表達(dá)式的函數(shù)。

這個(gè)簡單的過程大體上展示了一些過程上的重點(diǎn)。第一步表明為了完成調(diào)用表達(dá)式的求值過程,我們首先必須求出其它表達(dá)式。所以,求值過程本質(zhì)上是遞歸的,也就是說,它會調(diào)用其自身作為步驟之一。

例如,求出

>>> mul(add(2, mul(4, 6)), add(3, 5))
208

需要應(yīng)用四次求值過程。如果我們將每個(gè)需要求解的表達(dá)式抽出來,我們可以可視化這一過程的層次結(jié)構(gòu):

這個(gè)示例叫做表達(dá)式樹。在計(jì)算機(jī)科學(xué)中,樹從頂端向下生長。每一點(diǎn)上的對象叫做節(jié)點(diǎn)。這里它們是表達(dá)式和它們的值。

求出根節(jié)點(diǎn),也就是整個(gè)表達(dá)式,需要首先求出枝干節(jié)點(diǎn),也就是子表達(dá)式。葉子節(jié)點(diǎn)(也就是沒有子節(jié)點(diǎn)的節(jié)點(diǎn))的表達(dá)式表示函數(shù)或數(shù)值。內(nèi)部節(jié)點(diǎn)分為兩部分:表示我們想要應(yīng)用的求值規(guī)則的調(diào)用表達(dá)式,以及表達(dá)式的結(jié)果。觀察這棵樹中的求值,我們可以想象操作數(shù)的值向上流動(dòng),從葉子節(jié)點(diǎn)開始,在更高的層上融合。

接下來,觀察第一步的重復(fù)應(yīng)用,這會將我們帶到需要求值的地方,并不是調(diào)用表達(dá)式,而是基本表達(dá)式,例如數(shù)字(比如2),以及名稱(比如add),我們需要規(guī)定下列事物來謹(jǐn)慎對待基本的東西:

數(shù)字求值為它標(biāo)明的數(shù)值,

名稱求值為當(dāng)前環(huán)境中這個(gè)名稱所關(guān)聯(lián)的值

要注意環(huán)境的關(guān)鍵作用是決定表達(dá)式中符號的含義。Python 中,在不指定任何環(huán)境信息,來提供名稱x(以及名稱add)的含義的情況下,談到這樣一個(gè)表達(dá)式的值沒有意義:

>>> add(x, 1)

環(huán)境提供了求值所發(fā)生的上下文,它在我們理解程序執(zhí)行中起到重要作用。

這個(gè)求值過程并不符合所有 Python 代碼的求解,僅僅是調(diào)用表達(dá)式、數(shù)字和名稱。例如,它并不能處理賦值語句。

>>> x = 3

的執(zhí)行并不返回任何值,也不求解任何參數(shù)上的函數(shù),因?yàn)橘x值的目的是將一個(gè)名稱綁定到一個(gè)值上。通常,語句不會被求值,而是被執(zhí)行,它們不產(chǎn)生值,但是會改變一些東西。每種語句或表達(dá)式都有自己的求值或執(zhí)行過程,我們會在涉及時(shí)逐步介紹。

注:當(dāng)我們說“數(shù)字求值為數(shù)值”的時(shí)候,我們的實(shí)際意思是 Python 解釋器將數(shù)字求解為數(shù)值。Python 的解釋器使編程語言具有了這個(gè)意義。假設(shè)解釋器是一個(gè)固定的程序,行為總是一致,我們就可以說數(shù)字(以及表達(dá)式)自己在 Python 程序的上下文中會求解為值。

1.2.6 函數(shù)圖解

當(dāng)我們繼續(xù)構(gòu)建求值的正式模型時(shí),我們會發(fā)現(xiàn)解釋器內(nèi)部狀態(tài)的圖解有助于我們跟蹤求值過程的發(fā)展。這些圖解的必要部分是函數(shù)的表示。

純函數(shù):具有一些輸入(參數(shù))以及返回一些輸出(調(diào)用結(jié)果)的函數(shù)。內(nèi)建函數(shù)

>>> abs(-2)
2

可以描述為接受輸入并產(chǎn)生輸出的小型機(jī)器。

abs是純函數(shù)。純函數(shù)具有一個(gè)特性,調(diào)用它們時(shí)除了返回一個(gè)值之外沒有其它效果。

非純函數(shù):除了返回一個(gè)值之外,調(diào)用非純函數(shù)會產(chǎn)生副作用,這會改變解釋器或計(jì)算機(jī)的一些狀態(tài)。一個(gè)普遍的副作用就是在返回值之外生成額外的輸出,例如使用print函數(shù):

>>> print(-2)
-2
>>> print(1, 2, 3)
1 2 3

雖然這些例子中的printabs看起來很像,但它們本質(zhì)上以不同方式工作。print的返回值永遠(yuǎn)是None,它是一個(gè) Python 特殊值,表示沒有任何東西。Python 交互式解釋器并不會自動(dòng)打印None值。這里,print自己打印了輸出,作為調(diào)用中的副作用。

調(diào)用print的嵌套表達(dá)式會凸顯出它的非純特性:

>>> print(print(1), print(2))
1
2
None None

如果你發(fā)現(xiàn)自己不能預(yù)料到這個(gè)輸出,畫出表達(dá)式樹來弄清為什么這個(gè)表達(dá)式的求值會產(chǎn)生奇怪的輸出。

要當(dāng)心print!它的返回值為None,意味著它不應(yīng)該在賦值語句中用作表達(dá)式:

>>> two = print(2)
2
>>> print(two)
None

簽名:不同函數(shù)具有不同的允許接受的參數(shù)數(shù)量。為了跟蹤這些必備條件,我們需要以一種展示函數(shù)名稱和參數(shù)名稱的方式,畫出每個(gè)函數(shù)。abs函數(shù)值接受一個(gè)叫作number的參數(shù),向它提供更多或更少的參數(shù)會產(chǎn)生錯(cuò)誤。print函數(shù)可以接受任意數(shù)量的參數(shù),所以它渲染為print(...)。函數(shù)的可接受參數(shù)的描述叫做函數(shù)的簽名。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/38101.html

相關(guān)文章

  • SICP Python 描述 第三章 計(jì)算機(jī)程序的構(gòu)造和解釋 3.1 引言

    摘要:為通用語言設(shè)計(jì)解釋器的想法可能令人畏懼。但是,典型的解釋器擁有簡潔的通用結(jié)構(gòu)兩個(gè)可變的遞歸函數(shù),第一個(gè)求解環(huán)境中的表達(dá)式,第二個(gè)在參數(shù)上調(diào)用函數(shù)。這一章接下來的兩節(jié)專注于遞歸函數(shù)和數(shù)據(jù)結(jié)構(gòu),它們是理解解釋器設(shè)計(jì)的基礎(chǔ)。 3.1 引言 來源:3.1 Introduction 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 第一章和第二章描述了編程的兩個(gè)基本元素:數(shù)據(jù)和函數(shù)之間的...

    v1 評論0 收藏0
  • SICP Python描述 1.1 引言

    摘要:另一個(gè)賦值語句將名稱關(guān)聯(lián)到出現(xiàn)在莎士比亞劇本中的所有去重詞匯的集合,總計(jì)個(gè)。表達(dá)式是一個(gè)復(fù)合表達(dá)式,計(jì)算出正序或倒序出現(xiàn)的莎士比亞詞匯集合。在意圖上并沒有按照莎士比亞或者回文來設(shè)計(jì),但是它極大的靈活性讓我們用極少的代碼處理大量文本。 1.1 引言 來源:1.1 Introduction 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 計(jì)算機(jī)科學(xué)是一個(gè)極其寬泛的學(xué)科。全球的分布...

    xumenger 評論0 收藏0
  • SICP Python 描述 2.2 數(shù)據(jù)抽象

    摘要:示例有理數(shù)的算術(shù)有理數(shù)可表示為整數(shù)的比值,并且它組成了實(shí)數(shù)的一個(gè)重要子類。有理數(shù)的值需要兩部分來描述。這里的重要概念是,通過將有理數(shù)表示為整數(shù)的比值,我們能夠完全避免近似問題。返回有理數(shù)的分子。 2.2 數(shù)據(jù)抽象 來源:2.2 Data Abstraction 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 由于我們希望在程序中表達(dá)世界中的大量事物,我們發(fā)現(xiàn)它們的大多數(shù)都具有...

    Joonas 評論0 收藏0
  • SICP Python 描述 第二章 使用對象構(gòu)建抽象 2.1 引言

    摘要:對象表示信息,但是同時(shí)和它們所表示的抽象概念行為一致。通過綁定行為和信息,對象提供了可靠獨(dú)立的日期抽象。名稱來源于實(shí)數(shù)在中表示的方式浮點(diǎn)表示。另一方面,對象可以表示很大范圍內(nèi)的分?jǐn)?shù),但是不能表示所有有理數(shù)。 2.1 引言 來源:2.1 Introduction 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 在第一章中,我們專注于計(jì)算過程,以及程序設(shè)計(jì)中函數(shù)的作用。我們看到了...

    phoenixsky 評論0 收藏0
  • SICP Python 描述 2.6 實(shí)現(xiàn)類和對象

    摘要:以這種方式實(shí)現(xiàn)對象系統(tǒng)的目的是展示使用對象隱喻并不需要特殊的編程語言。我們的實(shí)現(xiàn)并不遵循類型系統(tǒng)的明確規(guī)定。反之,它為實(shí)現(xiàn)對象隱喻的核心功能而設(shè)計(jì)。是分發(fā)字典,它響應(yīng)消息和。 2.6 實(shí)現(xiàn)類和對象 來源:2.6 Implementing Classes and Objects 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 在使用面向?qū)ο缶幊谭妒綍r(shí),我們使用對象隱喻來指導(dǎo)程序...

    chenjiang3 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<