Python 學習筆記基礎篇

參考教程:https://github.com/jackfrued/Python-100-Days

1 優缺點

Python 爲我們提供了非常完善的基礎代碼庫,覆蓋了網絡、文件、GUI、數據庫、文本等大量內容,被形象地稱作“內置電池(batteries included)”。

優點:用 Python 開發,許多功能不必從零編寫,直接使用現成的即可。除了內置的庫外,Python 還有大量的第三方庫供我們直接使用。當然,我們自己開發的代碼通過很好的封裝,也可以作爲第三方庫給別人使用。

缺點:運行速度慢,代碼不能加密等。

 

2 CPython

當我們從 Python 官方網站下載並安裝好 Python 3.x 後,我們就直接獲得了一個官方版本的解釋器 CPython。這個解釋器是用C語言開發的,所以叫CPython。在命令行下運行 python 就是啓動 CPython 解釋器。CPython 是使用最廣的 Python 解釋器。

 

3 PIP

PIP 是 Python 包管理工具,Python 2.7.9+ 或 Python 3.4+ 以上版本都自帶 PIP 工具。

 

4 IPython

IPython 是一個 Python 的交互式 shell,比默認的 Python shell 好很多,支持變量自動補全、自動縮進、bash shell命令等,內置許多有用的功能函數。Jupyter Notebook( 此前稱爲 Ipython notebook ) 是集文本、代碼、圖像、公式展現於一體的超級 Python web 界面。

通過 PIP 安裝 IPython 和 Jupyter:

pip install ipython 和 pip install jupyter

 

5 退出 Python 環境

quit()

 

6 執行 Python 語句

在控制檯輸入 python 進入 Python 環境(啓動 CPython 解釋器),可執行 Python 語句。

 

7 運行 .py 文件

在控制檯可以直接運行 .py 文件,cd 進入目標目錄,運行命令 python xxx.py,輸入 \ 實現控制檯續行。

 

8 安裝 PyCharm

下載地址:https://www.jetbrains.com/pycharm/download/#section=windows

用軟件打開 .py 文件,直接 Run 即可。

 

9 if 語句

Python 中沒有用花括號來構造代碼塊而是使用了縮進的方式來設置代碼的層次結構,如果 if 條件成立的情況下需要執行多條語句。構造出更多的分支,可以使用 if…elif…else… 結構。

 

10 定義函數

def add(a=0, b=0, c=0):
    return a + b + c

 

11 多個可變入參

在參數名前面的 * 表示 args 是一個可變參數,即在調用 add 函數時可以傳入0個或多個參數。

def add(*args): 
    total = 0
    for val in args:
        total += val
    return total

 

12 用模塊管理函數

import module as m
m.foo()

需要說明的是,如果導入的模塊除了定義函數之外還有可以執行代碼,那麼 Python 解釋器在導入這個模塊時就會執行這些代碼,事實上我們可能並不希望如此,因此如果我們在模塊中編寫了執行代碼,最好是將這些執行代碼放入如下所示的條件中,這樣的話除非直接運行該模塊,if 條件下的這些代碼是不會執行的,因爲只有直接執行的模塊的名字纔是“__main__”。

# module.py
if __name__ == '__main__':
    print('see if print')
# __name__ 是 Python 中一個隱含的變量它代表了模塊的名字
# 只有被 Python 解釋器直接執行的模塊的名字纔是 __main__

# test.py
import module
# 將 if __name__ == '__main__' 去掉試試,是否執行 print 代碼

 

13 數組切片

數組:用於在單個變量中存儲多個值。注意,Python 沒有內置對數組的支持,但可以使用 Python 列表 代替。

切片:Python 的切片可以被用於數組,它基於每一個維度。

s[i:j] 表示獲取 a[i] 到 a[j-1] ;

s[:-1] 表示去掉最後一個字符;

s[:-n] 表示去掉最後 n 個字符;

s[-2:] 表示取最後兩個字符;

s[i:j:k] 這種格式呢,i 、j 與上面的一樣,但 k 表示步長,默認爲 1;

s[::-1] 是從最後一個元素到第一個元素複製一遍(反向)。

arr = [0, 1, 2, 3] arrNew = arr[1:3] print(arrNew) # [1, 2]

 

14 Yield 關鍵字

找到一篇一看即懂得博文:https://blog.csdn.net/mieleizhi0522/article/details/82142856

 

15 元組

元組:用圓括號 () 括起來,可包含多個不同類型元素,元素不能修改,和列表一樣可以保存多條數據。元組在創建時間和佔用的空間上面都優於列表。

# 定義元組
t = ('駱昊', 38, True, '四川成都')
# 獲取元組中的元素
print(t[0])
# 遍歷元組
for member in t:
    print(member)
# 重新賦值
t[0] = '王大錘'  # TypeError
# 變量t重新引用了新的元組原來的元組將被垃圾回收
t = ('王大錘', 20, True, '雲南昆明')
# 元組轉換成列表
person = list(t)
# 列表轉換成元組
fruits_tuple = tuple(fruits_list)

 

16 集合

集合:用花括號 {} 括起來,跟數學上的集合一致,不允許有重複元素,可以進行交集、並集、差集等運算。

set1 = {1, 2, 3, 3, 3, 2} # 怎麼重複了??
set2 = set(range(1, 10))
set1.add(4)
set2.update([11, 12])
set2.discard(5)
if 4 in set2:
   set2.remove(4)
# 遍歷集合容器
for elem in set2:
  print(elem ** 2, end=' ') # 經測試輸出了每個元素的二次冪
# 將元組轉換成集合
set3 = set((1, 2, 3, 3, 2, 1))
# 集合的交集、並集、差集、對稱差運算
print(set1 & set2)
# print(set1.intersection(set2))
print(set1 | set2)
# print(set1.union(set2))
print(set1 - set2)
# print(set1.difference(set2))
print(set1 ^ set2)
# print(set1.symmetric_difference(set2))
# 判斷子集和超集
print(set2 <= set1)
# print(set2.issubset(set1))
print(set1 >= set2)
# print(set1.issuperset(set2))

 

17 字典

字典:每個元素都是由一個鍵和一個值組成的“鍵值對”,鍵和值通過冒號分開。

scores = {'駱昊': 95, '白元芳': 78, '狄仁傑': 82}
# 通過鍵可以獲取字典中對應的值
print(scores['駱昊'])
# 對字典進行遍歷(遍歷的其實是鍵再通過鍵取對應的值)
for elem in scores:
   print('%s\t--->\t%d' % (elem, scores[elem]))
# 更新字典中的元素
scores['白元芳'] = 65
scores.update(冷麪=67, 方啓鶴=85)
if '武則天' in scores:
   print(scores['武則天'])
print(scores.get('武則天'))
# get方法也是通過鍵獲取對應的值但是可以設置默認值
print(scores.get('武則天', 60))
# 刪除字典中的元素
print(scores.popitem())
print(scores.pop('駱昊', 100))
# 清空字典
scores.clear()

 

18 類!!!

類:定義類用關鍵字 class(首字母小寫)。

class Student(object):
    # __init__是一個特殊方法用於在創建對象時進行初始化操作
    # 通過這個方法我們可以爲學生對象綁定name和age兩個屬性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def study(self, course_name):
        print('%s正在學習%s.' % (self.name, course_name))

    # PEP 8要求標識符的名字用全小寫多個單詞用下劃線連接
    # 但是部分程序員和公司更傾向於使用駝峯命名法(駝峯標識)
    def watch_movie(self):
        if self.age < 18:
            print('%s只能觀看《熊出沒》.' % self.name)
        else:
            print('%s正在觀看島國愛情大電影.' % self.name)

通過以下方式創建對象並向對象發消息。

stu1 = Student('駱昊', 38)
stu1.study('Python程序設計')
stu1.watch_movie()
stu2 = Student('王大錘', 15)
stu2.study('思想品德')
stu2.watch_movie()

在Python中,屬性和方法的訪問權限只有公開和私有,如果希望屬性私有,用兩個下劃線作爲開頭命名即可。

class Test:
    def __init__(self, foo):
        self.__foo = foo
    def __bar(self):
        print(self.__foo)

注意:實際開發中我們並不建議將屬性設置爲私有,因爲這會導致子類無法訪問(後面會講),所以大多數Python程序員會遵循一種命名慣例,就是讓屬性名以單下劃線開頭來表示屬性是受保護的,本類之外的代碼在訪問這樣的屬性時應該要保持慎重。這種做法並不是語法上的規則,單下劃線開頭的屬性和方法外界仍然是可以訪問的,所以更多的時候它是一種暗示或隱喻。

 

19 @property裝飾器

雖然不建議將屬性設爲私有,但如果直接將屬性暴露給外界也是有問題的,比如我們沒有辦法檢查賦給屬性的值是否有效。前面建議將屬性命名以單下劃線開頭,暗示屬性是受保護的,不建議外界直接訪問,那麼如果想訪問屬性可以通過屬性的getter(訪問器)和setter(修改器)方法進行對應的操作。如要做到這點,就可以考慮使用@property包裝器來包裝getter和setter方法,使得對屬性的訪問既安全又方便。

class Person(object):
    def __init__(self, name, age):
        self._name = name
        self._age = age    
    # 訪問器 - getter方法
    @property
    def name(self):
        return self._name
    @property
    def age(self):
        return self._age    
    # 修改器 - setter方法
    @age.setter
    def age(self, age):
        self._age = age    
    def play(self):
        if self._age <= 16:
            print('%s正在玩紙飛機。' % self._name)
        else:
            print('%s正在玩下象棋。' % self._name)
def main():
    person = Person('小明', 12)
    person.play()
    person.age = 22
    person.play()
    # person.name = '白元芳' #AttributeError: can't set attribute
    
if __name__ == '__main__':
    main()

 

20 __slots__

Python是一門動態語言——通常,動態語言允許我們在程序運行時給對象綁定新的屬性或方法,也可以對已綁定的屬性和方法進行解綁。但如果我們需要限定自定義類型的對象只能綁定某些屬性,可以通過在類中定義__slots__變量來進行限定。注意__slots__的限定只對當前類的對象生效,對子類並不起任何作用。

在定義類的第一行加上這句話:

__slots__ = ('_name', '_age', '_gender')

然後嘗試在類的外面給類追加'_gender'和''_address''看看效果,後者會報錯。

person._address= 'man' # AttributeError: 'Person' object has no attribute '_is_gay'

 

21 靜態方法和類方法

之前我們定義的都是對象方法(給對象發消息),實際上類中的方法並非都是對象方法,例如我們定義一個“三角形”類,通過傳入三個邊長來構造三角形,但是傳入的三條邊長未必能構造出三角形對象,因此我們可以先寫一個方法來驗證三條邊長是否可以構成三角形,這個方法顯然不是對象方法,因爲在調用這個方法時三角形對象尚未創建出來(因爲都不知道三條邊能不能構成三角形),所以說,該方法屬於三角形類但並不屬於三角形對象。此時可以使用靜態方法(@staticmethod)來解決這類問題。

class Triangle(object): ... ... @staticmethod def is_valid(a, b, c): return a + b > c and b + c > a and a + c > b ... ... def main(): ... ... # 靜態方法和類方法都是通過給類發消息來調用的 if Triangle.is_valid(a, b, c): ... ... else: print('無法構成三角形.') ... ...

 

22 類方法

Python還可以在類中定義類方法(@classmethod),第一個參數約定名爲cls,代表當前類相關的信息的對象(類本身也是一個對象,有的地方也稱之爲類的元數據對象),可以通過這個參數獲取和類相關的信息並且可以創建出類的對象。

class Triangle(object):
    ... ...
    @staticmethod
    def is_valid(a, b, c):
        return a + b > c and b + c > a and a + c > b
    ... ...

def main():
    ... ...
    # 靜態方法和類方法都是通過給類發消息來調用的
    if Triangle.is_valid(a, b, c):
        ... ...
    else:
        print('無法構成三角形.')
... ...

 

23 繼承和多態

繼承——提供繼承信息的稱之爲父類(也叫超類或基類),得到繼承信息的爲子類(也叫派生類或衍生類)。子類除了繼承父類的屬性和方法,還可以自定義特有的屬性和方法,所以子類比父類擁有的更多的能力。

from time import time, localtime, sleep
class Clock(object):
    """數字時鐘"""
    def __init__(self, hour=0, minute=0, second=0):
        self._hour = hour
        self._minute = minute
        self._second = second
    @classmethod
    def now(cls):
        ctime = localtime(time())
        return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec)  
    def run(self):
        """走字"""
        self._second += 1
        if self._second == 60:
            self._second = 0
            self._minute += 1
            if self._minute == 60:
                self._minute = 0
                self._hour += 1
                if self._hour == 24:
                    self._hour = 0
    def show(self):
        """顯示時間"""
        return '%02d:%02d:%02d' % \
               (self._hour, self._minute, self._second)
def main():
    # 通過類方法創建對象並獲取系統時間
    clock = Clock.now()
    while True:
        print(clock.show())
        sleep(1)
        clock.run()
if __name__ == '__main__':
    main()

多態——子類繼承父類後可以對父類的方法進行重寫。當調用子類重寫的方法時,不同的子類對象會表現出不同的行爲,這就是就是多態。

class Person(object):
    ... ...
class Student(Person):
    ... ...
class Teacher(Person):
    ... ...
def main():
    stu = Student('王大錘', 15, '初三')
    stu.study('數學')
    t = Teacher('駱昊', 38, '老叫獸')
    t.teach('Python程序設計')
... ...

抽象類——上例中,我們將Pet類處理成了一個抽象類,所謂抽象類就是不能夠創建對象的類,這種類的存在就是專門爲了讓其他類去繼承它。Python從語法層面並沒有像Java或C#那樣提供對抽象類的支持,但是我們可以通過abc模塊的ABCMeta元類和abstractmethod包裝器來達到抽象類的效果,如果一個類中存在抽象方法那麼這個類就不能夠實例化(創建對象)。

 

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