鍍金池/ 教程/ Python/ 一個(gè)腳本講述 python 語(yǔ)言的基礎(chǔ)規(guī)范,適合初學(xué)者
通過(guò) memcached 實(shí)現(xiàn)領(lǐng)號(hào)排隊(duì)功能及 python 隊(duì)列實(shí)例
利用 pypy 提高 python 腳本的執(zhí)行速度及測(cè)試性能
Python FAQ3-python 中 的原始(raw)字符串
Mongodb 千萬(wàn)級(jí)數(shù)據(jù)在 python 下的綜合壓力測(cè)試及應(yīng)用探討
Parallel Python 實(shí)現(xiàn)程序的并行多 cpu 多核利用【pp 模塊】
python simplejson 模塊淺談
服務(wù)端 socket 開(kāi)發(fā)之多線程和 gevent 框架并發(fā)測(cè)試[python 語(yǔ)言]
python Howto 之 logging 模塊
python 之 MySQLdb 庫(kù)的使用
關(guān)于 python 調(diào)用 zabbix api 接口的自動(dòng)化實(shí)例 [結(jié)合 saltstack]
python 之利用 PIL 庫(kù)實(shí)現(xiàn)頁(yè)面的圖片驗(yàn)證碼及縮略圖
Python 通過(guò) amqp 消息隊(duì)列協(xié)議中的 Qpid 實(shí)現(xiàn)數(shù)據(jù)通信
python 中用 string.maketrans 和 translate 巧妙替換字符串
python linecache 模塊讀取文件用法詳解
Python 批量更新 nginx 配置文件
python 計(jì)算文件的行數(shù)和讀取某一行內(nèi)容的實(shí)現(xiàn)方法
python+Django 實(shí)現(xiàn) Nagios 自動(dòng)化添加監(jiān)控項(xiàng)目
多套方案來(lái)提高 python web 框架的并發(fā)處理能力
python 寫(xiě)報(bào)警程序中的聲音實(shí)現(xiàn) winsound
python 調(diào)用 zabbix 的 api 接口添加主機(jī)、查詢組、主機(jī)、模板
對(duì) Python-memcache 分布式散列和調(diào)用的實(shí)現(xiàn)
使用 python 構(gòu)建基于 hadoop 的 mapreduce 日志分析平臺(tái)
一個(gè)腳本講述 python 語(yǔ)言的基礎(chǔ)規(guī)范,適合初學(xué)者
Python 編寫(xiě)的 socket 服務(wù)器和客戶端
如何將 Mac OS X10.9 下的 Python2.7 升級(jí)到最新的 Python3.3
python 監(jiān)控文件或目錄變化
報(bào)警監(jiān)控平臺(tái)擴(kuò)展功能 url 回調(diào)的設(shè)計(jì)及應(yīng)用 [python 語(yǔ)言]
Python 處理 cassandra 升級(jí)后的回滾腳本
python 實(shí)現(xiàn) select 和 epoll 模型 socket 網(wǎng)絡(luò)編程
關(guān)于 B+tree (附 python 模擬代碼)
通過(guò) python 和 websocket 構(gòu)建實(shí)時(shí)通信系統(tǒng)[擴(kuò)展 saltstack 監(jiān)控]

一個(gè)腳本講述 python 語(yǔ)言的基礎(chǔ)規(guī)范,適合初學(xué)者

最近學(xué) python 的人比較多,今天講一下 python 的基礎(chǔ):python 腳本的規(guī)范、縮進(jìn)、編寫(xiě)功能函數(shù)時(shí)注意事項(xiàng)等,這些都是自己編程過(guò)程中的心得體會(huì)。

一、python 腳本的規(guī)范:

每個(gè)腳本都有自己的規(guī)范,以下的規(guī)范不是強(qiáng)制的,但是規(guī)范一下,可以使你的腳本規(guī)范、易懂、方便使用。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

這個(gè)寫(xiě)在開(kāi)頭,定義腳本編碼?,F(xiàn)在多數(shù)都是 UTF8 格式,所以寫(xiě)腳本盡量用這個(gè)編碼,遇到中文可以做編碼處理,字符串編碼處理主要就是 encode 和 decode

import os,urllib,MySQLdb,time,platform 

導(dǎo)入需要的模塊。

main():  
   pass

定義函數(shù)

if __name__ == "__main__":
   main()

這個(gè)就是說(shuō)腳本從這里往下執(zhí)行,如果是其他的腳本調(diào)用這個(gè)腳本,這個(gè)腳本不至于執(zhí)行其他的部分

提示:以上是整個(gè)腳本中的規(guī)范,大家在寫(xiě)腳本的時(shí)候盡量這么做。

二、python 的縮進(jìn)

python 的對(duì)縮進(jìn)要求很嚴(yán)格,縮進(jìn)不對(duì),就會(huì)報(bào)語(yǔ)法錯(cuò)誤;python 中縮進(jìn)就是一個(gè) tab 鍵或是 4 個(gè)空格,4 個(gè)空格比較麻煩,直接一個(gè) tab 鍵簡(jiǎn)單,所以沒(méi)有特別的需求,縮進(jìn)一般用 tab 鍵??s進(jìn)類似于分層,同一縮進(jìn)就是相同的層次。見(jiàn)如下實(shí)例:

if a==0:
   print a
else:
   print b

三、每一個(gè)功能對(duì)應(yīng)一個(gè)函數(shù)

這一點(diǎn)我認(rèn)為最重要,每一個(gè)功能就寫(xiě)一個(gè)函數(shù),這樣你的腳本清晰易懂,腳本其他復(fù)用這個(gè)功能也方便,腳本也不冗余。不建議不要一個(gè)函數(shù)里面有好多功能,使函數(shù)模塊化。

四、系統(tǒng)命令的引用

引用系統(tǒng)命令的時(shí)候,特別是 linux 命令,一定要寫(xiě)命令的全路徑,比如:

os.popen("/sbin/ifconfig eth0").read()

這個(gè)你直接

os.popen("ifconfig eth0").read()

這樣也是沒(méi)有問(wèn)題的,起碼是你手動(dòng)執(zhí)行腳本時(shí),這個(gè)是會(huì)執(zhí)行的,但是腳本做 cron 的時(shí)候,就不會(huì)執(zhí)行了。所以這個(gè)要特別注意。

 五、異常處理

try:
   pass
except Exception,e:
  print e

其中 e 就是錯(cuò)誤錯(cuò)誤信息。try 的異常處理這么寫(xiě)就足夠用了,還有其他的方法,不常用。

以下是一個(gè)獲取本地 ip 地址,從數(shù)據(jù)庫(kù)查詢 ip 的用途,去連接一個(gè) URL,判斷這個(gè) URL 是否可以用,并寫(xiě)日志。主要講了講 python 操作數(shù)據(jù)庫(kù)的常用用法。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os,urllib,MySQLdb,time,platform
def 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.close()
def get_idcname(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()#查詢出的結(jié)果是元組形式,元組和列表基本一樣
        #cursor = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)#查詢結(jié)果是字典形式
        sql = "select host,user from mysql.user where host='%s'" % ip#python中執(zhí)行sql語(yǔ)句一次只能是一個(gè)sql語(yǔ)句,一次只執(zhí)行一條,如果用分號(hào)分開(kāi)寫(xiě)多條的話是會(huì)報(bào)錯(cuò)的,如果是多條sql語(yǔ)句可以多寫(xiě)幾個(gè)sql和cursor.execute()來(lái)分開(kāi)執(zhí)行
        cursor.execute(sql)#執(zhí)行sql語(yǔ)句
        #cursor.executemany("""insert into dist_sniffer.sniffer_order_day values(%s,%s,%s,%s,%s,%s,%s,%s,%s) """,values)#執(zhí)行組合插入數(shù)據(jù)庫(kù)的時(shí)候可以用這個(gè),每個(gè)%s代表一個(gè)數(shù)據(jù)庫(kù)字段,values是一個(gè)元組或是一個(gè)列表
        alldata = cursor.fetchall()#接收sql執(zhí)行結(jié)果,如果是寫(xiě)操作的,這個(gè)就不用了
        #conn.commit()如果是寫(xiě)操作,需要這個(gè)去提交
        cursor.close()
        conn.close()#關(guān)閉數(shù)據(jù)庫(kù)回話
        return alldata[0][0].encode('UTF8')#如果是寫(xiě)操作的話就沒(méi)有返回值了。
    except Exception,e:
        return 0
def get_ip():
    os = platform.system()
    if os == "Linux":
        ip = os.popen("/sbin/ifconfig eth0|grep 'inet addr'").read().strip().split(":")[1].split()[0]
    elif os == "Windows":
        import wmi
        c=wmi.WMI()
        network = c.Win32_NetworkAdapterConfiguration (IPEnabled=1)
        for interface in network:
            if interface.DefaultIPGateway:
                ip = interface.IPAddress[0]
                return ip
                #print interface.IPAddress[0],interface.MACAddress,interface.IPSubnet[0],interface.DefaultIPGateway[0],interface.DNSServerSearchOrder[0],interface.DNSServerSearchOrder[1]
                #獲取出網(wǎng)的ip地址、MAC地址、子網(wǎng)掩碼、默認(rèn)網(wǎng)關(guān)、DNS
def web_status():
    ip = get_ip()
    idc_name = get_idcname(ip)
    url = "http://www.text.com/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()

一開(kāi)始就要養(yǎng)成一個(gè)好習(xí)慣,這樣對(duì)以后 python 編程是十分有益的。自己的深切體會(huì)。