Python 有哪些新手不會了解的深入細節?

新手覺得簡單,但其實這玩意不比C簡單。有哪些區分新手和老手的知識,習慣和細節呢?謝謝!


前人問過了:

Hidden features of Python

摘抄目錄:

  • Argument Unpacking
  • Braces
  • Chaining Comparison Operators
  • Decorators
  • Default Argument Gotchas / Dangers of Mutable Default arguments
  • Descriptors
  • Dictionary default .get value
  • Docstring Tests
  • Ellipsis Slicing Syntax
  • Enumeration
  • For/else
  • Function as iter() argument
  • Generator expressions
  • import this
  • In Place Value Swapping
  • List stepping
  • __missing__ items
  • Multi-line Regex
  • Named string formatting
  • Nested list/generator comprehensions
  • New types at runtime
  • .pth files
  • ROT13 Encoding
  • Regex Debugging
  • Sending to Generators
  • Tab Completion in Interactive Interpreter
  • Ternary Expression
  • try/except/else
  • Unpacking+print() function
  • with statement

另外還有一個是黑魔法元類:

譯文:http://blog.jobbole.com/21351/

原文:http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python


了解內建的幾大容器list/dict/set用什麼數據結構實現,以及一些基本操作的時間複雜度。這個不難,python的list實際上就是個vector,不是linked list,dict/set就是hash table。。然後避免犯頻繁在list中間插入/刪除之類的錯誤

這也使得python不適合函數式編程,像什麼lambda不能跨行都是小事,但是標準庫里連持久化的列表/搜索樹都沒有。。自己實現也不是不行,CPython函數調用開銷又大。

所以還是老老實實寫循環、拋異常吧,When in Rome, do as the Romans do。


迭代器,生成器,可迭代對象。搞清楚這幾個概念,面試官就會覺得你很牛逼了。


列幾個關鍵字吧:

decorator

yield(generator)

descriptor

method function

slot

MRO

自省(id、type、dir、vars等等)

然後就是各種常用的模塊吧,itertools、functools、collections、copy等吧

最後有興趣的話可以讀一下陳儒寫的《Python源碼剖析》,可以了解到小整數緩存,int、list、dict緩存池,字元串intern機制,內存管理等內部實現。


某個主要分支的某個小版本被牆了


我覺得copy,deepcopy,=這算一個


你可以學完基礎Python的語法之後學一下其他語言,看看他們的一些特徵能不能在Python中實現。

我舉個小例子。

在Racket裡面,有一個stream的構造。

(define ones (lambda () (cons 1 ones)))

這就是說,有一個pair(你可以當成list來理解),它的結構用起來是這樣的,我轉化成Python的list寫給你看

[1, lambda: [1, lambda: [1, lambda....]]]

lambda在call之前是不會執行的,這在Racket裡面叫thunks(當然不是Racket特有的),這種設置就使得你可以在用的時候再對它進行value,節省一些不必要的計算。

這就類似於Python 2 里xrange 和 range 的那個區別一樣。

這個時候就可以去Python裡面實驗一下這個特性是否存在。

mylist = [1, lambda: mylist]

這樣可以得到

&>&>&>mylist
&>&>&>[1, & at 0x02E7E6F0&>]

從上面的描述中你可以知道,mylist實際上遠比看到的大,可以認為是無窮的。

&>&>&>mylist[-1]()
[1, & at 0x02E7E6F0&>]
mylist[-1]()[-1]()
&>&>&>[1, & at 0x02E7E6F0&>]

Python廣泛借鑒了許多語言的優點,只要你覺得別的語言哪個地方設計的好,不知道Python有沒有,就可以回來試試,說不定Python也有。

大概就是這樣一個思路吧。

——————————————————

@任遠 在這裡有代碼環境,從這裡回復你吧。

用yield就是和這個功能類似,要構造stream的話在Racket里是這樣構造的。

(define (stream-maker fn arg)
(letrec ([f (lambda (x)
(cons x (lambda () (f (fn x arg)))))])
(lambda () (f arg))))

(define ones (stream-maker (lambda (x y) 1) 1))

轉換成python直接這樣寫就可以:

def stream_maker(fn,arg):
return [arg, lambda :stream_maker(fn,fn(arg))]

自然數流就是這樣,從1開始好了

stream_plus = stream_maker(lambda x:x+1,1)

然後是這樣的

&>&>&> stream_plus
[1, &.& at 0x02ED16F0&>]
&>&>&> stream_plus[-1]()
[2, &.& at 0x02ED1738&>]
&>&>&> stream_plus[-1]()[-1]()
[3, &.& at 0x02ED17C8&>]


Talks | Armin Ronacher"s Thoughts and Writings 這裡的pdf中有, 我截一段你看下

或者這個網頁A Curious Course on Coroutines and Concurrency應該是將Python的yield用得超好了

舉例:


空數組、空字典、空字元串在作為條件判斷時相當於False


  1. Descriptor HowTo Guide

  2. Decorators

  3. GIL http://www.dabeaz.com/python/UnderstandingGIL.pdf

  4. What does the yield keyword do in Python?

  5. What is a metaclass in Python?

  6. Tasks and coroutines

PS:Hidden features of Python 有一個參考譯文:Python 實用技巧(上)


正負數除法求商和餘數的值


難道不是好好讀完PEP8?


一個非常重要的內置函數: type 。


我覺得最有趣的莫過於Method Resolution Order(MRO)。

MRO是指class inheritance中method或者attribute的search order。最簡單的情況是classic class的 inheritance tree。這時候,search order是depth first, from left to right。

舉個例子:

class A():

pass

class B(A):

pass

class C(A):

pass

class D(B, C):

pass

在上面的inheritance tree中,class D的MRO應該是 D,B,A,C。值得注意的是,A的位置在C的前面。

對於new style class, python 2.2和2.3(或以上)也有區別,2.3以後的MRO algorithm叫C3 algorithm。具體的細節大家可以google一下,個人覺得非常有趣。


如果你為了實現一個功能寫了好幾十行代碼還沒有完成,那就趕緊停下來,一定有辦法在幾行之內解決問題的。

PS:不要問我是怎麼知道的。


補充一點:多線程中不能強制結束線程,只能用join阻塞進程,而java等其他多數語言都有相應的interrupt函數


初學者學python,剛開始會因為語法簡單而格外興奮。其實要知道,還是有很多需要深入理解的細節需要仔細琢磨。

列舉幾個:字元編碼、列表解析式、迭代器、生成器、裝飾器、元類等等。目前寫了一個專欄,都一一仔細分析介紹,還在不斷更新:

專欄鏈接:給妹子講python,歡迎大家關注,提意見!

給妹子講python--04迭代和列表解析式

給妹子講python--08理清python的字元編碼

給妹子講python--14可迭代對象和迭代器

還有生成器、裝飾器等內容會陸續發布,歡迎關注~


推薦閱讀:

小白如何在最短時間內成長為熟悉主流編程語言的高手?
為什麼打開一個幾兆的 .jpg 圖片比打開一個幾兆的 .txt 文本文檔快很多?
你在閱讀源代碼或設計文檔時,看到哪些驚艷的技巧?
導師想要招收什麼樣的研究生?
俄羅斯計算機相關專業高等院校教育及科研現狀是怎樣的?

TAG:編程語言 | Python | 編程 | 計算機科學 |