python學習日誌

python中if __name__ == '__main__': 的解析

當你打開一個.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文件數據庫

 

 

 


Python 得到命令行參數的方法

須要模塊:sys
參數個數:len(sys.argv)
腳本名:    sys.argv[0]
參數1:     sys.argv[1]
參數2:     sys.argv[2]
json

 

 


Python xrange與range的區別windows

range 前面小節已經說明了,range([start,] stop[, step]),根據start與stop指定的範圍以及step設定的步長,生成一個序列。api

好比:函數

1 >>> range(5)
2 [01234]
3 >>> range(1,5)
4 [1234]
5 >>> range(0,6,2)
6 [024]

xrange 用法與 range 徹底相同,所不一樣的是生成的不是一個list對象,而是一個生成器。

01 >>> xrange(5)
02 xrange(5)
03 >>> list(xrange(5))
04 [01234]
05 >>> xrange(1,5)
06 xrange(15)
07 >>> list(xrange(1,5))
08 [1234]
09 >>> xrange(0,6,2)
10 xrange(062)
11 >>> list(xrange(0,6,2))
12 [024]

由上面的示例能夠知道:要生成很大的數字序列的時候,用xrange會比range性能優不少,由於不須要一上來就開闢一塊很大的內存空間。

xrange 和 range 這兩個基本上都是在循環的時候用。

1 for in range(0100):
2     print i
3  
4 for in xrange(0100):
5     print i

這兩個輸出的結果都是同樣的,實際上有不少不一樣,range會直接生成一個list對象:

1 = range(0,100)
2 print type(a)
3 print a
4 print a[0], a[1]

輸出結果:

1 <type 'list'>
2 [01234567891011121314151617181920,212223242526272829303132333435363738,394041424344454647484950515253545556,575859606162636465666768697071727374,757677787980818283848586878889909192,93949596979899]
3 0 1

而xrange則不會直接生成一個list,而是每次調用返回其中的一個值:

1 = 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

 


python 基於mmap模塊的jsonmmap實現本地多進程內存共享

1.概述

  • 共享內存能夠說是最有用的進程間通訊方式.兩個不用的進程共享內存的意思是:同一塊物理內存被映射到兩個進程的各自的進程地址空間.一個進程能夠及時看到另外一個進程對共享內存的更新,反之亦然.採用共享內存通訊的一個顯而易見的好處效率高,由於進程能夠直接讀寫內存,而不須要任何數據的複製.對於向管道和消息隊列等通訊等方式,則須要在內核和用戶空間進行四次的數據複製,而共享內存則只須要兩次數據複製:一次從輸入文件到共享內存區,另外一個從共享內存區到輸出文件.實際上,進程之間在共享內存時,並不老是讀寫少許數據後就解除映射,有新的通訊時,再從新創建共享內存區域.而是保持共享區域,知道通訊完畢爲止,這樣,數據內容就一直保存在共享內存中,並無寫回文件.共享內存中的內容每每是在解除映射時才寫回文件的.所以,採用共享內存的通訊方式效率很是高.

  • mmap系統調用是的是的進程間經過映射同一個普通文件實現共享內存.普通文件被映射到進程地址空間後,進程能夠向像訪問普通內存同樣對文件進行訪問,沒必要再調用read,write等操做.與mmap系統調用配合使用的系統調用還有munmap,msync等. 實際上,mmap系統調用並非徹底爲了用於共享內存而設計的.它自己提供了不一樣於通常對普通文件的訪問方式,是進程能夠像讀寫內存同樣對普通文件操做.而Posix或System V的共享內存則是純粹用於共享內存的,固然mmap實現共享內存也是主要應用之一.

2. python mmap模塊詳解

  • 在python中,mmap.mmap()的函數實如今windows和linux上是不同的,但實現api接口函數很類似,下面以mmap的windows實現爲例說明:

  • mmap.mmap(fileno, length[, tagname[, access[, offset]]])

    • fileno:the file handle fileno, 文件描述符
    • length:共享內存的大小
    • tagname: 共享內存區域的名字,能夠理解爲id
    • access:
      • ACCESS_READ: 只能讀,若是執行寫操做,raises a TypeError exception
      • ACCESS_WRITE: 可讀可寫
      • ACCESS_COPY: 可讀可寫,但不更新到文件中去
  • 函數列表

    • mmap.close() 斷開映射關係
    • mmap.find(string[, start[, end]]):返回第一個string的索引,不然返回-1
    • mmap.move(dest, src, count): 移動count大小的內容從src到dest
    • mmap.read(num): 根據文件指針的位置兌取num個字節的內容,更新文件指針的位置
    • mmap.read_byte():讀取當前字符,更新文件指針位置
    • mmap.readline():Returns a single line, starting at the current file position and up to the next newline.從當前位置到下一行位置的全部內容
    • mmap.resize(newsize):Resizes the map and the underlying file,改變映射內存與文件大小
    • mmap.rfind(string[, start[, end]]): 返回最後一個string的索引
    • mmap.seek(pos[, whence]): 設置文件指針的位置
    • mmap.size(): 返回共享內存的大小
    • mmap.tell():返回當前指針的位置
    • mmap.write(string):從當前指針位置開始寫入string
    • mmap.write_byte(byte): Write the single-character string byte into memory at the current position of the file pointer; the file position is advanced by 1.

 

 


Python操做mysql數據庫:MySQLdb模塊


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')

相關文章
相關標籤/搜索