1. 程式人生 > >演算法工程師修仙之路:python3官方文件筆記(三)

演算法工程師修仙之路:python3官方文件筆記(三)

本筆記來自於python手冊的中文版

Python 簡介


  • Python 中的註釋以 # 字元起始,直至實際的行尾。

  • 註釋可以從行首開始,也可以在空白或程式碼之後,但是不出現在字串中。

  • 文字字串中的 # 字元僅僅表示 # 。

  • 程式碼中的註釋不會被 Python 解釋,可以忽略它們。

    # 這是第一行
    spam = 1  # 這是第二行
              # ... 現在是第三行了!
    text = "# This is not a comment because it's inside quotes."
    

將 Python 當做計算器

數字

  • 直譯器表現得就像一個簡單的計算器:可以向其錄入一些表示式,它會給出返回值。

  • 表示式語法很直白:運算子 +,-,* 和 / 與其它語言一樣,括號 (()) 用於分組。

  • 整數(例如,2, 4, 20 )的型別是int,帶有小數部分的數字(例如,5.0, 1.6)的型別是float。

  • 除法(/)永遠返回一個浮點數。如要使用 floor 除法並且得到整數結果(丟掉任何小數部分),你可以使用 // 運算子,要計算餘數你可以使用%。

    >>> 17 / 3  # 經典除法返回一個浮點數
    5.666666666666667
    >>>
    >>> 17 // 3  # 丟棄了分數部分
    5
    >>> 17 % 3  # %運算子返回除法的餘數部分
    2
    
  • 通過 Python,還可以使用 ** 運算子計算冪乘方:

    >>> 5 ** 2  # 5的平方
    25
    >>> 2 ** 7  # 2的7次方
    128
    
  • 等號( ‘=’ )用於給變數賦值。賦值之後,在下一個提示符之前不會有任何結果顯示。

  • 變數在使用前必須 “定義”(賦值),否則會出錯

  • 浮點數有完整的支援,整數和浮點數的混合計算中,整數會被轉換為浮點數。

  • 互動模式中,最近一個表示式的值賦給變數 _。

    • 這樣我們就可以把它當作一個桌面計算器,很方便的用於連續計算:

      >>> tax = 12.5 / 100
      >>> price = 100.50
      >>> price * tax
      12.5625
      >>> price + _		# _代表price*tax
      113.0625
      >>> round(_, 2)	# _代表price+price*tax
      113.06
      
    • 此變數對於使用者是隻讀的。不要嘗試給它賦值 —— 你只會建立一個獨立的同名區域性變數,它遮蔽了系統內建變數的魔術效果。

    • 除了 int 和 float,Python 還支援其它數字型別,例如 Decimal 和 Fraction 。

    • Python 還內建支援複數 ,使用字尾 j 或 J 表示虛數部分(例如,3+5j)。

字串

  • Python 用單引號 (’…’) 或雙引號 ("…") 標識表示字串。

  • \ 可以用來轉義引號。

    >>> 'spam eggs'  # 單引號
    'spam eggs'
    >>> 'doesn\'t'  # 使用\'來轉義單引號
    "doesn't"
    >>> "doesn't"  # 或者使用雙引號
    "doesn't"
    >>> '"Yes," he said.'
    '"Yes," he said.'
    >>> "\"Yes,\" he said."
    '"Yes," he said.'
    >>> '"Isn\'t," she said.'
    '"Isn\'t," she said.'
    
  • 在互動式直譯器中,輸出的字串會用引號引起來,特殊字元會用反斜槓轉義。如果字串中只有單引號而沒有雙引號,就用雙引號引用,否則用單引號引用。

  • print() 函式生成可讀性更好的輸出, 它會省去引號並且打印出轉義後的特殊字元:

    >>> '"Isn\'t," she said.'
    '"Isn\'t," she said.'
    >>> print('"Isn\'t," she said.')
    "Isn't," she said.
    >>> s = 'First line.\nSecond line.' 	 # \n表示換行符
    >>> s  	# 沒有print(),\n包含在輸出中
    'First line.\nSecond line.'
    >>> print(s)  	# 使用print(),\n生成一個新行
    First line.
    Second line.
    
  • 如果你前面帶有 \ 的字元被當作特殊字元,你可以使用原始字串,方法是在第一個引號前面加上一個r:

    >>> print('C:\some\name')  	# 這裡\n的意思是換行!
    C:\some
    ame
    >>> print(r'C:\some\name')  	# 注意引號前的r
    C:\some\name
    
  • 字串文字能夠分成多行。

    • 一種方法是使用三引號:"""…""" 或者 ‘’’…’’’。

    • 行尾換行符會被自動包含到字串中,但是可以在行尾加上 \ 來避免這個行為。

    • 可以使用反斜槓為行結尾的連續字串,它表示下一行在邏輯上是本行的後續內容:

      print("""\
      Usage: thingy [OPTIONS]
           -h                        顯示此使用訊息
           -H hostname             要連線的主機名
      """)
      
      # 將生成以下輸出(注意,沒有開始的第一行):
      Usage: thingy [OPTIONS]
           -h                       顯示此使用訊息
           -H hostname             要連線的主機名
      
  • 字串可以由 + 操作符連線(粘到一起),可以由 * 表示重複:

    >>> # 3 times 'un', followed by 'ium'
    >>> 3 * 'un' + 'ium'
    'unununium'
    
  • 相鄰的兩個字串文字自動連線在一起。它只用於兩個字串文字,不能用於字串表示式,如果你想連線多個變數或者連線一個變數和一個字串文字,使用 + 。

    >>> 'Py' 'thon'
    'Python'
    >>> prefix = 'Py'
    >>> prefix 'thon'  	# 不能連線一個變數和一個字串文字
    ...
    SyntaxError: invalid syntax
    >>> ('un' * 3) 'ium'
     ...
    SyntaxError: invalid syntax
    
  • 字串也可以被擷取(檢索)。

    • 類似於 C ,字串的第一個字元索引為 0 。
    • Python沒有單獨的字元型別;一個字元就是一個簡單的長度為1的字串。
    • 索引也可以是負數,這將導致從右邊開始計算。
    • 請注意 -0 實際上就是 0,所以它不會導致從右邊開始計算。
  • 除了索引,還支援切片。

    • 索引用於獲得單個字元,切片讓你獲得一個子字串。

    • 注意,包含起始的字元,不包含末尾的字元。這使得 s[:i] + s[i:] 永遠等於 s。

      >>> word[0:2] 	 # 從位置0(包括)到位置2(不包括)的字元
      'Py'
      >>> word[2:5]  	# 從位置2(包括)到位置5(不包括)的字元
      'tho'
      >>> word[:2] + word[2:]
      'Python'
      >>> word[:4] + word[4:]
      'Python'
      
    • 切片的索引有非常有用的預設值,省略的第一個索引預設為零,省略的第二個索引預設為切片的字串的大小。

      >>> word[:2]  	# 從開始到位置2的字元(不包括)
      'Py'
      >>> word[4:]  	# 從位置4(包括)到結尾的字元
      'on'
      >>> word[-2:] 	# 字元從倒數第二(包括)到最後
      'on'
      
    • 切片時的索引是在兩個字元之間 。

      • 左邊第一個字元的索引為 0,而長度為 n 的字串其最後一個字元的右界索引為 n。
      • 文字中的第一行數字給出字串中的索引點 0…6。
      • 第二行給出相應的負索引。
      • 切片是從 i 到 j 兩個數值標示的邊界之間的所有字元。
      • 對於非負索引,如果上下都在邊界內,切片長度就是兩個索引之差。
        在這裡插入圖片描述
  • 試圖使用太大的索引會導致錯誤,Python 能夠優雅地處理那些沒有意義的切片索引。

    • 一個過大的索引值(即下標值大於字串實際長度)將被字串實際長度所代替。

    • 當上邊界比下邊界大時(即切片左值大於右值)就返回空字串。

      >>> word[4:42]
      'on'
      >>> word[42:]
      ''
      
  • Python字串不可以被更改 , 它們是不可變的。

    • 賦值給字串索引的位置會導致錯誤。

    • 如果你需要一個不同的字串,你應該建立一個新的。

    • 內建函式 len() 返回字串長度。

      >>> word[0] = 'J'
        ...
      TypeError: 'str' object does not support item assignment
      >>> word[2:] = 'py'
        ...
      TypeError: 'str' object does not support item assignment
      >>> 'J' + word[1:]
      'Jython'
      >>> word[:2] + 'py'
      'Pypy'
      >>> s = 'supercalifragilisticexpialidocious'
      >>> len(s)
      34
      

列表

  • Python 有幾個複合資料型別,用於表示其它的值。最通用的是 list (列表) ,它可以寫作中括號之間的一列逗號分隔的值。

  • 列表的元素不必是同一型別:

    >>> squares = [1, 4, 9, 16, 25]
    >>> squares
    [1, 4, 9, 16, 25]
    
  • 就像字串(以及其它所有內建的序列型別)一樣,列表可以被索引和切片。所有的切片操作都會返回一個包含請求的元素的新列表,列表支援連線操作。

    >>> squares[0]  	# 索引返回項
    1
    >>> squares[-1]
    25
    >>> squares[-3:]  	# 切片返回一個新列表
    [9, 16, 25]
    >>> squares + [36, 49, 64, 81, 100]
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    
  • 不像不可變的字串,列表是可變的,它允許修改元素。你還可以使用append()方法在列表的末尾新增新的元素。

    >>> cubes = [1, 8, 27, 65, 125]  
    >>> 4 ** 3 
    64
    >>> cubes[3] = 64  	# 替換錯誤的值
    >>> cubes
    [1, 8, 27, 64, 125]
    >>> cubes.append(216)  	# 加上6的立方
    >>> cubes.append(7 ** 3)  	# 7的立方
    >>> cubes
    [1, 8, 27, 64, 125, 216, 343]
    
  • 也可以對切片賦值,此操作可以改變列表的尺寸,或清空它:

    >>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    >>> letters
    ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    >>> # 替換一些值
    >>> letters[2:5] = ['C', 'D', 'E']
    >>> letters
    ['a', 'b', 'C', 'D', 'E', 'f', 'g']
    >>> # 現在刪除它們
    >>> letters[2:5] = []
    >>> letters
    ['a', 'b', 'f', 'g']
    >>> # 通過將所有元素替換為空列表來清除列表
    >>> letters[:] = []
    >>> letters
    []
    
  • 內建函式 len() 同樣適用於列表並且允許巢狀列表(建立一個包含其它列表的列表)。

    >>> a = ['a', 'b', 'c']
    >>> n = [1, 2, 3]
    >>> x = [a, n]
    >>> x
    [['a', 'b', 'c'], [1, 2, 3]]
    >>> x[0]
    ['a', 'b', 'c']
    >>> x[0][1]
    'b'
    

程式設計的第一步

  • 菲波那契子序列

    >>> # 菲波那契子序列
    ... # 兩個元素的和定義了下一個元素
    ... a, b = 0, 1
    >>> while b < 10:
    ...     print(b)
    ...     a, b = b, a+b
    ...
    1
    1
    2
    3
    5
    8
    
    • 第一行包括了一個 多重賦值:變數 a 和 b 同時獲得了新的值 0 和 1 ,最後一行又使用了一次。

    • 變數賦值前,右邊首先完成計算。右邊的表示式從左到右計算。

    • 條件(這裡是 b < 10 )為 true 時, while 迴圈執行。

    • 在 Python 中,類似於 C,任何非零整數都是 true ,0 是 false 。

    • 條件也可以是字串或列表,實際上可以是任何序列。

    • 所有長度不為零的是 true,空序列是 false。

    • 標準比較操作符與 C 相同: < , > , == , <=, >= 和 !=。

    • 迴圈體是縮排的,縮排是 Python 組織語句的方法。Python 不提供整合的行編輯功能,所以你要為每一個縮排行輸入 TAB 或空格。

    • 大多數文字編輯器提供自動縮排。互動式錄入複合語句時,必須在最後輸入一個空行來標識結束(因為直譯器沒辦法猜測你輸入的哪一行是最後一行),需要 注意的是同一個語句塊中的每一行必須縮排同樣數量的空白。

    • 關鍵字 print() 語句輸出給定表示式的值,它控制多個表示式和字串輸出為你想要字串。

    • 字串列印時不用引號包圍,每兩個子項之間插入空間,所以你可以把格式弄得很漂亮,用一個逗號結尾就可以禁止輸出換行:

      >>> i = 256*256
      >>> print('The value of i is', i)
      The value of i is 65536
      >>> a, b = 0, 1
      >>> while b < 1000:
      ...     print(b, end=',')
      ...     a, b = b, a+b
      ...
      1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,