1. 程式人生 > >Python學習之旅

Python學習之旅

tag 大小 表示 建模 希望 程序設計 amd64 2.3 .com

前言

  偶然看到廖雪峰老師寫的《Python教程》被其通俗易懂的語言深深吸引,於是就如饑似渴般沈侵其中。從python簡介開始一直到最後完成實戰項目差不多半個多月時間,收貨頗豐,疑惑也不少,於是希望通過記錄的方式梳理一下自己的思路,也算是對自己半個多月學習的總結。以下主要記錄自己學習結構,不做詳細說明,需要看詳細教程可移步(http://www.liaoxuefeng.com)查看原文。

簡介

  Python是著名的“龜叔”Guido van Rossum在1989年聖誕節期間,為了打發無聊的聖誕節而編寫的一個編程語言。許多大型網站就是用Python開發的,例如YouTube、Instagram,還有國內的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美國航空航天局)都大量地使用Python。龜叔給Python的定位是“優雅”、“明確”、“簡單”,所以Python程序看上去總是簡單易懂,初學者學Python,不但入門容易,而且將來深入下去,可以編寫那些非常非常復雜的程序。

Python的缺點:

  1. 運行速度慢。和C程序相比非常慢,因為Python是解釋型語言,你的代碼在執行時會一行一行地翻譯成CPU能理解的機器碼,這個翻譯過程非常耗時,所以很慢。而C程序是運行前直接編譯成CPU能執行的機器碼,所以非常快。但是大量的應用程序不需要這麽快的運行速度,因為用戶根本感覺不出來。例如開發一個下載MP3的網絡應用程序,C程序的運行時間需要0.001秒,而Python程序的運行時間需要0.1秒,慢了100倍,但由於網絡更慢,需要等待1秒,你想,用戶能感覺到1.001秒和1.1秒的區別嗎?這就好比F1賽車和普通的出租車在北京三環路上行駛的道理一樣,雖然F1賽車理論時速高達400公裏,但由於三環路堵車的時速只有20公裏,因此,作為乘客,你感覺的時速永遠是20公裏。
  2. 代碼不能加密。如果要發布你的Python程序,實際上就是發布源代碼。 這個缺點僅限於你要編寫的軟件需要賣給別人掙錢的時候。好消息是目前的互聯網時代,靠賣軟件授權的商業模式越來越少了,靠網站和移動應用賣服務的模式越來越多了,後一種模式不需要把源碼給別人。再說了,現在如火如荼的開源運動和互聯網自由開放的精神是一致的,互聯網上有無數非常優秀的像Linux一樣的開源代碼,我們千萬不要高估自己寫的代碼真的有非常大的“商業價值”。那些大公司的代碼不願開放的更重要的原因是代碼寫得太爛,一旦開源,就沒人敢用他們的產品了。

安裝

  因為Python是跨平臺的,它可以運行在Windows、Mac和各種Linux/Unix系統上。在Windows上寫Python程序,放到Linux上也是能夠運行的。要開始學習Python編程,首先就得把Python安裝到你的電腦裏。安裝後,你會得到Python解釋器(就是負責運行Python程序的),一個命令行交互環境,還有一個簡單的集成開發環境。目前,Python有兩個版本,一個是2.x版,一個是3.x版,這兩個版本是不兼容的。由於3.x版越來越普及,教程將以最新的Python 3.5版本為基礎。

在Mac上安裝Python

  如果你正在使用Mac,系統是OS X 10.8~10.10,那麽系統自帶的Python版本是2.7。要安裝最新的Python 3.5,有兩個方法:

  方法一:從Python官網下載Python 3.5的安裝程序(網速慢的移步國內鏡像),雙擊運行並安裝。

  方法二:如果安裝了Homebrew,直接通過命令brew install python3安裝即可。

在Windows上安裝Python

  首先,根據你的Windows版本(64位還是32位)從官網下載Python3.5對應的64位安裝程序或32位安裝程序(網速慢的移步國內鏡像),然後運行下載的EXE安裝包。

Python語法

  語言的學習總離不開語法,無論是英語,法語,德語,西班牙語等的學習都有一套自己的使用約定。我把Python的使用約定也總結出自己的一套語法,即Python語法核心五要素:

  1. 基本類型:內置常用的基本類型,如int, float, str, list, tuple, dict等
  2. 邏輯運算:如條件判斷,循環等
  3. 函數/方法:定義,參數
  4. 面向對象(OOP):一種程序設計思想,核心是繼承,封裝,多態
  5. 模塊:內建模塊和第三方模塊

五要素關系:語法中的基本數據類型通過一定的邏輯處理構成函數/方法,對函數/方法、基本數據類型套用面向對象的程序設計思想就能構成豐富的模塊。

基本類型

整數

  Python可以處理任意大小的整數,包括負整數,在程序中的表示方法和數學上的寫法一樣,例如:1,100,-8080,0,等等。

浮點數

  浮點數也就是小數,之所以稱為浮點數,是因為按照科學記數法表示時,一個浮點數的小數點位置是可變的,比如1.23x109和12.3x108是完全相等的。浮點數可以用數學寫法,如1.23,3.14,-9.01,等等。但是對於很大或很小的浮點數,就必須用科學計數法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以寫成1.2e-5,等等。

字符串

  字符串是以單引號或者雙引號括起來的任意文本,比如‘abc’。如果字符串內部包含’又包含“時可以使用轉義字符\來標識,如:‘I \’m \”OK\”!’

布爾值

  一個布爾值只有True、False兩種值,在Python中可以直接用True、False表示布爾值(請註意大小寫)。

空值

  空值是Python裏一個特殊的值,用None表示。None不能理解為0,因為0是有意義的,而None是一個特殊的空值。

List和Tuple

List

Tuple

切片

叠代

叠代器

生成式

生成器

Dict和Set

Dict

Set

邏輯運算

條件判斷

循環/叠代

函數/方法

  在Python中,類中定義的函數(方法)第一個參數永遠是實例變量self(不能忘記寫上),並且調用時,不用傳遞該參數。除此之外,類的方法和普通函數沒有什麽區別,所以你仍然可以使用默認參數、可變參數、關鍵字參數和命名關鍵字參數。

函數定義

函數返回

函數參數

參數檢查

參數類型

  定義函數的時候,我們把參數的名字和位置確定下來,函數的接口定義就完成了。對於函數的調用者來說,只需要知道如何傳遞正確的參數,以及函數將返回什麽樣的值就夠了,函數內部的復雜邏輯被封裝起來,調用者無需了解。Python的函數定義非常簡單,但靈活度卻非常大。除了正常定義的必選參數外,還可以使用默認參數可變參數關鍵字參數,使得函數定義出來的接口,不但能處理復雜的參數,還可以簡化調用者的代碼。

位置參數
默認參數
可變參數
關鍵字參數
命名關鍵字參數

參數組合

參數小結

  1. 默認參數一定要用不可變對象,如果是可變對象,程序運行時會有邏輯錯誤!
  2. 要註意定義可變參數和關鍵字參數的語法:
    • *args是可變參數,args接收的是一個tuple;
    • **kw是關鍵字參數,kw接收的是一個dict。
  3. 以及調用函數時如何傳入可變參數和關鍵字參數的語法:
    • 可變參數既可以直接傳入:func(1, 2, 3),又可以先組裝list或tuple,再通過*args傳入:func(*(1, 2, 3))
    • 關鍵字參數既可以直接傳入:func(a=1, b=2),又可以先組裝dict,再通過**kw傳入:func(**{‘a‘: 1, ‘b‘: 2})
  1. 使用*args**kw是Python的習慣寫法,當然也可以用其他參數名,但最好使用習慣用法。
  2. 命名的關鍵字參數是為了限制調用者可以傳入的參數名,同時可以提供默認值。
  3. 定義命名的關鍵字參數在沒有可變參數的情況下不要忘了寫分隔符*,否則定義的將是位置參數。

常用函數

類型轉換

遞歸函數

匿名函數

高階函數

變量可以指向函數

結論:函數本身也可以賦值給變量,即:變量可以指向函數。

函數名也是變量

傳入函數

偏函數
裝飾器
Filter函數
Sorted函數

返回函數

面向對象

  說到面向對象,就不得不提面向過程。從字面上理解,面向對象針對的是一個事物(比如桌子,椅子,動物等)的研究偏靜態,而面向過程則是針對流程或者動作的研究,偏動態。無論是面向過程還是面向對象核心是一種設計思想,指導我們如何進行程序設計。

  計算機世界只是我們現實世界的映射,如何實現這種映射就是我們廣大程序猿的工作。舉個簡單例子,“小明騎車去上學”,這是現實世界中小明的一項日常活動,如何把這一日常活動映射到計算機呢?很簡單——編程(寫代碼)。

  用面向過程的思想實現上述場景:

# 面向過程設計:小明騎車去上學
def Go2School(name, vehicle):

    print(%s%s去上學!% (name, vehicle))

if __name__ == __main__:

    Go2School(小明,騎車)

  用面向對象思想實現上述場景:

# 面向對象設計:小明騎車去上學

class Student(object):

    """定義一個學生類"""

    def __init__(self, name):

        super(Student, self).__init__()

        self.__name = name

    def ByVehicle(self,vehicle):

        return (self.__name + vehicle)

    def Todo(self,thing):  # 參數self必須寫,不寫會報錯

        return thing

xiaoMing=Student(小明)

print(%s%s! % (xiaoMing.ByVehicle(騎車),xiaoMing.Todo(上學)))

  現在,該死的產品狗告訴我要實現“小明騎車回家”或者“小明坐車去上學”,那麽按照面向過程設計思想,就得再寫一個GoHome(name, vehicle)函數;而按照面向對象設計思想,不用做任何更改,直接把傳入的參數“騎車”換成“坐車”,把“上學”換成“回家”即可。如果下次產品狗告訴你要實現“小花坐火箭去月球”,你使用面向對象設計的程序根本不用做任何修改,直接使用就行。很明顯,面向對象設計提供了更強大的擴展,是一種非常好的設計指導思路。

類和實例

三大特性

繼承

封裝

多態

模塊

使用模塊

安裝模塊

常用模塊

內建模塊

  常用內建模塊包括:datetime, collections, base64, struct, hashlib, itertools, contextlib, XML, HTMLParser, Urllib等。在此不做詳述。

第三方模塊

  常用第三方模塊有:PIL, Tkinter等。在此不做詳述。

Python用法

IO編程

進程和線程

多進程

多線程

進程VS線程

分布式進程

協程

同步IO

文件讀寫

操作文件和目錄

序列化

異步IO

asyncio

async/wait

aiohttp

網絡編程

TCP編程

UDP編程

電子郵件

SMTP發送郵件

POP3收取郵件

訪問數據庫

使用SQLite

使用MySQL

使用SQLAlchemy

Web開發

WSGI接口

使用Web框架

使用模板

Python學習之旅