成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

SICP Python 描述 1.2 編程元素

CoorChice / 1989人閱讀

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

1.2 編程元素

來源:1.2 The Elements of Programming

譯者:飛龍

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

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

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

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

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

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

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

1.2.1 表達式

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

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

>>> 42
42

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

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

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

1.2.2 調(diào)用表達式

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

>>> max(7.5, 9.5)
9.5

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

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

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

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

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

不會產(chǎn)生任何歧義,因為函數(shù)的名稱永遠在參數(shù)前面。

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

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

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

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

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

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

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

operator模塊提供了中綴運算符對應(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 庫文檔列出了定義在每個模塊中的函數(shù),例如數(shù)學(xué)模塊。然而,這個文檔為了解整個語言的開發(fā)者編寫。到現(xiàn)在為止,你可能發(fā)現(xiàn)使用函數(shù)做實驗會比閱讀文檔告訴你更多它的行為。當(dāng)你更熟悉 Python 語言和詞匯時,這個文檔就變成了一份有價值的參考來源。

1.2.4 名稱和環(huán)境

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

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

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

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

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

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

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

=符號在 Python(以及許多其它語言)中叫做賦值運算符。賦值是 Python 中的最簡單的抽象手段,因為它使我們可以使用最簡單的名稱來引用復(fù)合操作的結(jié)果,例如上面計算的area。這樣,復(fù)雜的程序可以由復(fù)雜性遞增的計算對象一步一步構(gòu)建,

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

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

>>> max

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

>>> f = max
>>> f

>>> f(3, 4)
4

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

>>> f = 2
>>> f
2

在 Python 中,通過賦值綁定的名稱通常叫做變量名稱,因為它們在執(zhí)行程序期間可以綁定到許多不同的值上面。

1.2.5 嵌套表達式的求解

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

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

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

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

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

例如,求出

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

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

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

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

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

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

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

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

>>> add(x, 1)

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

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

>>> x = 3

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

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

1.2.6 函數(shù)圖解

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

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

>>> abs(-2)
2

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

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

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    chenjiang3 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<