1. 程式人生 > >python基礎內建模組相關

python基礎內建模組相關

python內建函式:compile()

描述

compile() 函式將一個字串編譯為位元組程式碼。

語法

以下是 compile() 方法的語法:

compile(source, filename, mode[, flags[, dont_inherit]])

引數

  • source -- 字串或者AST(Abstract Syntax Trees)物件。。
  • filename -- 程式碼檔名稱,如果不是從檔案讀取程式碼則傳遞一些可辨認的值。
  • mode -- 指定編譯程式碼的種類。可以指定為 exec, eval, single。
  • flags -- 變數作用域,區域性名稱空間,如果被提供,可以是任何對映物件。。
  • flags和dont_inherit是用來控制編譯原始碼時的標誌

返回值

返回表示式執行結果。


source_code = \
'''
base_string = 'julyedu.com'
def test1(a,b):
    return a+b
    
def test2(c):
    x = 7
    print(c**2+x)
'''

co = compile(source_code,'test_compile.py','exec')
exec(co)
test1(2,6),test2(7)
co.co_code
co.__dir__()
test1.__code__.co_argcount
test2.__code__.co_varnames
test2.__code__.co_nlocals

輸出:

['__repr__',
 '__sizeof__',
 '__eq__',
 '__subclasshook__',
 'co_cellvars',
 '__class__',
 'co_firstlineno',
 'co_consts',
 '__ge__',
 '__reduce__',
 '__reduce_ex__',
 'co_flags',
 '__getattribute__',
 'co_filename',
 'co_stacksize',
 'co_nlocals',
 '__new__',
 '__dir__',
 '__hash__',
 '__init__',
 '__format__',
 '__delattr__',
 '__doc__',
 '__ne__',
 'co_names',
 'co_freevars',
 '__str__',
 'co_lnotab',
 'co_kwonlyargcount',
 'co_name',
 'co_code',
 'co_varnames',
 '__setattr__',
 '__lt__',
 '__le__',
 '__gt__',
 'co_argcount']

內建模組二:dis模組主要是用來分析位元組碼的一個內建模組,經常會用到的方法是dis.dis([bytesource]),引數為一個程式碼塊,可以得到這個程式碼塊對應的位元組碼指令序列。

具體可以看這個文件: https://docs.python.org/3/library/dis.html

import dis
dis.dis(co)#反彙編module test_compile
# dis.dis(test1),dis.dis(test2)#反彙編module test_compile下的函式

輸出結果:

Disassembler格式及解讀

  • 第一列表示以下幾個指令在py檔案中的行號;
  • 第二列是該指令在指令序列co_code裡的偏移量;
  • 第三列是指令opcode的名稱,分為有運算元和無運算元兩種,opcode在指令序列中是一個位元組的整數;
  • 第四列是運算元oparg,在指令序列中佔兩個位元組,基本都是co_consts或者co_names的下標;
  • 第五列帶括號的是運算元說明。

記錄幾個jupyter notebook常用的指令:

前面加!表示呼叫系統本身命令,%表示呼叫jupyter內部魔法命令

%lsmagic  可以看到所有的魔法命令

%quickref  表示所有魔法命令的解釋文件

%config ZMQInteractiveShell.ast_node_interactivity='all'   表示一個可以修改核心選項 ast_note_interactivity,使得 Jupyter 對獨佔一行的所有變數或者語句都自動顯示,這樣你就可以馬上看到多個語句的執行結果了。

%%writefile 直接寫入檔案

%run 直接指令碼執行py檔案

更多jupyter notebook的使用,我還收藏了:https://blog.csdn.net/m0_37870649/article/details/79453005

 

這位仁兄寫的比較全,可以看看。

幫助的使用
#dir,help,?,??,shift+tab,tab,相關Python的小抄

還有可以將shift+tab 游標在函式上就可以顯示。

 

在寫一個可以觀察執行中記憶體佔用的程式碼:

lesson = ['2018','2019','2020']
import sys
sys.getrefcount(lesson)
import psutil
def rss():
    m = psutil.Process().memory_info()
    print(m.rss>>20,'MB')     #>>表示輸出小數位
    
rss()
x = list(range(20000000))
rss()
del x
rss()

輸出結果如下:

 

垃圾回收的內建函式:gc

import gc
gc.get_count()#看看當前的垃圾的計數

gc.get_threshold()#檢視針對每代自動執行垃圾回收的閾值,可以使用gc.set_threshold重新設定閾值
# 當沒有回收的0代物件個數超過700,即開始0級垃圾回收,
# 當0代垃圾回收超過10次即開始1級垃圾回收,1級垃圾回收清除包括0級垃圾,
# 當1代垃圾回收超過10次,即開始2級垃圾回收,2級垃圾回收清除包括0級,1級垃圾


#垃圾回收機制python預設開啟的,gc.disabled可關閉垃圾回收機制
#而使用gc.collect([generation])顯式手動進行垃圾回收
gc.collect(2)#回收2級垃圾,也可以指定0,1

 

輸出結果;

 

格式化訪問的兩種形勢:

格式化訪問一:
str3='http://{}.com'
companyName='julyedu'
str3.format(companyName)
格式化訪問二:
_='Python 3'
str4=f"fstring is new feature of {_}"
str4

第二種是python3的新特性。

輸出結果: