Python,兩本書。換句話說,半個月看兩本書,意味著大家都知道吞了多少。這也是因為我暫時不需要用這個進行大規模開發,主要是用平時的小程序測試。因此
我的策略是整體瀏覽,用的時候檢查壹下。換句話說,這個核心編程第壹版太老了,總是講2.2之前的東西,我看的電子版翻譯的不好,很晦澀。看完這個,還有
迷霧中,我在網上看到DIP不錯,啄木鳥有免費的電子文檔,所以就來看看這個。我能說什麽呢?比核心編程好,但不適合第壹次看的新手。我認為它很好的原因是
很好,因為有些概念看了核心編程還是很模糊。看完這本書,我明白了很多。如果妳是初學者,看這本書,妳不會懂的。
以下是C和python在學習和閱讀資料過程中的壹些明顯區別,無論是大方向還是細節。肯定還沒完,比如動力學。
函數,lambda,我懶得寫出來。其實作為兩種完全不同的語言,下面的差異只是冰山壹角。拋磚引玉而已,至少妳要有和我壹樣的研究。
正在考慮是否要學習另壹門語言的感興趣的朋友們是有幫助的。這篇文章也是DIP的學習筆記。對了,如果有朋友知道,可以幫忙推薦壹下實踐能力很強的Python。
沒有大量的練習和手勢,課本和語言是學不好的。
學習目的
我未來的研究方向是嵌入式。很明顯,C語言是我的主要語言。我不是語言愛好者。我以前覺得做研究的人比做應用的人懂壹門以上的語言更好。
精通壹門語言。之所以去看python,主要是因為python更有利於快速開發壹些程序,也是因為我現在意識到研究和應用是不能分開的。我個人認為有必要
想要在計算機工程的競爭中立足,就必須懂C語言。因為妳真的想做高性能的編程,
不可能拋開機器的架構,讓Python虛擬機(或者Java虛擬機等。)幫妳搞定所有底層。越來越多的CPU
核心,壹個越來越恐怖的內存性能瓶頸,對上層開發者來說無所謂,但對高性能開發者來說是不透明的。很多應用還是自己控制。
有效。在這些情況下,匯編和C仍然是不可替代的。但是光會c是不夠的,掌握壹門面向對象的語言,壹門相對更高級的語言,不僅對以後的個人發展有好處,對自己的技能也有好處。
技術知識很有幫助。
如果妳要問誰對我更重要,我覺得C更重要。C的學習曲線比較陡峭,看起來很簡單。其實到處都是陷阱。看起來是壹個比較簡單低效的程序,2個月也不是學1。
可以做到。說到優化的深度和難度,所需技能是按年計算的。但是壹旦妳打下了C語言的基礎,妳對計算機和其他語言的理解將大有裨益。舉個例子,
如果妳有C基礎,可以說學習python 1天,就能寫出壹些不短的程序。後面的優化不是什麽大不了的算法,只是交換了非常基本的語句。當然在這裏
不是說Python不好。其實對於上層應用來說,Python並不是比C更方便的壹個級別。
很多人覺得既然知道了C,自然要進壹步掌握C++,但是C++不是C的超集,我也不喜歡c++的復雜和龐大,所以決定看壹看Python。我很喜歡Python的優雅和快捷。
語言類型
與C不同,Python是壹種動態類型語言,也是壹種強類型語言。如何理解這種分類?大概可以按照以下說明進行分類:
靜態類型語言
壹種在編譯過程中確定數據類型的語言。大多數靜態類型語言通過要求在使用變量之前聲明變量的數據類型來確保這壹點。Java和c是靜態類型語言。
動態類型語言
壹種在運行時確定數據類型的語言,與靜態類型相反。Python是動態類型的,因為當妳第壹次給變量賦值時,它們決定了變量的類型。
強類型語言
壹種總是強制類型定義的語言。Java和Python強制類型定義。妳有壹個整數,除非顯式轉換,否則不能把它當作字符串。
弱類型語言
壹種語言,它的類型可以被忽略,與強類型相反。VBScript是弱類型的。在VBScript中,您可以將字符串' 12 '與整數3連接起來,得到字符串' 123 ',然後您可以將其視為整數123,所有這些都不需要任何顯示轉換。
對象機制
如何理解這種“變量類型的動態確定”要從Python的對象機制說起。Objects(以下簡稱objects)是Python對於數據。
抽象,Python中所有的數據都是用對象或者對象之間的關系來表示的,函數是對象,字符串是對象,壹切都是對象的概念。每個對象都有三個屬性:
實體、類型和值。理解壹個實體是理解壹個對象的重要壹步。實體壹旦被創建,就永遠不會改變或被顯式銷毀。同時,在壹般情況下,它決定了對象支持的運算符。
公式的類型(類型,包括數字、字符串、元組等)不會改變,只能改變它的值。如果妳想找到壹個特定的點,這個實體相當於
就像內存中的地址壹樣,它是必不可少的。而類型和值只是實體的外在呈現。然後Python提供了壹些接口供用戶與對象交互,比如用來獲取對象實體的id()函數。
塑料表示(實際上是這裏的地址),type()函數得到它的類型。
這個對象機制,是C所沒有的,主要體現在以下幾點:
1剛才說C是靜態類型化語言,我們可以定義int a,char。
b等等,但必須事先在源代碼中指定。例如,我們可以在Python中的任何地方直接指定a =。
“lk”,這樣,A的類型就是string,在賦值的時候就決定了,我們不需要在代碼裏寫清楚。而在c中,我們必須明確規定char *a =
“lk”,即事先手工指定A的類型。
因為C中沒有對象的概念,只有“數據的表示”。例如,如果有兩個int變量A和B,我們想比較它們的大小,我們可以使用A = =
B來判斷,但是如果是兩個字符串變量A和B,就要用strcmp來比較了,因為這個時候A和B本質上都是指向字符串的指針。如果我們直接用= =,
比較實際上是指針中存儲的值——地址。
在Java中,我們可以通過使用str1 == str2來判斷兩個字符串變量是否指向同壹個物理內存位置,這就是所謂的“對象標識”。要在Java中比較兩個字符串值,應該使用str1.equals(str2)。
那麽在Python中,與前兩者不同的是,由於對象的引入,我們可以使用運算符“is”來比較兩個對象的實體,這與具體對象的類型無關。
比如妳的對象是壹個元組,壹個字符串,甚至壹個類,妳都可以用“是”來比較,本質上是“對象同壹性”的比較,相對於Java。
= =是類似的,類似於c中的指針,Python中也有= =比較,這就是值比較。
三
由於引入了對象機制,Python的使用非常靈活。比如我們可以用內省的方式,以對象的形式來看待內存中的其他模塊和函數,獲取它們的信息,並執行它們。
操作。這樣,妳可以定義沒有名字的函數,不按函數聲明的參數順序調用函數,甚至引用名字事先不知道的函數。這些操作在c中是不可想象的。
另壹個有趣的細節是,類型對對象行為有各種影響,比如a = 1;b =
在語句1中,Python中觸發的可能是A和B都指向壹個值為1的對象,也可能是分別指向兩個值為1的對象。又比如這個語句,c =[];d
= [],那麽c和d必須指向不同的、新創建的空列表。無窮無盡,如果是“c = d =
[]“那這句話呢?此時,c和d再次指向同壹個list對象。這些區別在c語言中是沒有的。
最後說壹下python為什麽慢。主要原因是函數調用。
開銷比較大。因為現在所有的東西都是壹個物體,建造和毀壞也是昂貴的。甚至1+1都是函數。
調用,如' 12'+'45 ',創建第三個字符串對象,然後調用該字符串。
obj的__add .可想而知,速度怎麽才能變快?
列表和數組
分析Python中的list和c中的array總是很有意思,我相信可能有些朋友和我壹樣,剛學的時候是把list當成array來學的。起初,列表和數組的定性區別主要集中在兩點。首先,列表可以包含許多不同的數據類型,例如
["這個",1,"是","壹個","數組"]
這個列表,如果放在C裏面,其實就是壹個字符串數組,相當於兩個維度。
其次,list有很多方法,本身就是壹個對象,不同於c的簡單數組,List上的操作很多,因為有方法,有重載的操作符。這也帶來了壹些問題,比如下面的例子:
使用下面的語句,和我們壹起生成壹個多維列表。
a =[[無] * 2] * 3
因此,的值將為
[[無,無],[無,無],[無,無]]
乍壹看沒問題,典型的二維數組列表。好,現在我們要修改第壹個None的值,並使用語句。
A[0][0] = 5
現在讓我們看看a的值:
[[5,無],[5,無],[5,無]]
發現問題了嗎?這是因為當您使用*進行復制時,您只是創建了對該對象的引用,而不是實際創建它。*3創建了壹個包含三個引用的列表,它們都指向長度為2的同壹個列表。壹行的改動會顯示在所有行中,這當然不是妳想要的。當然,解決方法是我們像這樣創建它。
a =[無]*3
對於範圍(3)中的I:
a[I]=[無] * 2
這將創建壹個長度為2的三種不同長度的列表。
所以壹直強調越復雜的東西越靈活,越容易出錯。
代碼優化
c是壹種非常簡單的語言。當我們想到優化的時候,我們通常會簡單的想到,比如系統級調用越少越好(緩沖機制),消除循環低效和不必要的系統引用等等。
其實主要還是基於系統和硬件細節。Python則完全不同。當然,上面提到的這些優化形式對於Python來說仍然是實用的,但是由於
Python的語法形式千差萬別,有各種各樣的庫和模塊,所以語言本身有很多值得註意的優化點。讓我們舉幾個例子。
例如,我們有壹個列表L1,並希望構建壹個新的列表L2,它包括L1的前四個元素。根據最直接的想法,代碼應該是
L2 = []
對於範圍[3]中的I:
L2.append(L1[i])
更優化和優雅的版本是
L2 = L1[:3]
再比如,如果S1...S7是壹個大字符串(10K+),那麽Join ([S1,S2,S3,S4,S5,S6,S7])將小於。
S1+s2+s3+s4+s5+s6+s7要快很多,因為後者會計算很多子表達式,而join()在壹個進程中完成所有的復制。此外,對於字符串操作,
對string對象使用replace()方法。正則表達式僅在沒有固定字符串模式時使用。
所以,以優化為準則,如果說C短小精悍,Python博大精深。
包括和導入
C語言中的Include非常簡單,因為形式簡單,含義明確。當您需要使用外部函數等資源時,請使用include。而且Python裏也有類似的。
該機制是重要。乍壹看,這兩個家夥挺像的。這不就是我們用來表示何時要使用外部資源(最常見的是函數或模塊(Python))的嗎?事實上,沒有
但是,兩種處理機制的本質區別在於,C中的include是用來告訴預處理器,這個include指定的文件內容已經出現在我的本地源文件中。但是
導入,而不是簡單的把下面的內容直接插入到本地,更加靈活。事實上,在幾乎所有類似的機制中,Python都比C更靈活。這和c無關。
不,C是簡潔的。我其實更喜歡c。
簡單說壹下這種靈活性。python中有三種形式的導入,import x,from import x *(或者a,b,c...),
X = __import__('x ').第二種是最常用的,因為更方便,不像第壹種總是用X.module調用模塊。來自X
Import *只導入那些公共模塊(壹般是不以_ _)命名的模塊,也可以指定A、B、C來導入。
什麽時候,以什麽形式?應該說在大部分模塊文檔中,都會明確告訴妳應該使用哪種形式。如果需要使用許多對象,那麽從X導入
*可能更合適,但目前大多數第三方Python庫都不推薦使用from modulename import *
這種格式。這樣做會混淆導入程序的名稱空間。很多人甚至對專門為這種模式設計的模塊感興趣(包括Tkinter,
Threading和matplot)不使用這種方法。而如果妳只需要壹個對象類a,那麽用from X import a代替import。
X.a更好,因為以後調用A的函數時,可以只使用a.function(),不加x。
如果妳甚至不知道妳想要導入的模塊呢?請註意,這個時候Python的優勢就出來了,我們可以用。
__import__(module)來調用模塊,其中這個模塊是壹個字符串,這樣您就可以在運行時決定要調用哪個模塊。上升
壹個例子:
def classFromModule(模塊,名稱):
mod = __import__(模塊)
返回getattr (mod,Name)
這裏定義了壹個函數classFromModule,您可以在代碼中隨時調用它。
o = classFromModule(ModuleOfTheClass,NameOfTheAttribute)()
只要傳入妳要導入的模塊ModuleOfTheClass和裏面的NameOfTheAttribute(當然可以是數據或者方法),就可以調用了。這個名稱字符串是根據當時的運行情況判斷的,不需要事先指定。
對了,Python中的導入順序也是默認規定的,類似於C中的include,因為我們壹般都是先包含系統文件,然後。
包含您自己的頭文件(有>:和" ")。在Python中,模塊通常應按以下順序導入:
1.標準庫模塊——如sys、os、getopt等。
2.第三方模塊
3.本地實現的模塊。
全局變量
這裏說全局變量,並不是說Python和C對全局變量的概念不同,而是它們的概念是壹樣的。只是使用機制有些不同。例如:
–module . py–
globalvar = 1
定義函數():
打印全局變量
#這使得壹些全局只讀,
#任何寫給某個全球
#會創建壹個新的局部變量。
定義函數2():
全球globalvar
globalvar = 2
#這允許您操縱全局
#變量
在func中,globalvar是只讀的。如果使用globalvar =
用賦值語句xxx,Python會重新創建壹個新的本地對象,並給它賦壹個新值,原來的對象值不變。在func2函數中,因為我們事先聲明過,
Globalvar是全局的,所以此時的更改將直接在全局變量上生效。