成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

經(jīng)驗(yàn)拾憶(純手工)=> Python好用深度技能工具介紹

UnixAgain / 2458人閱讀

摘要:?jiǎn)卧卦孢@是整數(shù)這才是元祖也許這兩行,你們當(dāng)時(shí)疑惑過,并且現(xiàn)在也都知道了,當(dāng)然重點(diǎn)并不在這里。。雖然我水平很垃圾,但是我知道匿名函數(shù)有一種執(zhí)行方式叫做自執(zhí)行??窗桑@就是版的匿名函數(shù)自執(zhí)行方法。

單元素元祖:
a = (1)    # 這是整數(shù)1
a = (1,)   # 這才是元祖
也許這兩行,你們當(dāng)時(shí)疑惑過,并且現(xiàn)在也都知道了,當(dāng)然重點(diǎn)并不在這里。。

我無(wú)聊的時(shí)候想過,為什么單元素元祖要這樣設(shè)計(jì) -> (1,)?
不多廢話,看下面代碼,自己理解:
    a = (3,)
    a = (3)
    
    a = (1+2)
    a = (1+2,)
    
    a = (1+2) + (3+4)
    a = (1+2,) + (3+4,)

注:
    這是我個(gè)人原創(chuàng)理解的一個(gè)微不足道的知識(shí)點(diǎn),但是印象卻特別深刻。
    因?yàn)槲曳聪蛲茰y(cè)出 設(shè)計(jì)者為什么會(huì)設(shè)計(jì)出這種語(yǔ)法。
    (當(dāng)然,也許我的推測(cè)和設(shè)計(jì)者當(dāng)時(shí)的想法的并不一樣~~~手動(dòng)滑稽)
深/淺拷貝-copy/deepcopy(皮/肉)
"""
    最開始接觸深淺拷貝的時(shí)候沒太大感覺,只是普通的覺得避免數(shù)據(jù)污染就夠了
    后來有一次用scrapy寫爬蟲的時(shí)候,層次太多導(dǎo)致內(nèi)存有些頂不住。
    后來用的 deepcopy() 來 優(yōu)化  scrapy 的 meta, 雖然效果不是特別明顯,但是感覺深淺拷貝很有用
"""
    1. =號(hào),不拷貝
        =號(hào)就意味著,引用指向同一個(gè)地址空間,‘?dāng)硠?dòng)我動(dòng),敵不動(dòng)我不懂’ 的感覺。 LOL一句話:"連體嬰兒"~~
    2. copy:也稱淺拷貝
        我用最簡(jiǎn)單的話解釋一下:淺拷貝就是只能拷貝最外面的一層皮,來獨(dú)立開辟空間使用,再深還是共用的
        eg:
            from copy import copy
            from copy import deepcopy
            
            a = [[1,2,3],[4,5,6]]
            b = deepcopy(a)
            b[0] = 0            # 這就是最外面的一層皮
            print(b)
            print(a)
    
    3. deepcopy:顧名思義了,深拷貝
       如果你聽懂我上面的話,我感覺這個(gè)就更好理解了, 淺拷貝是皮,深拷貝那就是肉了唄。
       沒錯(cuò),無(wú)論套了幾層的序列結(jié)構(gòu),每一層都是獨(dú)立開辟空間,獨(dú)立指向。
            from copy import copy
            from copy import deepcopy
            
            a = [[1,2,3],[4,5,6]]
            b = deepcopy(a)
            b[0][1] = 0    # 看清楚,這回就是里面的肉了, 深拷貝:你改哪里都行,哪里都與我無(wú)關(guān)
            print(b)
            print(a)

lambda黑科技
"""lambda相當(dāng)于匿名函數(shù),可以使代碼簡(jiǎn)介,但有時(shí)也會(huì)被人唾棄,但我仍然喜歡用lambda"""

1. 試想:如果你想在lambda調(diào)用多個(gè)函數(shù),該如何寫?
    lambda: (print(1),print(2))    # 最外層加個(gè)括號(hào)即可
    
2. 如果你想讓這個(gè) lambda函數(shù)直接自執(zhí)行,而不是通過賦予一個(gè)函數(shù)引用再執(zhí)行?
    1. 這個(gè)也是我自己瞎鼓搗出來的。
    2. 雖然我JS水平很垃圾,但是我知道JS匿名函數(shù)有一種執(zhí)行方式叫做 ‘自執(zhí)行’。
    3. 把上面類比一下。
    
    看吧,這就是Python版的匿名函數(shù)自執(zhí)行方法。
        Python版本: (lambda a:print(a))(1)        
        JS版:       (function(){})()
lambda的虛偽替代品-operator
"""
    據(jù)說這個(gè)模塊可以替代lambda, 個(gè)人理解此模塊并不那么太有實(shí)用價(jià)值,理解成本也偏高,
    建議:如果不喜歡lambda或者lambda用的很少的人,可以研究一下此模塊。此模塊的意圖還是可以的。
    我還是喜歡使用 lambda
"""
直接上個(gè)例子:(字典基于Value來排序) 
    傳統(tǒng)lambda寫法:
        In [27]: a = {"1":6, "2":5, "3":4}
        In [28]: sorted(a.items(), key=lambda a:a[1])   # 看key= 這里
        Out[28]: [("3", 4), ("2", 5), ("1", 6)]
                                
    operator寫法:
        from operator import itemgetter
        
        In [25]: a = {"1":6, "2":5, "3":4}
        In [26]: sorted(a.items(), key=itemgetter(1))   # 就是key= 這里有區(qū)別
        Out[26]: [("3", 4), ("2", 5), ("1", 6)]

如果上面兩種新舊方法都很模糊,那么我再解釋一下: 我認(rèn)為上面能讓人頭疼的也就是 索引 1 了!?。。?    sorted, map這種高階函數(shù),我之前也多帶帶講過,它會(huì)把 一個(gè)序列的每一個(gè)元素用管道函數(shù)進(jìn)行映射。
    
    sorted稍微特殊一點(diǎn),它的管道函數(shù)方法變成了key=這里: (變相理解為 指定排序的基準(zhǔn)/參考)
        1. key=lambda a:a[1]
            指定基準(zhǔn):序列a的 每子元素 的 第1號(hào)索引子元素    # eg: [[1,2],[3,4],[5,6]]  就是2,4,6
        
        2. key=itemgetter(1)
            指定基準(zhǔn):同上一模一樣,只不過寫法不一樣,邏輯步驟就是 原原本本從 lambda那里演變過來的。
            
總結(jié)與個(gè)人觀點(diǎn):
    1. operator 模塊只是 lambda 使用思想 的 高一層的封裝
    2. 讓使用者可以忽略lambda格式細(xì)節(jié)
    3. 但是我認(rèn)為 如果lambda都用不好, 那么 這個(gè) itemgetter(1) 這種子元素 索引的指定 也會(huì)很困難
    4. 所以我還是建議用 lambda, 當(dāng)你 lambda思想練熟了之后, 用 operator看看官方文檔就是很快的事情
    
            
      
            
                            
封包/拆包(解構(gòu)賦值)/函數(shù)占位參數(shù)騷操作
"""
    再次說明一下:我寫的所有的都是Py3的/   Py2的解構(gòu)賦值可能有些出入,此處我只說Py3
"""

封包:
    1)
        def f(a,*b):
            print(a)    # 1
            print(b)    # (2,3,4)
        f(1,2,3,4)
    2) 
        def f(**kwargs):
            print(kwargs)    # {"a": 3, "b": 4}
        f(**dict(a=3,b=4))
        
拆包(解構(gòu)賦值):
    """
        我說過太多次了, ES6的語(yǔ)法和Python很像。解構(gòu)賦值這個(gè)詞也是從ES6聽到的。
        不過ES6的解構(gòu),還可以解構(gòu) {} 和 解構(gòu)空值 和 解構(gòu)默認(rèn)值,   而Python不可以
    """
    1)  只要第一個(gè)
            a, *_ = range(5)
            print(a, _)     # 0  [1, 2, 3, 4]

    2)  只要第一個(gè)和最后一個(gè)
            a, *_, c = range(5)
            print(a, _, c)    # 0  [1, 2, 3]  4
            
    3)  只要最后一個(gè)
            *_, b = range(5)
            print(_, b)      # [0, 1, 2, 3]  4


函數(shù)占位參數(shù)騷操作:
    """
        這是我在源碼中看到的,當(dāng)時(shí)覺得很驚訝,自己試了一下,下面說下自己的理解:
        這個(gè)*的作用就是: (*后面的參數(shù)是 調(diào)用時(shí) 必須命名 且 必須傳遞 的參數(shù))
            a你必須給我傳過來,但是你不寫   a=
            b你必須給我傳過來,但是你必須寫 b=
    """
    def f(a,*,b):
        print(a)
        print(b)
    f(1,b=3)    # f(a=1,b=3)    # 只能通過這兩種方式調(diào)用
反射-getattr & setattr & hasattr & delattr & import_module
綜合例子:
    from importlib import import_module
    random = import_module("random")          # 動(dòng)態(tài)反射導(dǎo)入模塊  
    # 或 random = __import__("random")         
    if hasattr(random, "randint"):            # 檢測(cè)模塊中是否有函數(shù)
        randint = getattr(random,"randint")   # 動(dòng)態(tài)反射導(dǎo)入函數(shù)
        print(eval("randint(0,1)"))               # 字符串轉(zhuǎn)語(yǔ)句執(zhí)行(類似反射)
    
getattr & setattr & hasattr & delattr 講解:
    hasattr & getattr
        random = __import__("random")
        if hasattr(random,"randint"):    # 檢測(cè) random 模塊中是否有 randint 函數(shù)
            randint = getattr(random,"randint")
            print(randint(0,1))
            
    delattr & hasattr 
        delattr(random, "randint")      # 動(dòng)態(tài)刪除模塊中的 randint函數(shù)
        if not hasattr(random,"randint"):
            print("沒有此函數(shù)了,讓delattr刪除了")
            
    setattr & getattr                   # 動(dòng)態(tài)重新設(shè)置模塊的 randint函數(shù),并給個(gè)函數(shù)體
        setattr(random, "randint", lambda:print("設(shè)置這個(gè)方法湊合用把。"))
        randint = getattr(random, "randint")
        randint()     

模塊重新導(dǎo)入到內(nèi)存-reload
from imp import reload
import time
reload(time)
print(time.time())
進(jìn)度條-tqdm
for x in tqdm(range(100)):
    import time
    time.sleep(1)
    print(x)
tqdm包裝一個(gè)可迭代對(duì)象, 只是裝飾了一下,使用方法還是像原來一樣使用。 
票數(shù)統(tǒng)計(jì)-Counter
In [2]: from collections import Counter

In [3]: Counter([1,2,3,4])
Out[3]: Counter({1: 1, 2: 1, 3: 1, 4: 1})

In [4]: Counter([1,1,1,2,2,3])    # 統(tǒng)計(jì)頻次
Out[4]: Counter({1: 3, 2: 2, 3: 1})

In [5]: Counter([1,1,1,2,2,3]).most_common(1)    # 頻次最多的前1個(gè)
Out[5]: [(1, 3)]
文件 復(fù)制/移動(dòng)-shutil
import shutil
shutil.copy(源,目標(biāo))    # 復(fù)制
shutil.move(源,目標(biāo))    # 移動(dòng),改名
shutil.rmtree(r"目錄名")  # 刪除目錄(級(jí)聯(lián)刪除)    # 參數(shù)只能是目錄
文件遍歷-os.walk
"""
    os.walk() 是一個(gè)深度遍歷模式的文件遍歷函數(shù)
    返回值是一個(gè)迭代器,遍歷這個(gè)迭代器后,每一次的返回值都是如下順序三種構(gòu)成
        1. current_path: 當(dāng)前路徑 
        2. dir_list:     其下目錄列表
        3. file_list:    其下文件列表
    
"""
import os
file_generator = os.walk("D:/虛擬E盤-代碼空間/TF2")
for current_dir, dir_list, file_list in file_generator:
    print(current_dir, dir_list, file_list)
非阻塞執(zhí)行cmd/shell-subprocess
"""
    主要代替os.system
""" 
import subprocess
res = subprocess.run("dir", shell=True, stdout=subprocess.PIPE) # 結(jié)果輸入到res管道中去
print(res.stdout.decode("gbk"))    # res管道中有輸出日志,如果在win下,需要 decode
排列組合-itertools模塊
import itertools
list(itertools.product([1,2,3],repeat=3))    # 復(fù)制3份有序全排列, repeat=3    
list(itertools.permutations([1,2,3], 3))     # 內(nèi)部有序排列, 3表示最后排列為幾位
list(itertools.permutations([1,2,3,4],3))    # 無(wú)序組合, 3表示3位
枚舉-emunerate
In [100]: list(enumerate(list("abcde"),start=1))    # 默認(rèn)從0,開始標(biāo)號(hào), start=1就從1開始
Out[100]: [(1, "a"), (2, "b"), (3, "c"), (4, "d"), (5, "e")]

In [108]: list(enumerate(((1,2),(3,4))))
Out[108]: [(0, (1, 2)), (1, (3, 4))]        

In [106]: list(enumerate({"a":"c","b":"d"}))
Out[106]: [(0, "a"), (1, "b")]
global & nonlocal & globals() & locals()
global: 函數(shù)外的變量只能在函數(shù)內(nèi)部取值,而不能修改, 如果想要在函數(shù)內(nèi)部修改外部變量, ‘global 變量名’ 即可
    a = 1
    def f():
        global a
        a += 1
        print(a)
    f()
        
nonlocal: 原理同上一模一樣,只不過應(yīng)用場(chǎng)景是閉包了,代碼如下:
    def f():
        a = 1
        def f1():
            nonlocal a
            a = a+1
            print(a)
        f1()
    f()

日歷-calendar
import calendar
calendar.calendar(2019)    # 返回2019年的日歷
calendar.month(2919,5)    # 返回2019年5月的日歷
calendar.isleap(2000)    # 判斷2000年是否為閏年
時(shí)間/日期-time/datetime
import time
1. 時(shí)間戳:
    time.time()
    
2. 字符串轉(zhuǎn)時(shí)間(p-pass方便記憶)
    from datetime import datetime
    fordate = datetime.strptime("2019-5-25 9:30:30", "%Y-%m-%d %H:%M:%S")
    print(fordate)

3. 時(shí)間轉(zhuǎn)字符串(f-from方便記憶)
    from datetime import datetime
    strdate = datetime.strftime(fordate, "%Y-%m-%d %H:%M:%S")
    print(strdate)
    
4. 初始化時(shí)間
    from datetime import datetime
    dt1 = datetime(2019,5,25,9,37)    # 初始化時(shí)間為 datetime格式
    dt1 = datetime.now()   # 獲取當(dāng)前時(shí)間為 datetime格式
    print(dt1.year)
    print(dt1.month)
    print(dt1.day)
    print(dt1.hour)
    print(dt1.minute)
    print(dt1.second)



    

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43889.html

相關(guān)文章

  • 經(jīng)驗(yàn)拾憶手工)=> Python基本數(shù)據(jù)類型

    摘要:不要疑惑,告訴你答案這個(gè)代表正負(fù)號(hào)的正。雖然一點(diǎn)技術(shù)含量沒有,但是你要懂序列也許叫可迭代對(duì)象更為合適,但是我喜歡叫序列。 數(shù)據(jù)結(jié)構(gòu) 可變類型與不可變類型(重頭戲) 基操: 可變類型:[], {} # 可增刪改 查 不可變類型: int float str () # 無(wú)法增刪改, 只可查 升操: + 與...

    Andrman 評(píng)論0 收藏0
  • 經(jīng)驗(yàn)拾憶手工)=> Linux實(shí)用工具命令

    摘要:為啥直接不行呢因?yàn)橐蚤_頭的最后一條命令是。和和和強(qiáng)制終止最常用的,先提出來。。。。我們可以通過這一條命令來迅速回到程序運(yùn)行的環(huán)境。其實(shí)這些配置文件以及這些命令和用戶以及權(quán)限等都是有很大關(guān)系的。 Ubuntu16升級(jí)到18.04 有特殊新穎強(qiáng)迫癥癖好可以升下,如果你覺得16.04好用,就根本沒必要升了 我當(dāng)時(shí)租的 云服務(wù)器通常都是16.04,現(xiàn)在估計(jì)也是16.04較多 我是個(gè)...

    kk_miles 評(píng)論0 收藏0
  • 經(jīng)驗(yàn)拾憶手工)=> Python高階函數(shù)操作

    摘要:解釋就相當(dāng)于把每個(gè)序列元素的每一個(gè)單獨(dú)用一個(gè)管道函數(shù)處理,再把他們按順序組合成一個(gè)新可迭代對(duì)象注意這個(gè)管道函數(shù)只能是單參數(shù)函數(shù),如果想傳遞多個(gè)參數(shù)怎么辦使用偏函數(shù)怕有些人看不懂,這里就不用了,而是用普通函數(shù)定義方式固定值固定值固定值固定值固 map In [25]: list(map(lambda a:a**2, [1,2,3,4])) Out[25]: [1, 4, 9, 16] 解...

    Elle 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

UnixAgain

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<