python碰到的一些小細(xì)節(jié)

寫python碰到的一些小細(xì)節(jié)沉衣,總結(jié)一下:

1.pip install太慢

pip install xlrd -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
其中xlrd為需要下載的包

2.代碼過長,一行寫不下

self.indexcol=['項(xiàng)目', '文件夾名', '報(bào)表job', '圖表名稱', '圖表內(nèi)指標(biāo)數(shù)量', '圖表類型', '描述', \
            '指標(biāo)名稱', '指標(biāo)名稱是否使用正則表達(dá)式', '函數(shù)名稱', '函數(shù)區(qū)分選項(xiàng)', '時(shí)間間隔', 'label1是否使用正則表達(dá)式', \
                'label1', 'label2是否使用正則表達(dá)式', 'label2', 'label3是否使用正則表達(dá)式', 'label3', \
                    'instance是否使用正則表達(dá)式', 'instance' ,'hostname是否使用正則表達(dá)式', 'hostname','手工輸入表達(dá)式']

使用\換行

3. 關(guān)于python形參和實(shí)參蹲姐,淺拷貝和深拷貝

因?yàn)樵谕瑫r(shí)用C++和python,習(xí)慣了C++的使用方式方灾,python的函數(shù)調(diào)用可把我害慘了滤祖,不過也沒有調(diào)太久就發(fā)現(xiàn)了這個bug,還是比較有意思棍潘,寫出來看看恃鞋,順便查查官方的東西看看自己的理解對不對啊。
先說說我自己的理解:
我的使用場景是這樣的:
我需要將一個模板復(fù)制出來亦歉,然后每一次的循環(huán)就只對這個模板的copy修改特定的內(nèi)容恤浪,其余的內(nèi)容不變。然后把修改后的東西放入一個list中肴楷。

第一個需要注意的地方是水由,python的賦值操作 = 有點(diǎn)類似于,C++中的引用赛蔫。

就是對同一塊內(nèi)存重命名砂客,若直接

 panel_new=kee   
panel["a"]=x

那么對panel修改后泥张,kee對應(yīng)的a下內(nèi)容也會更改。
但實(shí)際上我們想要的結(jié)果是鞭盟,以kee為模板拷貝出一份panel_new圾结,修改對應(yīng)內(nèi)容,對kee不造成改變齿诉,這時(shí)我們就需要使用:

import copy
panel_new=copy.deepcopy(kee)

這才是類似C里面的賦值(即 int a =b;a 和 b對應(yīng)不同的內(nèi)存空間)

第二個需要注意的地方是筝野,Python形參就是實(shí)參,和C++完全不一樣粤剧!

因?yàn)橄葘W(xué)的C歇竟,python全是自學(xué)的,不會才查抵恋,寫代碼的時(shí)候完全沒有意識到這個問題

PANEL=self.jsonbase["panels"]
        label=0
        for kee in PANEL:
            if "targets" not in kee:
                continue
            if "content" not in kee:
                panel_new=copy.deepcopy(kee)
                label+=1
                if label==num:
                    break

由于我在調(diào)試時(shí)焕议,覺得把這一段放到了這個函數(shù)里面每一次都copy一次好麻煩鴨,不如把拷貝后的結(jié)果作為參數(shù)傳入弧关,然后每次修改就是了盅安。這樣,在C里面是完全正確的世囊,因?yàn)镃每次函數(shù)的形參都是會重新分配空間别瞭,然后再把實(shí)參賦給形參,但是python顯然不是這樣株憾,你對函數(shù)內(nèi)的形參做了改變蝙寨,實(shí)參也會跟著變化!
所以實(shí)際上這里我就把全部圖改成了一張圖嗤瞎。墙歪。。贝奇。虹菲。
所以還是得自己手動copy一下然后插入。

def add_a_panel(self,target_dict,num):
        PANEL=self.jsonbase["panels"]
        label=0
        for kee in PANEL:
            if "targets" not in kee:
                continue
            if "content" not in kee:
                panel_new=copy.deepcopy(kee)
                label+=1
                if label==num:
                    break
        if "alert" in panel_new:
            panel_new.pop("alert")
        target_num=target_dict["num"]
        target_copy=copy.deepcopy(panel_new["targets"][0])
        panel_new["targets"]=[]
        for n in range(0,int(target_num)):
            target_new=copy.deepcopy(target_copy)
            target_new["expr"]=target_dict["expr"][n]
            target_new["refId"]=chr(ord('A')+n)
            #legendFormat沒有實(shí)現(xiàn)
            target_new["legendFormat"]=target_dict["legendFormat"][n]
            panel_new["targets"].append(target_new)
        panel_new["id"]=11+num*2
        panel_new["title"]=target_dict["title"]
        panel_new["description"]=target_dict["description"]
        panel_new["type"]=target_dict["type"]
        self.dict["panels"].append(panel_new)
        return

第三個有意思的技巧是弃秆,默認(rèn)參數(shù)

有的時(shí)候我們的類初始化時(shí)需要傳入有這個屬性届惋,有的時(shí)候可以沒有,那么我們可以使用默認(rèn)參數(shù)菠赚。

    def __init__(self,targetnum,title,discription,stype=0):
        self.dict={}
        self.dict["type"] = stype
        self.dict["num"] = int(targetnum)
        self.dict["title"] = title
        self.dict["description"] = discription

例如這個stype就是默認(rèn)參數(shù)為0,如果你在調(diào)用的時(shí)候沒有填type脑豹,那么就默認(rèn)為0 ,填了就是你填入的數(shù)
需要注意的是:默認(rèn)參數(shù)需要寫在最后衡查,不然編譯器怎么知道你有沒有使用默認(rèn)參數(shù)呢瘩欺?

4.正則表達(dá)式

哇這個可以說的東西可太多了,是一個完整的知識點(diǎn),實(shí)際上我自己也沒有完完全全的學(xué)完了所有的表達(dá)(只是這里會用了俱饿,嘿嘿)
列下提綱吧歌粥,反正我會了,這篇文章只是幫助我回憶起知識點(diǎn)的拍埠。

1.字符匹配表

只列舉我認(rèn)為比較常見的

字符 描述
^ 匹配輸入字符串的開始位置失驶。
$ 匹配輸入字符串的結(jié)束位置。 \d$表示必定以數(shù)字結(jié)尾
\d 匹配一個數(shù)字
\w 匹配一個字符
. 匹配除“\n”之外的任意一個字符
* 匹配0個或多個*前面的字符(經(jīng)常這么用: .* )
+ 匹配1個或多個前面的字符(經(jīng)常這么用: .+ )
? 匹配前面的子表達(dá)式零次或一次枣购。例如嬉探,“do(es)?”可以匹配“does”或“does”中的“do”。?等價(jià)于{0,1}棉圈。
{n} n是一個非負(fù)整數(shù)涩堤。匹配確定的n次。例如分瘾,“o{2}”不能匹配“Bob”中的“o”胎围,但是能匹配“food”中的兩個o。
{n,} n是一個非負(fù)整數(shù)德召。至少匹配n次白魂。例如,“o{2,}”不能匹配“Bob”中的“o”上岗,但能匹配“foooood”中的所有o碧聪。“o{1,}”等價(jià)于“o+”液茎。“o{0,}”則等價(jià)于“o*”辞嗡。
{n,m} m和n均為非負(fù)整數(shù)捆等,其中n<=m。最少匹配n次且最多匹配m次续室。例如栋烤,“o{1,3}”將匹配“fooooood”中的前三個o⊥φ“o{0,1}”等價(jià)于“o?”明郭。請注意在逗號和兩個數(shù)之間不能有空格。

2.python正則表達(dá)式函數(shù)

re.search(匹配內(nèi)容丰泊,表達(dá)式)
self.medium.group() 顯示第一個匹配到的內(nèi)容

def pre_decon(self):
        #{}解構(gòu)預(yù)處理薯定,先將[]去掉
        #將[]的內(nèi)容存在self.medium內(nèi)
        self.medium=re.search('\[.+\]',self.expr)
        if self.medium == None:
            return
        else:
            self.medium=self.medium.group()
            start_loc = self.expr.find(self.medium)
            len_substr = len(self.medium)
            self.expr = self.expr[:start_loc] + self.expr[start_loc + len_substr:]
            start = self.medium.find('[')
            end = self.medium.find(']')
            self.medium = self.medium[start+1:end]
            print(self.medium)

零寬斷言匹配:匹配內(nèi)容不反悔斷言本身

向前斷言:(?=patter)
向后斷言:(?<=patter)
re.compile(pattern)
find=re.findall(p,self.expr)在expr中找到所有匹配上patter編譯后的內(nèi)容的字符串,輸出為列表

import re

def pre_decon(self):
        #函數(shù)解構(gòu)預(yù)處理瞳购,先將by()去掉
        #hardcode 匹配by的內(nèi)容只能在3-9之間
        pattern='(?<=by\\().+?(?=\\))'
        p=re.compile(pattern)
        find=re.findall(p,self.expr)
        if len(find)==0:
            self.by ==None
            return
        else:
            self.by=find[0]
            start_loc = self.expr.find(self.by)
            len_substr = len(self.by)
            self.expr = self.expr[:start_loc-3] + self.expr[start_loc + len_substr+1:]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末话侄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌年堆,老刑警劉巖吞杭,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異变丧,居然都是意外死亡芽狗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門痒蓬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來童擎,“玉大人,你說我怎么就攤上這事谊却∪嶂纾” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵炎辨,是天一觀的道長捕透。 經(jīng)常有香客問我,道長碴萧,這世上最難降的妖魔是什么乙嘀? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮破喻,結(jié)果婚禮上虎谢,老公的妹妹穿的比我還像新娘。我一直安慰自己曹质,他們只是感情好婴噩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著羽德,像睡著了一般几莽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宅静,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天章蚣,我揣著相機(jī)與錄音,去河邊找鬼姨夹。 笑死纤垂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的磷账。 我是一名探鬼主播峭沦,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逃糟!你這毒婦竟也來了熙侍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛉抓,沒想到半個月后庆尘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巷送,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年驶忌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笑跛。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡付魔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出飞蹂,到底是詐尸還是另有隱情几苍,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布陈哑,位于F島的核電站妻坝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惊窖。R本人自食惡果不足惜刽宪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望界酒。 院中可真熱鬧圣拄,春花似錦、人聲如沸毁欣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽价捧。三九已至,卻和暖如春恭朗,著一層夾襖步出監(jiān)牢的瞬間哭尝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工剖煌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留材鹦,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓耕姊,卻偏偏與公主長得像桶唐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茉兰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354