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)
descriptormethod functionslotMRO自省(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, &
從上面的描述中你可以知道,mylist實際上遠比看到的大,可以認為是無窮的。
&>&>&>mylist[-1]()
[1, &
mylist[-1]()[-1]()
&>&>&>[1, &
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))
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, &
&>&>&> stream_plus[-1]()
[2, &
&>&>&> stream_plus[-1]()[-1]()
[3, &
Talks | Armin Ronacher"s Thoughts and Writings 這裡的pdf中有, 我截一段你看下或者這個網頁A Curious Course on Coroutines and Concurrency應該是將Python的yield用得超好了舉例:
空數組、空字典、空字元串在作為條件判斷時相當於False
- Descriptor HowTo Guide
- Decorators
- GIL http://www.dabeaz.com/python/UnderstandingGIL.pdf
- What does the yield keyword do in Python?
- What is a metaclass in Python?
- 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():
passclass B(A):
passclass 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 文本文檔快很多?
※你在閱讀源代碼或設計文檔時,看到哪些驚艷的技巧?
※導師想要招收什麼樣的研究生?
※俄羅斯計算機相關專業高等院校教育及科研現狀是怎樣的?