使用os.path.exists()可以判斷文件或者文件夾是否存在,方法很簡單,括弧中放入需要判斷的路徑即可,如下
但這種時候容易混淆文件夾和文件,所以可以採用如下命令只檢查文件,同樣返回布爾型變數
如果文件不存在,直接用open()函數會拋出異常,這時候只要try一下並獲取異常即可,如下
上麵包含了文件不存在和文件不可讀取兩種錯誤類型,這兩種都屬於IO error,簡化一下有,
主要是通過文件的路徑來創建path對象,進而判斷路徑是否存在,如下
(想到這些簡單的知識都似曾相識,為什麼要零散地記錄呢
參考資料: https://www.py.cn/faq/python/12821.html
『貳』 Python 解決你的實際問題可以在哪些地方找資料
Python 標准庫:
應該瀏覽一下這份文檔,它為標准庫中的類型、函數和模塊提供了完整(盡管很簡略)的參考資料。標準的 Python 發布版包括了 大量 的附加模塊。其中有針對讀取 Unix 郵箱、接收 HTTP 文檔、生成隨機數、解析命令行選項、寫 CGI 程序、壓縮數據以及很多其它任務的模塊。略讀一下庫參考會給你很多解決問題的思路。
安裝 Python 模塊 展示了如何安裝其他 Python 用戶編寫的附加模塊。
Python 語言參考: 詳細說明了 Python 語法和語義。
它讀起來很累,不過對於語言本身,有份完整的手冊很有用。
其它 Python 資源:
http://www.python.org: Python 官方網站。它包含代碼、文檔和 Web 上與 Python 有關的頁面鏈接該網站鏡像於全世界的幾處其它問題,類似歐洲、日本和澳大利亞。
鏡像可能會比主站快,這取決於你的地理位置。
http://docs.python.org: 快速訪問 Python 的文檔。
http://pypi.python.org: Python 包索引,以前昵稱為乳酪店,索引了可供下載的,用戶創建的 Python 模塊。如果你發布了代碼,可以注冊到這里,這樣別人可以找到它。
http://code.activestate.com/recipes/langs/python/: Python 食譜是大量的示例代碼、大型的集合,和有用的腳本。
值得關注的是這次資源已經結集成書,名為《Python 食譜》(O』Reilly & Associates, ISBN 0-596-00797-3。)
http://scipy.org: The Scientific Python 項目包括數組快速計算和處理模塊,和大量線性代數、傅里葉變換、非線性solvers、隨機數分布,統計分析以及類似的包。
與 Python 有關的問題,以及問題報告,可以發到新聞組 comp.lang.python ,或者發送到郵件組 [email protected] 。新聞組和郵件組是開放的,所以發送的消息可以自動的跟到另一個之後。每天有超過 120 個投遞(高峰時有數百),提問(以及回答)問題,為新功能提建議,發布新模塊。在發信之前,請查閱 常見問題 (亦稱 FAQ),或者在 Python 源碼發布包的 Misc/ 目錄中查閱。郵件組也可以在 http://mail.python.org/pipermail/ 訪問。FAQ回答了很多被反復提到的問題,很可能已經解答了你的問題。
Next Previous
『叄』 如何在python(或特定大小的數組)中聲明0數組
只是為了安全起見:如果你要在python中聲明一個多維的0列表,你必須使用像這樣的列表:
buckets = [[0 for col in range(5)] for row in range(10)]
以避免引用共享。
有關更多詳細信息,請參閱Python FAQ。
『肆』 python如何垂直輸出
我們都知道使用print函數可以輸出內容,那麼怎麼才能向下垂直輸出呢?
Python的print()函數輸出時,通常輸出結果是整行顯示出來的,這時候我們需要考慮一下,我們輸出的結果需不需要換行?
不需要換行的方法也是嗯容易的的,這里就不多贅述了,來說說如何做到輸出換行:
常用的轉義符方式:\n
輸出結果
原文至:https://www.py.cn/faq/python/14976.html
『伍』 python中有switch語句嗎
python官網的回答(地址:https://docs.python.org/2/faq/design.html#why-isn-t-there-a-switch-or-case-statement-in-python):
You can do this easily enough with a sequence of if... elif... elif... else.
意思就是:python語法講究簡單明了,if else完全可以很簡單的實現switch的所有功能,沒必要用switch。
『陸』 python 的源代碼是否可以用於商業目的
如何成為一名黑客
什麼是黑客?
Jargon File中對「黑客」一詞給出了很多個定義,大部分定義都涉及高超的編程技術,強烈的解決問題和克服限制的慾望。如果你想知道如何成為一名黑客,那麼好,只有兩方面是重要的。(態度和技術)
長久以來,存在一個專家級程序員和網路高手的共享文化社群,其歷史可以追溯到幾十年前第一台分時共享的小型機和最早的ARPAnet實驗時期。 這個文化的參與者們創造了「黑客」這個詞。 黑客們建起了Internet。黑客們使Unix操作系統成為今天這個樣子。黑客們搭起了Usenet。黑客們讓WWW正常運轉。如果你是這個文化的一部分,如果你已經為它作了些貢獻,而且圈內的其他人也知道你是誰並稱你為一個黑客,那麼你就是一名黑客。
黑客精神並不僅僅局限於軟體黑客文化圈中。有些人同樣以黑客態度對待其它事情如電子和音樂---事實上,你可以在任何較高級別的科學和藝術中發現它。軟體黑客們識別出這些在其他領域同類並把他們也稱作黑客---有人宣稱黑客實際上是獨立於他們工作領域的。 但在本文中,我們將注意力集中在軟體黑客的技術和態度,以及發明了「黑客」一詞的哪個共享文化傳統之上。
另外還有一群人,他們大聲嚷嚷著自己是黑客,實際上他們卻不是。他們是一些蓄意破壞計算機和電話系統的人(多數是青春期的少年)。真正的黑客把這些人叫做「駭客」(cracker),並不屑與之為伍。多數真正的黑客認為駭客們是些不負責任的懶傢伙,還沒什麼大本事。專門以破壞別人安全為目的的行為並不能使你成為一名黑客, 正如拿根鐵絲能打開汽車並不能使你成為一個汽車工程師。不幸的是,很多記者和作家往往錯把「駭客」當成黑客;這種做法激怒真正的黑客。
根本的區別是:黑客們建設,而駭客們破壞。
如果你想成為一名黑客,繼續讀下去。如果你想做一個駭客,去讀 alt.2600 新聞組,並在發現你並不像自己想像的那麼聰明的時候去坐5到10次監獄。 關於駭客,我只想說這么多。
---黑客的態度
黑客們解決問題,建設事物,信仰自由和雙向的幫助,人人為我, 我為人人。
要想被認為是一名黑客,你的行為必須顯示出你已經具備了這種態度。要想做的好象你具備這種態度,你就不得不真的具備這種態度。但是如果你想靠培養黑客態度在黑客文化中得到承認,那就大錯特錯了。因為成為具備這些特質的這種人對你自己非常重要,有助於你學習,並給你提供源源不斷的活力。同所有有創造性的藝術一樣,成為大師的最有效方法就是模仿大師的精神---不是僅從理智上,更要從感情上進行模仿。
So,如果你想做一名黑客,請重復以下事情直到你相信它們:
1 這世界充滿待解決的迷人問題
做一名黑客有很多樂趣,但卻是些要費很多氣力方能得到的樂趣。 這些努力需要動力。成功的運動員從健壯體魄,挑戰自我極限中汲取動力。同樣,做黑客,你必須
要有從解決問題,磨練技術,鍛煉智力中得到基本的熱望。如果你還不是這類人又想做黑客,你就要設法成為這樣的人。否則你會發現,你的黑客熱情會被其他誘惑無情地吞噬掉---如金錢、性和社會上的虛名。
(同樣你必須對你自己的學習能力建立信心---相信盡管你對某問題所知不多,但如果你一點一點地學習、試探,你最終會掌握並解決它。)
2. 一個問題不應該被解決兩次
聰明的腦瓜是寶貴的,有限的資源。當這個世界還充滿其他有待解決的有趣問題之時,他們不應該被浪費在重新發明輪子這些事情上。 作為一名黑客,你必須相信其他黑客的思考時間是寶貴的---因此共享信息,解決問題並發布結果給其他黑客幾乎是一種道義,這樣其他人就可以去解決新問題而不是重復地對付舊問題。
(你不必認為你一定要把你的發明創造公布出去,但這樣做的黑客是贏得大家尊敬最多的人。賣些錢來給自己養家糊口,買房買車買計算機甚至發大財和黑客價值也是相容的,只要你別忘記你還是個黑客。)
3. 無聊和乏味的工作是罪惡
黑客們應該從來不會被愚蠢的重復性勞動所困擾,因為當這種事情發生時就意味著他們沒有在做只有他們才能做的事情---解決新問題。這樣的浪費傷害每一個人。因此,無聊和乏味的工作不僅僅是令人不舒服而已,它們是極大的犯罪。 要想做的象個黑客,你必須完全相信這點並盡可能多地將乏味的工作自動化,不僅為你自己,也為了其他人(尤其是其他黑客們)。
(對此有一個明顯的例外。黑客們有時也做一些重復性的枯燥工作以進行「腦力休息」,或是為練熟了某個技巧,或是獲得一些除此無法獲得的經驗。但這是他自己的選擇---有腦子的人不應該被迫做無聊的活兒。)
4 自由就是好
黑客們是天生的反權威主義者。任何能向你發命令的人會迫使你停止解決令你著迷的問題,同時,按照權威的一般思路,他通常會給出一些極其愚昧的理由。因此,不論何時何地,任何權威,只要他壓迫你或其他黑客,就要和他斗到底。
(這並非說任何權力都不必要。兒童需要監護,罪犯也要被看管起來。 如果服從命令得到某種東西比起用其他方式得到它更節約時間,黑客會同意接受某種形式的權威。但這是一個有限的、特意的交易;權力想要的那種個人服從不是你的給予,而是無條件的服從。)
權力喜愛審查和保密。他們不信任自願的合作和信息共享---他們只喜歡由他們控制的合作。因此,要想做的象個黑客,你得對審查、保密,以及使用武力或欺騙去壓迫人們的做法有一種本能的反感和敵意。
5. 態度不能替代能力
要做一名黑客,你必須培養起這些態度。但只具備這些態度並不能使你成為一名黑客,就象這並不能使你成為一個運動健將和搖滾明星一樣。成為一名黑客需要花費智力,實踐,奉獻和辛苦。
因此,你必須學會不相信態度,並尊重各種各樣的能力。黑客們不會為那些故意裝模做樣的人浪費時間,但他們卻非常尊重能力---尤其是做黑客的能力,不過任何能力總歸是好的。具備很少人才能掌握的技術方面的能力尤其為好,而具備那些涉及腦力、技巧和聚精會神的能力為最好。
如果你尊敬能力,你會享受提高自己能力的樂趣---辛苦的工作和奉獻會變成一種高度娛樂而非賤役。 要想成為一名黑客,這一點非常重要。
基本黑客技術
黑客態度是重要的,但技術更加重要。態度無法替代技術,在你被別的黑客稱為黑客之前,有一套基本的技術你必須掌握。 這套基本技術隨著新技術的出現和老技術的過時也隨時間在緩慢改變。例如,過去包括使用機器碼編程,而知道最近才包括了HTML語言。但現在明顯包括以下技術:
1 學習如何編程
這當然是最基本的黑客技術。如果你還不會任何計算機語言,我建議你從Python開始。它設計清晰,文檔齊全,對初學者很合適。盡管是一門很好的初級語言,它不僅僅只是個玩具。它非常強大,靈活,也適合做大型項目。
但是記住,如果你只會一門語言,你將不會達到黑客所要求的技術水平,甚至也不能達到一個普通程序員的水平---你需要學會如何以一個通用的方法思考編程問題,獨立於任何語言。要做一名真正的黑客,你需要學會如何在幾天內通過一些手冊,結合你現在所知,迅速掌握一門新語言。這意味著你應該學會幾種不同的語言。
如果要做一些重要的編程,你將不得不學習C語言,Unix的核心語言。其他對黑客而言比較重要的語言包括Perl和LISP。 Perl很實用,值得一學;它被廣泛用於活動網頁和系統管理,因此即便你從不用Perl寫程序,至少也應該能讀懂它。 LISP 值得學習是因為當你最終掌握了它你會得到豐富的經驗;這些經驗使你在以後的日子裡成為一個更好的程序員,即使你實際上可能很少使用LISP本身。
當然,實際上你最好四種都會。 (Python, C, Perl, and LISP). 除了是最重要的四種基本語言,它們還代表了四種非常不同的編程方法,每種都會讓你受益非淺。
這里我無法完整地教會你如何編程---這是個復雜的活兒。但我可以告訴你,書本和課程也不能作到。幾乎所有最好的黑客都是自學成材的。真正能起作用的就是去親自讀代碼和寫代碼。
學習如何編程就象學慣用自然語言寫作一樣。最好的做法是讀一些大師的名著,試著自己寫點東西,再讀些,再寫點,又讀些,又寫點....如此往復,直到你達到自己在範文中看到的簡潔和力量。
過去找到好的代碼去讀是困難的,因為很少有大型程序的可用源代碼能讓新手練手。這種狀況已經得到了很大的改善;現在有很多可用的開放源碼軟體,編程工具和操作系統(全都有黑客寫成)。這使我們自然地來到第二個話題...
2 得到一個開放源碼的Unix並學會使用、運行它
我假設你已經擁有了一台個人計算機或者有一個可用的( 今天的孩子們真幸福 :-) )。新手們最基本的一步就是得到一份Linux或BSD-Unix,安裝在個人計算機上,並運行它。
當然,這世界上除了Unix還有其他操作系統。但它們都是以二進制形式發送的---你無法讀到它的源碼,更不可能修改它。嘗試在DOS或Windows的機器上學習黑客技術,就象是在腿上綁了鐵塊去學跳舞。
除此之外,Unix還是Internet的操作系統。你可以不知道Unix而學會用Internet,但不懂它你就無法成為一名Internet黑客。因為這個原因,今天的黑客文化在很大程度上是以Unix為中心的。(這點並不總是真的,一些很早的黑客對此很不高興,但Unix和Internet之間的共生關系已是如此之強,甚至連微軟也無可奈何)
So,裝一個Unix---我個人喜歡Linux,不過也有其他選擇。(你也可以在同一台機器上同時運行DOS,Windows和Linux)學會它。運行它。用它跟Internet對話。讀它的代碼。試著去修改他。你會得到比微軟操作系統上好的多的編程工具(包括C,Lisp, Python, and Perl),你會得到樂趣,並將學到比你想像的更多知識。
關於學習Unix的更多信息,請看 The Loginataka.
要得到Linux,請看: 哪裡能得到 Linux.
3 學會如何使用WWW和寫HTML
大多黑客文化建造的東西都在你看不見的地方發揮著作用,幫助工廠、辦公室和大學正常運轉,表面上很難看到它對他人的生活的影響。Web是一個大大的例外。即便政客也同意,這個巨大而耀眼的黑客玩具正在改變整個世界。單是這個原因(還有許多其它的), 你就需要學習如何掌握Web。
這並不是僅僅意味著如何使用瀏覽器(誰都會),而是要學會如何寫HTML,Web的標記語言。如果你不會編程,寫HTML會教你一些有助於學習的思考習慣。因此,先建起自己的主頁。
但僅僅建一個主頁也不能使你成為一名黑客。 Web里充滿了各種網頁。多數是無意義的,零信息量垃圾。
要想有價值,你的網頁必須有內容---必須有趣或對其它黑客有用。這樣,我們來到下一個話題....
黑客文化中的地位大教堂與集市」,解釋了許多Linux和開放源碼文化的運做原理。我還在它的續集「大教堂與集市」,解釋了許多Linux和開放源碼文化的運做原理。我還在它的續集「開拓智域」一文中有更直接的論述。
FAQ(常問問題解答)
問:你會教我如何做黑客嗎?
自從第一次發布此頁,我每周都會得到一些請求,要我「教會他如何做黑客」;遺憾的是,我沒有足夠的時間和精力來做這個;我自己的編程項目已經佔用了我110%的時間。
甚至即便我想教你也不可能,黑客基本上是一項需要你自行修煉的的態度和技術。你會發現即使真正的黑客想幫助你,如果你乞求他們填鴨一樣教你的話,你不會贏得他們的尊敬。
首先去學習。顯示你在嘗試,你能靠自己去學習。然後再去向黑客們請教問題。
問:你會幫我「黑」掉一個站點嗎?或者教我怎麼黑它?
No. 任何在讀完FAQ後還問此問題人,都是愚不可及的傢伙,即使有時間我也不會理睬。 任何發給我的此類mail都會被忽略或被痛斥。
問:哪裡能找到真正的可以與之交流的黑客?
最佳辦法是就近參加一個Unix或Linux的用戶組,參加他們的會議。
問:我該先學哪種語言?
HTML, 如果你還不會的話.
但它不是一個真正的編程語言。當你准備編程時,我建議你從 Python開始. 會有很多人向你推薦Perl,它比Python還受歡迎,但卻難學一些。
C 是非常重要的,但它卻是最難學的。不要一開始就嘗試學C。
問:開放源碼的自由軟體不會使程序員餓肚子嗎?
這似乎不大可能---到目前,開放源碼軟體產業創造了而不是消滅了大量工作機會。
如果寫一個程序比不寫一個程序只是個純粹經濟上的收益的話,無論它是否免費,只要它被完成,程序員都會從中得到回報。而且,無論軟體是由多麼的free的方法開發的,對更新的軟體應用的需求總是會有的。
問:我從何學起?哪裡有免費的Unix?
本頁的其他地方指向最常用的免費Unix。要做一名黑客,你需要自立自強,以及自我教育的能力。
現在開始吧......
參考資料:
『柒』 微軟官方上線 Python 教程
微軟近日上線了一套 Python 教程《Develop with Python on Windows》,文檔內容包括設置 Python 開發環境、在 Windows 與 WSL 子系統中安裝相應開發工具,以及集成 VS Code 與 Git 工具並進行開發等。
具體來看,課程有以下幾個章節:
相應章節的內容都比較詳細,值得一提的是 FAQ,學習 Python 的人肯定會被 Python 的各種各樣的問題困擾,在 FAQ 中,有一些常見問題的詳細解答,比如:
Python 正在變得越來越受歡迎,這點毋庸置疑,單單看一下我們近期跟蹤的 TIOBE 編程語言排行榜,連續幾個月榜單的焦點都在 Python 上:
現在微軟官方都出了 Python 教程,看來這把火又要再烈一些了,你覺得呢?
教程地址:「鏈接」
『捌』 誰知道這個python數據分析教程是哪個機構的嗎或者有資源的! 非常感謝
使用Python進行數據挖掘是最近幾年才開始火起來的,之前網上很多的資料都是關於Python網頁開發等。但使用Python進行數據挖掘的側重點已經完成不一樣了。本人就是浪費了很多時間來篩選這些博客、書籍。所以就有了本文,希望能幫大家少走一點彎路。
熟練掌握任何一門語言,幾乎都需要經過以下過程:
良師--學習Python課程+入門書籍+瀏覽技術博客
社區幫助--善於使用搜索引擎、Mail List
益友 -- 尋找學習夥伴
Learn by Code --項目實踐
一、Python學習課程推薦
這兩個學習課程從最基礎的Python語法開始,介紹了Python數據分析、統計模型以及機器學習的各個方面,內容十分充足。之所以建議使用老外的課程是因為,老外上課假定你什麼都不會,講解深入淺出,尤其是對於華盛頓大學的機器學習課程,把復雜的概念講解得十分簡單。
1. 密歇根大學的《學習使用Python編程並分析數據》主要包括以下課程(講解十分詳細,深入淺出,非常適合入門學習,視頻都是有字幕的):
《大家的編程 (Python 入門》:課程涵蓋了如何使用Python的基本指令編寫程序. 課程對學生沒有先設要求, 我們只涉及到最基本的數學, 有一定使用電腦經驗的人都可以完全掌握這門課的內容.
《Python 數據結構》:本課程將介紹Python編程語言的核心數據結構。我們將學習編程語言的基礎概念,探索如何使用Python的內置數據結構,如列表、字典、元組,進行更為復雜的數據分析。
《使用 Python 訪問網路數據》:使用Python爬取和解析網路數據
《Python 資料庫開發》:使用Python和資料庫進行交互
《使用 Python 獲取並處理數據,並用可視化方式展現數據》
2. 華盛頓大學的《機器學習》專項課程
在專項課程頁面無法選擇旁聽,必須點擊進入單獨課程頁面才可,這個課程專題旁聽是有限制的,無法提交作業;如有需求,可以申請獎學金,回答三個問題即可,系統自動通過申請。
《機器學習基礎:案例研究》:你是否好奇數據可以告訴你什麼?你是否想在關於機器學習促進商業的核心方式上有深層次的理解?你是否想能同專家們討論關於回歸,分類,深度學習以及推薦系統的一切?在這門課上,你將會通過一系列實際案例學習來獲取實踐經歷。
《機器學習:回歸》
《機器學習:分類》
《機器學習:聚類和檢索》
《機器學習:推薦系統和降維》
《機器學習:應用深度學習創建智能運用》
二、網上打碼教程
Learn by doing!!! 學習編程最有效的方式就是敲代碼!
Codecademy圍繞Python 的基礎語法,內容非常豐富。
DatacampPython基本語法(他家的R語言課程十分不錯!)
三、Python技術博客
簡單介紹一些非常棒的Python技術學習的博客
1.廖雪峰Python教程簡單易上手的Python基礎語法教程,值得學習, Python 2和Python 3版本都有。
2.非常棒的pandas練習Github Repo
3.很詳細的Python 爬蟲教程
4.國外Data Science博客大全
四、Python入門書籍推薦
常用書籍下載網址,幾乎囊括了網上能找得到的所有Python相關的書籍(PDF、Epub和mo bi格式),且提供雲盤下載鏈接。你值得擁有!
python | 搜索結果
1. 掌握Python語法的基礎上學習《Python for data analysis》是比較不錯的選擇,涵蓋了ipython notebook、Numpy、Scipy和Pandas包的使用。
2.《Python數據分析與挖掘實戰》介紹了使用Python進行數據挖掘的詳細案例,數據和代碼都可以下載,作為機器學習的進階學習是不錯的選擇(這本書也用對應的R語言和Matlab 版本)。
3.《Python Cookbook》很厚的一本書,可以作為Python語法查詢手冊。
再添加幾個外文書籍下載網址:
1.All IT eBooks全
2.Library Genesis各種書籍,不局限於編程書籍
3.Fox eBook - eBooks Free Download Site
4.Development / Programming / AvaxHome
五、推薦訂閱博客(更細頻率較高)
iPhone上可以使用Reeder閱讀器,Instapaper用來保存後稍後閱讀,因為信息量比較大。
No free HunchKaggle競賽平台的官方博客,包括一些優秀的代碼解讀以及高分選手的采訪,十分有用的經驗(來自不同背景,不同年齡層次,不同職業的選手)
Flowing Data十分有用的數據分析的案例
Python日報內容十分精彩的集錦(中文)
六、FAQ (待續)
Python 2.x還是Python 3.x?
如何安裝Python包? 強烈推薦Anaconda包,你值得擁有!尤其是Windows系統。
是否需要很強的統計和數學背景? 有良好的數學和統計背景固然很好,但是現在很多崗位對數學和統計背景要求並不很多,都是簡單的演算法,Python編程已經能夠很方便地實現,更多的是對業務的深入理解。如有需要建議,邊學習Python邊學習數學統計。
七、實踐項目
Kaggle競賽項目,裡面不僅僅有很多競賽項目,而且有很多可供學習的代碼、博客以及論壇,都是實戰項目,有很強的實踐價值。
『玖』 python怎樣向手持設備推送消息
關注leancloud已經有一段時間了,其宣布的眾多開發語言支持,以及SMS, 對象存儲,
用戶管理及鑒權,推送,聊天等服務對於開發目前主流的移動應用來說,吸引力很大。我們開發的不同移動應用,需要去維護不同的管理後台和服務,開發起來重復
而繁瑣,如果leancloud能夠幫助我們減輕這些工作,那真是物超所值。
為了將應用遷移到leancloud的方案大概如下:
使用leancloud作為後端存儲,用戶管理和鑒權引擎;
使用python開發一個管理界面, 來幫助管理員編輯文章,發布信息;
使用js, oc作為前端語言來開發用戶界面;
在第二步的時候, 我們希望先試驗下如下兩個簡單的user cases:
創建若干個對象,存儲在leancloud中;
注冊一個用戶,確定注冊結果,並能驗證提供的手機和郵箱;
就
是這么兩個最簡單的用例,一整個晚上下來,居然沒有搞定。 首先,除了官方文檔,leancloud基本很難看到任何其它形式的文檔,比如FAQ,
論壇,社區,stackoverflow, 反正google不出來,其次,就是這僅有的官方文檔,也是坑爹啊,
以下是我從官方文檔上的代碼片段,幾乎未做修改。
Default
# -*- coding: utf-8 -*-#coding=utf-8import leancloudAPP_ID=''APP_KEY=''MASTER_KEY=''leancloud.init(APP_ID, "%s/%s" % (APP_KEY, MASTER_KEY))user = leancloud.User()user.set("username", "admin")user.set("password", "admin")user.set("email", "[email protected]")# other fields can be set just like with leancloud.Objectuser.set("phone", "415-392-0202")try:user.sign_up()except Exception, e:print e# Hooray! Let them use the app now.
『拾』 python 為什麼有深拷貝淺拷貝
在寫Python過程中,經常會遇到對象的拷貝,如果不理解淺拷貝和深拷貝的概念,你的代碼就可能出現一些問題。所以,在這里按個人的理解談談它們之間的區別。
一、賦值(assignment)
在《Python FAQ1》一文中,對賦值已經講的很清楚了,關鍵要理解變數與對象的關系。
12345
>>> a = [1, 2, 3]>>> b = a>>> print(id(a), id(b), sep='\n')
在Python中,用一個變數給另一個變數賦值,其實就是給當前內存中的對象增加一個「標簽」而已。
如上例,通過使用內置函數 id() ,可以看出 a 和 b 指向內存中同一個對象。a is b會返回 True 。
二、淺拷貝(shallow )
注意:淺拷貝和深拷貝的不同僅僅是對組合對象來說,所謂的組合對象就是包含了其它對象的對象,如列表,類實例。而對於數字、字元串以及其它「原子」類型,沒有拷貝一說,產生的都是原對象的引用。
所謂「淺拷貝」,是指創建一個新的對象,其內容是原對象中元素的引用。(拷貝組合對象,不拷貝子對象)
常見的淺拷貝有:切片操作、工廠函數、對象的()方法、模塊中的函數。
12345678910
>>> a = [1, 2, 3]>>> b = list(a)>>> print(id(a), id(b)) # a和b身份不同140601785066200 140601784764968>>> for x, y in zip(a, b): # 但它們包含的子對象身份相同... print(id(x), id(y))... 140601911441984 140601911442048
從上面可以明顯的看出來,a 淺拷貝得到 b,a 和 b 指向內存中不同的 list 對象,但它們的元素卻指向相同的 int 對象。這就是淺拷貝!
三、深拷貝(deep )
所謂「深拷貝」,是指創建一個新的對象,然後遞歸的拷貝原對象所包含的子對象。深拷貝出來的對象與原對象沒有任何關聯。
深拷貝只有一種方式:模塊中的deep函數。
1234567891011
>>> import >>> a = [1, 2, 3]>>> b = .deep(a)>>> print(id(a), id(b))140601785065840 140601785066200>>> for x, y in zip(a, b):... print(id(x), id(y))... 140601911441984 140601911442048
看了上面的例子,有人可能會疑惑:
為什麼使用了深拷貝,a和b中元素的id還是一樣呢?
答:這是因為對於不可變對象,當需要一個新的對象時,python可能會返回已經存在的某個類型和值都一致的對象的引用。而且這種機制並不會影響 a 和 b 的相互獨立性,因為當兩個元素指向同一個不可變對象時,對其中一個賦值不會影響另外一個。
我們可以用一個包含可變對象的列表來確切地展示「淺拷貝」與「深拷貝」的區別:
>>> import >>> a = [[1, 2],[5, 6], [8, 9]]>>> b = .(a) # 淺拷貝得到b>>> c = .deep(a) # 深拷貝得到c>>> print(id(a), id(b)) # a 和 b 不同139832578518984 139832578335520>>> for x, y in zip(a, b): # a 和 b 的子對象相同... print(id(x), id(y))... 139832578622816 139832578623104>>> print(id(a), id(c)) # a 和 c 不同139832578518984 139832578622456>>> for x, y in zip(a, c): # a 和 c 的子對象也不同... print(id(x), id(y))... 139832578622816 139832578623392
從這個例子中可以清晰地看出淺拷貝與深拷貝地區別。
總結:
1、賦值:簡單地拷貝對象的引用,兩個對象的id相同。
2、淺拷貝:創建一個新的組合對象,這個新對象與原對象共享內存中的子對象。
3、深拷貝:創建一個新的組合對象,同時遞歸地拷貝所有子對象,新的組合對象與原對象沒有任何關聯。雖然實際上會共享不可變的子對象,但不影響它們的相互獨立性。
淺拷貝和深拷貝的不同僅僅是對組合對象來說,所謂的組合對象就是包含了其它對象的對象,如列表,類實例。而對於數字、字元串以及其它「原子」類型,沒有拷貝一說,產生的都是原對象的引用。