摘要:?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
摘要:不要疑惑,告訴你答案這個(gè)代表正負(fù)號(hào)的正。雖然一點(diǎn)技術(shù)含量沒有,但是你要懂序列也許叫可迭代對(duì)象更為合適,但是我喜歡叫序列。 數(shù)據(jù)結(jié)構(gòu) 可變類型與不可變類型(重頭戲) 基操: 可變類型:[], {} # 可增刪改 查 不可變類型: int float str () # 無(wú)法增刪改, 只可查 升操: + 與...
摘要:為啥直接不行呢因?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è)...
摘要:解釋就相當(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] 解...
閱讀 454·2019-08-29 12:44
閱讀 3035·2019-08-26 17:49
閱讀 2489·2019-08-26 13:40
閱讀 1202·2019-08-26 13:39
閱讀 3684·2019-08-26 11:59
閱讀 1846·2019-08-26 10:59
閱讀 2490·2019-08-23 18:33
閱讀 2718·2019-08-23 18:30