當前位置:編程學習大全網 - 編程語言 - 風變編程的Python課程學完效果如何?

風變編程的Python課程學完效果如何?

壹、Python簡介

Python是壹種用來編寫應用程序的高級程序設計語言,TIOBE程序語言排行榜2015年12月的排名如下:

Python實現強勢逆襲,而且我相信,隨著時間的推移,國內Python語言未來前景也是壹片向好。

Python的特點是優雅簡單,易學易用(雖然我感覺還是有壹些概念不容易理解),Python的哲學是盡量用最少的,最簡單易懂的代碼實現需要的功能。Python適宜於開發網絡應用,腳本寫作,日常簡單小工具等等。Python的缺點是效率較低,但是在大量的場合效率卻不是那麽重要或者說Python不是其性能瓶頸,所以不要太在意。其次是2.x-3.x的過渡使得許多3.x還缺少很多2.x下的模塊,不過也在完善中。其次就是源代碼無法加密,發布Python程序其實就是發布源代碼。

二、基礎語法要點

1.如果壹個字符串中有許多需要轉義的字符,而又不想寫那麽多'\',那麽可以用 r'...' 表示 '...'內的內容不轉義。

2.Python可用'''...'''來表示多行內容,如:

123456

>>>?print('''line1line2line3''')line1line2line3

3.Python的邏輯運算and, or, not 分別對應C語言中的&&, ||, !.

4.Python的整數與浮點數大小都沒有範圍。

5.Python中除法有兩種: '/'除出來必是浮點數, '//'除出來是整數,即地板除。

6.Python中壹切皆引用。每個對象都有壹個引用計數器(內部跟蹤變量)進行跟蹤,引用計數值表示該對象有多少個引用,當初次產生賦給變量時,引用計數為1,其後沒進行下列行為中的任意壹種都會增加引用計數:

123

賦值:? a?=?b用作函數參數傳遞: func(a)成為容器對象的壹個元素: lis?=?[1,2,a]

以下任意壹種行為都會減少引用計數:

1234

del銷毀:?del?a變量另賦給其他對象:a?=?False對象從容器中刪除:? lis.remove(a)身在的容器被銷毀:?del?lis

7.深拷貝與淺拷貝的概念與對比,有點復雜,看這篇文章

8.list,tuple和dict,set

list:?為列表,是壹個有序集合,類似於數組但又比數組功能強大,可以隨時append,pop元素,下標從0開始,且下標為加n模n制,即lis[-1] = lis[len-1],下標範圍[-len,len-1].

tuple:為元組,類似於list,但list為可變類型,而tuple不可變,即沒有append,pop等函數。壹個建議是為了安全起見,能用tuple代替list盡量用tuple。如果tuple只有壹個元素,要寫成如(1,)以避免歧義。

dict:字典類型,存放key-value鍵值對,可以根據key迅速地找出value,當然,key必須是不可變類型,如下是錯誤的:

12345

>>> dic?=?{[1,2]:'value'}Traceback (most recent call last):?File?"<pyshell#10>", line?1,?in?<module>dic?=?{[1,2]:'value'}TypeError: unhashable?type:?'list'

list與dict的優劣對比:

1234567

dict:1.插入,查找速度快,跟key的數目無關2.需占用大量內存,內存浪費嚴重?list:1.插入,查找速度慢,O(n)的復雜度,隨元素個數增加而增加2.占用內存小

dict內部存放的順序和key放入的順序是沒有關系的

set:set與dict類似,相當於只有key沒有value的dict,每個key不同,set間有 &, | 等操作對應集合的交,並操作。

三、函數

1.函數是對象,函數名即是指向對應函數對象的引用,所以可以將函數名賦給壹個變量,相當於給函數起壹個‘別名’。

123

>>> mmm?=?max>>> mmm(1,2,3)3

2.Python函數可以返回”多個值“,之所以打引號,是因為實際上返回的多個值拼成了壹個元組,返回這個元組。

3.定義默認參數需要牢記:默認參數必須指向不變對象。否則第壹次調用和第二次調用結果會不壹樣,因為可變的默認參數調用後改變了。

4.可變參數:傳入的參數個數是可變的,可以是0個或多個。可變參數會將妳傳入的參數自動組裝為壹個tuple。在妳傳入的list或tuple名字前加壹個 * 即說明傳入的是可變參數。習慣寫法為*args。

5.關鍵字參數:傳入0個或多個含參數名的參數,這些參數被自動組裝成壹個dict。習慣寫法**kw,如**a表示把a中所有的鍵值對以關鍵字參數的形式傳入kw,獲得壹個dict,這個dict是a的壹份拷貝,對kw改動不會傳遞到a

6.命名關鍵字在函數定義中跟在壹個*分割符後,如

12

def?func(a,b,*,c,d):pass

c,d為命名關鍵字參數,可以限制調用者可以傳入的參數名,同時可以提供默認值。

7.參數定義順序:必選參數,默認參數,可變參數/命名關鍵字參數,關鍵字參數。

8.切片操作格式為lis[首下標:尾下標:間隔],如果都不填,即lis[::]則代表整個容器lis

9.用圓括號()括起來壹個列表生成式創建壹個生成器generator,generator保存生成算法,我們可以用next(g)取得生成器g的下壹個返回值。生成器的好處就是我們不需要提前生成所有列表元素,而是需要時再生成,這在某些情況下可以節省許多內存。算法也可以不是列表生成式而是自定義函數,只需在函數定義中包含yield關鍵字。

10.map()和reduce(): 二者都是高階函數。map()接收兩個參數,壹個是函數,壹個是Iterable序列,map將傳入的函數依次作用在序列每壹個元素上,並把結果作為新的Iterator返回。reduce()類似累積計算版的map(),把壹個函數作用在壹個序列上,每次接收兩個參數,將結果繼續與序列的下壹個元素做累積計算。

利用map和reduce編寫壹個str2float函數,如把字符串'123.456'轉換成浮點數123.456:

123456789101112131415

from?functools?import?reduce?def?str2float(s):def?f1(x,y):return?x*10?+?ydef?char2num(s):return?{'0':?0,?'1':?1,?'2':?2,?'3':?3,?'4':?4,?'5':?5,?'6':?6,?'7':?7,?'8':?8,?'9':?9}[s]def?f2(x,y):return?x*0.1?+?ya,b?=?s.split('.')print('a=',a)print('b=',b)return?reduce(f1,?map(char2num,a))?+?0.1*reduce(f2,?map(char2num,b[::-1]))?print('str2float(\'123.456\') =', str2float('123.456'))

11.fliter()函數過濾序列,類似於map()作用於每壹元素,根據返回值是True或者False決定舍棄還是保留該元素。函數返回壹個Iterator。

12.sorted()函數可實現排序,類似於C++庫中的sort()函數,但是比其更加簡潔,語法為sorted(lis,key=func,reverse=T/F)

key函數可實現自定義的排序規則,reverse表示升序還是降序。

13.壹個函數可以返回壹個函數,但是返回時該函數並未執行,所以返回函數中不要引用任何可能發生變化的變量,否則會出現邏輯錯誤。

14.裝飾器(decorator): 當需要增強函數的功能卻不希望修改函數本身,那麽可以采用裝飾器這種運行時動態增加功能的方式,增加的功能卸載裝飾器函數中。如在執行前後打印'begin call'和'end call',可以這樣做:

12345678910111213141516

import?functools?def?log(func):@functools.wraps(func)?#為了校正函數簽名,最好寫上def?wrapper(*args,**kw):print('begin call')f?=?func(*args,**kw)print('end call')return?freturn?wrapper?@logdef?hah():print('hahahaha')?hah()

123

begin callhahahahaend call

15.偏函數: functools.partial(),作用是將壹個函數的某些參數固定住,作為新函數的參數,即固定住該參數,返回壹個新函數,使調用更簡單。

四、面向對象編程

1.Python實例變量可以自由地綁定任何屬性

2.為了不讓內部屬性不被外部訪問,在屬性的名稱前加上兩個下劃線__,這樣就變成了壹個私有變量(private),註意,不能直接訪問不代表壹定不能訪問,事實上,加雙下劃線後Python就會將其改名為‘_class名__name’,所以還是可以這樣來訪問這個‘私有’變量。

3.對於靜態語言,如果要求傳入壹個class類型的對象,那麽傳入的對象必須是class類型或者其子類,否則將無法調用class中的方法,而Python這樣的動態語言有‘鴨子類型’壹說,即不壹定要傳入class類型或其子類,而只要保證傳入的對象中有要使用的方法即可。

4.如果想要限制實例可以綁定的屬性,那麽在定義class時定義壹個__slots__變量即可,例如:

12

class?Student(object):__slots__?=?(‘name’,’age’)

註意,__slots__限制的屬性對當前類實例起完全限制作用,且與子類***同定義其__slots__,也就是說子類可以定義自己的__slots__,子類實例允許定義的屬性就是自身的__slots__加上父類的__slots__,即並集。

5.@ property裝飾器可以使壹個getter方法變成屬性,如果方法名為me,那麽@me.setter裝飾器則可使壹個setter方法變成屬性。這樣可以使代碼更簡短,同時可對參數進行必要的檢查。

6.通過多重繼承,可使子類擁有多個父類的所有功能。

7.在類中__call__方法可使實例對象像函數那樣直接調用,作用即是該方法定義的過程。

8.ORM(Object Relational Mapping 對象關系映射),就是把關系數據庫的壹行映射為壹個對象,也就是壹個類對應壹個表。ORM的實現需要通過metaclass元類修改類的定義。元類可以改變類創建時的行為。

五、調試

1.Python調試方法:

(1)直接打印

(2)斷言

(3)pdb

(4)IDE

六、IO編程

1.序列化: 把變量從內存中變成可存儲或傳輸的過程稱之為序列化。Python用pickle模塊實現序列化。序列化之後,就可以把序列化後的內容存儲到磁盤上或者通過網絡進行傳輸。pickle.dumps()將對象序列化成壹個bytes,而pickle.loads()可以根據bytes反序列化出對象。

2.pickle雖好,但是它專為Python而生,所以要在不同語言間傳遞對象,最好還是xml或者json,而json表示格式是壹個字符串,更易讀取,且比xml快,所以更加適宜於對象序列化。Python內置了json模塊,相應方法仍然是dumps()和loads()。

3.但是在默認情況下,有些對象是無法序列化的,所以我們有時還需要定制轉換方法,告訴json該如何將某類對象轉換成可序列為json格式的{}對象。如下即是壹個轉換方法:

123456

def?mantodict(std):return?{'name': std.name,'age': std.age,'id': std.id}

七、進程與線程

1.Python用mutiprocessing模塊來實現多進程。

2.如果要大量創建子進程,可以使用進程池:

1

from?multiprocessing?import?Pool

示例如下:

12345678

....p?=?Pool(4)for?i?in?range(5):p.apply_async(long_time_task, args=(i,))print('Waiting for all subprocesses done...')p.close()p.join()print('All subprocesses done.')

要使用進程池需新建Pool對象,對Pool對象調用join()使等待池中所有子進程運行完畢,調用join()方法之前必須調用close(),且此後無法再新加子進程。

3.使用subprocess模塊可以方便的啟動並管理壹個子進程,控制其輸入輸出。

4.進程間通信使用Queue,Pipes實現。

5.threading模塊管理線程。threading.lock()創建線程鎖,防止同時訪問互斥資源造成的錯誤,示例如下:

1234567

lock?=?threading.Lock()...lock.acquire()...change(mutex)...lock.release()

6.ThreadLocal可以解決參數在壹個線程中各個函數之間互相傳遞的問題。

7.managers模塊實現分布式進程。

八、正則表達式與常用內建模塊

1.re模塊進行正則表達式編譯和匹配,如果該表達式需要匹配很多次,那麽最好進行編譯從而大大節省時間。

正則表達式匹配郵箱例子:

12345678910

import?re?hah?=?re.compile('[0-9a-zA-Z]+[\.[0-9a-zA-Z]+]*\@[0-9a-zA-Z]+\.[a-z]{2,3}')print(hah.match('someone@gmail.com').group())print(hah.match('bill.gates@microsoft.com').group())i?=?1while?i <?10:r?=?input('請輸入郵箱:')print(hah.match(r).group())i?=?i+1

2.datetime模塊進行日期和時間的處理,每壹個時間對應壹個timestamp,我們把1970年1月1日 00:00:00 UTC+00:00時區的時刻稱為epoch time,記為0(1970年以前的時間timestamp為負數),當前時間就是相對於epoch time的秒數,稱為timestamp。字符串和datetime也可以相互轉換,采用strptime()方法,字符串轉換為datetime時需要設定壹個識別格式,其中

1

%Y-%m-%d?%H:%M:%S

分別表示年-月-日 時-分-秒。

從datetime得出月份,星期等字符串用strftime()方法,其中:

1

%a,?%b?%d?%H:%M

分別表示星期, 月份 日期 時:分。

示例:

12345678910

from?datetime?import?datetime?r?=?'2015-11-23 12:01'dt?=?datetime.strptime(r,?'%Y-%m-%d %H:%M')print(dt)?week?=?dt.strftime('%a %b %d, %H:%M')print(week)2015-11-23?12:01:00Mon Nov?23,?12:01

3.collections是Python內建的壹個集合模塊,提供了許多有用的集合類。

4.Base64是壹種任意二進制到文本字符串的編碼方法,常用於在URL、Cookie、網頁中傳輸少量二進制數據。

5.struct模塊用來解決bytes和其他二進制數據類型的轉換。

6.Python的hashlib提供了常見的哈希算法,如MD5,SHA1等等。hashlib實現簡單登錄:

12345678910111213141516171819202122

import?hashlib?db?=?{'michael':?'e10adc3949ba59abbe56e057f20f883e','bob':?'878ef96e86145580c38c87f0410ad153','alice':?'99b1c2188db85afee403b1536010c2c9'}?def?get_md5(ostr):md5?=?hashlib.md5()md5.update(ostr.encode())return?md5.hexdigest()?def?login(user, password):r?=?get_md5(password)for?name?in?db:if?db[name]?==?r:return?Truereturn?False?print(login('bob','abc999'))True

7.Python的內建模塊itertools提供了非常有用的用於操作叠代對象的函數。

8.urllib提供了壹系列用於操作URL的功能。如GET,POST...

9.PIL(Python Imaging Library Python圖像庫)是壹個強大的圖像處理標準庫,功能強大卻又簡單易用。現在的名字叫做Pillow。可以如下安裝Pillow:

1

pip3 install pillow

從下面生成數字驗證碼的程序可以窺其壹斑:

View Code

效果:

九、網絡編程和電子郵件

1.網絡編程主要是TCP和UDP的編程,示例見Python網絡編程利用Python進行TCP、UDP套接字編程

2.SMTP是發送郵件的協議,Python內置對SMTP的支持,可以發送純文本郵件、HTML郵件以及帶附件的郵件。Python對SMTP支持有smtplib和email兩個模塊,email負責構造郵件,smtplib負責發送郵件。Python內置壹個poplib模塊,實現了POP3協議,可以直接用來收郵件。由於現在絕大多數大型郵件服務商都采取了反垃圾郵件措施,所以這部分的簡單實驗並沒有成功,還需進壹步研究,等遇到具體情況再說。

3.Python內嵌了sqlite數據庫,還可以自行安裝連接mysql,MySQL是當前最流行的開源數據庫,在行業內有著廣泛的應用。

十、Web開發和異步IO

1.WSGI(Web Server Gateway Interface) 服務器網關接口。

2.Python web 開發框架:

-Flask:流行的Web框架

-Django:全能型Web框架

-web.py:壹個小巧的Web框架

-Bottle:和Flask類似的Web框架

-Tornado:Facebook的開源異步Web框架

3.協程

  • 上一篇:編程貓編程仰臥發育
  • 下一篇:Vb編程2024
  • copyright 2024編程學習大全網