4 一個腳本講述 python 語言的基礎規範,適合初學者
Python實戰-從菜鳥到大牛的進階之路 作者:極客學院 投票推薦 加入書簽 留言反饋
最近學 python 的人比較多,今天講一下 python 的基礎:python 腳本的規範、縮進、編寫功能函數時注意事項等,這些都是自己編程過程中的心得體會。 <h2>一、python 腳本的規範:</h2>
每個腳本都有自己的規範,以下的規範不是強製的,但是規範一下,可以使你的腳本規範、易懂、方便使用。
#!/usr/bin/env python # -*- coding: utf-8 -*- </pre>
這個寫在開頭,定義腳本編碼。現在多數都是 utf8 格式,所以寫腳本盡量用這個編碼,遇到中文可以做編碼處理,字符串編碼處理主要就是 encode 和 decode
import os,urllib,mysqldb,time,tform </pre>
導入需要的模塊。
main: pass </pre>
定義函數
if __name__ == "__main__": main </pre>
這個就是說腳本從這裏往下執行,如果是其他的腳本調用這個腳本,這個腳本不至於執行其他的部分
提示:以上是整個腳本中的規範,大家在寫腳本的時候盡量這麽做。 <h2>二、python 的縮進</h2>
python 的對縮進要求很嚴格,縮進不對,就會報語法錯誤;python 中縮進就是一個 tab 鍵或是 4 個空格,4 個空格比較麻煩,直接一個 tab 鍵簡單,所以沒有特別的需求,縮進一般用 tab 鍵。縮進類似於分層,同一縮進就是相同的層次。見如下實例:
if a==0: print aelse: print b </pre><h2>三、每一個功能對應一個函數</h2>
這一點我認為最重要,每一個功能就寫一個函數,這樣你的腳本清晰易懂,腳本其他複用這個功能也方便,腳本也不冗餘。不建議不要一個函數裏麵有好多功能,使函數模塊化。 <h2>四、係統命令的引用</h2>
引用係統命令的時候,特別是 linux 命令,一定要寫命令的全路徑,比如:
os.popen("/sbin/ifconfig eth0").read </pre>
這個你直接
os.popen("ifconfig eth0").read </pre>
這樣也是沒有問題的,起碼是你手動執行腳本時,這個是會執行的,但是腳本做 cron 的時候,就不會執行了。所以這個要特別注意。 <h2> 五、異常處理</h2>
try: passexcept exception,e: print e </pre>
其中 e 就是錯誤錯誤信息。try 的異常處理這麽寫就足夠用了,還有其他的方法,不常用。
以下是一個獲取本地 ip 地址,從數據庫查詢 ip 的用途,去連接一個 url,判斷這個 url 是否可以用,並寫日誌。主要講了講 python 操作數據庫的常用用法。
#!/usr/bin/env python # -*- coding: utf-8 -*-import os,urllib,mysqldb,time,tformdef log_w(text): logfile = "/tmp/websocket.log" if os.path.isfile(logfile):if (os.path.getsize(logfile)/1024/1024) > 100: os.remove(logfile) now = time.strftime("%y-%m-%d %h:%m:%s") tt = str(now) + "t" + str(text) + "n" f = open(logfile,\''a+\'') f.write(tt) f.closedef get_iame(ip): try:conn = mysqldb.connect(host = \''192.168.8.43\'',port=3306,user = \''read_app\'',passwd = \''123456\'',charset=\''utf8\'',connect_timeout=20)cursor = conn.cursor#查詢出的結果是元組形式,元組和列表基本一樣#cursor = conn.cursor(cursorss = mysqldb.cursors.dictcursor)#查詢結果是字典形式sql = "select host,user from mysql.user where host=\''%s\''" % ip#python中執行sql語句一次隻能是一個sql語句,一次隻執行一條,如果用分號分開寫多條的話是會報錯的,如果是多條sql語句可以多寫幾個sql和cursor.execute來分開執行cursor.execute(sql)#執行sql語句#cursor.executemany("""insert into dist_sniffer.sniffer_order_day values(%s,%s,%s,%s,%s,%s,%s,%s,%s) """,values)#執行組合插入數據庫的時候可以用這個,每個%s代表一個數據庫字段,values是一個元組或是一個列表alldata = cursor.fetchall#接收sql執行結果,如果是寫操作的,這個就不用了#connmit如果是寫操作,需要這個去提交cursor.closeconn.close#關閉數據庫回話return alldata[0][0].encode(\''utf8\'')#如果是寫操作的話就沒有返回值了。 except exception,e:return 0def get_ip: os = tform.system if os == "linux":ip = os.popen("/sbin/ifconfig eth0|grep \'' addr\''").read.strip.split(":")[1].split[0] elif os == "windows":import wmic=wmi.wmwork = c.win32workadapterconfiguration (ipenabled=1)for interface inwork: if interface.defaultipgateway:ip = interface.ipaddress[0]return ip#print interface.ipaddress[0],interface.macaddress,interface.ipsu[0],interface.defaultipgateway[0],interface.dnsserversearchorder[0],interface.dnsserversearchorder[1]#獲取出網的ip地址、mac地址、子網掩碼、默認網關、dnsdef web_status: ip = get_ip idc_name = get_iame(ip) url = "http://.text/index.php?idc_ip=%s&idc_name=%s" % (ip,idc_name) get = urllib.urlopen(url) if get.getcode == 200:aa = int(get.read.strip)if aa == 1: text = "webservice return ok"else: text = "webservice return error" else:text = "conect webservice error" print text log_w(text)if __name__ == "__main__": web_status </pre>
一開始就要養成一個好習慣,這樣對以後 python 編程是十分有益的。自己的深切體會。
每個腳本都有自己的規範,以下的規範不是強製的,但是規範一下,可以使你的腳本規範、易懂、方便使用。
#!/usr/bin/env python # -*- coding: utf-8 -*- </pre>
這個寫在開頭,定義腳本編碼。現在多數都是 utf8 格式,所以寫腳本盡量用這個編碼,遇到中文可以做編碼處理,字符串編碼處理主要就是 encode 和 decode
import os,urllib,mysqldb,time,tform </pre>
導入需要的模塊。
main: pass </pre>
定義函數
if __name__ == "__main__": main </pre>
這個就是說腳本從這裏往下執行,如果是其他的腳本調用這個腳本,這個腳本不至於執行其他的部分
提示:以上是整個腳本中的規範,大家在寫腳本的時候盡量這麽做。 <h2>二、python 的縮進</h2>
python 的對縮進要求很嚴格,縮進不對,就會報語法錯誤;python 中縮進就是一個 tab 鍵或是 4 個空格,4 個空格比較麻煩,直接一個 tab 鍵簡單,所以沒有特別的需求,縮進一般用 tab 鍵。縮進類似於分層,同一縮進就是相同的層次。見如下實例:
if a==0: print aelse: print b </pre><h2>三、每一個功能對應一個函數</h2>
這一點我認為最重要,每一個功能就寫一個函數,這樣你的腳本清晰易懂,腳本其他複用這個功能也方便,腳本也不冗餘。不建議不要一個函數裏麵有好多功能,使函數模塊化。 <h2>四、係統命令的引用</h2>
引用係統命令的時候,特別是 linux 命令,一定要寫命令的全路徑,比如:
os.popen("/sbin/ifconfig eth0").read </pre>
這個你直接
os.popen("ifconfig eth0").read </pre>
這樣也是沒有問題的,起碼是你手動執行腳本時,這個是會執行的,但是腳本做 cron 的時候,就不會執行了。所以這個要特別注意。 <h2> 五、異常處理</h2>
try: passexcept exception,e: print e </pre>
其中 e 就是錯誤錯誤信息。try 的異常處理這麽寫就足夠用了,還有其他的方法,不常用。
以下是一個獲取本地 ip 地址,從數據庫查詢 ip 的用途,去連接一個 url,判斷這個 url 是否可以用,並寫日誌。主要講了講 python 操作數據庫的常用用法。
#!/usr/bin/env python # -*- coding: utf-8 -*-import os,urllib,mysqldb,time,tformdef log_w(text): logfile = "/tmp/websocket.log" if os.path.isfile(logfile):if (os.path.getsize(logfile)/1024/1024) > 100: os.remove(logfile) now = time.strftime("%y-%m-%d %h:%m:%s") tt = str(now) + "t" + str(text) + "n" f = open(logfile,\''a+\'') f.write(tt) f.closedef get_iame(ip): try:conn = mysqldb.connect(host = \''192.168.8.43\'',port=3306,user = \''read_app\'',passwd = \''123456\'',charset=\''utf8\'',connect_timeout=20)cursor = conn.cursor#查詢出的結果是元組形式,元組和列表基本一樣#cursor = conn.cursor(cursorss = mysqldb.cursors.dictcursor)#查詢結果是字典形式sql = "select host,user from mysql.user where host=\''%s\''" % ip#python中執行sql語句一次隻能是一個sql語句,一次隻執行一條,如果用分號分開寫多條的話是會報錯的,如果是多條sql語句可以多寫幾個sql和cursor.execute來分開執行cursor.execute(sql)#執行sql語句#cursor.executemany("""insert into dist_sniffer.sniffer_order_day values(%s,%s,%s,%s,%s,%s,%s,%s,%s) """,values)#執行組合插入數據庫的時候可以用這個,每個%s代表一個數據庫字段,values是一個元組或是一個列表alldata = cursor.fetchall#接收sql執行結果,如果是寫操作的,這個就不用了#connmit如果是寫操作,需要這個去提交cursor.closeconn.close#關閉數據庫回話return alldata[0][0].encode(\''utf8\'')#如果是寫操作的話就沒有返回值了。 except exception,e:return 0def get_ip: os = tform.system if os == "linux":ip = os.popen("/sbin/ifconfig eth0|grep \'' addr\''").read.strip.split(":")[1].split[0] elif os == "windows":import wmic=wmi.wmwork = c.win32workadapterconfiguration (ipenabled=1)for interface inwork: if interface.defaultipgateway:ip = interface.ipaddress[0]return ip#print interface.ipaddress[0],interface.macaddress,interface.ipsu[0],interface.defaultipgateway[0],interface.dnsserversearchorder[0],interface.dnsserversearchorder[1]#獲取出網的ip地址、mac地址、子網掩碼、默認網關、dnsdef web_status: ip = get_ip idc_name = get_iame(ip) url = "http://.text/index.php?idc_ip=%s&idc_name=%s" % (ip,idc_name) get = urllib.urlopen(url) if get.getcode == 200:aa = int(get.read.strip)if aa == 1: text = "webservice return ok"else: text = "webservice return error" else:text = "conect webservice error" print text log_w(text)if __name__ == "__main__": web_status </pre>
一開始就要養成一個好習慣,這樣對以後 python 編程是十分有益的。自己的深切體會。