Python常用知識點彙總

一.Python中的數據結構

python的元組、列表、字典數據類型是很python(there python is a adjective)的數據結構。這些結構都是經過足夠優化後的,所以如果使用好的話,在某些area會有很大的益處。

1.元組

個人認爲就像java的數組,python中的元組有以下特性:

任意對象的有序集合,這條沒啥說的,數組的同性;

通過偏移讀取;

一旦生成,不可改變;

固定長度,支持嵌套

來例子吧,python 代碼

>>> (0, 'haha', (4j, 'y'))   ###元組用圓括號標誌

(0, 'haha', (4j, 'y'))  

>>> t = (1, 3, 'b')  

>>> t[2]  

'b'  

>>> t[3]   

Traceback (most recent call last):     File "#41>", line 1, in <module></module>       t[3]   IndexError: tuple index out of range 

>>> t[-1]  

'b'  

>>> t[0:-1]  

(1, 3)  

>>> t * 2   ##這裏是元組內的對象都重複兩次,而不是每個對象值乘以2

(1, 3, 'b', 1, 3, 'b')

>>> for x in t:      

       print x,           

1 3 b  

>>> 'b' in t  

True 

>>> q = t + ((3, 'abc'))   ##也可以寫成:q = t + (3,’abc’)

>>> q  

(1, 3, 'b', 3, 'abc')  

>>> for x in (2, (3, 'a')):  ##嵌套的元組遍歷,輸出時被嵌套的元組作爲一個對象輸出

print x           

2   (3, 'a')  

>>> len(q)  

5  

>>> len((2, (3, 'abc')))   ##注意嵌套元組的長度

2  

>>> (1, 2, 3)[1]  

2  

>>> q[1] = 'd'    

Traceback (most recent call last):     File "#57>", line 1, in <module></module>       q[1] = 'd'   TypeError: 'tuple' object does not support item assignment  

>>> a = ('b', 'c', q)  

>>> 1 in a   ###判斷元組中是否有某個值

False 

>>> q in a  

True 

>>> a = ('b', 'c', (1, 3, 'b', 3, 'abc')) 

>>> a  

('b', 'c', (1, 3, 'b', 3, 'abc')) 

上面的例子足以說明大部分了,使用元組時最重要的一點是“一旦生成,就不可變了”。

 

2.列表

列表所具有的特性也要比元組更多、更靈活,其character總結如下:

任意對象的有序集合;

可通過偏移存取,注意,列表中的元素都是可變的,這是不同於元組的;

長度可變,支持嵌套;

還有一些類似java的對象引用機制

由於列表的這些特性,使得列表在實際應用中被廣泛使用,下面是一些例子。

1)首先是基本用法

python 代碼

>>> l = ['a', 'b', 'c'] 

>>> len(l)   3  

>>> l + ['d']   ['a', 'b', 'c', 'd']  

>>> l * 2   ['a', 'b', 'c', 'a', 'b', 'c']  

>>> for x in l:      

print x,          a b c 

2)索引和分片,賦值(單個元素賦值,分片賦值

python 代碼

>>> l = ['abc', 'def', 'ghi', 123]        

>>> l[2]         'ghi'        

>>> l[-3]         'def'       

>>> l[:3]         ['abc', 'def', 'ghi']     

>>> l[1] = 'haha'    

>>> l      ['abc', 'haha', 'ghi', 123]   

>>> l[1:] = ['apple', 'banana']     

>>> l      ['abc', 'apple', 'banana']     

>>> l[2] = [123, 345, 456]     

>>> l      ['abc', 'apple', [123, 345, 456]]   

>>> l[1:] = [123, 234, 345, 456, 567]     

>>> l      ['abc', 123, 234, 345, 456, 567] 

3) 添加、排序、刪除操作

python 代碼

>>> l = ['abc', 'def', 'ghi', 123] 

>>> l.append(456)  

>>> l   ['abc', 'def', 'ghi', 123, 456]  

>>> l.sort()  

>>> l   [123, 456, 'abc', 'def', 'ghi']  

>>> del l[0]  

>>> l   [456, 'abc', 'def', 'ghi']  

>>> del l[2:]  

>>> l   [456, 'abc'] 

4)一些有趣的用法

去掉列表中每個元素頭尾的空格:## str.strip() 函數使用

python 代碼

>>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']  

>>> [str.strip() for str in freshfruit]    ['banana', 'loganberry', 'passion fruit'] 

把列表中,大於3的元素,乘以2:

python 代碼

>>> vec = [2, 4, 6]   

>>> [2*x for x in vec if x > 3]    [8, 12] 

把列表1的每一個元素和列表2的每一個元素相乘:

python 代碼

>>> lst1 = [2, 4, 6]   

>>> lst2 = [4, 3, -9]  

>>> [x*y for x in lst1 for y in lst2]    [8, 6, -18, 16, 12, -36, 24, 18, -54] 

取獲[0-10)的平方:

python 代碼

[x**2 for x in range(10)] 

3.字典

python裏的字典就像java裏的HashMap,以鍵值對的方式存在並操作,其特點如下:

通過鍵來存取,而非偏移量;

鍵值對是無序的;

鍵和值可以是任意對象;

長度可變,任意嵌套;

在字典裏,不能再有序列操作,雖然字典在某些方面與列表類似,但不要把列表套在字典上。

字典的鍵必須是不可改變的類型,如:字符串,數字,tuple(元組);值可以爲任何Python數據類型。

1)基本操作

python 代碼

>>> table = {'abc':1, 'def':2, 'ghi':3}  

>>> table['abc']   1 

>>> len(table)   3  

>>> table.keys()   ['abc', 'ghi', 'def']  

>>> table.values()   [1, 3, 2]  

>>> table.has_key('def')   True

>>> table.items()   [('abc', 1), ('ghi', 3), ('def', 2)] 

2)修改,刪除,添加

python 代碼

>>> table = {'abc':1, 'def':2, 'ghi':3}  

>>> table['ghi'] = ('g', 'h', 'i') 

>>> table   {'abc': 1, 'ghi': ('g', 'h', 'i'), 'def': 2} 

>>> del table['abc'] 

>>> table   {'ghi': ('g', 'h', 'i'), 'def': 2}  

>>> table['xyz'] = ['x', 'y', 'z']   ##另一種添加方法>>> dict1.setdefault('b',2)

>>> table   {'xyz': ['x', 'y', 'z'], 'ghi': ('g', 'h', 'i'), 'def': 2} 

#清空字典

>>> dict1.clear() 

>>> dict1 #字典變爲空了

{} 

#刪除字典對象

>>> del dict1 

>>> dict1 

Traceback (most recent call last): 

File "< interactive input>", line 1, in < module>

NameError: name 'dict1' is not defined

在這裏需要來一句,對於字典的擴充,只需定義一個新的鍵值對即可,而對於列表,就只能用append方法或分片賦值。

3)對字典的遍歷

python 代碼

>>> table = {'abc':1, 'def':2, 'ghi':3}  

>>> for key in table.keys():      

print key, '\t', table[key]            abc     1   ghi     3   def     2 

二.文件讀寫

與java的File類相比,python的文件類要狹義一些

1文件寫

python 代碼

>>> myfile = open('myfile', 'w')    ##另外一種寫法myfile=file(‘myfile’,’w’)

>>> myfile.write('hello world\n')  

>>> myfile.close() 

python的一個open語句就打開了一個文件(當給定的文件不存在時,會自動建立一個新的文件)。open的第一個參數是文件名,第二個參數是操作模式,所謂操作模式就是你打開一個文件是用來幹什麼的,是讀,還是寫 (當然操作模式不僅只有讀和寫)。還有一件事,操作完要記得關。

2 文件讀

python 代碼

>>> myfile = open('myfile', 'r')  ##另外一種寫法myfile=file(‘myfile’,’r’)

>>> myfile.readline ()   'hello world\n' 

很是簡單,這樣兩句就頂java一長串的流嵌套,當然,java那樣做也是有道理的。

三.Python中使用pickle持久化對象

Python中可以使用 pickle 模塊將對象轉化爲文件保存在磁盤上,在需要的時候再讀取並還原。具體用法如下:
pickle.dump(obj, file[, protocol])

這是將對象持久化的方法,參數的含義分別爲:

n obj: 要持久化保存的對象;

n file: 一個擁有 write() 方法的對象,並且這個 write() 方法能接收一個字符串作爲參數。這個對象可以是一個以寫模式打開的文件對象或者一個StringIO對象,或者其他自定義的滿足條件的對象。

n protocol: 這是一個可選的參數,默認爲0,如果設置爲 1 或 True,則以高壓縮的二進制格式保存持久化後的對象,否則以ASCII格式保存。

對象被持久化後怎麼還原呢?pickle 模塊也提供了相應的方法,如下:
pickle.load(file)
只有一個參數 file ,對應於上面 dump方法中的 file 參數。這個 file 必須是一個擁有能接收一個整數爲參數的 read() 方法以及一個不接收任何參數的 readline() 方法,並且這兩個方法的返回值都應該是字符串。這可以是一個打開爲讀的文件對象、StringIO 對象或其他任何滿足條件的對象。
下面是一個基本的用例:

# -*- coding: utf-8 -*-
import pickle
# 也可以這樣: import cPickle as pickle
obj = {"a": 1, "b": 2, "c": 3}
# 將 obj 持久化保存到文件 tmp.txt 中
pickle.dump(obj, open("tmp.txt", "w"))

#filename=file(‘tmp.txt’,’w’)

#pickle.dump(obj,filename)

# do something else ...
# 從 tmp.txt 中讀取並恢復 obj 對象
obj2 = pickle.load(open("tmp.txt", "r"))

#filename=file(‘tmp.txt’,’r’)

#pickle.load(filename)
print obj2

不過實際應用中,我們可能還會有一些改進,比如用 cPickle 來代替 pickle ,前者是後者的一個 C 語言實現版本,擁有更快的速度,另外,有時在 dump 時也會將第三個參數設爲 True 以提高壓縮比。

四.Python連接操作MySQL數據庫

MySQLdb在Python中也就相當於JAVA中MySQL的JDBC Driver,Python也有類似的數據接口規範Python DB API,MySQLdb就是Mysql的實現。操作也比較簡單和其它平臺或語言操作數據庫一樣,就是建立和數據庫系統的連接,然後給數據庫輸入SQL,再從數據庫獲取結果。

1.下載MySql-python:

http://cdnetworks-kr-1.dl.sourceforge.net/project/mysql-python/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz ,

2.解壓、編譯和安裝

Shell> tar -zxvf MySQL-python-1.2.3.tar.gz

Shell> cd MySQL-python-1.2.3

Shell> python setup.py build #編譯

   Shell> python setup.py install #安裝

注:

如果在執行編譯操作python setup.py build時報如下錯誤:

rom setuptools import setup
ImportError: No module named setuptools

解決方法:

1)wget -q http://peak.telecommunity.com/dist/ez_setup.py

2)python ez_setup.py ( 這一步必然失敗,是爲了第三步取得url準備的.)

運行這行的時候,linux會停留在Downling ~~~~~這類似的上面.

這是因爲你的這個目錄下中沒有setuptools-0.6c8-py2.4.egg東西.

3)wget http://pypi.python.org/packages/2.4/s/setuptools/setuptools-0.6c8-py2.4.egg

注意:第三步的url是根據第二步得到的url.

這時候你再運行第二步.之後再運行安裝你前面不能夠安裝的軟件.應該就解決了setuptools方面的問題了.

關鍵東西:是要準備好2個東西:ez_setup.py和setuptools-0.6c8-py2.4.egg.

3.測試

Shell> python

>>> import MySQLdb

如果沒有出錯提示,剛安裝成功

4.Python連接MySQL操作示例:

Shell>cat mysqldb.py

#!/usr/bin/python

import MySQLdb #導入模塊,注意大小寫!!

#建立和數據庫的連接

conn=MySQLdb.connect(host='localhost',user='root',passwd='root',db='test')

#host:Mysql主機地址或名稱
#user:連接使用的用戶名
#passwd:連接使用的用戶名密碼
#db:默認打開的數據庫

#獲取操作遊標

cursor=conn.cursor()

#執行SQL

cursor.execute('select * from tab4')

#獲得SQL執行返回結果集的第一條記錄

row1=cursor.fetchone()

print ‘the first records is:’,row1

#獲取5條記錄,注意由於之前執行有了fetchone(),所以遊標已經指到第二條記錄了,也就是從第二條開始的所有記錄
print "只獲取5條記錄:" 
results = cursor.fetchmany(5)  
for r in results:  
    print r  

#重置遊標位置,0,爲偏移量,mode=absolute | relative,默認爲relative, 

cursor.scroll(0,mode='absolute') 

#當使用fetchone()方法是,指針是會發生移動的。所以,若不重置指針,那麼使用fetchall

#的信息將只會包含指針後面的行內容。
#實際上,我覺得應該儘量避免移動指針;而應從select語句得到全部結果後,交給python處理比較方便,但我們應該明白該指針的含義。

#獲得SQL執行返回的所有結果集,該結果集是以元組數據結構存放,第一條爲row[0]

rows=cursor.fetchall()

print ‘the first records is:’,rows[0]

print 'the results of tab4 is:',rows

#用for循環打印結果集

for row in rows:

print row

#關閉連接,釋放資源

cursor.close()

conn.close()

執行該腳本:

Shell> ./mysqldb.py

mysql server version: ((1L, 'sam', 1L), (2L, 'sam2', 2L), (3L, 'sam3', 3L), (4L, 'sam4', 4L))

5.Python對MySQL的數據庫其他操作

Python在MySQL中創建數據庫newdb,創建數據庫表newtab,並向newtab中插入一條、多條記錄

Shell>cat newdb.py

#!/usr/bin/python

import MySQLdb  
#建立和數據庫系統的連接
conn = MySQLdb.connect(host='localhost', user='root',passwd='longforfreedom')  
#獲取操作遊標
cursor = conn.cursor()  
#執行SQL,創建一個數據庫.  
cursor.execute("create database if not exists python")  
#選擇數據庫
conn.select_db('python');  
#執行SQL,創建一個數據表.  
cursor.execute("create table test(id int, info varchar(100)) ")  
value = [1,"inserted "];  
#插入一條記錄
cursor.execute("insert into test values(%s,%s)",value);  
values=[]  
#生成插入參數值
for i in range(20):  
values.append((i,'Hello mysqldb, I am recoder ' + str(i)))  
#插入多條記錄
cursor.executemany("insert into test values(%s,%s) ",values);  

count = cursor.execute('select * from test')  
print '總共有 %s 條記錄',count 

#獲取一條記錄,每條記錄做爲一個元組返回
print "只獲取一條記錄:" 
result = cursor.fetchone();  
print result  
#print 'ID: %s   info: %s' % (result[0],result[1])  
print 'ID: %s   info: %s' % result   
#關閉連接,釋放資源
cursor.close();

conn.close();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章