導航:首頁 > 編程語言 > python語言博大精深

python語言博大精深

發布時間:2022-06-25 21:14:28

Ⅰ 選java還是python

java是當今最普及的語言,沒有之一,有及其豐富的第三方庫(開源),編譯執行,運行在jvm(運行在jvm上的開發語言越來越多,如scala),從web開發、網路開發(tcp/socket/rpc應用)、app開發(android開發,和後端開發有較大的思維上的不同)、雲計算應用(hadoop),是典型的面向對象的開發語言,擁有最大的市場需求(注意,在國內,java在web上的應用佔比不到php十分一),但是它慢慢的被業界所詬病,如開發代碼不簡潔,開發效率低,學習時間成本高,有走下坡路的趨勢。
python號稱膠水語言,本身也是解釋語言,但它能調用c模塊,可以用於linux系統腳本開發、甚至用於linux嵌入式開發、可以用於web 開發(有豐富的、好用的框架);最重要的就是它的語法非常簡潔;」最最「重要的是目前大數據分析、機器學習它也是熱門的開發語言。
沒有人知道那個語言最有前景,你的重點事如何「精通」一門語言,更正確一點說,你要如何在編程這個技能上成為專家,練就「九陽神功」,然後,根據自己的職業需求、觀察市場隨時憑自己練就的內功、強大的學習能力應對隨時的變化和需求。我曾經看不起php,不願意學它,但是,國內幾乎web開發市場被它占據,到處公司後台都招php,只好也學習了php做項目,但我是用了8年的c#的基礎,容易學啊,因為工作的需要,我還學了android、(ios)oc、node.js、甚至golang都學了(學得不好),沒辦法,干這行,學無止境。
但是,一定要給自己一個准確的定位,你能做什麼?你要做什麼?你將來要成為什麼?要搞清楚,不能什麼都做,還有,語言還真的只是工具,它需要你(聰明的你、有知識的你、有文化的你)來運用和驅動它,打個比方,現在流行大數據分析、機器學習,它們可以用python來開發,但是,你會python就能做大數據分析、機器學習了嗎?你要沒有相關的理論知識、特別是數學知識。

Ⅱ 什麼編程軟體比較好比較容易入門

1、JavaScript

Java是一種可以撰寫跨平台應用軟體的面向對象的程序設計語言,即使是開發簡單的程序,也必須設計對象;而JavaScript是一種直譯式腳本語言,它本身提供了非常豐富的內部對象供設計人員使用。

2、Python

Python對初學者來說也是一個入門級編程語言。Python可用於Web開發的應用程序和桌面應用程序,這種動態語言支持OOP編程、過程式編程和函數式編程。

另外,它是開源語言,這意味著它可以免費入手,有著相當活躍的社區。Joel Lee細述了為何Python很有用。

3、TotalCommander

簡稱TC文件管理器,一款功能強大的全能文件管理軟體,能夠極大地提高文件處理工作的效率,以其使用高效方便、穩定可靠、擴展性與可配置性強征服了無數電腦老鳥。

4、Android studio

對UI界面設計和編寫代碼有更好地支持,可以方便地調整設備上的多種解析度。同樣支持ProGuard工具和應用簽名。不過,目前版本的Android Studio不能在同一窗口中管理多個項目。

5、WebStorm

jetbrains公司旗下一款JavaScript 開發工具。目前已經被廣大中國JS開發者譽為「Web前端開發神器」、「最強大的HTML5編輯器」、「最智能的JavaScript IDE」等。與IntelliJ IDEA同源,繼承了IntelliJ IDEA強大的JS部分的功能。

Ⅲ 學習人工智慧有什麼要求嗎

人工智慧的定義可以分為兩部分,即「人工」和「智能」。「人工」比較好理解,爭議性也不大。有時我們會要考慮什麼是人力所能及製造的,或著人自身的智能程度有沒有高到可以創造人工智慧的地步,等等。但總的來說,「人工系統」就是通常意義下的人工系統。
關於什麼是「智能」,就問題多多了。這涉及到其它諸如意識(consciousness)、自我(self)、思維(mind)(包括無意識的思維(unconscious_mind)等等問題。人唯一了解的智能是人本身的智能,這是普遍認同的觀點。但是我們對我們自身智能的理解都非常有限,對構成人的智能的必要元素也了解有限,所以就很難定義什麼是「人工」製造的「智能」了。因此人工智慧的研究往往涉及對人的智能本身的研究。其它關於動物或其它人造系統的智能也普遍被認為是人工智慧相關的研究課題。
人工智慧目前在計算機領域內,得到了愈加廣泛的重視。並在機器人,經濟政治決策,控制系統,模擬系統中得到應用--機器視覺:指紋識別,人臉識別,視網膜識別,虹膜識別,掌紋識別,專家系統等。
人工智慧(Artificial Intelligence)是研究解釋和模擬人類智能、智能行為及其規律的一門學科。其主要任務是建立智能信息處理理論,進而設計可以展現某些近似於人類智能行為的計算系統。AI作為計算機科學的一個重要分支和計算機應用的一個廣闊的新領域,它同原子能技術,空間技術一起被稱為20世紀三大尖端科技。
人工智慧學科研究的主要內容包括:知識表示、自動推理和搜索方法、機器學習和知識獲取、知識處理系統、自然語言理解、計算機視覺、智能機器人、自動程序設計等方面。
知識表示是人工智慧的基本問題之一,推理和搜索都與表示方法密切相關。常用的知識表示方法有:邏輯表示法、產生式表示法、語義網路表示法和框架表示法等。
常識,自然為人們所關注,已提出多種方法,如非單調推理、定性推理就是從不同角度來表達常識和處理常識的。
問題求解中的自動推理是知識的使用過程,由於有多種知識表示方法,相應地有多種推理方法。推理過程一般可分為演繹推理和非演繹推理。謂詞邏輯是演繹推理的基礎。結構化表示下的繼承性能推理是非演繹性的。由於知識處理的需要,近幾年來提出了多種非演澤的推理方法,如連接機制推理、類比推理、基於示例的推理、反繹推理和受限推理等。
搜索是人工智慧的一種問題求解方法,搜索策略決定著問題求解的一個推理步驟中知識被使用的優先關系。可分為無信息導引的盲目搜索和利用經驗知識導引的啟發式搜索。啟發式知識常由啟發式函數來表示,啟發式知識利用得越充分,求解問題的搜索空間就越小。典型的啟發式搜索方法有A*、AO*演算法等。近幾年搜索方法研究開始注意那些具有百萬節點的超大規模的搜索問題。
機器學習是人工智慧的另一重要課題。機器學習是指在一定的知識表示意義下獲取新知識的過程,按照學習機制的不同,主要有歸納學習、分析學習、連接機制學習和遺傳學習等。
知識處理系統主要由知識庫和推理機組成。知識庫存儲系統所需要的知識,當知識量較大而又有多種表示方法時,知識的合理組織與管理是重要的。推理機在問題求解時,規定使用知識的基本方法和策略,推理過程中為記錄結果或通信需設資料庫或採用黑板機制。如果在知識庫中存儲的是某一領域(如醫療診斷)的專家知識,則這樣的知識系統稱為專家系統。為適應復雜問題的求解需要,單一的專家系統向多主體的分布式人工智慧系統發展,這時知識共享、主體間的協作、矛盾的出現和處理將是研究的關鍵問題。
需要數學基礎:高等數學,線性代數,概率論數理統計和隨機過程,離散數學,數值分析。
需要演算法的積累:人工神經網路,支持向量機,遺傳演算法等等演算法;當然還有各個領域需要的演算法,比如要讓機器人自己在位置環境導航和建圖就需要研究SLAM;總之演算法很多需要時間的積累。
需要掌握至少一門編程語言,畢竟演算法的實現還是要編程的;如果深入到硬體的話,一些電類基礎課必不可少。

Ⅳ 計算機語言都包括什麼語言及其各個應用領域

1、web page script languages
就是網頁代碼,比如Html、javascript、Css、Asp、Php、Xml都應該屬於此類(照蔡的意思,Html不應該屬於anguages的,可能他覺得太簡單了吧,不過我覺得Html也應該算的,大家愛聽誰的就聽誰的好了,這個不重要)
2、Interpreted Languages(解釋型語言)
包括Perl、Python、REBOL、Ruby等(後面三個聽豆沒聽過),也常被稱作Script語言,通常被用於和底下的操作系統溝通。照蔡的意思,每個人至少應該學會一套這類的語言。這類語言的缺點是效率差、源代碼外露——所以不適合用來開發軟體產品,一般用於網頁伺服器。
3、Hybrid Laguages(混合型語言)
代表是JAVA和C#。介於解釋型和編譯型之間。蔡認為C#是.NET最重要的語言,值得期待其後續發展;至於JAVA,蔡叫看他的《Sleepless in Java》——我倒!
4、COMPILING Languages(編譯型語言)
C/C++,JAVA都是編譯型語言。蔡說C++很復雜,要成為高手沒三五年是不行的(就憑這句話,我決定向JAVA投降),雖然如此,但真正要成為高手的都應該懂C/C++。
關於Delphi,蔡說如果想要跨Linux和Windows平台的語言,則Delphi似乎是最好的選擇。
5、Assembly Languages(匯編語言)
匯編語言是最接近於硬體的語言,不過現在幾乎沒多少人用了。
程序語言學習順序建議
如果完全沒有程序經驗,可照這個順序:javascript——解釋型語言——混合型語言——編譯型語言——匯編(如果需要的話)
用業界流行一句話做結尾「真正的程序員用C++,聰明的程序員用Delphi」,那麼,什麼樣的程序員用JAVA呢?
虛懷若谷題外話
看在我這么晚了還這么辛苦的敲字的面子上,看到這篇帖子的朋友給點掌聲吧,雖然沒什麼自己的思想。
另外,本文完全據蔡學鏞先生同名文章精簡,所以如果這篇文章給你的程序員生涯有什麼不好的作用,那我不介意你去扁他。當然如果這篇文章對你有什麼積極影響,我很高興你能請我吃大餐。
如果您想學習編程,卻又不知從何入手,那麼您不妨看看下面的幾種學習方案,可能會給您一些啟示吧!
方案一Basic語言 & Visual Basic
優點
(1)Basic 簡單易學,很容易上手。
(2)Visual Basic 提供了強大的可視化編程能力,可以讓你輕松地做出漂亮的程序。
(3)眾多的控制項讓編程變得象壘積木一樣簡單。
(4)Visual Basic 的全部漢化讓我們這些見了English就頭大的人喜不自禁。
缺點
(1)Visual Basic 不是真正的面向對象的開發文具。
(2)Visual Basic 的數據類型太少,而且不支持指針,這使得它的表達能力很有限。
(3)Visual Basic 不是真正的編譯型語言,它產生的最終代碼不是可執行的,是一種偽代碼。它需要一個動態鏈接庫去解釋執行,這使得Visual Basic 的編譯速度大大變慢。
綜述:方案一適合初涉編程的朋友,它對學習者的要求不高,幾乎每個人都可以在一個比較短的時間里學會vB編程,並用VB 做出自己的作品。對於那些把編程當做游戲的朋友來說,VB 是您最佳的選擇。
方案二Pascal語言 & Delphi
優點
(1)Pascal語言結構嚴謹,可以很好地培養一個人的編程思想。
(2)Delphi是一門真正的面向對象的開發工具,並且是完全的可視化。
(3)Delphi使用了真編譯,可以讓你的代碼編譯成為可執行的文件,而且編譯速度非常快。
(4)Delphi具有強大的資料庫開發能力,可以讓你輕松地開發資料庫。
缺點
Delphi幾乎可以說是完美的,只是Pascal語言的過於嚴謹讓人感覺有點煩。
綜述: 方案二比較適合那些具有一定編程基礎並且學過Pascal語言的朋友。
方案三C語言 & Visual C++
優點
(1)C語言靈活性好,效率高,可以接觸到軟體開發比較底層的東西。
(2)微軟的MFC庫博大精深,學會它可以讓隨心所欲地進行編程。
(3)VC是微軟製作的產品,與操作系統的結合更加緊密。
缺點
對使用者的要求比較高,既要具備豐富的C語言編程經驗,又要具有一定的WINDOWS編程基礎,它的過於專業使得一般的編程愛好者學習起來會有不小的困難。
綜述: VC是程序員用的東西。如果你是一個永不滿足的人,而且可以在編程上投入很大的精力和時間,那麼學習VC你一定不會後悔的。
方案四C++語言 & C++ Builder
優點
(1)C++語言的優點全部得以繼承。
(2)完全的可是化。
(3)極強的兼容性,支持OWL、VCL和MFC三大類庫。
(4)編譯速度非常快。
缺點
由於推出的時間太短,關於它的各種資料還不太多。
綜述:我認為C++ Builder 是最好的編程工具。它既保持了C++語言編程的優點,又做到了完全的可視化。
方案五SQL語言 & Power Builder
對於一些傳統的數據開發人員來說,Foxpro系列也許讓他們感到更加熟悉。但是對於初學者來說,PowerBuilder也許是最好的資料庫開發工具。各種各樣的控制項,功能強大的PowerBuilder語言都會幫助你開發出自己的資料庫應用程序。
補充:關於網頁後台語言和其他語言的關系,一般認為:
C語言學的好,那麼學習PHP會有事半功倍的效果
VC學的好,那麼學習ASP會有事半功倍的效果
JAVA學的好,那麼學習JSP、JAVASCRIPT會有事半功倍的效果
關於網頁後台語言和資料庫,通常來說:
PHP與MYSQL是黃金搭檔
ASP小型網站用ACCESS,大型用SQL
JSP我就不知道了
關於電子商務流行的語言,目前
當當、卓越、6688、igo5、雅寶使用的是asp語言
易趣、淘寶使用的是php語言
貝塔斯曼使用的是jsp語言
4、至少學會以下的其中兩種:
一、網站伺服器程序ASP、PHP、CGI、JSP
我個人認為CGI是最難學的其中一種。
二、程序語言:C語言、C++、VB、JAVA、PERL、DELPHI、匯編語言
不過我認為C語言的通用性最好,可以跨平台(操作系統)使用。
還要試著自己寫程序、開發軟體等工作。
三、資料庫管理軟體:MYSQL、SQL、FOXPRO……等。
四、幾種常用的操作系統:WIN98、WIN2000、WINNT、WINXP、UNIX、LINUX、要是能學到UNIX那是最好不過的了。最最基本的WIN2K、WINNT也要學會吧。
如果以上的你都會了,那麼你已經是個高手了

Ⅳ 初學者學習程序語言學Python怎麼樣C語言.C++和java哪個比較好

Python比較好上手,c語言靈活,c++比c難學。Java和c++差不多。如果是初學者的話你學習Python吧,其實Python是c的一個變化的版本,內部還是c。但是Python在國內不是太火,國外很火的。Python做網站不錯,有一些現成的模塊。

Ⅵ 從哪能找到python示常式序或源碼

哥,要下載源碼也是去官網下載啊,點下面那個就行了
https://www.python.org/ftp/python/3.4.3/python-3.4.3.tar.xz

Ⅶ c語言和python哪個好入門

從開始看Python到現在也有半個多月了,前後看了Python核心編程和Dive into
Python兩本書。話說半個月看兩本,是個人都知道有多囫圇吞棗,這也是因為我暫時沒有需求拿這個做大型開發,主要是平時的小程序test用一用。所以

我的策略是,整體瀏覽,用到時候現查。話說這核心編程第一版太古老了,老在講2.2之前的東西,我看的翻譯電子版,翻譯得也不好,很晦澀。看完這個後還有
點雲里霧里,看網上人家說DIP好,啄木鳥還有免費電子文檔,就找來看這個。怎麼說呢,講的比核心編程好,但不適合第一次看的初學者。我之所以覺得講得
好,是因為看核心編程,有些概念還有些模糊,看了這本書就明白不少了。要是初學者上來就看這本,保證不好理解。

下面就是在學習的過程中,在翻閱資料的過程中,總結的一些C和python比較明顯的不同之處,有大方向的,也有細節的。肯定沒有總結完,比如動態

函數,lambda這些,我都懶得往上寫了。實際上,作為兩種完全不同的語言,下面這些差異只是冰山一角而已。權當拋磚引玉吧,至少應該對和我有相同研究

興趣,正在考慮是否學習另一門語言的朋友有點幫助。此文也算是DIP的學習筆記吧。順帶說一句,要是有朋友了解,可以幫忙推薦一下實戰性強的Python
教材,語言這東西,不多練手,光比劃,是不可能學好的。

學習目的

我的以後的研究方向是嵌入式,顯然,C語言是我的主要語言。我不是一個語言愛好者,我以前覺得,對於做研究而不是應用的人來說,了解多門語言,不如

精通一門語言。之所以去看python,主要還是因為python更有利於快速開發一些程序,也是因為現在認識到,研究和應用是不能分離的。個人以為,要
想在計算機工程的競爭中立足,必須懂C語言。因為真正要做高性能編程,
不可能將機器的體系架構拋到腦後讓Python虛擬機(或Java虛擬機等)幫你搞定所有底層。越來越多的CPU
core,越來越恐怖的內存性能瓶頸,對於上層開發人員來說,無所謂,但是對高性能程序開發人員來說,這些是無法透明的。很多應用,還是自己掌控比較有
效。這些場合中,匯編和C還是不可替代的。但是,光知道C是不夠的,掌握一門面向對象語言,相對更高層的語言,不僅對以後的個人發展有利,也會對自己的技
術認識產生幫助。

如果要問對我來說誰更重要,我覺得還是C更重要。C的學習曲線更陡,貌似簡單,實際上到處都是陷阱,看上去比較簡單低效的程序,也不是學1,2個月

就能搞定的。談到優化的深層次和難度嘛,需要的功底是按年算的。但是一旦你C語言的基礎打好了,對計算機的理解,對其他語言的理解都是大有裨益的。比如,

如果你有C基礎,可以說,學過1天python,就能寫的出來一些不短的程序。後面的優化也不是什麼大不了的演算法,都是非常基本的語句換來換去。當然這里
不是說 Python不好,實際上,上層應用,Python比C方便的不是一個層次。

很多人覺得,既然懂C了,那麼進一步掌握C++應該是水到渠成,但C++不是C的超集,而我又不喜歡C++的繁瑣和巨大,所以才決定看一看Python。我很喜歡Python的優雅與快捷。

語言類型

和C不一樣,Python是一種動態類型語言,又是強類型語言。這個分類怎麼理解呢?大概是可以按照下列說明來分類的:

靜態類型語言

一種在編譯期間就確定數據類型的語言。大多數靜態類型語言是通過要求在使用任一變數之前聲明其數據類型來保證這一點的。Java和 C 是靜態類型語言。

動態類型語言

一種在運行期間才去確定數據類型的語言,與靜態類型相反。Python 是動態類型的,因為它們確定一個變數的類型是在您第一次給它賦值的時候。

強類型語言

一種總是強制類型定義的語言。Java 和 Python 是強制類型定義的。您有一個整數,如果不明確地進行轉換 ,不能將把它當成一個字元串。

弱類型語言

一種類型可以被忽略的語言,與強類型相反。VBScript 是弱類型的。在 VBScript 中,您可以將字元串 『12′ 和整數 3 進行連接得到字元串』123′,然後可以把它看成整數 123 ,所有這些都不需要任何的顯示轉換。

對象機制

具體怎麼來理解這個「動態確定變數類型」,就要從Python的Object對象機制說起了。Objects(以下稱對象)是Python對於數據

的抽象,Python中所有的數據,都是由對象或者對象之間的關系表示的,函數是對象,字元串是對象,每個東西都是對象的概念。每一個對象都有三種屬性:

實體,類型和值。理解實體是理解對象中很重要的一步,實體一旦被創建,那麼就一直不會改變,也不會被顯式摧毀,同時通常意義來講,決定對象所支持的操作方

式的類型(type,包括number,string,tuple及其他)也不會改變,改變的只可能是它的值。如果要找一個具體點的說明,實體就相當於對

象在內存中的地址,是本質存在。而類型和值都只是實體的外在呈現。然後Python提供一些介面讓使用者和對象交互,比如id()函數用來獲得對象實體的
整形表示(實際在這里就是地址),type()函數獲取其類型。

這個object機制,就是c所不具備的,主要體現在下面幾點:

1 剛才說了,c是一個靜態類型語言,我們可以定義int a, char
b等等,但必須是在源代碼裡面事先規定。比如我們可以在Python裡面任意一處直接規定a =
「lk」,這樣,a的類型就是string,這是在其賦值的時候才決定的,我們無須在代碼中明確寫出。而在C裡面,我們必須顯式規定char *a =
「lk」,也就是人工事先規定好a的類型

2 由於在C中,沒有對象這個概念,只有「數據的表示」,比如說,如果有兩個int變數a和b,我們想比較大小,可以用a ==
b來判斷,但是如果是兩個字元串變數a和b,我們就不得不用strcmp來比較了,因為此時,a和b本質上是指向字元串的指針,如果直接還是用==比較,
那比較的實際是指針中存儲的值——地址。

在Java中呢,我們通過使用 str1 == str2 可以確定兩個字元串變數是否指向同一塊物理內存位置,這叫做「對象同一性」。在 Java 中要比較兩個字元串值,你要使用 str1.equals(str2)。

然後在Python中,和前兩者都不一樣,由於對象的引入,我們可以用「is」這個運算符來比較兩個對象的實體,和具體對象的type就沒有關系
了,比如你的對象是tuple也好,string也好,甚至class也好,都可以用」is」來比較,本質上就是「對象同一性」的比較,和Java中
的==類似,和 C中的pointer比較類似。Python中也有==比較,這個就是值比較了。

3
由於對象機制的引入,讓Python的使用非常靈活,比如我們可以用自省方法來查看內存中以對象形式存在的其它模塊和函數,獲取它們的信息,並對它們進行
操作。用這種方法,你可以定義沒有名稱的函數,不按函數聲明的參數順序調用函數,甚至引用事先並不知道名稱的函數。 這些操作在C中都是不可想像的。

4 還有一個很有意思的細節,就是類型對對象行為的影響是各方面的,比如說,a = 1; b =
1這個語句中,在Python裡面引發的,可能是a,b同時指向一個值為1的對象,也可能是分別指向兩個值為1的對象。而例如這個語句,c = []; d
= [],那麼c和d是肯定指向不同的,新創建的空list的。沒完,如果是」c = d =
[]「這個語句呢?此時,c和d又指向了相同的list對象了。這些區別,都是在c中沒有的。

最後,我們來說說為什麼python慢。主要原因就是function call
overhead比較大。因為所有東西現在都是對象了,contruct 和destroy 花費也大。連1 + 1 都是 function
call,像』12′+』45′ 這樣的要 create a third string object, then calls the string
obj』s __add。可想而知,速度如何能快起來?

列表和數組

分析Python中的list和C中的數組總是很有趣的。相信可能一些朋友和一樣,初學列表的時候,都是把它當作是數組來學的。最初對於list和數組區別的定性,主要是集中在兩點。首先,list可以包含很多不同的數據類型,比如

["this", 1, "is", "an", "array"]

這個List,如果放在C中,其實是一個字元串數組,相當於二維的了。

其次呢,list有很多方法,其本身就是一個對象,這個和C的單純數組是不同的。對於List的操作很多樣,因為有方法也有重載的運算符。也帶來一些問題,比如下面這個例子:

加入我們要產生一個多維列表,用下面這個語句

A = [[None] * 2] * 3

結果,A的值會是

[[None, None], [None, None], [None, None]]

初一看沒問題,典型的二維數組形式的列表。好,現在我們想修改第一個None的值,用語句

A[0][0] = 5

現在我們再來看看A的值:

[[5, None], [5, None], [5, None]]

發現問題沒有?這是因為用 * 來復制時,只是創建了對這個對象的引用,而不是真正的創建了它。 *3 創建了一個包含三個引用的列表,這三個引用都指向同一個長度為2的列表。其中一個行的改變會顯示在所有行中,這當然不是你想要的。解決方法當然有,我們這樣來創建

A = [None]*3
for i in range(3):
A[i] = [None] * 2

這樣創建了一個包含三個不同的長度為2的列表。

所以,還是一直強調的,越復雜的東西,越靈活,也越容易出錯。

代碼優化

C是一個很簡單的語言,當我們考慮優化的時候,通常想得也很簡單,比如系統級調用越少越好(緩沖區機制),消除循環的低效率和不必要的系統引用,等
等,其實主要都是基於系統和硬體細節考慮的。而Python就完全不一樣了,當然上面說的這些優化形式,對於Python仍然是實用的,但由於
Python的語法形式千差萬別,庫和模塊多種多樣,所以對於語言本身而言,就有很多值得注意的優化要點,舉幾個例子吧。

比如我們有一個list L1,想要構建一個新的list L2,L2包括L1的頭4個元素。按照最直接的想法,代碼應該是

L2 = []
for i in range[3]:
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()則在一次過程中完成所有的復制。還有,對於字元串操作,
對字元串對象使用replace()方法。僅當在沒有固定字元串模式時才使用正則表達式。

所以說,以優化為評判標准,如果說C是短小精悍,Python就是博大精深。

include和import

在C語言中的include非常簡單,因為形式單一,意義明確,當你需要用到外部函數等資源時,就用include。而Python中有一個相似的
機制,就是import。乍一看,這兩個傢伙挺像的,不都是我們要用外部資源(最常見的就是函數或者模塊(Python))時就用這個來指明么?其實不

然,兩者的處理機制本質區別在於,C中的include是用於告訴預處理器,這個include指定的文件的內容,你都給我當作在本地源文件中出現過。而

import呢,不是簡單的將後面的內容*直接*插入到本地裡面去,這玩意更加靈活。事實上,幾乎所有類似的機制,Python都比C靈活。這里不是說C
不好,C很簡練,我其實更喜歡C。

簡單說說這個靈活性。import在python中有三種形式,import X, from X import *( or a,b,c……),
X = __import__(』x')。最常用的是第二種,因為比較方便,不像第一種那樣老是用X.mole來調用模塊。from X
import *只是import那些public的mole(一般都是不以__命名的模塊),也可以指定a,b,c來import。

什麼時候用哪一種形式呢?應該說,在大多數的模塊文檔里,都會明確告訴你應該用哪種形式。如果需要用到很多對象,那麼from X import
*可能更合適一些,但是,就目前來看,大多數第三方Python庫都不推薦使用from molename import *
這種格式。這樣做會使引入者的namespace混亂。很多人甚至對於那些專門設計用於這種模式的模塊(包括Tkinter,
threading和matplot)都不採用這種方式。而如果你僅僅需要某個對象類a,那麼用from X import a比用import
X.a更好,因為以後你調用a的函數直接用a.function()既可以了,不用加X。

如果你連自己希望import的模塊都不知道怎麼辦?請注意,此時Python的優勢就體現出來了,我們可以用
__import__(mole)來調用mole,其中這個mole是字元串,這樣,可以在運行時再決定,你到底要調用什麼mole。舉
個例子:

def classFromMole (mole, Name):
mod = __import__ (mole)
return getattr (mod, Name)

這里,定義了一個函數classFromMole,你可以在代碼的任何時候調用它,

o = classFromMole (MoleOfTheClass, NameOfTheAttribute)()

只需要傳入字元串形式的你希望import的模塊MoleOfTheClass和其中屬性的名字NameOfTheAttribute(當然可以是數據也可以是方法),就能調用了,這個名字字元串不用事先指定,而是根據當時運行的情況來判斷。

順帶說一句,Python中import的順序也有默認規定,這個和C中的include有點類似,因為我們一般都是先include系統文件,再
include自己的頭文件(而且還有<>和「」的區別)。Python中呢,一般應該按照以下順序import模塊:

1. 標准庫模塊 — 如 sys, os, getopt 等

2. 第三方模塊

3. 本地實現的模塊。

全局變數

這里談全局變數呢,倒不是說Python和c的全局變數概念不同,他們的概念是相同的。只是在使用機制上,是有一些差異的。舉個例子:

– mole.py –
globalvar = 1

def func():
print globalvar
# This makes someglobal readonly,
# any attempt to write to someglobal
# would create a new local variable.

def func2():
global globalvar
globalvar = 2
# this allows you to manipulate the global
# variable

在 func這個函數中,globalvar是只讀的。如果你使用了globalvar =
xxx這種賦值語句,Python會重新創造一個新的本地對象並將新值賦給它,原來的對象值不變。而在func2函數中,由於我們事先申明了
globalvar是global的,那麼此時的更改就直接在全局變數上生效。

Ⅷ 同樣的python代碼通過python文件運行正常,但是直接在解釋器裡面逐行寫的時候報語法錯誤,這是為什麼呢

對於Python而言,存儲好的腳本文件(Script file)和在Console中的互動式(interactive)命令,執行方式不同。對於腳本文件,解釋器將其當作整個代碼塊執行,而對於交互性命令行中的每一條命令,解釋器將其當作單獨的代碼塊執行。而Python在執行同一個代碼塊的初始化對象的命令時,會檢查是否其值是否已經存在,如果存在,會將其重用(這句話不夠嚴謹,後面會詳談)。所以在你給出的例子中,文件執行時(同一個代碼塊)會把a、b兩個變數指向同一個對象;而在命令行執行時,a、b賦值語句分別被當作兩個代碼塊執行,所以會得到兩個不同的對象,因而is判斷返回False。

# 如果你能理解上面一段,就不用看下面的廢話了。

下面是詳細的回答:
說真的,這簡直是我最近在知乎遇到過的最好的問題!
這個問題遠超我想像中的復雜。我本來以為我能用兩分鍾搞定這種每日一水的問題,結果我花了一個小時搜來搜去,讀來讀去,還跑去群里跟人討論了一陣,都沒能找到答案。
大概兩個小時以後,我找到了相對正確的答案,把自己已經弄懂的部分強答一番,並邀請一些大神,希望能看到更為准確的回答。

這個問題的博大精深在於,能從中扯出許多小問題來,雖然這些東西很細枝末節,很trick,在日常編程中不怎麼用的到,更不怎麼需要額外關注,但是理解這些問題,對於我們理解Python的對象機制乃至內存處理機制有很大的幫助。

我從頭開始說,大概會分以下幾個部分來談,每個部分其實都能展開很廣,這次就把與問題相關的知識簡單一提:
(雖然我覺得按照我尋找答案的過程講,可能對認知更有幫助,但是理清頭緒的話可能更好理解,之後會找時間為這個問題寫篇文章好好記錄一下)

Python中的數據類型——可變與不可變
Python中is比較與==比較的區別
Python中對小整數的緩存機制
Python程序的結構——代碼塊
Python的內存管理——新建對象時的操作

聲明:以下所講機制,與Python不同版本的具體實現有關(implement specific)可能不同。

Python中的數據類型
Python中的數據類型,這可能是大家入門Python的第一節課。很簡單嘛,大家最常用的,int(包括long)、float、string、list、tuple、dict,加上bool和NoneType。
但是這里要重點說的,其實是可變類型和不可變類型。
不可變(immutable):Number(包括int、float),String,Tuple
可變(mutable):Dict,List,User-defined class
首先我們要記住一句話,一切皆對象。Python中把任何一種Type都當作對象來處理。其中有一些類型是不可變的,比如:

這個還是好理解的,在初始化賦值一個字元串後,我們沒有辦法直接修改它的值。但是數字呢?數字這種變來變去的又怎麼理解。
可以看出,a的值雖然從10變成了11,但是a這個變數指向內存中的位置發生了變化,也就是說我們並沒有對a指向的內存進行操作,而是對a進行了重新賦值。
再簡單舉一個可變的例子。

體會了可變與不可變的外在表現後,簡單理解一下為什麼不可變。
Python官方文檔這樣解釋字元串不可變:

There are several advantages.
One is performance: knowing that a string is immutable means we can allocate space for it at creation time, and the storage requirements are fixed and unchanging. This is also one of the reasons for the distinction between tuples and lists.
Another advantage is that strings in Python are considered as 「elemental」 as numbers. No amount of activity will change the value 8 to anything else, and in Python, no amount of activity will change the string 「eight」 to anything else.
個人感覺,有性能上的考慮(比如對一些固定不變的元素給予固定的存儲位置,整數這樣操作比較方便,字元串的話涉及一些比較也會減少後續操作的時間),也有一些安全上的考慮(比如列表中的值會改變,元組不會)。這個我也不太精通,就不展開談了。

Python中is比較與==比較的區別
前面已經提過一次,Python中一切皆對象。對象包含三個要素,id、type、value。
而Python中用於比較「相等」這一概念的操作符,is和==。
當兩個變數指向了同一個對象時,is會返回True(即is比較的是兩個變數的id);
當兩個變數的值相同時,==會返回True(即==比較的是兩個變數的value)。
示例(命令行交互模式下):
第一個和第三個示例是好理解的。
但是第二個就不那麼好理解了,尤其是配合下面這個(假定我們已經知道命令行中的語句執行是單獨執行兩次不會相互影響,後面會具體解釋):
為什麼a、b分別賦值1000時is比較返回False,可以分別賦值100就會返回True?

Python中對小整數的緩存機制
Python官方文檔中這么說:
The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object. So it should be possible to change the value of 1. I suspect the behaviour of Python in this case is undefined. :-)簡單來說就是,Python自動將-5~256的整數進行了緩存,當你將這些整數賦值給變數時,並不會重新創建對象,而是使用已經創建好的緩存對象。

Python程序的結構——代碼塊&Python的內存管理——新建對象時的操作
終於要來到題主問題的部分了。
先來看最讓我們困惑的,也就是題主給出的示例吧(接下來用float演示,int是同樣的情況):
交互命令行下:
同樣的還有:
(說好的小整數才有緩存呢(摔)!這跟你講的不一樣啊教練!)
這就很尷尬了對吧。
其實從結果論出發,我們很容易猜到結論,就像題主自己也猜了個差不多——緩存機制不同。畢竟is比較的就是對象的id,也就是對象在內存中的位置,也就是是不是同一個對象。
既然腳本文件的執行結果是True,那麼,他倆就是同一個對象;既然命令行執行的結果是False,那麼他倆就不是同一個對象。(這他喵的不是廢話嗎!)
所以我開始了漫長的找原理的過程……然而網上這方面提及的實在太少。尤其是大家的大部分討論都是int的小整數緩存機制;就算討論到了float,也不實際解決我們的問題。

其實我都快要放棄了,漫無目的地翻stackoverflow推薦的相關問題時終於找到了一個類似的情況,但是人家並不是比較的腳本文件和命令行執行,而是比較的函數體和賦值語句:
同樣的代碼,拆開就是False,放函數里就是True!是不是很像我們遇到的情況了。
根據提示我們從官方文檔找到了這樣的說法:

A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: a mole, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the interpreter or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the interpreter command line with the 『-c『 option) is a code block. The string argument passed to the built-in functions eval() and exec() is a code block.
A code block is executed in an execution frame. A frame contains some administrative information (used for debugging) and determines where and how execution continues after the code block』s execution has completed.
沒錯!跟我們猜的一樣!這就是原理的出處了!
代碼塊作為一個執行單元,一個模塊、一個函數體、一個類定義、一個腳本文件,都是一個代碼塊。
在互動式命令行中,每行代碼單獨視作一個代碼塊。

至此問題解決……了嗎?視作一個代碼塊,就意味著要把相同value的賦值指向相同的對象嗎?
在此重復一下'is' operator behaves unexpectedly with non-cached integers中提到的實驗,並簡單翻譯結論。
通過compile()函數和dis模塊的code_info()函數來檢測我們執行的命令的信息。
示例:
可以看出,分別賦值a,b得到的value相等,id是不一樣的。
把10.0 10.0 10.1分別賦值給a,b,c,可以看出結果中其實只保存了一個10.0,也就是a,b共用了這個數值。

也就是說,當命令行執行時,是以single的模式來compile代碼(2. Built-in Functions)。它會在u_consts字典中記錄對象常量。
The mode argument specifies what kind of code must be compiled; it can be 'exec' if source consists of a sequence of statements, 'eval' if it consists of a single expression, or 'single' if it consists of a single interactive statement (in the latter case, expression statements that evaluate to something other than None will be printed).而在同一代碼塊執行時,當增加新的常量,會先在字典中查詢記錄,所以相同賦值的變數會指向同一個對象而不是新建對象。

至此…問題大概是解決了。

Ⅸ 學人工智慧先要學什麼

想學人工智慧首先應該了解人工智慧。
人工智慧的定義,核心,現在的發展狀況,趨勢,前景。這些基礎的認知還是要有的。
還有人工智慧的基礎入門就是先要學會python這門語言。
python派森是一種高級的編程語言,簡單易學,開源,在計算機領域所有的關於程序代碼的專業都與python有關系,所以它也是人工智慧的基礎語言。學好python入門是關鍵,入門知識不需要老師自己在網上找資料就可以我推薦你去尚學堂的官網上學習,裡面有免費的視頻入門資料,而且還可以免費試學。如果你是在找不到的話可以關注我,留言個我,我會把入門的視頻資料發給你。

閱讀全文

與python語言博大精深相關的資料

熱點內容
怎麼查看u盤加密區 瀏覽:181
台電加密是什麼格式 瀏覽:155
php論壇版塊在哪個文件夾 瀏覽:442
暗黑的伺服器為什麼維護 瀏覽:623
android內存溢出的原因 瀏覽:17
標志307的壓縮比是多少 瀏覽:636
伺服器啟動為什麼叫三聲 瀏覽:997
追風箏的人英文pdf 瀏覽:939
解壓小熊手機殼 瀏覽:346
成都市區建成面積演算法 瀏覽:660
智能家居單片機 瀏覽:97
買男裝用什麼app好 瀏覽:855
文件夾合並了怎麼拆開 瀏覽:260
波段副圖源碼無未來函數 瀏覽:89
livecn伺服器地址 瀏覽:259
程序員這個工作真的很吃香嗎 瀏覽:847
程序員和數學分析師待遇 瀏覽:681
壓縮氣彈簧怎麼拆 瀏覽:325
華為公有雲伺服器添加虛擬ip 瀏覽:211
程序員和運營哪個累 瀏覽:27