Python學習筆記
因爲是搞nlp的,而python作爲腳本語言對處理語料等方面有着先天的優勢,所以近期好好學習了下它,下面是一些我的筆記,比較粗略,主要爲了以後好複習。
Sys.path環境變量
數字,字符串,列表,字典,元組,文件
自動跟蹤類型,不聲明代碼
Lambda args: expression 生成匿名函數
拷貝對象
字符串格式化 'a%s parrot'%type
列表解析 [.. for .. in .. if ..]
內部暫時存儲並重複使用短字符串
try/except/finally
raise 觸發異常
不要用;和(),一行有多個語句則;
.. .. = .. ..
使用列表作爲堆棧的數據結構:
L = [1,2,3,4]
While L:
front, L = L[0], L[1:]
Print(front,L)
重定向利用print中的file默認指向sys.stdout
文件迭代:for line in open(..).readlines():
List(..), tuple(..), dict(..)
zip().....make an iterator that aggregates elements from each of the iterator
dir(..)抓取對象內所有可用屬性列表
不要期待進行在原處的修改的函數會返回結果
函數僅僅是對象,可以賦值給不同的變量名,並通過新的變量名進行調用
一個函數所有變量名都是與函數的命名空間相關聯內部變量名都是本地化的除非聲明爲全局變量(global)
變量名解析:LEGB原則
本地作用域(L)之後是上一層結構中def或lambda本地作用域(E),之後是全局作用域(G),最後是內置作用域(B)並且在第一處能夠找到這個變量名的地方停下來
不可變參數是“通過值”進行傳遞,可變對象時通過“指針”進行傳遞
lambda用來編寫跳轉表(jump table)也就是行爲的列表或字典
L = [(lambda x: x**2),(lambda x: x**3),(lambda x: x**4)]
for f in L:
Print(f(2))
print(L[0](3))
lambda中表達式:(lambda x,y: x if x<y else y)
filter: x = filter((lambda x: x>0),range(-5,5))
for y in iter(x):
Print(y)
對返回迭代器的使用:for x in iter:
Print(x)
交互模式下命令空間是名爲__main__的命名空間
模塊搜索路徑:程序主目錄,pythonpath目錄,標準鏈接庫目錄,任何.pth文件內容,上述四個組件合起來就成爲sys.path
from 複製而來的變量名和其來源文件之間並沒有聯繫,爲實際修改另一個文件全局變量名,必須使用import
包導入:import dir1.dir2.mod
from dir1.dir2.mod import x
包導入語句的路徑內每個目錄內都必須有__init__.py這個文件
__name__當以頂層腳本執行這個文件時爲__main__在導入模塊時常以此來判斷是否導入
運算符重載:class Number:
def __init__(self,start):
self.data = start
def __sub__(self,other):
return Number(self.data - other)
__getitem__攔截索引運算:
class indexer:
def __getitem__(self,index):
return index**2
測試:x = index()
x[2] #.......4
如果__str__不存在,會轉向__repr__(反過來不會),相當於java的toString()方法
__init__用於初始化,__call__應用函數調用表達式運行
如下:class Prod:
def __init__(self,value):
self.value = value
def __call__(self,othe):
Return self.value*other
>>> x = Prod(2)
>>> x(3) #........調用__call__
6
__del__析構器,__class__ is the instance's class
__getattr__(), __setattr__(),__delattr__()
方法是對象:1, 無綁定類方法對象:無self
2, 綁定實例方法對象:self+函數對
先獲取綁定而不用實際進行調用:
class Spam:
def doit(self,message):
print(message)
可以獲取綁定方法而不用實際進行調用
Object1 = Spam()
x = object1.doit #獲取綁定
x('hello world') #調用
異常基礎:try/except, try/finally , raise手動觸發異常,assert有條件在代碼中觸發異常