python 覆盖list_【Python妙招】gt;gt;gt;看腻了能不能换成别的啊……当然可以啦:)...
原文作者:站在兩個世界邊緣? & 小象
編輯:VL
今天給大家介紹幾個Python里(可能沒那么廣為人知的)小知識,希望能給大家帶來幫助,讓編程更有樂趣。
1.如何修改解釋器提示符
? ? 正常情況下,我們在終端下執行Python?命令是這樣的。
>>>?for?i?in?range(2):...?????print?(i)...01
你是否想過?>>>?和?...?這兩個提示符也是可以修改的呢?
sys.ps1?sys.ps2?是指定解釋器的主要和輔助提示的字符串。僅在解釋器處于交互模式時才定義這些。在這種情況下,它們的初始值是和。如果將非字符串對象分配給任一變量,則每次解釋器準備讀取新的交互式命令時都會重新評估該變量。這可以用來實現動態提示。’>>> ”… ‘str()
>>>?import?sys??????????????????????>>>?sys.ps1????????????????????????? >>>? ??????????????????????????????>>>?sys.ps2????????????????????????? ...? ??????????????????????????????>>>?????????????????????????????????
>>>?sys.ps2?=? ................ ?????????????????>>>?sys.ps1?=? Python編程時光>>> ???????
Python編程時光>>>for?i?in?range(2):?????
................????print?(i)????????????????????
................?????????????????????????????????0???????????????????????????????????1?????????
2. 類首字母不一定是大寫
在正常情況下,我們所編寫的所見到的代碼,好像都默許了類名首字母大寫,而實例用小寫的這一準則。但這并不是強制性的,即使你反過來的也沒有關系。
但有一些內置的類,首字母都是小寫,而實例都是大寫。
比如?bool?是類名,而?True,False?是其實例;
比如?ellipsis?是類名,Ellipsis是實例;
還有?int,string,float,list,tuple,dict?等一系列數據類型都是類名,它們都是小寫。
3. 增量賦值的性能更好
諸如?+=?和?*=?這些運算符,叫做?增量賦值運算符。
這里使用用?+=?舉例,以下兩種寫法,在效果上是等價的。
#?第一種a?=?1?;?a?+=?1
#?第二種a?=?1;?a?=?a?+?1
+=?其背后使用的魔法方法是?__iadd__,如果沒有實現這個方法則會退而求其次,使用?__add__?。
這兩種寫法有什么區別呢?
用列表舉例?a?+=?b,使用?__iadd__?的話就像是使用了a.extend(b),如果使用?__add__?的話,則是?a?=?a+b,前者是直接在原列表上進行擴展,而后者是先從原列表中取出值,在一個新的列表中進行擴展,然后再將新的列表對象返回給變量,顯然后者的消耗要大些。
所以在能使用增量賦值的時候盡量使用它。
4. and 和 or 的取值順序
and?和?or?是我們再熟悉不過的兩個邏輯運算符。而我們通常只用它來做判斷,很少用它來取值。
如果一個or表達式中所有值都為真,Python會選擇第一個值,而and表達式則會選擇第二個。
5. 省略號也是對象
...?這是省略號,在Python中,一切皆對象。它也不例外。
在?Python?中,它叫做?Ellipsis?。
在?Python?3?中你可以直接寫…來得到這玩意。
>>>?...
Ellipsis>>>?type(...)
<class? ellipsis >
而在?2?中沒有…這個語法,只能直接寫Ellipsis來獲取。
>>>?Ellipsis
Ellipsis>>>?type(Ellipsis) ellipsis >>>>
它轉為布爾值時為真
>>>?bool(...)
True
最后,這東西是一個單例。
>>>?id(...)4362672336>>>?id(...)4362672336
這東西有啥用呢?據說它是Numpy的語法糖,不玩Numpy的人,可以說是沒啥用的。
在網上只看到這個 用?...?代替?pass?,稍微有點用,但又不是必須使用的。
try:1/0except?ZeroDivisionError:
????...
6. 默認參數最好不為可變對象
函數的參數分三種
可變參數
默認參數
關鍵字參數
這里要說的是傳遞默認參數時,新手很容易踩雷的一個坑。
先來看一個示例
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?會與這個內存地址綁定。在后面的函數調用中,如果調用方指定了新的默認值,就會將原來的默認值覆蓋。如果調用方沒有指定新的默認值,那就會使用原來的默認值。
07. 訪問類中的私有方法
大家都知道,類中可供直接調用的方法,只有公有方法(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()????
08. 時有時無的切片異常
這是個簡單例子
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:])?
09. 哪些情況下不需要續行符
在寫代碼時,為了代碼的可讀性,代碼的排版是尤為重要的。
為了實現高可讀性的代碼,我們常常使用到的就是續行符?。
>>>?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
上面只舉了一些簡單的例子。
但你要學會舉一反三。一樣的,在以下這些場景也同樣適用
類,和函數的定義。
列表推導式,字典推導式,集合推導式,生成器表達式
10. Py2 也可以使用 print()
我相信應該有不少人,思維定式,覺得只有?Py3?才可以使用?print(),而?Py2?只能使用print? ?。
今天,小明要為?Py2?正名一次。
在Python 2.6之前,只支持
print?"hello"
在Python 2.6和2.7中,可以支持如下三種
print?"hello"
print("hello")print?("hello")
在Python3.x中,可以支持如下兩種
print("hello")print?("hello")
▼往期精彩回顧▼【Python應用】素質自動修正-thef***為什么要學編程?讓她們給你答案……【Python妙招】如何去除Django警告信息總結
以上是生活随笔為你收集整理的python 覆盖list_【Python妙招】gt;gt;gt;看腻了能不能换成别的啊……当然可以啦:)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ajax返回list前台遍历_List、
- 下一篇: scala seq java_Scala