20201121 第十二堂 物件導向(上)

Susan&Clara發表於2020-11-22

20201121 第十二堂 物件導向(上)

列表推導式

  • 舊列表 -> 新列表
  • 語法:
    • [表示式 for 變數 in 舊列表]
    • [表示式 for 變數 in 舊列表 if 條件]
  • 練習:
    • 過濾長度小於等於3的人名

      names = [‘Amy’,‘Clara’,‘Apple’,‘Tom’,‘Chanel’]

      result = [name for name in names if len(name) > 3]

      print(result)

      結果:
      [‘Clara’, ‘Apple’, ‘Chanel’]

    • 再將所有名字首字母都大寫

      names = [‘Amy’,‘clara’,‘Apple’,‘tom’,‘chanel’]

      result = [name.capitalize() for name in names if len(name) > 3]

      print(result)

      結果:
      [‘Clara’, ‘Apple’, ‘Chanel’]

    • 將 1-100之間能夠被3整除的組成一個新的列表

      new_list = [i for i in range(1,101) if i % 3 ==0]

      print(new_list)

      結果:
      [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]

    • 將 1-100之間既能夠被3和5整除的組成一個新的列表

      new_list = [i for i in range(1,101) if i % 3 == 0 and i % 5 == 0]

      print(new_list)

      結果:
      [15, 30, 45, 60, 75, 90]

生成器(瞭解)

  • 生成器的作用:解決資源優化的問題,節省記憶體

  • 當我們建立一些程式碼的時候,運算出來的結果非常大,但是我們往往只運用其中幾個資料,那麼這種情況會很浪費以及佔用記憶體資源。因此使用生成器,我們可以在使用資料的時候,將需要運動的資料提取出來,就不需要全部資料執行一遍。

  • 生成器該如何創捷?

    • 可以通過列表推導式來得到生成器,將中括號變成括號
      0-10之內分別和3相乘的列表

      new_list = [x * 3 for x in range(21)]
      print(type(new_list)) 列表

      g = (x * 3 for x in range(21))

      print(type(g)) 生成器只需要變成括號

    方法一:呼叫_ next _ ( )得到元素
    方法二:通過next()來得到元素
    g = (x * 3 for x in range(21))
    print(type(g))
    print(g.next())
    print(g.next())
    print(next(g))

    呼叫第一次,提取的是第一個元素,第二次是第二個元素,第三次是第三個元素,以此類推

    • 通過函式的方式來得到生成器
      只要函式中出現了yield,那麼這個函式就是生成器
      def fn1():
      num = 0
      while True:
      num += 1
      yield num
      g = fn1()
      print(g)
      print(g.next())
      print(g.next())
      print(next(g))

      結果:
      <generator object fn1 at 0x000001F7D554CA50>
      1
      2
      3

迭代器

  • 迭代:獲取元素的一個過程
  • 可迭代物件:
    • 列表,集合,元組,字串…只要能夠遍歷,就是可迭代物件
    • 生成器
  • 如何來判斷一個物件是否是可迭代的?
    • isinstance()檢查一個物件是否是另一個物件的例項
      lst = [1,2,3,4,5]
      print(isinstance(lst,Iterable))
      列表True
      print(isinstance(‘123’,Iterable))
      字串True
      print(isinstance(123,Iterable))
      整數False
      g = (x * 3 for x in range(21))
      print(isinstance(g,Iterable))
      生成器True

    • 可以被next()函式呼叫,並不斷返回下一個值的物件稱之為迭代器,Iterator

    • 可迭代的物件不是迭代器
      lst = [1,2,3,4,5]
      print(next(lst))
      TypeError: ‘list’ object is not an iterator

    • 通過iter()將可迭代物件變成一個迭代器

      lst = [1,2,3,4,5]
      
      lst = iter(lst)
      
      print(next(lst))
      print(next(lst))
      
      結果:
      1
      2
      

物件導向

面向的基本結構

  • 程式在執行當中,所有的資料都是存在記憶體當中執行
  • 物件就是記憶體中專門用來儲存指定資料的一塊區域
  • 物件實際上就是一個容器。專門用來儲存資料的容器
  • 物件的結構
    • id(標識)
    • type(型別)型別決定了物件有那些功能
    • value(值)物件中儲存的具體資料

物件導向的簡介

  • Python就是一個物件導向的語言
    1.我穿衣服出門
    2.我騎上了自行車
    3.我把自行車放到停車處
    4.我去買了瓶水
    5.我結賬
    6.我起自行車回家
    7.我回到家喝水
    整個結果就是我在家喝水
  • 程式導向
    • 在程式當中把整個的邏輯分解成一個個小的步驟去完成
    • 好處:非常清晰,符合人的思維邏輯
    • 缺點:複用性比較低,可能只適用一個功能
  • 物件導向
    • 我出去買水回家喝水
    • 物件導向編寫的程式碼比較容易維護,容易服用。但是不太符合人的思維邏輯,編寫起來有點麻煩。

類的簡介

  • 類(class)

    • 類是一張圖紙,在程式中我們需要根據類來建立多個物件

    • Python內建的物件,如:int,str,list,tuple…

    • 在開發的時候,只用Python提供的物件是不能夠滿足我們的需求,這個時候要自定義物件

    • 物件是類的例項(instance)

    • 類就是用來建立物件的物件,類是type型別的物件

      ‘’’
      class 類名([父類]):
      程式碼塊
      ‘’’
      class MyClass():
      pass

      print(MyClass)

      <class ‘main.MyClass’>

      mc = MyClass()
      mc是MyClass這個類建立出來的物件,mc是MyClass類的例項

      mc2 = MyClass()
      mc3 = MyClass()
      mc4 = MyClass()

      r = isinstance(mc2,MyClass)
      print®
      True

  • 類的定義:類和物件都是對現實生活中事物的抽象

  • 實際上所有事物是由兩部分組成:資料(屬性)和行為(方法)

  • 在類的程式碼塊當中,我們可以定變數和函式
    在類中定義的變數,我們稱之為屬性(或者說是所有例項的公共屬性)。也就是所有例項都可以訪問這些變數

    嘗試定義一個人類:
    class Person:
    a = 1
    b = 2
    p1 = Person()
    p2 = Person()
    print(p1.a,p2.b)
    結果: 1 2

    呼叫方法:物件.方法名()
    class Person:
    name = ‘葫蘆娃’
    公共屬性,所有例項都可以訪問
    p1 = Person()
    p2 = Person()
    print(p1.name,p2.name)
    結果:葫蘆娃 葫蘆娃

  • 在類中定義函式我們稱之為方法,這些方法都可以通過該類的例項來訪問

    class Person:
         def speak(a): 
         TypeError: speak() takes 0 positional arguments but 1 was given需要新增一個實參
            print('hello...')
      
    p1.speak()
    
    結果:hello...
    
  • 方法呼叫和函式呼叫的區別:
    如果是函式呼叫,函式由幾個形參,我們就會傳遞幾個實參
    如果是方法呼叫,預設傳遞一個引數,所以方法中至少要定義一個形參

相關文章