python的創始人爲吉多·範羅蘇姆(Guido van Rossum)。1989年的聖誕節期間,吉多·範羅蘇姆爲了在阿姆斯特丹打發時間,決心開發一個新的腳本解釋程序,做爲ABC語言的一種繼承。 html
最新的TIOBE排行榜,Python趕超PHP佔據第五, Python崇尚優美、清晰、簡單,是一個優秀並普遍使用的語言。java
由上圖可見,Python總體呈上升趨勢,反映出Python應用愈來愈普遍而且也逐漸獲得業內的承認!!!python
Python能夠應用於衆多領域,如:數據分析、組件集成、網絡服務、圖像處理、數值計算和科學計算等衆多領域。目前業內幾乎全部大中型互聯網企業都在使用Python,如:Youtube、Dropbox、BT、Quora(中國知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、騰訊、汽車之家、美團等。linux
目前Python主要應用領域:c++
Python在一些公司的應用: 程序員
編程語言主要從如下幾個角度爲進行分類,編譯型和解釋型、靜態語言和動態語言、強類型定義語言和弱類型定義語言,每一個分類表明什麼意思呢,咱們一塊兒來看一下。web
編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機能夠直接以機器語言來運行此程序,速度很快; 算法
解釋器則是隻在執行程序時,才一條一條的解釋成機器語言給計算機來執行,因此運行速度是不如編譯後的程序運行的快的. shell
這是由於計算機不能直接認識並執行咱們寫的語句,它只能認識機器語言(是二進制的形式)數據庫
編譯型
優勢:編譯器通常會有預編譯的過程對代碼進行優化。由於編譯只作一次,運行時不須要編譯,因此編譯型語言的程序執行效率高。能夠脫離語言環境獨立運行。
缺點:編譯以後若是須要修改就須要整個模塊從新編譯。編譯的時候根據對應的運行環境生成機器碼,不一樣的操做系統之間移植就會有問題,須要根據運行的操做系統環境編譯不一樣的可執行文件。
解釋型
優勢:有良好的平臺兼容性,在任何環境中均可以運行,前提是安裝瞭解釋器(虛擬機)。靈活,修改代碼的時候直接修改就能夠,能夠快速部署,不用停機維護。
缺點:每次運行的時候都要解釋一遍,性能上不如編譯型語言。
(瞭解)
1、低級語言與高級語言
最初的計算機程序都是用0和1的序列表示的,程序員直接使用的是機器指令,無需翻譯,從紙帶打孔輸入便可執行獲得結果。後來爲了方便記憶,就將用0、1序列表示的機器指令都用符號助記,這些與機器指令一一對應的助記符就成了彙編指令,從而誕生了彙編語言。不管是機器指令仍是彙編指令都是面向機器的,統稱爲低級語言。由於是針對特定機器的機器指令的助記符,因此彙編語言是沒法獨立於機器(特定的CPU體系結構)的。但彙編語言也是要通過翻譯成機器指令才能執行的,因此也有將運行在一種機器上的彙編語言翻譯成運行在另外一種機器上的機器指令的方法,那就是交叉彙編技術。
高級語言是從人類的邏輯思惟角度出發的計算機語言,抽象程度大大提升,須要通過編譯成特定機器上的目標代碼才能執行,一條高級語言的語句每每須要若干條機器指令來完成。高級語言獨立於機器的特性是靠編譯器爲不一樣機器生成不一樣的目標代碼(或機器指令)來實現的。那具體的說,要將高級語言編譯到什麼程度呢,這又跟編譯的技術有關了,既能夠編譯成直接可執行的目標代碼,也能夠編譯成一種中間表示,而後拿到不一樣的機器和系統上去執行,這種狀況一般又須要支撐環境,好比解釋器或虛擬機的支持,Java程序編譯成bytecode,再由不一樣平臺上的虛擬機執行就是很好的例子。因此,說高級語言不依賴於機器,是指在不一樣的機器或平臺上高級語言的程序自己不變,而經過編譯器編譯獲得的目標代碼去適應不一樣的機器。從這個意義上來講,經過交叉彙編,一些彙編程序也能夠得到不一樣機器之間的可移植性,但這種途徑得到的移植性遠遠不如高級語言來的方便和實用性大。
2、編譯與解釋
編譯是將源程序翻譯成可執行的目標代碼,翻譯與執行是分開的;而解釋是對源程序的翻譯與執行一次性完成,不生成可存儲的目標代碼。這只是表象,兩者背後的最大區別是:對解釋執行而言,程序運行時的控制權在解釋器而不在用戶程序;對編譯執行而言,運行時的控制權在用戶程序。
解釋具備良好的動態特性和可移植性,好比在解釋執行時能夠動態改變變量的類型、對程序進行修改以及在程序中插入良好的調試診斷信息等,而將解釋器移植到不一樣的系統上,則程序不用改動就能夠在移植瞭解釋器的系統上運行。同時解釋器也有很大的缺點,好比執行效率低,佔用空間大,由於不只要給用戶程序分配空間,解釋器自己也佔用了寶貴的系統資源。編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機能夠直接以機器語言來運行此程序,速度很快;
而解釋器則是隻在執行程序時,才一條一條的解釋成機器語言給計算機來執行,因此運行速度是不如編譯後的程序運行的快的.編譯型和解釋型
咱們先看看編譯型,其實它和彙編語言是同樣的:也是有一個負責翻譯的程序來對咱們的源代碼進行轉換,生成相對應的可執行代碼。這個過程說得專業一點,就稱爲編譯(Compile),而負責編譯的程序天然就稱爲編譯器(Compiler)。若是咱們寫的程序代碼都包含在一個源文件中,那麼一般編譯以後就會直接生成一個可執行文件,咱們就能夠直接運行了。但對於一個比較複雜的項目,爲了方便管理,咱們一般把代碼分散在各個源文件中,做爲不一樣的模塊來組織。這時編譯各個文件時就會生成目標文件(Object file)而不是前面說的可執行文件。通常一個源文件的編譯都會對應一個目標文件。這些目標文件裏的內容基本上已是可執行代碼了,但因爲只是整個項目的一部分,因此咱們還不能直接運行。待全部的源文件的編譯都大功告成,咱們就能夠最後把這些半成品的目標文件「打包」成一個可執行文件了,這個工做由另外一個程序負責完成,因爲此過程好像是把包含可執行代碼的目標文件鏈接裝配起來,因此又稱爲連接(Link),而負責連接的程序就叫……就叫連接程序(Linker)。連接程序除了連接目標文件外,可能還有各類資源,像圖標文件啊、聲音文件啊什麼的,還要負責去除目標文件之間的冗餘重複代碼,等等,因此……也是挺累的。連接完成以後,通常就能夠獲得咱們想要的可執行文件了。
上面咱們大概地介紹了編譯型語言的特色,如今再看看解釋型。噢,從字面上看,「編譯」和「解釋」的確都有「翻譯」的意思,它們的區別則在於翻譯的時機安排不大同樣。打個比方:假如你打算閱讀一本外文書,而你不知道這門外語,那麼你能夠找一名翻譯,給他足夠的時間讓他從頭至尾把整本書翻譯好,而後把書的母語版交給你閱讀;或者,你也馬上讓這名翻譯輔助你閱讀,讓他一句一句給你翻譯,若是你想往回看某個章節,他也得從新給你翻譯。
兩種方式,前者就至關於咱們剛纔所說的編譯型:一次把全部的代碼轉換成機器語言,而後寫成可執行文件;然後者就至關於咱們要說的解釋型:在程序運行的前一刻,還只有源程序而沒有可執行程序;而程序每執行到源程序的某一條指令,則會有一個稱之爲解釋程序的外殼程序將源代碼轉換成二進制代碼以供執行,總言之,就是不斷地解釋、執行、解釋、執行……因此,解釋型程序是離不開解釋程序的。像早期的BASIC就是一門經典的解釋型語言,要執行BASIC程序,就得進入BASIC環境,而後才能加載程序源文件、運行。解釋型程序中,因爲程序老是以源代碼的形式出現,所以只要有相應的解釋器,移植幾乎不成問題。編譯型程序雖然源代碼也能夠移植,但前提是必須針對不一樣的系統分別進行編譯,對於複雜的工程來講,的確是一件不小的時間消耗,何況極可能一些細節的地方仍是要修改源代碼。並且,解釋型程序省卻了編譯的步驟,修改調試也很是方便,編輯完畢以後便可當即運行,沒必要像編譯型程序同樣每次進行小小改動都要耐心等待漫長的Compiling…Linking…這樣的編譯連接過程。不過凡事有利有弊,因爲解釋型程序是將編譯的過程放到執行過程當中,這就決定了解釋型程序註定要比編譯型慢上一大截,像幾百倍的速度差距也是不足爲奇的。
編譯型與解釋型,二者各有利弊。前者因爲程序執行速度快,同等條件下對系統要求較低,所以像開發操做系統、大型應用程序、數據庫系統等時都採用它,像C/C++、Pascal/Object Pascal(Delphi)、VB等基本均可視爲編譯語言,而一些網頁腳本、服務器腳本及輔助開發接口這樣的對速度要求不高、對不一樣系統平臺間的兼容性有必定要求的程序則一般使用解釋性語言,如Java、JavaScript、VBScript、Perl、Python等等。
但既然編譯型與解釋型各有優缺點又相互對立,因此一批新興的語言都有把二者折衷起來的趨勢,例如Java語言雖然比較接近解釋型語言的特徵,但在執行以前已經預先進行一次預編譯,生成的代碼是介於機器碼和Java源代碼之間的中介代碼,運行的時候則由JVM(Java的虛擬機平臺,可視爲解釋器)解釋執行。它既保留了源代碼的高抽象、可移植的特色,又已經完成了對源代碼的大部分預編譯工做,因此執行起來比「純解釋型」程序要快許多。而像VB6(或者之前版本)、C#這樣的語言,雖然表面上看生成的是.exe可執行程序文件,但VB6編譯以後實際生成的也是一種中介碼,只不過編譯器在前面安插了一段自動調用某個外部解釋器的代碼(該解釋程序獨立於用戶編寫的程序,存放於系統的某個DLL文件中,全部以VB6編譯生成的可執行程序都要用到它),以解釋執行實際的程序體。C#(以及其它.net的語言編譯器)則是生成.net目標代碼,實際執行時則由.net解釋系統(就像JVM同樣,也是一個虛擬機平臺)進行執行。固然.net目標代碼已經至關「低級」,比較接近機器語言了,因此仍將其視爲編譯語言,並且其可移植程度也沒有Java號稱的這麼強大,Java號稱是「一次編譯,處處執行」,而.net則是「一次編碼,處處編譯」。呵呵,固然這些都是題外話了。總之,隨着設計技術與硬件的不斷髮展,編譯型與解釋型兩種方式的界限正在不斷變得模糊。動態語言和靜態語言
一般咱們所說的動態語言、靜態語言是指動態類型語言和靜態類型語言。(1)動態類型語言:動態類型語言是指在運行期間纔去作數據類型檢查的語言,也就是說,在用動態類型的語言編程時,永遠也不用給任何變量指定數據類型,該語言會在你第一次賦值給變量時,在內部將數據類型記錄下來。Python和Ruby就是一種典型的動態類型語言,其餘的各類腳本語言如VBScript也多少屬於動態類型語言。
(2)靜態類型語言:靜態類型語言與動態類型語言恰好相反,它的數據類型是在編譯其間檢查的,也就是說在寫程序時要聲明全部變量的數據類型,C/C++是靜態類型語言的典型表明,其餘的靜態類型語言還有C#、JAVA等。
強類型定義語言和弱類型定義語言
(1)強類型定義語言:強制數據類型定義的語言。也就是說,一旦一個變量被指定了某個數據類型,若是不通過強制轉換,那麼它就永遠是這個數據類型了。舉個例子:若是你定義了一個整型變量a,那麼程序根本不可能將a看成字符串類型處理。強類型定義語言是類型安全的語言。
(2)弱類型定義語言:數據類型能夠被忽略的語言。它與強類型定義語言相反, 一個變量能夠賦不一樣數據類型的值。
強類型定義語言在速度上可能略遜色於弱類型定義語言,可是強類型定義語言帶來的嚴謹性可以有效的避免許多錯誤。另外,「這門語言是否是動態語言」與「這門語言是否類型安全」之間是徹底沒有聯繫的!
例如:Python是動態語言,是強類型定義語言(類型安全的語言); VBScript是動態語言,是弱類型定義語言(類型不安全的語言); JAVA是靜態語言,是強類型定義語言(類型安全的語言)。
經過上面這些介紹,咱們能夠得出,python是一門動態解釋性的強類型定義語言。那這些基因使成就了Python的哪些優缺點呢?咱們繼續往下看。
先看優勢
再看缺點:
固然,Python還有一些其它的小缺點,在這就不一一列舉了,我想說的是,任何一門語言都不是完美的,都有擅長和不擅長作的事情,建議各位不要拿一個語言的劣勢去跟另外一個語言的優點來去比較,語言只是一個工具,是實現程序設計師思想的工具,就像咱們以前中學學幾什麼時候,有的時候須要要圓規,有的時候須要用三角尺同樣,拿相應的工具去作它最擅長的事纔是正確的選擇。以前不少人問我Shell和Python到底哪一個好?我回答說Shell是個腳本語言,但Python不僅是個腳本語言,能作的事情更多,而後又有鑽牛角尖的人說徹底不必學Python, Python能作的事情Shell均可以作,只要你足夠牛B,而後又舉了用Shell能夠寫俄羅斯方塊這樣的遊戲,對此我能說表達只能是,不要跟SB理論,SB會把你拉到跟他同樣的高度,而後用充分的經驗把你打倒。
當咱們編寫Python代碼時,咱們獲得的是一個包含Python代碼的以.py
爲擴展名的文本文件。要運行代碼,就須要Python解釋器去執行.py
文件。
因爲整個Python語言從規範到解釋器都是開源的,因此理論上,只要水平夠高,任何人均可以編寫Python解釋器來執行Python代碼(固然難度很大)。事實上,確實存在多種Python解釋器。
CPython
當咱們從Python官方網站下載並安裝好Python 2.7後,咱們就直接得到了一個官方版本的解釋器:CPython。這個解釋器是用C語言開發的,因此叫CPython。在命令行下運行python
就是啓動CPython解釋器。
CPython是使用最廣的Python解釋器。教程的全部代碼也都在CPython下執行。
IPython
IPython是基於CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所加強,可是執行Python代碼的功能和CPython是徹底同樣的。比如不少國產瀏覽器雖然外觀不一樣,但內核其實都是調用了IE。
CPython用>>>
做爲提示符,而IPython用In [
序號
]:
做爲提示符。
PyPy
PyPy是另外一個Python解釋器,它的目標是執行速度。PyPy採用JIT技術,對Python代碼進行動態編譯(注意不是解釋),因此能夠顯著提升Python代碼的執行速度。
絕大部分Python代碼均可以在PyPy下運行,可是PyPy和CPython有一些是不一樣的,這就致使相同的Python代碼在兩種解釋器下執行可能會有不一樣的結果。若是你的代碼要放到PyPy下執行,就須要瞭解PyPy和CPython的不一樣點。
Jython
Jython是運行在Java平臺上的Python解釋器,能夠直接把Python代碼編譯成Java字節碼執行。
IronPython
IronPython和Jython相似,只不過IronPython是運行在微軟.Net平臺上的Python解釋器,能夠直接把Python代碼編譯成.Net的字節碼。
小結
Python的解釋器不少,但使用最普遍的仍是CPython。若是要和Java或.Net平臺交互,最好的辦法不是用Jython或IronPython,而是經過網絡調用來交互,確保各程序之間的獨立性。
In summary : Python 2.x is legacy, Python 3.x is the present and future of the language
Python 3.0 was released in 2008. The final 2.x version 2.7 release came out in mid-2010, with a statement of
extended support for this end-of-life release. The 2.x branch will see no new major releases after that. 3.x is
under active development and has already seen over five years of stable releases, including version 3.3 in 2012,
3.4 in 2014, and 3.5 in 2015. This means that all recent standard library improvements, for example, are only
available by default in Python 3.x.
Guido van Rossum (the original creator of the Python language) decided to clean up Python 2.x properly, with less regard for backwards compatibility than is the case for new releases in the 2.x range. The most drastic improvement is the better Unicode support (with all text strings being Unicode by default) as well as saner bytes/Unicode separation.
Besides, several aspects of the core language (such as print and exec being statements, integers using floor division) have been adjusted to be easier for newcomers to learn and to be more consistent with the rest of the language, and old cruft has been removed (for example, all classes are now new-style, "range()" returns a memory efficient iterable, not a list as in 2.x).
PRINT IS A FUNCTION
The statement has been replaced with a print() function, with keyword arguments to replace most of the special syntax of the old statement (PEP 3105). Examples:
Old: print "The answer is", 2*2 New: print("The answer is", 2*2) Old: print x, # Trailing comma suppresses newline New: print(x, end=" ") # Appends a space instead of a newline Old: print # Prints a newline New: print() # You must call the function! Old: print >>sys.stderr, "fatal error" New: print("fatal error", file=sys.stderr) Old: print (x, y) # prints repr((x, y)) New: print((x, y)) # Not the same as print(x, y)!
You can also customize the separator between items, e.g.:
print("There are <", 2**32, "> possibilities!", sep="")
ALL IS UNICODE NOW
今後再也不爲討厭的字符編碼而煩惱
還能夠這樣玩: (A,*REST,B)=RANGE(5)
<strong>>>> a,*rest,b = range(5) >>> a,rest,b (0, [1, 2, 3], 4) </strong>
一、下載安裝包 https://www.python.org/downloads/ 二、安裝 默認安裝路徑:C:\python27 三、配置環境變量 【右鍵計算機】--》【屬性】--》【高級系統設置】--》【高級】--》【環境變量】--》【在第二個內容框中找到 變量名爲Path 的一行,雙擊】 --> 【Python安裝目錄追加到變值值中,用 ; 分割】 如:原來的值;C:\python27,切記前面有分號
linux、Mac
無需安裝,原裝Python環境 ps:若是自帶2.6,請更新至2.7
在linux 下建立一個文件叫hello.py,並輸入
print("Hello World!")
而後執行命令:python hello.py ,輸出
localhost:~ jieli$ vim hello.py localhost:~ jieli$ python hello.py Hello World!
指定解釋器
上一步中執行 python hello.py 時,明確的指出 hello.py 腳本由 python 解釋器來執行。
若是想要相似於執行shell腳本同樣執行python腳本,例: ./hello.py
,那麼就須要在 hello.py 文件的頭部指定解釋器,以下:
#!/usr/bin/env python print "hello,world"
如此一來,執行: ./hello.py
便可。
ps:執行前需給予 hello.py 執行權限,chmod 755 hello.py
在交互器中執行
除了把程序寫在文件裏,還能夠直接調用python自帶的交互器運行代碼,
localhost:~ jieli$ python Python 2.7.10 (default, Oct 23 2015, 18:05:06) [GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> print("Hello World!") Hello World!
變量,是用於在內存中存放程序數據的容器,怎麼理解呢?
計算機的最核心功能就是「計算」, 計算須要數據源,數據源要存在內存裏,好比我要把小明的姓名、身高、年齡信息存下來,後面程序會調用,怎麼存呢,直接設置一個「變量名=值」, 就能夠
name = "小明" age = 22 height = 160
後面程序想調用的時候,直接調 變量名 就能夠
name = "小明" age = 22 height = 160 print(name) print(age)
程序是從上到下執行的,因此變量必須先定義,後調用, 不然會報錯
駝峯體
AgeOfOldboy = 56 NumberOfStudents = 80
下劃線
age_of_oldboy = 56 number_of_students = 80
你以爲哪一種更清晰,哪一種就是官方推薦的,我想你確定會先第2種
首先,當咱們定義了一個變量name = ‘oldboy’的時候,在內存中實際上是作了這樣一件事:
程序開闢了一塊內存空間,將‘oldboy’存儲進去,再讓變量名name指向‘oldboy’所在的內存地址。以下圖所示:
咱們能夠經過id()方法查看這個變量在內存中的地址
>>> name = "oldboy" >>> id(name) 4317182304
自行看圖不解釋
>>> name = "oldboy" >>> id(name) 4317182304 >>> >>> name = "alex" >>> id(name) # 若是隻是在原有地址上修改,那麼修改後內存地址不該該變化呀。 4317182360
實際的原理什麼樣的呢? 程序先申請了一塊內存空間來存儲‘oldboy’,讓name變量名指向這塊內存空間
執行到name=‘alex’以後又申請了另外一塊內存空間來存儲‘alex’,並讓本來指向‘oldboy’內存的連接斷開,讓name再指向‘alex’。
變量的指向關係
提問:下面這段代碼爲什麼出現這樣的現象?
>>> name1 = 'oldboy' >>> name2 = name1 # 把name1賦值給name2,這樣name2的值也是oldboy了 >>> print(name1,name2) oldboy oldboy >>> >>> name1 = 'alex' >>> print(name1,name2) #改了name1後,name2爲什麼沒跟着改? alex oldboy
要想知道上面問題的結果是爲何,首先要了解在內存中兩個變量的存儲狀況
從上面的示意圖中咱們能夠知道,當執行name2=name1這句話的時候,事實上是讓name2指向了‘oldboy’所在的內存地址。
修改name1的值,至關於斷開了name1到‘oldboy’的連接,從新創建name1和‘alex’之間的連接。在這個過程當中,始終沒有影響到name2和‘oldboy‘之間的關係,所以name2仍是‘oldboy’,而name1變成了‘alex’。
常量即指不變的量,如π 3.141592653…, 或在程序運行過程當中不會改變的量
舉例,假如老男孩老師的年齡會變,那這就是個變量,但在一些狀況下,他的年齡不會變了,那就是常量。在Python中沒有一個專門的語法表明常量,程序員約定俗成用變量名所有大寫表明常量
AGE_OF_OLDBOY = 56
隨着學習的深刻,用不了多久,你就能夠寫複雜的上千甚至上萬行的代碼啦,有些代碼你花了好久寫出來,過了些天再回去看,發現居然看不懂了,哈哈,這太正常了。 另外,你之後在工做中會發現,一個項目可能是由幾個甚至幾十個開發人員一塊兒作,你要調用別人寫的代碼,別人也要用你的,若是代碼不加註釋,你本身都看不懂,更別說別人了,這樣寫會捱打的。因此爲了不這種尷尬的事情發生,必定要增長你代碼的可讀性。
代碼註釋分單行和多行註釋, 單行註釋用 #
,多行註釋能夠用三對雙引號""" """
下面給你們看一段標準代碼的註釋,忽略代碼意思
def subclass_exception(name, parents, module, attached_to=None): """ Create exception subclass. Used by ModelBase below. If 'attached_to' is supplied, the exception will be created in a way that allows it to be pickled, assuming the returned exception class will be added as an attribute to the 'attached_to' class. """ class_dict = {'__module__': module} if attached_to is not None: def __reduce__(self): # Exceptions are special - they've got state that isn't # in self.__dict__. We assume it is all in self.args. return (unpickle_inner_exception, (attached_to, name), self.args) def __setstate__(self, args): self.args = args class_dict['__reduce__'] = __reduce__ class_dict['__setstate__'] = __setstate__ return type(name, parents, class_dict)
代碼註釋原則:
name = input("What is your name?") print("Hello " + name )
執行腳本就會發現,程序會等待你輸入姓名後再往下繼續走。
可讓用戶輸入多個信息,以下
name = input("What is your name?") age = input("How old are you?") hometown = input("Where is your hometown?") print("Hello ",name , "your are ", age , "years old, you came from",hometown)
結果輸出
What is your name?Alex Li How old are you?22 Where is your hometown?ShanDong Hello Alex Li your are 22 years old, you came from ShanDong
注意,input()方法接收的只是字符串,即便你輸入的是數字,它也會按字符串處理
備註:
當行注視:# 被註釋內容
多行註釋:""" 被註釋內容 """
int(整型)
在64位系統上,整數的位數爲64位,取值範圍爲2-263~2263-1,即-9223372036854775808~9223372036854775807
long(長整型)
跟C語言不一樣,Python的長整數沒有指定位寬,即:Python沒有限制長整數數值的大小,但實際上因爲機器內存有限,咱們使用的長整數數值不可能無限大。
注意,自從Python2.2起,若是整數發生溢出,Python會自動將整數數據轉換爲長整數,因此現在在長整數數據後面不加字母L也不會致使嚴重後果了。
注意:在Python3裏再也不有long類型了,全都是int
float(浮點型)
即小數
type(2.32) ---> <class float>
在Python中,加了引號的字符都被認爲是字符串!
>>> name = "Alex Li" #雙引號 >>> age = "22" #只要加引號就是字符串 >>> age2 = 22 #int >>> >>> msg = '''My name is Alex, I am 22 years old!''' #我擦,3個引號也能夠 >>> >>> hometown = 'ShanDong' #單引號也能夠
那單引號、雙引號、多引號有什麼區別呢? 讓我大聲告訴你,單雙引號木有任何區別,只有下面這種狀況 你須要考慮單雙的配合
msg = "My name is Alex , I'm 22 years old!"
多引號什麼做用呢?做用就是多行字符串必須用多引號
msg = ''' 今天我想寫首小詩, 歌頌個人同桌, 你看他那烏黑的短髮, 好像一隻炸毛雞。 ''' print(msg)
字符串拼接
數字能夠進行加減乘除等運算,字符串呢?讓我大聲告訴你,也能?what ?是的,但只能進行」相加」和」相乘」運算。
>>> name 'Alex Li' >>> age '22' >>> >>> name + age #相加其實就是簡單拼接 'Alex Li22' >>> >>> name * 10 #相乘其實就是複製本身多少次,再拼接在一塊兒 'Alex LiAlex LiAlex LiAlex LiAlex LiAlex LiAlex LiAlex LiAlex LiAlex Li'
注意,字符串的拼接只能是雙方都是字符串,不能跟數字或其它類型拼接
>>> name 'Alex Li' >>> age2 22 >>> name + age2 Traceback (most recent call last): File "", line 1, in TypeError: cannot concatenate 'str' and 'int' objects #錯誤提示數字 和 字符 不能拼接
布爾類型很簡單,就兩個值 ,一個True(真),一個False(假), 主要用記邏輯判斷
但其實大家並不明白對麼? let me explain, 我如今有2個值 , a=3, b=5 , 我說a>b你說成立麼? 咱們固然知道不成立,但問題是計算機怎麼去描述這成不成立呢?或者說a< b是成立,計算機怎麼描述這是成立呢?
沒錯,答案就是,用布爾類型
>>> a=3 >>> b=5 >>> >>> a > b #不成立就是False,即假 False >>> >>> a < b #成立就是True, 即真 True
計算機爲何要描述這種條件呢?由於接下來就能夠根據條件結果來幹不一樣的事情啦呀!好比
if a > b print(a is bigger than b ) else print(a is smaller than b )
上面是僞代碼,可是不是意味着, 計算機就能夠根據判斷結果不一樣,來執行不一樣的動做啦?
若是要把全班的人名在內存裏存下來,用上面的字符串類型能夠作到,但取的時候不方便。
names = "Alex,Jack,Rain,Rachel,Mack..."
你print(names)它打印的是全部人的信息,若是想取出Rain,沒辦法(能夠用字符串切割方式,可是很麻煩)。此時,用列表就比較合適。
>>> names = ["Alex","Jack","Rain","Rachel","Mack"] >>> names[2] #爲什麼names[2]就能取出Rain? 'Rain'
由於列表的是經過下標來標記元素位置的。 下標從0開始,每添加一個元素,就自動+1
元素名 | ALEX | Jack | Rain | Rachel | Mack |
下標(索引) | 0 | 1 | 2 | 3 | 4 |
1.元素添加
元素的添加有2種方式,插入、追加,插入指能夠插入到列表的任意位置
插入
>>> names ['Alex', 'Jack', 'Rain', 'Rachel', 'Mack'] >>> names.insert(3,"小明") #3表明你想插入的位置 >>> names ['Alex', 'Jack', 'Rain', '小明', 'Rachel', 'Mack']
追加
添加到列表的尾部
>>> names ['Alex', 'Jack', 'Rain', '小明', 'Rachel', 'Mack'] >>> names.append("小強") >>> names ['Alex', 'Jack', 'Rain', '小明', 'Rachel', 'Mack', '小強']
2.修改
直接根據下標找到元素從新賦值便可
>>> names[0] = "金角大王Alex" >>> names ['金角大王Alex', 'Jack', 'Rain', '小明', 'Rachel', 'Mack', '小強']
3.刪除元素
這個不是經過下標了,是根據元素名子。
>>> names ['金角大王Alex', 'Jack', 'Rain', '小明', 'Rachel', 'Mack', '小強'] >>> names.remove("小明") >>> names ['金角大王Alex', 'Jack', 'Rain', 'Rachel', 'Mack', '小強']
上面的命令會刪除從左開始找到的第一個小明, 若是有多個小明,則只刪除找到的第一個。
固然也能夠經過索引刪除
names=['金角大王Alex', 'Jack', 'Rain', '小明', 'Rachel', 'Mack', '小強'] index=names.index("Rain") >>> 2 del names[names.index("Rain")] >>> ['金角大王Alex', 'Jack', '小明', 'Rachel', 'Mack', '小強'] 注意:index方法是經過列表裏面的元素找索引,若是元素不存在,會報錯,錯誤信息爲: index=names.index("Rain1") >>> ValueError: 'Rain1' is not in list
判斷元素是否在列表裏
>>> names ['金角大王Alex', 'Jack', 'Rain', 'Rachel', 'Mack', '小強'] >>> >>> "Mack" in names True
現有一練習需求,問用戶的姓名、年齡、工做、愛好 ,而後打印成如下格式
------------ info of Alex Li ----------- Name : Alex Li Age : 22 job : Teacher Hobbie: girl ------------- end -----------------
你怎麼實現呢?你會發現,用字符拼接的方式還難實現這種格式的輸出,因此一塊兒來學一下新姿式
只須要把要打印的格式先準備好, 因爲裏面的 一些信息是須要用戶輸入的,你沒辦法預設知道,所以能夠先放置個佔位符,再把字符串裏的佔位符與外部的變量作個映射關係就好啦
name = input("Name:") age = input("Age:") job = input("Job:") hobbie = input("Hobbie:") info = ''' ------------ info of %s ----------- #這裏的每一個%s就是一個佔位符,本行的表明 後面拓號裏的 name Name : %s #表明 name Age : %s #表明 age job : %s #表明 job Hobbie: %s #表明 hobbie ------------- end ----------------- ''' %(name,name,age,job,hobbie) # 這行的 % 號就是 把前面的字符串 與拓號 後面的 變量 關聯起來 print(info)
%s就是表明字符串佔位符,除此以外,還有%d,是數字佔位符,%f是浮點數佔位符, 若是把上面的age後面的換成%d,就表明你必須只能輸入數字啦
咱們運行一下,可是發現出錯了。。。
說%d須要一個數字,而不是str, what? 咱們明明輸入的是數字呀,22,22呀。
不用擔憂 ,不要相信你的眼睛我,們調試一下,看看輸入的究竟是不是數字呢?怎麼看呢?查看數據類型的方法是什麼來着?type()
name = input("Name:") age = input("Age:") print(type(age))
執行輸出是
Name:Alex Age:22 #怎麼會是str Job:IT ....
讓我大聲告訴你,input接收的全部輸入默認都是字符串格式!
要想程序不出錯,那怎麼辦呢?簡單,你能夠把str轉成int
age = int( input("Age:") ) print(type(age))
確定沒問題了。相反,能不能把數字轉成字符串呢?必然能夠,str( yourStr )