日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 获取第一个key_Python中常见的9大坑,看看你有没有遇到

發布時間:2024/9/19 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 获取第一个key_Python中常见的9大坑,看看你有没有遇到 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? Python作為一門簡潔且容易上手的語言,正在受到越來越多人的喜愛。但如果你對其中的一些細節不甚了解,就有可能掉入它的“坑”里。本文將介紹學習Python過程中遇到的一些問題,接下來看看Python里一些常見的坑。

01

三元表達式

乍一看,按照根深蒂固的四則運算的思維,加號之前是一部分,加號之后為另一部分,結果貌似等于10。為什么打印出來的結果跟我們預想的大相徑庭呢?很顯然,Python解釋器在遇到三元表達式時,默認把if之前的(10+4)作為三元表達式的前面部分了。

02

嵌套列表的創建

要創建一個嵌套的列表,我們可能會選擇這樣的方式:

目前看起來一切正常,我們得到了一個包含3個list的嵌套list。接下來往第一個list中添加一個元素:

奇怪的事情發生了,我們只想給第一元素增加元素,結果三個list都增加了一個元素。這是因為[[]]*3并不是創建了三個不同list,而是創建了三個指向同一個list的對象,所以,當我們操作第一個元素時,其他兩個元素內容也會發生變化。下面的代碼可以證實這一點:

正確的做法如下:

03

try...finally + return

看下面這段代碼,可以試想一下print語句打印的順序:

是不是很多小伙伴看到return就對print的順序感到不知所措了,下圖是最終的結果:

我們先來看一段Python官網對于finally的解釋:

翻譯成中文就是try塊中包含break、continue或者return語句的,在離開try塊之前,finally中的語句也會被執行。所以在上面的例子中,try塊return之前,會執行finally中的語句,最后再執行try中的return語句返回結果。看到這里小伙伴們都豁然開朗了吧。

04

參數默認值

當我們把函數的參數默認值設置為列表時,會發生什么?

出現以上情況的原因是:默認值在定義函數時計算(通常在加載模塊時),因此默認值變成了函數對象的屬性。具體來說,函數的參數默認值保存在函數的__defaults__屬性中,指向了同一個列表。因此,如果默認值是可變對象,而且修改了它的值,那么后續的函數調用都會受到影響。正確的做法是設置該參數默認為None。

05

lambda自由參數之坑

先來看這樣一段代碼:

結果并不是0,2,4,6,8,而是8,8,8,8,8。不少人可能會覺得匪夷所思,不著急,先試著用dis庫分析字節碼。

沒有得到想要的結果,只能看到參數i和x,參數i的具體值無法獲取。這也就是說lambda函數在定義的時候只知道有一個i,而他的值并不明確,之后通過計算獲取i的值。到這里很容易聯想到閉包,因為i引用了“for i in range(5)”這個表達式中的值。先復習一下“閉包”的定義:閉包是一種函數,它會保留定義函數時存在的自由變量的綁定,這樣調用函數時,雖然定義作用域不可用了,但是仍能使用那些綁定。接下來驗證一下,我們通過f.__code__.co_freevars來獲取自由變量的名稱,通過f.__closure__[0].cell_contents得到自由變量的值:

果不其然,自由變量i最終的值都是4,這也就解釋了最開始的結果。如果還不明白可以看下面這段代碼。

Python程序從上到下執行,同時它也是一門動態型的語言,舉個例子,定義一個類之后,你可以動態的給它增加方法。同樣,上面這個例子中,程序執行到最后i的值為5,所以lambda表達式中i為5,最終的結果為:[10, 10,10, 10, 10, 10]。

要解決上述出現的問題,就要把閉包作用域變為局部作用域:

a = [lambda x, i=i: i*x for i in range(5)]。這行代碼等效于下面這種寫法:

“紙上得來終覺淺,絕知此事要躬行”。

06

含單個元素的元組

上圖有兩行新建元組的代碼,但只有第二種寫法是正確的。因為在唯一的元素之后不加逗號,小括號對于Python解釋器是無效的。

07

對象銷毀順序

創建一個類OBJ:

創建兩個OBJ示例,使用is判斷是否為同一對象:

接下來同樣創建兩個對象,使用id來判斷。

調用id函數, Python 創建一個OBJ類的實例,并使用id函數獲得內存地址后,銷毀內存丟棄這個對象。當連續兩次進行此操作, Python會將相同的內存地址分配給第二個對象,所以兩個對象的id值是相同的。但是is行為卻與之不同,通過打印順序就可以看到。

08

了解執行時機

請看下面這個例子:

結果并不是[1, 3, 5]而是[5],這有些不可思議。原因在于,in子句在聲明時執行, 而條件子句則是在運行時執行。所以上圖中的生成器等價于:

09

相同值的不可變對象

可以看到,key=1,value=’a’的鍵值對神奇地消失了。這里不得不說一下Python字典是使用哈希表的思想實現的,Python 調用內部的散列函數,將鍵(Key)作為參數進行轉換,得到一個唯一的地址,也就是哈希值。而Python 的哈希算法對相同的值計算得到的結果是一樣的,這就很好地解釋了上述情況出現的原因。

本文列出了在Python學習或者工作中可能會遇到的一些“坑”,雖然不見得每個人都能遇到上述問題,但是可以作為一個參考,以后就能避免踩坑了。希望小伙伴在跟Python打交道的過程中能多注意細節,甚至去了解一些內部實現的原理,這樣才能更好地掌握Python這門語言。

總結

以上是生活随笔為你收集整理的python 获取第一个key_Python中常见的9大坑,看看你有没有遇到的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。