當你打開一個.py文件時,常常會在代碼的最下面看到if __name__ == '__main__':,如今就來介 紹一下它的做用.html
模塊是對象,而且全部的模塊都有一個內置屬性 __name__。一個模塊的 __name__ 的值取決於您如何應用模塊。若是 import 一個模塊,那麼模塊__name__ 的值一般爲模塊文件名,不帶路徑或者文件擴展名。可是您也能夠像一個標準的程序樣直接運行模塊,在這 種狀況下, __name__ 的值將是一個特別缺省"__main__"。python
///////////////////////////////////////////////////////////////////////////////////////////////////mysql
在cmd 中直接運行.py文件,則__name__的值是'__main__';linux
而在import 一個.py文件後,__name__的值就不是'__main__'了;sql
從而用if __name__ == '__main__'來判斷是不是在直接運行該.py文件數據庫
須要模塊:sys
參數個數:len(sys.argv)
腳本名: sys.argv[0]
json
參數1: sys.argv[1]
參數2: sys.argv[2]
Python xrange與range的區別windows
range 前面小節已經說明了,range([start,] stop[, step]),根據start與stop指定的範圍以及step設定的步長,生成一個序列。api
好比:函數
1 |
>>> range ( 5 ) |
2 |
[ 0 , 1 , 2 , 3 , 4 ] |
3 |
>>> range ( 1 , 5 ) |
4 |
[ 1 , 2 , 3 , 4 ] |
5 |
>>> range ( 0 , 6 , 2 ) |
6 |
[ 0 , 2 , 4 ] |
xrange 用法與 range 徹底相同,所不一樣的是生成的不是一個list對象,而是一個生成器。
01 |
>>> xrange ( 5 ) |
02 |
xrange ( 5 ) |
03 |
>>> list ( xrange ( 5 )) |
04 |
[ 0 , 1 , 2 , 3 , 4 ] |
05 |
>>> xrange ( 1 , 5 ) |
06 |
xrange ( 1 , 5 ) |
07 |
>>> list ( xrange ( 1 , 5 )) |
08 |
[ 1 , 2 , 3 , 4 ] |
09 |
>>> xrange ( 0 , 6 , 2 ) |
10 |
xrange ( 0 , 6 , 2 ) |
11 |
>>> list ( xrange ( 0 , 6 , 2 )) |
12 |
[ 0 , 2 , 4 ] |
由上面的示例能夠知道:要生成很大的數字序列的時候,用xrange會比range性能優不少,由於不須要一上來就開闢一塊很大的內存空間。
xrange 和 range 這兩個基本上都是在循環的時候用。
1 |
for i in range ( 0 , 100 ): |
2 |
print i |
3 |
4 |
for i in xrange ( 0 , 100 ): |
5 |
print i |
這兩個輸出的結果都是同樣的,實際上有不少不一樣,range會直接生成一個list對象:
1 |
a = range ( 0 , 100 ) |
2 |
print type (a) |
3 |
print a |
4 |
print a[ 0 ], a[ 1 ] |
輸出結果:
1 |
< type 'list' > |
2 |
[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 , 64 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , 96 , 97 , 98 , 99 ] |
3 |
0 1 |
而xrange則不會直接生成一個list,而是每次調用返回其中的一個值:
1 |
a = xrange ( 0 , 100 ) |
2 |
print type (a) |
3 |
print a |
4 |
print a[ 0 ], a[ 1 ] |
輸出結果:
1 |
< type 'xrange' > |
2 |
xrange ( 100 ) |
3 |
0 1 |
共享內存能夠說是最有用的進程間通訊方式.兩個不用的進程共享內存的意思是:同一塊物理內存被映射到兩個進程的各自的進程地址空間.一個進程能夠及時看到另外一個進程對共享內存的更新,反之亦然.採用共享內存通訊的一個顯而易見的好處效率高,由於進程能夠直接讀寫內存,而不須要任何數據的複製.對於向管道和消息隊列等通訊等方式,則須要在內核和用戶空間進行四次的數據複製,而共享內存則只須要兩次數據複製:一次從輸入文件到共享內存區,另外一個從共享內存區到輸出文件.實際上,進程之間在共享內存時,並不老是讀寫少許數據後就解除映射,有新的通訊時,再從新創建共享內存區域.而是保持共享區域,知道通訊完畢爲止,這樣,數據內容就一直保存在共享內存中,並無寫回文件.共享內存中的內容每每是在解除映射時才寫回文件的.所以,採用共享內存的通訊方式效率很是高.
mmap系統調用是的是的進程間經過映射同一個普通文件實現共享內存.普通文件被映射到進程地址空間後,進程能夠向像訪問普通內存同樣對文件進行訪問,沒必要再調用read,write等操做.與mmap系統調用配合使用的系統調用還有munmap,msync等. 實際上,mmap系統調用並非徹底爲了用於共享內存而設計的.它自己提供了不一樣於通常對普通文件的訪問方式,是進程能夠像讀寫內存同樣對普通文件操做.而Posix或System V的共享內存則是純粹用於共享內存的,固然mmap實現共享內存也是主要應用之一.
在python中,mmap.mmap()的函數實如今windows和linux上是不同的,但實現api接口函數很類似,下面以mmap的windows實現爲例說明:
mmap.mmap(fileno, length[, tagname[, access[, offset]]])
函數列表
Python中的mysql操做可使用MySQLdb模塊來完成。它符合Python社區設計的Python Database API SpecificationV2.0標準,因此與其餘的數據庫操做的API,如SQLite等基本相似。
1.鏈接的創建與釋放
創建鏈接時可用connect函數,它返回一個Connection類型對象
conn = MySQLdb.connect('localhost', 'root', '123456', 'test')
connect方法經常使用的參數有
host:數據庫主機名.默認是用本地主機.
user:數據庫登錄名.默認是當前用戶.
passwd:數據庫登錄的祕密.默認爲空.
db:要使用的數據庫名.沒有默認值.
port:MySQL服務使用的TCP端口.默認是3306.
charset:數據庫編碼。
若是在數據編碼設置正確時,向數據庫插入數據出現亂碼時,能夠設置鏈接的字符集參數charset。
釋放鏈接時能夠應用Connection類型對象的close方法。
conn.close()
2.Cursor對象
執行SQL語句前要得到一個指定鏈接的Cursor對象,由Cursor對象執行SQL查詢並獲取結果。
得到Cursor對象的方法
cur = conn.cursor()
在默認狀況下cursor方法返回的是BaseCursor類型對象,BaseCursor類型對象在執行查詢後每條記錄的結果以列表(list)表示。若是要返回字典(dict)表示的記錄,就要設置cursorclass參數爲MySQLdb.cursors.DictCursor類。
cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
這個參數也可在調用connect方法創建鏈接時設置
conn = MySQLdb.connect(host = 'localhost', user = 'root', passwd = '123456', db = 'test' cursorclass = MySQLdb.cursors.DictCursor)
執行結束後能夠關閉cursor對象
cur.close()
3.查詢,插入,更新、刪除操做。
Cursor類型提供了execute方法用於執行SQL操做
execute(query [,parameters])
query是一個SQL字符串,parameters是一個序列或映射,返回值是所影響的記錄數
查詢
cur.execute("select * from t1 where name = %s and age = %s", ('June', 27))
cur.execute("select * from t1 where name = %(name)s and age = %(age)s", {'name':'June', 'age':27})
這裏和字符串的格式化操做相似,但無論參數是什麼類型,都要用'%s'
獲取結果
獲取結果集有三種方法,fetchone、fetchall和fetchmany,返回結果是一個tuple對象,tuple中的每個元素對應查詢結果中的一條記錄。
fetchone()返回結果集中的下一條記錄
fetchall()返回結果集中的剩餘記錄
fetchmany([size])返回結果集中size條記錄
插入、更新、刪除
cur.execute("insert t1(name, age) values(%s, %s)", ('Jack', 32))
更新和刪除的操做與更新、刪除相似
除了execute,Cursor類還提供了executemany()方法
executemany(query [, parametersequence])
querey是一個查詢字符串,parametersequence是一個參數序列。這一序列的每一項都是一個序列或映射對象。但executemany只適合插入、更新或刪除操做,而不適用於查詢操做。
cur.execute("insert t1(name, age) values(%s, %s)", (('Jack', 32), ('Junior', 24)))
mysql如今通常會默認InnoDB做爲默認引擎,InnoDB引擎執行插入、更新、刪除操做後要進行提交,纔會更新數據庫。
cur.commit()
4.其餘操做
Connection類:
rollback() 回滾
Cursor類:
callproc(procname, args):用來執行存儲過程,接收的參數爲存儲過程名和參數列表,返回值爲受影響的行數。
nextset():移動到下一個結果集
執行查詢操做或存儲過程時可能返回多個結果集,例如:
cur.execute('select * from t1; select * from t2')