導航:首頁 > 編程語言 > python地址偏移

python地址偏移

發布時間:2022-10-06 11:29:48

python 什麼是magic string

無論是python還是其它的編程語言,都有magic string這類東西存在。它並不是phtyon專有的東西。類似的還有magic number這樣的。

前兩年有關linux一個版本的更新就有個關於魔法數字的小插曲:

linux一個版本更新出來後,對某個類型的顯卡的驅動支持出現了問題,然後相關代碼被修復,其中在代碼中就直接對一個地址加了一個偏移量,類似python中addr_offset += 123這樣的操作,這里,這個123就是一個魔法數:它為什麼是123?為什麼不可以是124或者別的什麼值?沒有說明,沒有理由,它就這么神奇的出現,然後問題就神奇的被解決了。

為此,linux項目負責人員很惱火,在項目中都說了臟話。

無論是magic string還是magic number,統稱為magic value,即,魔法值。

它們在代碼中突然出現,直接使用,沒有說明,無從追溯。

這對代碼的可讀性,可維護性都帶來了負面效應。

拿個簡單的例子來說,在python中,我們有時會使用zipfile來處理壓縮文件,比如這樣:

z_file.writestr(z_name,data,zipfile.ZIP_DEFLATED)

但如果寫成:

z_file.writestr(z_name,data,8)

那麼,這個8就是一個魔法值:它是什麼?它哪裡來的?為什麼是8而不是9?除非你去讀zlip的文檔或源代碼,否則不知道這個8是什麼。而使用`zipfile.ZIP_DEFLATED`的話,即使你不了解zlip,看到這個常量名,也知道它是壓縮(deflated)的zip選擇了。

魔法值讓我們需要了解相關很多內容時才能讀懂一句代碼,並且修改它的功能或修正它的bug需要同樣多的精力。

再拿一個例子來說:

defgetfileencode(file):
"""測試得到文本類型文件可能使用的編碼格式
它不一定就是正確的
>>>getfileencode('errorlog.txt')
'utf_8_sig'
>>>getfileencode('星.txt')
'gb18030'
>>>getfileencode(r'D:/Python/baseweb\app.py')
'utf_8'
"""
codes=['utf_8','utf_16','gb18030','big5']
withopen(file,'rb')asf:
b=f.read()
forcodeincodes:
try:
b.decode(code)
ifcode=='utf_8'andb.startswith(b'xefxbbxbf'):
code='utf_8_sig'
break
except(Exception,):
continue
returncode

第17行中的b'xefxbbxbf'就是一個魔法值,為什麼是這個值?你只有了解到windows(MS)自作主張的在utf-8編碼的文本文件最開始加了這么一段作為這種編碼的標識時,才能理解為什麼這么寫。如果我們將它命名為一個常量:

UTF8_BOM=b'xefxbbxbf'

然後在代碼中的if這樣寫:

ifcode=='utf_8'andb.startswith(UTF8_BOM)

你無需了解關於微軟在utf-8文件前加了什麼,就能知道這個判斷的意思:如果它是utf-8編碼,並且以BOM開始……

這是避免代碼中出現魔法值的最常見的辦法。

❷ 如何設置偏移/指向一個列表/數組在Python

python中的list叫做列表,可以通過append方法在列表的末尾添加單個元素
x
=
[1,2,3]
x.append(4)
或者使用extend方法在列表末位添加多個元素,參數就變成了列表
x.append([4,5,6])
或者使用insert方法在任意位置添加元素,第一個參數是插入元素...

❸ python 什麼是偏移

偏移,又稱偏移量。原本出自匯編語言。計算機匯編語言中的偏移量定義為:把存儲單元的實際地址與其所在段的段地址之間的距離稱為段內偏移,也稱為「有效地址或偏移量」。

在高級語言中的有序序列中同樣引入了偏移的概念。所謂有序序列,是指序列內的元素順序固定,如數組、字元串。與此對比的是無序序列,即隨意改變其中元素的相對順序,不影響該數據結構的使用,如字典。

某元素在有序序列中的偏移是指從該元素在序列中的索引值。這一設計便於計算機進行定址。在C語言、python中,首個元素的偏移量均為0。


a=[1,2,3]
printa[0]
1

❹ seek函數用法python

參數offset--開始的偏移量,也就是代表需要移動偏移的位元組數whence:可選,默認值為0。
給offset參數一個定義,表示要從哪個位置開始偏移;0代表從文件開頭開始算起,1代表從當前位置開始算起,2代表從文件末尾算起。
file.seek(off,whence=0):從文件中移動off個操作標記(文件指針),正往結束方向移動,負往開始方向移動。
如果設定了whence參數,就以whence設定的起始位為准,0代表從頭開始,1代表當前位置,2代表文件最末尾位置。

❺ python為啥運行效率不高

原因:1、python是動態語言;2、python是解釋執行,但是不支持JIT;3、python中一切都是對象,每個對象都需要維護引用計數,增加了額外的工作。4、python GIL;5、垃圾回收。

當我們提到一門編程語言的效率時:通常有兩層意思,第一是開發效率,這是對程序員而言,完成編碼所需要的時間;另一個是運行效率,這是對計算機而言,完成計算任務所需要的時間。編碼效率和運行效率往往是魚與熊掌的關系,是很難同時兼顧的。不同的語言會有不同的側重,python語言毫無疑問更在乎編碼效率,life is short,we use python。

雖然使用python的編程人員都應該接受其運行效率低的事實,但python在越多越來的領域都有廣泛應用,比如科學計算 、web伺服器等。程序員當然也希望python能夠運算得更快,希望python可以更強大。

首先,python相比其他語言具體有多慢,這個不同場景和測試用例,結果肯定是不一樣的。這個網址給出了不同語言在各種case下的性能對比,這一頁是python3和C++的對比,下面是兩個case:

從上圖可以看出,不同的case,python比C++慢了幾倍到幾十倍。

python運算效率低,具體是什麼原因呢,下列羅列一些:

第一:python是動態語言

一個變數所指向對象的類型在運行時才確定,編譯器做不了任何預測,也就無從優化。舉一個簡單的例子:r = a + b。a和b相加,但a和b的類型在運行時才知道,對於加法操作,不同的類型有不同的處理,所以每次運行的時候都會去判斷a和b的類型,然後執行對應的操作。而在靜態語言如C++中,編譯的時候就確定了運行時的代碼。

另外一個例子是屬性查找,關於具體的查找順序在《python屬性查找》中有詳細介紹。簡而言之,訪問對象的某個屬性是一個非常復雜的過程,而且通過同一個變數訪問到的python對象還都可能不一樣(參見Lazy property的例子)。而在C語言中,訪問屬性用對象的地址加上屬性的偏移就可以了。

第二:python是解釋執行,但是不支持JIT(just in time compiler)。雖然大名鼎鼎的google曾經嘗試Unladen Swallow 這個項目,但最終也折了。

第三:python中一切都是對象,每個對象都需要維護引用計數,增加了額外的工作。

第四:python GIL,GIL是Python最為詬病的一點,因為GIL,python中的多線程並不能真正的並發。如果是在IO bound的業務場景,這個問題並不大,但是在CPU BOUND的場景,這就很致命了。所以筆者在工作中使用python多線程的情況並不多,一般都是使用多進程(pre fork),或者在加上協程。即使在單線程,GIL也會帶來很大的性能影響,因為python每執行100個opcode(默認,可以通過sys.setcheckinterval()設置)就會嘗試線程的切換,具體的源代碼在ceval.c::PyEval_EvalFrameEx。

第五:垃圾回收,這個可能是所有具有垃圾回收的編程語言的通病。python採用標記和分代的垃圾回收策略,每次垃圾回收的時候都會中斷正在執行的程序,造成所謂的頓卡。infoq上有一篇文章,提到禁用Python的GC機制後,Instagram性能提升了10%。感興趣的讀者可以去細讀。

推薦課程:Python機器學習(Mooc禮欣、嵩天教授)

❻ python爬蟲怎麼解決css偏移量問題

使用一個變數 is_h4做標記判定 html 文件中的 h4 標簽,如果遇到 h4 標簽,則將標簽內的內容加入到 List 變數 name中。解釋一下 start_h4() 和 end_h4() 函數,他們原型是 SGMLParser 中的
start_tagname(self, attrs)
end_tagname(self)
tagname 就是標簽名稱,比如當遇到 <pre>,就會調用 start_pre,遇到 </pre>,就會調用end_pre。attrs 為標簽的參數,以 [(attribute, value), (attribute, value), ...] 的形式傳回。

❼ 如何設置偏移/指向一個列表/數組在Python

python中的list叫做列表,可以通過append方法在列表的末尾添加單個元素 x = [1,2,3] x.append(4) 或者使用extend方法在列表末位添加多個元素,參數就變成了列表 x.append([4,5,6]) 或者使用insert方法在任意位置添加元素,第一個參數是插入元素...

❽ Python文件讀取中:f.seek(0)和f.seek(0,0)有什麼區別

seek(0)和f.seek(0,0)是沒有區別的。

file.seek()方法標准格式是:seek(offset,whence=0)offset:開始的偏移量,也就是代表需要移動偏移的位元組數whence:給offset參數一個定義,表示要從哪個位置開始偏移;0代表從文件開頭開始算起,1代表從當前位置開始算起,2代表從文件末尾算起。默認為0

whence 的默認參數是0。

whence 還有兩種情況 是1,或者2:

1的時候,相對當前坐標的移動,可以是正的也可以是負的。

2的時候相對於文件結束的移動,通常應該是負的。

(8)python地址偏移擴展閱讀

python 文件讀寫操作:

讀文件

打開一個文件用open()方法(open()返回一個文件對象,它是可迭代的):

>>> f = open('test.txt', 'r')

r表示是文本文件,rb是二進制文件。(這個mode參數默認值就是r)

如果文件不存在,open()函數就會拋出一個IOError的錯誤,並且給出錯誤碼和詳細的信息告訴你文件不存在:

>>> f=open('test.txt', 'r')
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

文件使用完畢後必須關閉,因為文件對象會佔用操作系統的資源,並且操作系統同一時間能打開的文件數量也是有限的

>>> f.close()

由於文件讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會調用。

❾ 為什麼用python獲取mac地址會變動

首先聲明,我本人還沒有研究出來問題的究竟。此處只是寫下我本人的一點小心得,大家一起進步。

因為我發現,使用uuid庫得到的mac地址,總有最後一位不對。所以,我就查看了python官方的uuid文檔,找到了問題的關鍵是調用UUID()的時候,會調用getnode()函數以得到物理地址。

這個是getnode()函數的定義:

我把它摘出來,考到下面。

def getnode(*, getters=None):
"""Get the hardware address as a 48-bit positive integer.

The first time this runs, it may launch a separate program, which could
be quite slow. If all attempts to obtain the hardware address fail, we
choose a random 48-bit number with its eighth bit set to 1 as recommended
in RFC 4122.
"""
global _node
if _node is not None:
return _node

if sys.platform == 'win32':
getters = _NODE_GETTERS_WIN32
else:
getters = _NODE_GETTERS_UNIX

for getter in getters + [_random_getnode]:
try:
_node = getter()
except:
continue
if (_node is not None) and (0 <= _node < (1 << 48)):
return _node
assert False, '_random_getnode() returned invalid value: {}'.format(_node)


我正在試圖通過研究這個問題來試圖研究。但同樣,我覺得我們可以直接讓python調用系統庫,從而執行系統自帶的命令:(類似於windows下cmd裡面"ipconfig -all"命令,或者ubuntu下terminal中"ifconfig"命令)。實現物理地址。之後,根據「短時間內該機器的網卡不會出現過大的變動這個前提」,我們可以根據返回內容,切片出我們需要的部分即可。

閱讀全文

與python地址偏移相關的資料

熱點內容
移動手機怎麼修改登錄密碼app 瀏覽:582
兩點間中點垂直線cad命令 瀏覽:32
dpdk編程開發 瀏覽:978
linux編輯文件退出命令 瀏覽:883
好看的網站 瀏覽:764
class版本為過高無法反編譯 瀏覽:467
vivo手機怎麼刪除app上的小鎖 瀏覽:462
泰國《永恆》未刪減 瀏覽:952
程序員小妹留學新加坡 瀏覽:459
app為什麼要做伺服器端app 瀏覽:608
華為電腦命令提示符在哪 瀏覽:80
法國啄木鳥網站入口 瀏覽:601
java的api怎麼打開 瀏覽:277
一本主角叫林楓的重生小說 瀏覽:809
超級靈魂解壓視頻 瀏覽:536
葉天明和柳韻 瀏覽:138
韓國愛情片在線觀看 瀏覽:745
h264壓縮工具 瀏覽:320
為什麼app總是用手機號注冊 瀏覽:430
編譯程序卡死怎麼回事 瀏覽:976