您好,登錄后才能下訂單哦!
Python冷知識?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
省略號也是對象
... 這是省略號,在Python中,一切皆對象。它也不例外。
在 Python 中,它叫做 Ellipsis 。
在 Python 3 中你可以直接寫…來得到這玩意。
>>> ... Ellipsis >>> type(...) <class ellipsis >
而在 2 中沒有…這個語法,只能直接寫Ellipsis來獲取。
>>> Ellipsis Ellipsis >>> type(Ellipsis) <type ellipsis > >>>
它轉為布爾值時為真
>>> bool(...) True
最后,這東西是一個單例。
>>> id(...) 4362672336 >>> id(...) 4362672336
這東西有啥用呢?據說它是Numpy的語法糖,不玩 Numpy 的人,可以說是沒啥用的。
類首字母不一定大寫
在正常情況下,我們所編寫的所見到的代碼,好像都默許了類名首字母大寫,而實例用小寫的這一準則。但這并不是強制性的,即使你反過來的也沒有關系。
但有一些內置的類,首字母都是小寫,而實例都是大寫。
比如 bool 是類名,而 True,False 是其實例;
比如 ellipsis 是類名,Ellipsis是實例;
還有 int,string,float,list,tuple,dict 等一系列數據類型都是類名,它們都是小寫。
增量賦值的性能更好
+= 其背后使用的魔法方法是 __iadd__,如果沒有實現這個方法則會退而求其次,使用 __add__ 。
這兩種寫法有什么區別呢?
用列表舉例 a += b,使用 __iadd__ 的話就像是使用了a.extend(b),如果使用 __add__ 的話,則是 a = a+b,前者是直接在原列表上進行擴展,而后者是先從原列表中取出值,在一個新的列表中進行擴展,然后再將新的列表對象返回給變量,顯然后者的消耗要大些。
所以在能使用增量賦值的時候盡量使用它。
and和or的取值順序
and 和 or 是我們再熟悉不過的兩個邏輯運算符。而我們通常只用它來做判斷,很少用它來取值。
如果一個or表達式中所有值都為真,Python會選擇第一個值,而and表達式則會選擇第二個。
如何修改解釋器提示符
這個當做今天的一個小彩蛋吧。應該算是比較冷門的,估計知道的人很少了吧。
正常情況下,我們在 終端下 執行Python 命令是這樣的。
>>> for i in range(2): ... print (i) ... 0 1
你是否想過 >>> 和 ... 這兩個提示符也是可以修改的呢?
>>> import sys >>> sys.ps1 >>> >>> sys.ps2 ... >>> >>> sys.ps2 = ................ >>> sys.ps1 = Python編程時光>>> Python編程時光>>>for i in range(2): ................ print (i) ................ 0 1
默認參數最好為不可變對象
函數的參數分三種
可變參數
默認參數
關鍵字參數
這三者的具體區別,和使用方法在 廖雪峰的教程 里會詳細的解釋。這里就不搬運了。
今天要說的是,傳遞默認參數時,新手很容易踩雷的一個坑。
先來看一個示例
def func(item, item_list=[]): item_list.append(item) print(item_list) func( iphone ) func( xiaomi , item_list=[ oppo , vivo ]) func( huawei )
在這里,你可以暫停一下,思考一下會輸出什么?
思考過后,你的答案是否和下面的一致呢
[ iphone ] [ oppo , vivo , xiaomi ] [ iphone , huawei ]
如果是,那你可以跳過這部分內容,如果不是,請接著往下看,這里來分析一下。
Python 中的 def 語句在每次執行的時候都初始化一個函數對象,這個函數對象就是我們要調用的函數,可以把它當成一個一般的對象,只不過這個對象擁有一個可執行的方法和部分屬性。
對于參數中提供了初始值的參數,由于 Python 中的函數參數傳遞的是對象,也可以認為是傳地址,在第一次初始化 def 的時候,會先生成這個可變對象的內存地址,然后將這個默認參數 item_list 會與這個內存地址綁定。在后面的函數調用中,如果調用方指定了新的默認值,就會將原來的默認值覆蓋。如果調用方沒有指定新的默認值,那就會使用原來的默認值。
訪問類中的私有方法
大家都知道,類中可供直接調用的方法,只有公有方法(protected類型的方法也可以,但是不建議)。也就是說,類的私有方法是無法直接調用的。
這里先看一下例子
class Kls(): def public(self): print( Hello public world! ) def __private(self): print( Hello private world! ) def call_private(self): self.__private() ins = Kls() # 調用公有方法,沒問題 ins.public() # 直接調用私有方法,不行 ins.__private() # 但你可以通過內部公有方法,進行代理 ins.call_private()
既然都是方法,那我們真的沒有方法可以直接調用嗎?
當然有啦,只是建議你千萬不要這樣弄,這里只是普及,讓你了解一下。
# 調用私有方法,以下兩種等價 ins._Kls__private() ins.call_private()
時有時無的切片異常
這是個簡單例子
my_list = [1, 2, 3, 4, 5] print(my_list[5])
執行一下,和我們預期的一樣,會拋出索引異常。
Traceback (most recent call last): File "F:/Python Script/test.py", line 2, in <module> print(my_list[5]) IndexError: list index out of range
但是今天要說的肯定不是這個,而是一個你可能會不知道的冷知識。
來看看,如下這種寫法就不會報索引異常,執行my_list[5:],會返回一個新list:[]。
my_list = [1, 2, 3] print(my_list[5:])
哪些情況不需要換行符
在寫代碼時,為了代碼的可讀性,代碼的排版是尤為重要的。
為了實現高可讀性的代碼,我們常常使用到的就是續行符 。
>>> a = talk is cheap, ... show me the code. >>> >>> print(a) talk is cheap,show me the code.
那有些情況下,是不需要寫續行符的呢?
經過總結,在這些符號中間的代碼換行可以省略掉續行符:[],(),{}
>>> my_list=[1,2,3, ... 4,5,6] >>> my_tuple=(1,2,3, ... 4,5,6) >>> my_dict={"name": "MING", ... "gender": "male"}
另外還有,在多行文本注釋中 ,續行符也是可以不寫的。
>>> text = talk is cheap, ... show me the code
上面只舉了一些簡單的例子。
但你要學會舉一反三。一樣的,在以下這些場景也同樣適用
類,和函數的定義。
列表推導式,字典推導式,集合推導式,生成器表達式
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。