一.Python中的數據結構java
python的元組、列表、字典數據類型是很python(there python is a adjective)的數據結構。這些結構都是通過足夠優化後的,因此若是使用好的話,在某些area會有很大的益處。python
1.元組mysql
我的認爲就像java的數組,python中的元組有如下特性:linux
任意對象的有序集合,這條沒啥說的,數組的同性;sql
經過偏移讀取;數據庫
一旦生成,不可改變;數組
固定長度,支持嵌套數據結構
來例子吧,python 代碼app
>>> (0, 'haha', (4j, 'y')) ###元組用圓括號標誌dom
(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();