標籤:python學習技巧 python易錯點
一:基礎教程
(1)檔案I/O 非常類似於 c語言;IO在電腦中指Input/Output,也就是輸入和輸出。由於程式和運行時資料是在記憶體中駐留,由CPU這個超快的計算核心來執行,涉及到資料交換的地方,通常是磁碟、網路等,就需要IO介面。
spath="D:/download/baa.txt"f=open(spath,"w") # Opens file for writing.Creates this file doesn't exist.f.write("First line 1.\n")f.writelines("First line 2.")f.close()f=open(spath,"r") # Opens file for readingfor line in f:print linef.close()
(2)異常處理 try: except: 在程式啟動並執行過程中,如果發生了錯誤,可以事先約定返回一個錯誤碼,這樣,就可以知道是否有錯,以及出錯的原因。在作業系統提供的調用中,返回錯誤碼非常常見。比如開啟檔案的函數open()
,成功時返迴文件描述符(就是一個整數),出錯時返回-1
。
s=raw_input("Input your age:")if s =="":raise Exception("Input must no be empty.")try:i=int(s)except ValueError:print "Could not convert data to an integer."except:print "Unknown exception!"else: # It is useful for code that must be executed if the try clause does not raise an exceptionprint "You are %d" % i," years old"finally: # Clean up actionprint "Goodbye!"
(3)類和繼承 class B (A)的形式類是建立執行個體的模板,而執行個體則是一個一個具體的對象,各個執行個體擁有的資料都互相獨立,互不影響;方法就是與執行個體綁定的函數,和普通函數不同,方法可以直接存取執行個體的資料;通過在執行個體上調用方法,我們就直接操作了對象內部的資料,但無需知道方法內部的實現細節。
(4)包機制
每一個.py檔案稱為一個module,module之間可以互相匯入.請參看以下例子:
# a.py
def add_func(a,b):
return a+b
# b.py
from a import add_func # Also can be : import a
print "Import add_func from module a"
print "Result of 1 plus 2 is: "
print add_func(1,2) # If using "import a" , then here should be "a.add_func"
二:實戰例子
# encoding: utf-8#!/usr/bin/pythonimport reclass Parent:parentAttr = 100;# 重載def __init__(self):print "調用父類建構函式 Parent construct".decode("utf-8").encode("gbk");#成員函數def parentMethod(self):print "調用父類成員函數:Parent method";def setAttr(self,attr):Parent.parentAttr = attr;def getAttr(sef):print "父類屬性:ParentAttr:", Parent.parentAttr;def __del__(self):print "parent descontruct";class Child(Parent): # 定義子類def __init__(self):print "調用子類構造方法 child construct"def childMethod(self):print '調用子類方法 child method'def __del__(self):print "child destructor";c = Child() # 執行個體化子類c.childMethod() # 調用子類的方法c.parentMethod() # 調用父類方法c.setAttr(200) # 再次調用父類的方法c.getAttr() lines = "zyp,0001,nan\r\nxqz,0002,nan\r\nwzx,0003,nv";line = "Cats are smarter than dogs";matchObj = re.match( r'(.*),', lines, re.M|re.I)if matchObj:print "ddd", matchObj.group();else:print "no match!!";lists = lines.split(',\\r\\n');print "lists:",lists;for li in lists:print li;#print li,"\n";print " *********just for test******";try:fileR = open('splits.txt','r');done = 0;while not done:f_str = fileR.readline();if (f_str != ''):eles = f_str.split(',');#print "eles:",eles;for ele in eles:print ele;else:done = 1;except IOError:print "Error:can\'t find this file";fileR.close();print " *********just for test******";try:fileR = open('splits.txt','r');f_lines = fileR.readlines();for line in f_lines:eles = line.split(',');for ele in eles:print ele;except IOError:print "Error:can\'t find this file";fileR.close();
說明:本例子說明了Python的類繼承,以及異常處理,和檔案的讀取任務
三:易犯錯誤
(1)常見錯誤1:在函數參數中亂用運算式作為預設值
Python允許給一個函數的某個參數設定預設值以使該參數成為一個選擇性參數。儘管這是這門語言很棒的一個功能,但是這當這個預設值是可變對象(mutable)時,那就有些麻煩了。例如,看下面這個Python函數定義:
def foo(bar=[]): # bar是選擇性參數,如果沒有指明的話,預設值是[]
bar.append("MKY"); # 但是這行可是有問題的,走著瞧…
return bar;
print foo()
print foo()
答案是一個函數參數的預設值,僅僅在該函數定義的時候,被賦值一次。如此,只有當函數foo()第一次被定義的時候,才講參數bar的預設值初始化到它的預設值(即一個空的列表)。當調用foo()的時候(不給參數bar),會繼續使用bar最早初始化時的那個列表。
(2)本地變數(由於賦值和變數不用聲明即可用造成的)在使用列表(lists)的時候,這種情況尤為突出。看下面這個例子:
>>> lst = [1, 2, 3]
>>> def foo1():
... lst.append(5) # 這沒有問題...
...
>>> foo1()
>>> lst
[1, 2, 3, 5]
>>> lst = [1, 2, 3]
>>> def foo2():
... lst += [5] # ... 這就有問題了!
...
>>> foo2()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
UnboundLocalError: local variable ‘lst‘ referenced before assignment
嗯?為什麼foo2有問題,而foo1沒有問題?
答案foo1並沒有給lst賦值,但是foo2嘗試給lst賦值。注意lst+=[5]只是lst=lst+[5]的簡寫,由此可以看到我們嘗試給lst賦值(因此Python假設範圍為本地)。但是,這個要賦給lst的值是基於lst本身的(這裡的範圍仍然是本地),而lst卻沒有被定義,這就出錯了。
(3)與Python標準庫模組命名衝突
Python的一個優秀的地方在於它提供了豐富的庫模組。但是這樣的結果是,如果你不下意識的避免,很容易你會遇到你自己的模組的名字與某個隨Python附帶的標準庫的名字衝突的情況(比如,你的代碼中可能有一個叫做email.py的模組,它就會與標準庫中同名的模組衝突)。
這會導致一些很粗糙的問題,例如當你想載入某個庫,這個庫需要載入Python標準庫裡的某個模組,結果呢,因為你有一個與標準庫裡的模組同名的模組,這個包錯誤的將你的模組載入了進去,而不是載入Python標準庫裡的那個模組。這樣一來就會有麻煩了。
所以在給模組起名字的時候要小心了,得避免與Python標準庫中的模組重名。相比起你提交一個“Python改進建議(Python Enhancement Proposal (PEP))”去向上要求改一個標準庫裡包的名字,並得到批准來說,你把自己的那個模組重新改個名字要簡單得多。
(4)版本問題,2.X和 3.X的區別,下面是兩個很好的學習Python的網站
Python程式員的10個常見錯誤 http://www.csdn.net/article/2014-05-12/2819716-Top-10-Mistakes-that-Python-Programmers-Make
http://www.yiibai.com/python/python_gui_programming.html --- python GUI工具
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00141861202544241651579c69d4399a9aa135afef28c44000Python教程
Python 基礎教程 和 易犯錯誤(文本處理)