《計算思維導論:程序設計思想與方法》——第2章:用數據表示現實世界

計算涉及到兩樣東西:信息和對信息的處理過程。
計算的程序要做兩件事:第一,用特定數據類型和數據結構將信息表示出來;第二,用控制結構將信息處理過程表示出來。

2.1 數據和數據類型
2.1.1 數據使對現實的抽象
  1. 在計算領域,將現實世界中的事實或信息用編程語言提供的符號化手段進行表示,這種符號化表示稱爲數據(data)。
    在這裏插入圖片描述
  2. 爲了用計算機解決一個問題,必須先對該問題進行抽象,定義問題在計算機中的數據表示。數據表示的選擇,必須依據將對數據施加的操作來考慮,以便將來能夠方便、高效地處理數據。
2.1.2 常量與變量
  1. 所有編程語言都提供兩種指明數據的方式:第一,直接用字面值(literal)表示數據,即從文本字面上即可看出什麼是數據,這種數據是不會改變的常量;第二,將數據存儲在一個變量中,以後用該變量來指代數據。
  2. 變量知識一個“佔位符”,必須用具體數據賦值後纔有意義。賦值語句的語法形式是:
    <變量> = <表達式>
    Python首先對表達式進行求值,然後將結果存儲到變量中。如果表達式無法求值,則賦值語句出錯。
  • 並行賦值
    在這裏插入圖片描述
2.1.3 數據類型
  1. 爲了更精細、更準確地表示現實世界的信息,編程語言提供了多種數據類型(data type)來區分不同種類的數據。
  2. 每一種數據類型由兩部分構成:全體合法的值(value)以及對這種值能執行的各種操作(operation,或稱運算)。
2.1.4 Python的動態類型
  1. 將一個數據存入變量,實際上是存入該變量所標識的內存單元;而訪問一個變量,是訪問該變量所標識的內存單元中的數據。
  2. 絕大多數編程語言中對變量的使用由嚴格的類型限制,一個變量固定作爲某內存單元的標識,並且該單元只能存儲特定類型的數據。
  3. 在Python中,變量並不是某個固定內存單元的標識,也就不需要預先定義變量的類型。Python變量只是對內存中存儲的某個數據的引用(reference),這個引用時可以動態改變的。
    在這裏插入圖片描述
  4. 變量改爲指向另一個數據時,原數據就變成了無人使用的“垃圾數據”(除非還有別的變量引用它),Python會回收垃圾數據的存儲單元,以便提供給別的數據使用,這稱爲垃圾回收(garbage collection)。
2.2 數值類型
2.2.1 整數類型int
  1. 整數就是沒有小數部分的數值,分爲正整數、0和負整數。
  2. 整數運算符:
    在這裏插入圖片描述
  3. 賦值與運算結合:
    在這裏插入圖片描述
  • int類型的侷限性
    在計算機底層,整數一般都是用特定長度的二進制數來表示。至於具體長度是多少,取決於CPU的設計。
2.2.2 長整數類型long
  1. 長整數類型long的值在計算機內的表示不是固定長度的,只要內存許可,長整數可以擴展到任意長度。
  2. 長整數類型的字面值必須加後綴“L”或“l”,這是long類型的標誌。
  3. Python中用函數type()來檢查表達式樹蕨類型:
    在這裏插入圖片描述
  4. long類型和int類型除了內部表示不同,運算規律是一樣的。與int類型相比,long類型的運算效率極差。這是因爲int類型的運算是CPU硬件直接支持的,而long類型的運算是程序實現的。
  • 自動類型轉換:int與long
    一般而言,數據類型轉換應當確保不丟失信息。當兩個int類型的數據進行運算,導致結果超出int範圍時,較後版本的Python也會自動將結果轉換成long類型的數據。
  • 計算時次序的藝術
2.2.3 浮點數類型的float
  1. 浮點數就是包含小數點的數,大體對應數學中的實數集合。float允許小數點後面沒有任何數字(表示小數部分爲0)。
  • 浮點數的能力與限制
    浮點數類型能夠表示巨大的數值,能夠進行高精度的計算。但是,浮點數在計算機內是用固定長度的二進制表示的,有些數可能無法精確地表示,只能存儲帶有微小誤差地近似值。
    不要對浮點數使用==來判斷是否相等,正確的做法是檢查兩個浮點數的差是否足夠小,是則認爲相等:
    在這裏插入圖片描述
  • 科學記數法
    對於很大或很小的浮點數,Python會自動以科學記數法來表示。所謂科學記數法就是以“a×10的整數次冪”的形式來表示的數字,其中1 ≤ abs(a) < 10。
    當一個表達式的結果超出了浮點數表示範圍的時候,Python會顯示結果爲inf(無窮大)或-inf(負無窮)。
  • 自動類型轉換
    Python在對混合類型的表達式進行求值時,首先將int或long類型轉換成float,然後再執行float運算,結果爲float類型。
  • 手動類型轉換
    使用類型函數int() long() float()實現。
2.2.4 數學庫模塊math
  1. 所謂的“庫”其實是專業程序員編寫的Python模塊,其中定義了很多有用的函數,應用程序可以使用庫中的函數。
  2. 數據庫的導入:
  • import語句導入整個模塊
    在這裏插入圖片描述
    math.sqrt()表示“調用模塊math中的sqrt函數”。
  • from xxx import xxx語句導入某個數據庫的某個函數
    在這裏插入圖片描述
  • from xxx imort*
    在這裏插入圖片描述
  1. math庫中定義的一些數學函數和常數:
    在這裏插入圖片描述
2.2.5 複數類型complex
  1. Python中,complex類型的字面值形式是(a+bj),在不會產生誤解的情況下括號也可以省略。
  2. abs()對複數是計算複數的模數。
  3. 可以通過x.real和x.imag來分別獲得複數x的實部和虛部,結果都是float類型
2.3 字符串類型str
  1. 字符是計算機中表示信息的最小符號,常見的大小寫字母、阿拉伯數字、標點符號等都是字符。
  2. 字符串是由字符組成的序列,在程序中作爲被處理的數據。
2.3.1 字符串類型的字面值形式
  1. 在Python中,字符串的字面值有四種形式:
  • 用單引號括起來的字符串:
  • 用雙引號括起來的字符串
  • 用三個單引號括起來的字符串
  • 用三個雙引號括起來的字符串
  1. 用單引號或雙引號括起來的字符串必須在一行內表示,是程序設計中最常用的形式。而用三個單引號或三個雙引號括起來的字符串是可以多行的,主要用於一個特殊用法——文檔字符串(docstring)。
  2. 轉義字符""轉變意義。
2.3.2 字符串類型的操作
  1. 字符串是字符序列,每個字符在序列中的位置都由一個從0開始的整數編號指定,這個編號稱爲位置索引。
  2. 訪問字符串內容的一般形式:
    <字符串>[<數值表達式>]
    Python還支持從後往前的索引方式,索引-1代表倒數第一個位置;
    Python也支持通過索引操作來訪問字符串的子串,方法是指定字符串的一個索引區間,這種操作也稱爲切分,切分操作的一般形式是:
    <字符串>[開始位置:結束位置],不含結束位置。
    在這裏插入圖片描述
    除了索引操作,字符串類型還支持字符串的合併(+)、複製(*)、子串測試(in)操作,並提供一個求字符串長度的內建函數len().
    在這裏插入圖片描述
  3. Python中的字符串類型的值是不能修改的!str類型的數據不支持對其成員的賦值。
  4. 字符串操作:
    在這裏插入圖片描述
2.3.3 字符的機內表示
  1. 和數值一樣,字符在計算機內部也是二進制數表示的,這個二進制數稱爲該字符的編碼。
  2. 由於計算機是美國人發明的,所以較早出現的一個編碼標準是根據美國的使用情況制定的標準,稱爲ASCII(American Standard Code for Information Interchange)
  3. Python提供了兩個與字符編碼相關的函數:ord()函數用於從字符得到其編碼,chr()函數用於從編碼得出對應的字符:
    在這裏插入圖片描述
  4. 爲了將全世界的字符編碼統一起來,國家標準化組織ISO制定了一個龐大的字符編碼標準Unicode。
  5. Python語言中,在字符串前面加個前綴u就表示Unicode字符串,其中可以使用任意Unicode字符。
    在這裏插入圖片描述
    \x是十六進制的標誌;
    “漢”字在機器內部被表示成了兩個字節的編碼。
  6. 如果希望Python程序能夠處理包含漢字的字符串,用Unicode字符串是最可靠的做法。
2.3.4 字符串類型與其他類型的轉換
  1. 函數eval()接收一個字符串,並將該字符串解釋成Python表達式進行求值,最終得到特定類型的結果值。
    在這裏插入圖片描述
  2. 將其他類型的值轉換成字符串類型,可以使用str()函數。
    在這裏插入圖片描述
2.3.5 字符串庫string
  1. 模塊string中常用的函數如下:
    在這裏插入圖片描述
    在這裏插入圖片描述
2.4 布爾類型bool
  1. Python語言自從2.3版之後定義了布爾類型bool,bool類型的兩個值爲True和False。
2.4.1 關係運算
  1. Python中,字符串是按所謂的字典序進行比較的,即基於字母順序的比較,字母順序又是根據ASCII編碼順序確定的。這樣,所有大寫字母都排在任何小寫字母之前,而同爲大寫或同爲小寫字母的兩個字母之間按字母表順序排列。
2.4.2 邏輯運算
  1. Python語言支持的邏輯運算符有三個:and、or和not
  2. 在Python語言中,邏輯運算符的優先級次序是not>and>or。
2.4.3 布爾代數運算定律
  • a and False ⇔ False
  • a and True ⇔ a
  • a or False ⇔ a
  • a or True ⇔ a
  • a or (b and c) ⇔ (a or b) and (a or c)
  • a and (b or c) ⇔ (a and b) or (a and c)
  • not (not a) ⇔ a
  • not (a or b) ⇔ (not a) and (not b)
  • not (a and b) ⇔ (not a) or (not b)
2.4.4 Python中真假的表示與計算
  1. a 和 b不一定是布爾表達式:
    a and b:如果a的值可解釋爲False,則返回a的值;否則返回b的值;a and b:如果a的值可解釋爲False,則返回a的值;否則返回b的值;
    a or b:如果a的值可解釋爲False,則返回b的值;否則返回a的值。
    not a:如果a的值看解釋爲False,則返回True;否則返回False
2.5 列表和元組類型
  1. 整數類型、浮點數類型和布爾類型都是最簡單的“原子”數據類型,因爲這些類型的值是不可分割的基本數據項。
  2. Python提供了多種集合體類型,包括列表、元組、字典和文件。
2.5.1 列表類型list
  1. 列表(list)是由若干數據組成的序列(sequence)。
  • 列表的表示
  1. [<表達式1>,<表達式2>,…,<表達式n>]
    即用一對方括號將以逗號分隔的若干數據(表達式的值)括起來。
  2. 列表中成員的個數稱爲列表的長度,可以用len()函數求得。
  3. 不含任何成員的列表也是有意義的,稱爲空列表,用一對方括號[]表示,長度爲0。
    在這裏插入圖片描述
  • 列表的操作
  1. 通過索引操作訪問列表成員的一般形式如下:
    <列表>[<數值表達式>]
    其中數值表達式的值就是位置索引,整個索引操作的返回結果就是索引位置上的成員。如果索引超出了範圍,則導致出錯。
  2. Python也支持通過指定列表的一個索引區間來訪問列表的“子列表”,一般形式是:
    <列表>[開始位置:結束位置],不含結束位置。
  3. 列表的索引機制和前面的字符串類型很類似,而字符串的運算+和*,也適用於列表,可以實現列表的合併、複製操作。
  4. 列表是可更改的,可以增加、刪除和改變某個成員的值。
    在這裏插入圖片描述
  • range()函數
  1. Python語言提供了一個內建函數range(),用於產生整數列表。
    range()的一般形式是:
    range(<起點>,<終點>,<步長>)
    返回結果是從起點到終點的有序整數列表各整數之間以步長爲差。整數不包含終點。
    在這裏插入圖片描述
2.5.2 元組類型tuple
  1. 元組也是數據集合體的一種,該類型的字面值形式是用一對圓括號括起來並以逗號分隔得多個成員。
  2. 沒有成員的元組是空元組,用()表示。如果元組只有一個成員,仍然需要在該成員後面加上逗號。
  3. 和列表一樣,可以通過索引來訪問元組的成員。列表運算基本上都適用於元組。
  4. 元組是不可更改的,一旦創建,不可以修改、刪除和添加。
  5. 如果想要修改元組,只能通過創建新的元組來迂迴達到目的。
    在這裏插入圖片描述
2.6 數據的輸入和輸出
2.6.1 數據的輸入
  1. Python中提供了input()函數用於輸入數據,該函數通常的使用方式如下:
    <變量名> = (<提示字符串>)
    函數將用戶輸入作爲一個表達式進行解釋、求值,最後將結果賦予變量。
  2. input不僅能接收數值類型的表達式,也能接收其他類型的表達式。
    在這裏插入圖片描述
  3. 如果不加引號,input會將輸入的字符串解釋爲變量名,以便構成合法的表達式。
  4. Python還提供另一個輸入函數raw_input(),它用於字符串數據輸入時更方便。通常使用方式如下:
    <變量名> = raw_input(<提示字符串>)
    用戶輸入的所有內容視爲一個普通的字符串而不是表達式。
    *input()與raw_input()的比較
    raw_input能處理空輸入,而input時空輸入會導致錯誤。
2.6.2 數據的輸出
  1. print後面可以出現零個、一個乃至n個表達式,各表達式之間用逗號分隔。print語句的語義是:從左到右計算每一個表達式,將各表達式的值以文本形式從左到右顯示在屏幕的同一行上,值與值之間插入一個空格作爲間隔。沒有表達式的print語句用於輸出一個空白行。連續兩條print語句將在屏幕的兩個不同行上顯示信息,但如果前一條語句以逗號結尾,則下一條print語句將不會換行,而是接在前一行的後面繼續顯示。
    在這裏插入圖片描述
2.6.3 格式化輸出
  1. 字符串格式化運算%的一般用法如下:
    <模板字符串> % (<數據1>, …, <數據n>)
  2. 格式定義符的一般形式是:
    %<款度>.<精度><類型字符>
    如果實際數據的寬度超出空位的預留寬度,則空位自動擴張至所需寬度;如果實際數據的寬度小於預留寬度,則按預留寬度輸出。若省略寬度或指定寬度爲0,則表示根據實際數據的寬度分配空間。
    另外:當預留寬度大於數據的實際寬度時,該數據在預留空間內默認是右對齊的,但可以通過寬度前加上負號改成左對齊;浮點數輸出時默認的精度是保留6位小數,實際數據的小數部分不足6位時自動補0,超出6位時自動進行舍入;如果指定過高的精度,可能導致無法精確表示。
    在這裏插入圖片描述
2.7 編程案例:查找問題
2.8 練習
  1. 什麼是數據?什麼是數據類型?
    數據是現實的抽象
    數據類型區分不同種類的數據
  2. Python中數值類型有哪些?對數值類型能執行什麼運算?
    整數和浮點數類型
    在這裏插入圖片描述
  3. Python中字符串有哪些表示方式?對字符串類型能執行什麼運算?
  4. Python中布爾類型提供了哪兩個值?對布爾類型數據能執行什麼運算?
  5. Python中的列表類型和其他編程語言中常見的數組類型有何異同?
  6. Python中字符串類型和列表類型有何異同?
  7. Python中元組類型與列表類型有何異同?
  8. 說Python中的變量是動態類型的,這是什麼意思?
  9. 哪些運算符針對不同類型的數據有不同意義?
  10. 利用Python計算以下表達式。如果出錯,找出原因。
    (1) 4.0/10.0 + 3.52
    (2) 10%4+6/2
    (3) abs(4-20/3)**3
    (4) sqrt(4.5-5.0)+7
    3
    (5) 3*10/3 + 10%3
    (6) 3L**3
  11. 將下列數學式用Python表達式表示出來。假設已通過import math導入了數學庫。
    (1) (a+b)×c
    (2) n(n-1)/2
    (3) 2πr
    (4) √r(cos a)2+r(sin a)2
    (5) (y2-y1)/(x2-x1)
  12. 設計程序:輸入球體半徑 r,計算球體的體積( 4/3πr3)和表面積( 4πr2)。
  13. 設計程序:輸入平面上兩個點的座標(x1,y1)和(x2,y2),計算兩點間距離。距離公式爲 d = √(x2-x1)2+(y2-y2)2.
  14. 設計程序:輸入以英尺英寸爲單位的身高數據,轉換成以米爲單位的數據。 (1 英尺=12 英寸=0.305 米)
  15. 設計程序:輸入 5 個考試分數,計算平均分。
  16. 假設已經執行了如下語句:
    >>> import string
    >>> s1 = “programming”
    >>> s2 = “language”
    (1)求下列各表達式的值。
    a)s1[1]
    b)s1[:4]
    c)s1[0] + s2[:3]
    d)s2[5:len(s2)]
    e)"Python " + s2
    f)2 * (s1[:2] + s2[-1])
    g)string.count(s1,‘r’) + string.find(s1,‘r’)
    h)string.ljust(string.upper(s2),10)
    (2)利用 s1、s2 和字符串操作,寫出能產生下列結果的表達式。
    a)‘gram’
    b)‘ProgLang’
    c)‘la la la’
    d)’ language ’
    e)‘progrAmming lAnguAge’
  17. 求下列字符串格式化操作的結果。如果出錯,解釋原因。
    (1)"%s has won %d gold medals." % (“China”,38)
    (2)“Hello %s.” % (“Tom”,“Tim”) (3)"%0.2f %0.2f" % (3.1416,2.718) (4)“Time left %02d:%05.2f” % (1,5.432) (5)"%3d" % (“14”)
  18. 將下列條件用布爾表達式表示出來: (1)a 大於 b,或者 a 小於等於 b 且 c 不等於 0。
    (2)a 和 b 的差不超過 0.005。
    (3)字符串 s 以“水”開頭,並且包含子串“酒旗”。
    (4)字符串 s1 的長度爲 10,或者 s1 在字符串 s2 中出現 2 次。
  19. 若 P 表示“x 小於等於 y 並且 x 大於 0”,那麼 not P 表示什麼?
  20. 假設已經執行了如下語句:
    >>> s1 = [1,2,3,4]
    >>> s2 = [‘a’,‘b’,‘c’]
    求下列各表達式的值。
    (1)s1+s2
    (2)2s1+3s2
    (3)s1[:3]
    (4)s2[0:len(s2)]
  21. 將第20題中的s1和s2改爲元組,重做(1)~(4)
  22. 設計程序:輸入五分制的分數(0~5),輸出相應的等級制分數:5=A, 4=B, 3=C, 2=D, 1=F, 0=F。(提示:仿照程序2.5的查找方法)
  23. 設計程序:輸入百分制的分數:(0~100),輸出相應的等級制分數:90~100=A, 80~89=B, 70~79=C, 60~69=D, 0~59=F。

書籍下載地址:https://download.csdn.net/download/qq_37590544/10959608

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章