第十一章、高階語法與用法

xmd_bmx發表於2020-10-31

第十一章、高階語法與用法

一、列舉

1.列舉其實就是一個類

  1. 列舉的定義:本質是類

    • 導包:

    • from enum import Enum
      # 匯入列舉對應的包
      
      class VIP(Enum):
          yellow = 1
          green = 2
          black = 3
          red = 4
      
      print(VIP.yellow)
      # 結果:
      VIP.yellow
      

2.列舉的優勢

  1. 字典和類定義的資料都是可變的,沒有防止相同標籤的出現
  2. 列舉是不可更改的

3.列舉型別,列舉名稱與列舉值

  1. 獲取列舉標籤下所對應的值

    • 對資料訪問

    • from enum import Enum
      # 匯入列舉對應的包
      class VIP(Enum):
          yellow = 1
          green = 2
          black = 3
          red = 4
      print(VIP.yellow.value)
      # 結果:
      1
      
    • 對標籤進行訪問

    • from enum import Enum
      # 匯入列舉對應的包
      class VIP(Enum):
          yellow = 1
          green = 2
          black = 3
          red = 4
      print(VIP.yellow.name)
      # 結果:
      yellow
      
    • VIP.yellow.name和VIP.yellow的不同

    • from enum import Enum
      # 匯入列舉對應的包
      class VIP(Enum):
          yellow = 1
          green = 2
          black = 3
          red = 4
      print(type(VIP.yellow.name))
      print(type(VIP.yellow))
      # 結果:
      <class 'str'>
      <enum 'VIP'>
      
  2. 通過列舉名稱獲取列舉的值

    • from enum import Enum
      # 匯入列舉對應的包
      class VIP(Enum):
          yellow = 1
          green = 2
          black = 3
          red = 4
      print(VIP["yellow"])
      # 結果:
      VIP.yellow
      
  3. 列舉的遍歷:

    • from enum import Enum
      # 匯入列舉對應的包
      
      class VIP(Enum):
          yellow = 1
          green = 2
          black = 3
          red = 4
      for ele in VIP:
          print(ele)
      # 結果:
      VIP.yellow
      VIP.green
      VIP.black
      VIP.red
      

4.列舉的比較運算

  1. ==,同一個型別可以進行比較
  2. 大小比較不可進行
  3. 身份比較is可以

5.列舉注意事項

  1. 列舉型別的標籤是不可以相同的,但是數值可以
  2. 列舉的遍歷時,若數值相同,你們第二個hi是第一個標籤的別名

6.列舉轉換

from enum import Enum
# 匯入列舉對應的包
class VIP(Enum):
    yellow = 1
    green = 2
    black = 3
    red = 4
a = 1
print(VIP(a))
# 結果:
VIP.yellow

7.列舉總結

  1. 強制要求數字作為數值時可以用Intenum

    • from enum import IntEnum
      class VIP(IntEnum):
          yellow = 1
          green = 2
          black = "str"
          red = 4
      # 結果:存在字元 
      ValueError: invalid literal for int() with base 10: 'str'
      
  2. 不能有相同值時

    • from enum import IntEnum,unique
      @unique
      class VIP(IntEnum):
          yellow = 1
          green = 2
          black = 1
          red = 4
      # 結果:有相同值
      ValueError: duplicate values found in <enum 'VIP'>: black -> yellow
      

二、物件與閉包

1.一切皆物件

  1. 高階程式設計和函數語言程式設計有關
  2. 閉包
    1. 函式:
      • 在別的語言中,函式只是一段可執行的程式碼,並不是物件。
      • 可以把函式當做另外一個函式的引數傳遞到函式中去

2.什麼是閉包:和變數的作用域有關

  1. # 閉包
    def curve_pre():
        a = 25
        def curve(x):
            return a*x*x
        return curve
    
    # curve 函式在外部不可以呼叫,會報錯,作用域只在外層函式的內部
    f = curve_pre()
    print(f(2))
    # 結果:
    100
    
  2. 閉包 = 函式+環境變數

  3. 閉包的意義:將現場保護起來

3.閉包的誤區

  1. def f1():
        a = 10
        def f2():
            # a被認為是區域性變數
            a = 20
            print(a)
        print(a)
        f2()
        print(a)
    f1()
    # 結果:不屬於閉包
    10
    20
    10
    

4.閉包解決問題

  1. 閉包的作用:
    • 不是必不可少的東西
    • 記住上一次變數的狀態
origin = 0
def f1(pos):
    def f2(step):
        nonlocal pos
        new_step = pos + step
        pos = new_step
        return new_step
    return f2
f = f1(origin)
print(f(1))
print(f(2))
print(f(3))
# 結果:
1
3
6

global 變數:全域性變數不會被誤認為成區域性變數

s):
def f2(step):
nonlocal pos
new_step = pos + step
pos = new_step
return new_step
return f2
f = f1(origin)
print(f(1))
print(f(2))
print(f(3))

結果:

1
3
6


`global 變數`:全域性變數不會被誤認為成區域性變數

`nonlocal 變數` :閉包變數,不會被誤認為成區域性變數

相關文章