亚洲精品国产第1页,国产在线不卡一区,狠狠色狠狠色很很综合很久久
360doc--古明地覺O_o的文章
http://www.gongjishe.com/rssperson/81250822.aspx
360doc (http://www.gongjishe.com)
zh-cn
360doc--個人圖書館
-
一文讓你搞懂 Python 的生成器,以及我和一個奇葩之間的恩怨情仇
http://www.gongjishe.com/content/24/1202/13/81250822_1140950859.shtml
2024/12/2 13:54:28
def gen(): yield 123 return "result"def middle(): try: yield from gen() except GeneratorExit as e: print(f"子生成器結(jié)束了")g = middle()print(g.__next__()) # 123# 關(guān)閉子生成器,會 throw 一個 GeneratorExit# 然后這個 GeneratorExit 會向上透傳給委托生成器g.close()"""子生成器結(jié)束了"""# 注意:委托生成器也是同理# 一旦捕獲了 GeneratorExit,后續(xù)不應(yīng)該再出現(xiàn) yield.
-
Python 解釋器源碼剖析系列,我決定暫停更新了
http://www.gongjishe.com/content/24/1202/00/81250822_1140913813.shtml
2024/12/2 0:00:32
Python 解釋器源碼剖析系列,我決定暫停更新了。1)Python 源碼有大幾十萬行,閱讀起來真的是費時又費力。2)研究 Python 解釋器注定只是少數(shù)人的狂歡,因為這個除了在面試的時候能裝一下之外,其實沒啥大用,差不多就行了?;谝陨蠋讉€原因,Python 源碼剖析系列暫時不更新了,感謝大家一直以來的支持。Python 解釋器源碼這種耗費精力的東西真的做不動了o(╥﹏╥)o。
-
裝飾器是怎么實現(xiàn)的?
http://www.gongjishe.com/content/24/1128/10/81250822_1140619296.shtml
2024/11/28 10:09:17
def deco1(func): def inner(): return f"<deco1>{func()}</deco1>" return innerdef deco2(func): def inner(): return f"<deco2>{func()}</deco2>" return innerdef deco3(func): def inner(): return f"<deco3>{func()}</deco3>" return inner@deco1@deco2@deco3def foo(): return "古明地覺"print(foo())<deco1><deco2><deco3>古明地覺</deco3></deco2></deco1>
-
閉包是怎么實現(xiàn)的?
http://www.gongjishe.com/content/24/1125/10/81250822_1140355213.shtml
2024/11/25 10:50:37
如果使用外層函數(shù) foo 獲取 co_freevars 的話,那么得到的結(jié)果顯然就是個空元組了,除非 foo 也作為某個函數(shù)的內(nèi)層函數(shù),并且內(nèi)部引用了外層函數(shù)的變量。因為內(nèi)層函數(shù) inner 引用了函數(shù) bar 里面的變量 gender,同時函數(shù) bar 也作為內(nèi)層函數(shù)引用了函數(shù) foo 里的 name 和 age。函數(shù)即變量,對于函數(shù) some_func 而言,內(nèi)層函數(shù) inner 也是一個局部變量,由于符號 inner 位于符號表中索引為 1 的位置。
-
函數(shù)在底層是如何調(diào)用的?
http://www.gongjishe.com/content/24/1119/10/81250822_1139735568.shtml
2024/11/19 10:36:14
-
函數(shù)是怎么創(chuàng)建的,背后經(jīng)歷了哪些過程?
http://www.gongjishe.com/content/24/1115/16/81250822_1139428155.shtml
2024/11/15 16:27:11
def foo(): passprint(foo.__name__) # foobar = fooprint(bar.__name__) # foo.gender = "female"def foo(name, age): return f"name: {name}, age: {age}, gender: {gender}"code = foo.__code__# 第二個參數(shù)必須是一個字典,不能傳 Nonenew_foo = type(foo)(code, {}, "根據(jù) foo 創(chuàng)建的 new_foo")try: print(new_foo("古明地覺", 17))except NameError as e: print(e) # name ''''''''gender'''''''' is not defined.
-
Python 函數(shù)在底層長什么樣子?
http://www.gongjishe.com/content/24/1113/10/81250822_1139222781.shtml
2024/11/13 10:33:13
def foo(): name = "古明地覺" age = 17 def bar(): print(name, age) return bar# 內(nèi)層函數(shù) bar 使用了外層作用域中的 name、age 變量print(foo().__closure__)"""(<cell at 0x000001FD1D3B02B0: int object at 0x7efe79d4a1c8>, <cell at 0x000001FD1D42E310: str object at 0x7efe7921bc30>)"""print(foo().__closure__[0].cell_contents) # 17print(foo().__closure__[1].cell_contents) # 古明地覺。
-
虛擬機是如何捕獲異常的?
http://www.gongjishe.com/content/24/1111/10/81250822_1139045038.shtml
2024/11/11 10:45:21
try: raise IndexError("IndexError Occurred")except ValueError as e: print("ValueError 匹配上了異常")except IndexError as e: print("IndexError 匹配上了異常")except Exception as e: print("Exception 匹配上了異常")else: print("我是 else")finally: print("我是 finally")"""IndexError 匹配上了異常我是 finally"""try 子句的指令我們說完了,再來看看 except 子句。
-
異常是怎么實現(xiàn)的?虛擬機是如何將異常拋出去的?
http://www.gongjishe.com/content/24/1107/10/81250822_1138710871.shtml
2024/11/7 10:21:11
但是找不到,于是會從線程狀態(tài)對象中取出已有的 traceback 對象(此時是函數(shù) g 的棧幀對應(yīng)的 traceback),然后以函數(shù) f 的棧幀為參數(shù),創(chuàng)建新的 traceback 對象,再將兩者通過 tb_next 關(guān)聯(lián)起來,并重新設(shè)置到線程狀態(tài)對象中。因為每一個棧幀對應(yīng)一個 traceback,而棧幀又是往后退的,因此顯然會從 .py文件對應(yīng)的 traceback 開始打印,然后通過 tb_next 找到函數(shù)f 對應(yīng)的 traceback,依次下去。
-
流程控制語句 for、while 是怎么實現(xiàn)的?
http://www.gongjishe.com/content/24/1105/10/81250822_1138536725.shtml
2024/11/5 10:45:23
我們直接從 10 GET_ITER 開始看起,首先 for 循環(huán)遍歷的對象必須是可迭代對象,然后會調(diào)用它的 __iter__ 方法,得到迭代器。循環(huán)的時候,先將迭代器中的元素迭代出來,然后再讓變量 item 指向。因為 for 循環(huán)事先是不知道迭代 10 次就能結(jié)束的,它需要再迭代一次,發(fā)現(xiàn)沒有元素可以迭代、并捕獲拋出的 StopIteration 之后,才能結(jié)束。for 循環(huán)遍歷可迭代對象時,會先拿到對應(yīng)的迭代器,那如果遍歷的就是一個迭代器呢?
-
流程控制語句 match case 是怎么實現(xiàn)的?
http://www.gongjishe.com/content/24/1104/10/81250822_1138444924.shtml
2024/11/4 10:24:10
流程控制語句 match case 是怎么實現(xiàn)的?match (1, 2): case x: print(f"case x 分支執(zhí)行,x = {x}")"""case x 分支執(zhí)行,x = (1, 2)"""print(x)"""(1, 2)"""match {"name": "古明地覺", "age": 17}: case x: print(f"case x 分支執(zhí)行,x = {x}")"""case x 分支執(zhí)行,x = {''''''''name'''''''': ''''''''古明地覺'''''''', ''''''''age'''''''': 17}"""print(x)"""{''''''''name'''''''': ''''''''古明地覺'''''''', ''''''''age'''''''': 17}"""
-
流程控制語句 if 是怎么實現(xiàn)的?
http://www.gongjishe.com/content/24/1101/10/81250822_1138190031.shtml
2024/11/1 10:18:10
POP_JUMP_IF_FALSE 指令的偏移量為 14,向前跳轉(zhuǎn) 9 個指令,一個指令的大小是 2 字節(jié),所以結(jié)果是 14 + 18 = 32。比如 A 和 B 兩個指令的關(guān)聯(lián)性很強,盡管 A 的下一條指令除了是 B 之外,也有可能是其它指令,但 B 出現(xiàn)的概率是最大的,因此虛擬機會預(yù)測下一條指令是 B 指令。以上便是指令預(yù)測,說白了就是如果指令 A 和指令 B 具有極高的關(guān)聯(lián)性(甚至百分百),那么執(zhí)行完 A 指令后會判斷下一條指令是不是 B。
-
深入源碼,進一步考察字節(jié)碼的執(zhí)行流程
http://www.gongjishe.com/content/24/1021/10/81250822_1137223783.shtml
2024/10/21 10:21:12
# define DISPATCH_GOTO() goto *opcode_targets[opcode]#else# define TARGET(op) case op: TARGET_##op: INSTRUCTION_START(op);變量 opcode 就是指令(一個 uint8 整數(shù)),而最后跳轉(zhuǎn)到了 *opcode_targets[opcode],那么我們有理由相信,指令和 opcode_targets 數(shù)組的索引之間存在某種關(guān)聯(lián)。這種關(guān)聯(lián)也很好想,opcode_targets[opcode] 指向的標簽,其內(nèi)部的邏輯就是用來處理 opcode 指令的,我們來驗證一下。
-
虛擬機是怎么執(zhí)行字節(jié)碼的?背后都經(jīng)歷了哪些過程
http://www.gongjishe.com/content/24/1018/11/81250822_1136882126.shtml
2024/10/18 11:54:25
注:STACK_LEVEL() 是動態(tài)變化的,因為 stack_pointer 會動態(tài)變化。而往棧里面壓入一個元素,其實就是修改 stack_pointer 指向的內(nèi)存單元,然后執(zhí)行 stack_pointer++。// 設(shè)置元素POKE(1, 3); // stack_pointer[-1] = 3POKE(2, 2); // stack_pointer[-2] = 2.比如 LOAD_CONST 指令,它在加載完常量之后,會將常量壓入運行時棧,然后 STORE_NAME 或 STORE_FAST 指令再將常量從運行時棧的頂部彈出,和某個符號(變量)綁定起來。
-
當查找一個 Python 變量時,虛擬機會進行哪些動作?
http://www.gongjishe.com/content/24/1014/11/81250822_1136519791.shtml
2024/10/14 11:12:07
但我們之前說了,作用域僅僅是由文本決定的,函數(shù) bar 位于函數(shù) foo 之內(nèi),所以函數(shù) bar 定義的作用域內(nèi)嵌于函數(shù) foo 的作用域之內(nèi)。x = 1def foo(): print(x)def bar(): print(x) x = 2print(foo.__code__.co_varnames) # ()print(bar.__code__.co_varnames) # (''''''''x'''''''',)不過由于 foo 是一個函數(shù),調(diào)用內(nèi)層函數(shù) bar 的時候,外層函數(shù) foo 已經(jīng)結(jié)束了,所以不管怎么修改它里面的變量,都無所謂了。
-
名字空間:Python 變量的容身之所
http://www.gongjishe.com/content/24/1009/11/81250822_1136097727.shtml
2024/10/9 11:30:14
這個文件本身也有自己的作用域,并且是 global 作用域,所以解釋器在運行這個文件的時候,也會為其創(chuàng)建一個名字空間,而這個名字空間就是 global 名字空間,即全局名字空間。注:關(guān)于 local 名字空間,還有一個重要的細節(jié),全局變量會存儲在 global 名字空間中,但局部變量卻并不存儲在 local 名字空間中。builtin 名字空間也是一個字典,當 local 名字空間、global 名字空間都查找不到指定變量的時候,會去 builtin 空間查找。
-
深度解密 Python 虛擬機的執(zhí)行環(huán)境:棧幀對象
http://www.gongjishe.com/content/24/0930/11/81250822_1135410394.shtml
2024/9/30 11:42:19
import inspectdef foo(): return inspect.currentframe()frame = foo()print(frame)"""<frame at 0x100de0fc0, file ''''''''.../main.py'''''''', line 6, code foo>"""# foo 的上一級棧幀,顯然對應(yīng)的是模塊的棧幀print(frame.f_back)"""<frame at 0x100adde40, file ''''''''.../main.py'''''''', line 12, code <module>>"""# 相當于模塊的上一級棧幀,顯然是 Noneprint(frame.f_back.f_back)"""None"""
-
一文讓你搞懂 Python 的 pyc 文件
http://www.gongjishe.com/content/24/0925/13/81250822_1134985025.shtml
2024/9/25 13:33:10
對的,并不是編譯成 PyCodeObject 對象之后就直接使用,而是先寫到 pyc 文件里,然后再將 pyc 文件里面的 PyCodeObject 對象重新在內(nèi)存中復(fù)制出來。比如 Python3.12 不會加載 3.10 版本的 pyc,因為 Python 在加載 pyc 文件的時候會首先檢測該 pyc 的 magic number。如果 pyc 文件的寫入時間比源代碼的修改時間要早,說明在生成 pyc 之后,源代碼被修改了,那么會重新編譯并寫入 pyc,而反之則會直接加載已存在的 pyc。
-
PyCodeObject 拾遺
http://www.gongjishe.com/content/24/0923/12/81250822_1134802273.shtml
2024/9/23 12:24:16
a = 1# 所以 eval("a") 就等價于 aprint(eval("a")) # 1print(eval("1 + 1 + 1")) # 3.print(eval("1 + 1")) # 2print(exec("1 + 1")) # None# 相當于 a = 2exec("a = 1 + 1")print(a) # 2try: # 相當于 a = 2,但很明顯 a = 2 是一個語句 # 它無法作為一個值,因此放到 eval 里面就報錯了 eval("a = 1 + 1")except SyntaxError as e: print(e) # invalid syntax (<string>, line 1)
-
Python 源文件編譯之后會得到什么,它的結(jié)構(gòu)是怎樣的?和字節(jié)碼又有什么聯(lián)系?
http://www.gongjishe.com/content/24/0920/14/81250822_1134559695.shtml
2024/9/20 14:24:08
// Include/cpython/code.h// 函數(shù)參數(shù)是否包含 *args#define CO_VARARGS 0x0004// 函數(shù)參數(shù)是否包含 **kwargs#define CO_VARKEYWORDS 0x0008// 函數(shù)是否是內(nèi)層函數(shù)#define CO_NESTED 0x0010// 函數(shù)是否是生成器函數(shù)#define CO_GENERATOR 0x0020// 函數(shù)是否是協(xié)程函數(shù)#define CO_COROUTINE 0x0080// 函數(shù)是否是異步生成器函數(shù)#define CO_ASYNC_GENERATOR 0x0200.