列表是Python里的一個類。一個特定的表,比如說nl = [1,3,8],就是這個類的一個對象。我們可以調用這個對象的一些方法,比如 nl.append(15)。 我們要介紹一個新的類,詞典 (dictionary)。與列表相似,詞典也可以儲存多個元素。這種儲存多個元素的對象稱為容器(container)。
基本概念
常見的創建詞典的方法:
>>>dic = {'tom':11, 'sam':57,'lily':100}>>>PRint type(dic)詞典元素的循環調用
>>>dic = {'lilei': 90, 'lily': 100, 'sam': 57, 'tom': 90}>>>for key in dic: print dic[key]詞典的常用方法
>>>print dic.keys() # 返回dic所有的鍵>>>print dic.values() # 返回dic所有的值>>>print dic.items() # 返回dic所有的元素(鍵值對)>>>dic.clear()另外有一個很常用的用法:
>>>del dic['tom'] # 刪除 dic 的‘tom’元素del是Python中保留的關鍵字,用于刪除對象。
與表類似,你可以用len()查詢詞典中的元素總數。
>>>print len(dic)Python具有基本的文本文件讀寫功能。Python的標準庫提供有更豐富的讀寫功能。 文本文件的讀寫主要通過open()所構建的文件對象來實現。
創建文件對象
我們打開一個文件,并使用一個對象來表示該文件: 對象名 = open(文件名,模式) 最常用的模式有:
r 打開只讀文件,該文件必須存在。r+ 打開可讀寫的文件,該文件必須存在。w 打開只寫文件,若文件存在則文件長度清為0,即該文件內容會消失。若文件不存在則建立該文件。w+ 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。a+ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾后,即文件原先的內容會被保留。上述的形態字符串都可以再加一個b字符,如rb、w+b或ab+等組合,加入b 字符用來告訴函數庫打開的文件為二進制文件,而非純文字文件。文件對象的方法
讀?。?/p>content = f.read(N) # 讀取N bytes的數據content = f.readline() # 讀取一行content = f.readlines() # 讀取所有行,儲存在列表中,每個元素是一行。
寫入:
f.write('I like apple!/n') # 將'I like apple'寫入文件并換行關閉文件:
f.close() # 不要忘記關閉文件我們之前看到了函數和對象。從本質上來說,它們都是為了更好的組織已經有的程序,以方便重復利用。
模塊(module)也是為了同樣的目的。在Python中,一個.py文件就構成一個模塊。通過模塊,你可以調用其它文件中的程序。
引入模塊
我們先寫一個first.py文件,內容如下:
def laugh(): print 'HaHaHaHa'再寫一個second.py,并引入first中的程序:
import first #將first文件引入for i in range(10): first.laugh()在second.py中,我們使用了first.py中定義的laugh()函數。
引入模塊后,可以通過 模塊.對象 的方式來調用引入模塊中的某個對象。上面例子中,first為引入的模塊,laugh()是我們所引入的對象。Python中還有其它的引入方式:
import a as b # 引入模塊a,并將模塊a重命名為b from a import function1 # 從模塊a中引入function1對象。調用a中對象時,我們不用再說明模塊,即直接使用function1,而不是a.function1。 from a import * # 從模塊a中引入所有對象。調用a中對象時,我們不用再說明模塊,即直接使用對象,而不是a.對象。這些引用方式,可以方便后面的程序書寫。搜索路徑
Python會在以下路徑中搜索它想要尋找的模塊:
程序所在的文件夾?操作系統環境變量PYTHONPATH所包含的路徑?標準庫的安裝路徑如果你有自定義的模塊,或者下載的模塊,可以根據情況放在相應的路徑,以便Python可以找到。
模塊包
可以將功能相似的模塊放在同一個文件夾(比如說this_dir)中,構成一個模塊包。通過
import this_dir.module引入this_dir文件夾中的module模塊。 該文件夾中必須包含一個 __init__.py 的文件,提醒Python,該文件夾為一個模塊包。__init__.py 可以是一個空文件。
包裹傳遞
在定義函數時,我們有時候并不知道調用的時候會傳遞多少個參數。這時候,包裹(packing)位置參數,或者包裹關鍵字參數,來進行參數傳遞,會非常有用。
下面是包裹位置傳遞的例子:
def func(*name): print type(name) print namefunc(1,4,6)func(5,6,7,1,2,3)兩次調用,盡管參數個數不同,都基于同一個func定義。在func的參數表中,所有的參數被name收集,根據位置合并成一個元組(tuple),這就是包裹位置傳遞。 為了提醒Python參數,name是包裹位置傳遞所用的元組名,在定義func時,在name前加*號。
下面是包裹關鍵字傳遞的例子:
def func(**dict): print type(dict) print dictfunc(a=1,b=9)func(m=2,n=1,c=11)與上面一個例子類似,dict是一個字典,收集所有的關鍵字,傳遞給函數func。為了提醒Python,參數dict是包裹關鍵字傳遞所用的字典,在dict前加 * *。 包裹傳遞的關鍵在于定義函數時,在相應元組或字典前加 * 或 * * 。
解包裹
* 和 **,也可以在調用的時候使用,即解包裹(unpacking), 下面為例:
def func(a,b,c): print a,b,cargs = (1,3,4)func(*args)在這個例子中,所謂的解包裹,就是在傳遞tuple時,讓tuple的每一個元素對應一個位置參數。在調用func時使用 * ,是為了提醒Python:我想要把args拆成分散的三個元素,分別傳遞給a,b,c。(設想一下在調用func時,args前面沒有 * 會是什么后果?) 相應的,也存在對詞典的解包裹,使用相同的func定義,然后:
dict = {'a':1,'b':2,'c':3}func(**dict)在傳遞詞典dict時,讓詞典的每個鍵值對作為一個關鍵字傳遞給func。
新聞熱點
疑難解答