盤點 Python 中的那些冷知識(二)

上一篇文章分享了 Python中的那些冷知識,地址在這裏html

今天將接着分享!!python

06. 默認參數最好不爲可變對象

函數的參數分三種sql

  • 可變參數
  • 默認參數
  • 關鍵字參數

這三者的具體區別,和使用方法在 廖雪峯的教程 裏會詳細的解釋。這裏就不搬運了。json

今天要說的是,傳遞默認參數時,新手很容易踩雷的一個坑。ruby

先來看一個示例app

def func(item, item_list=[]):
    item_list.append(item)
    print(item_list)

func('iphone')
func('xiaomi', item_list=['oppo','vivo'])
func('huawei')

在這裏,你能夠暫停一下,思考一下會輸出什麼?iphone

思考事後,你的答案是否和下面的一致呢函數

['iphone']
['oppo', 'vivo', 'xiaomi']
['iphone', 'huawei']

若是是,那你能夠跳過這部份內容,若是不是,請接着往下看,這裏來分析一下。spa

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 = [12345]
print(my_list[5])

執行一下,和咱們預期的同樣,會拋出索引異常。

Traceback (most recent call last):
  File "F:/Python Script/test.py", line 2in <module>
    print(my_list[5])
IndexError: list index out of range

可是今天要說的確定不是這個,而是一個你可能會不知道的冷知識。

來看看,以下這種寫法就不會報索引異常,執行my_list[5:],會返回一個新list:[]。

my_list = [123]
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")

相關文章
相關標籤/搜索