---恢復內容開始---java
強類型定義語言在速度上可能略遜色於弱類型定義語言,可是強類型定義語言帶來的嚴謹性可以有效的避免許多錯誤。python
編譯:是將源程序翻譯成可執行的目標代碼,翻譯與執行是分開;而解釋是對源程序的翻譯與執行一次性完成,不生成可存儲的目標代碼。這只是表象,兩者背後的最大區別是:對解釋執行而言,程序運行時的控制權在解釋器而不在用戶程序;對編譯執行而言,運行時的控制權在一用戶程序linux
解釋:具備良好的動態特性和可移植性,好比在解釋執行時能夠動態改變變量的類型,對程序進行修改以及在程序中插入良好的調試診斷信息等,而將解釋器移植到不一樣的系統上,則程序不用改動就能夠在移植瞭解釋器的系統上運行。同時解釋器也有很大的缺點 ,好比執行效率低,佔用空間大,由於不只要給用戶程序分配空間,解釋器自己也佔用了寶貴的系統資源。程序員
編譯型:有一個負責翻譯的程序來對咱們的源代碼進行轉換,生成相對應的可執行代碼。這個過程成爲編譯,而負責編譯的程序稱爲編譯器。若是咱們寫的程序代碼都包含在一個源文件中,那麼一般編譯以後就會直接生成一個可執行文件,咱們就能夠直接運行了。但對於一個比較複雜的項目,爲了方便管理,咱們一般把代碼分散在各個源文件中,做爲不一樣的模塊來組織。這時編譯各個文件時就會生成目標文件而不是前面說的可執行代碼了,但因爲只是整個項目的一部分,因此咱們還不能直接運行。待全部的源文件的編譯都完成後,咱們就能夠最後把這些半成品的目標「打包」成一個可執行的文件了,這個工做由另外一個程序負責完成,而負責鏈接的程序就叫連接程序。連接程序除了連接目標文件外,可能還有各類資源,像圖標文件,聲音文件,還要負責去除目標文件之間的冗餘重複代碼。連接完成後,通常就能夠獲得咱們想要的可執行文件了web
從字面上看,"編譯"和"解釋"的確都有"翻譯"的意思,他們的區別則在於翻譯的時機安排的不大同樣。例如:你打算閱讀一本外文書,而你不知道這門外語,那麼你能夠找一名翻譯,給他足夠的時間讓他從頭至尾把整本書翻譯好,而後把書的母語版交給你閱讀;或者,你也能夠馬上讓這名翻譯輔助你閱讀,讓他一句一句的給你翻譯,若是你想往回看某個章節,他也得從新翻譯算法
兩種方式,前者就至關於編譯型:一次把全部的代碼轉換成機器語言,而後寫成可執行文件;後者至關於解釋型:在程序運行的前一刻,還只有源程序而沒有可執行程序;而程序每執行到源程序的某一條指令,則會有一個稱之爲解釋程序的外殼程序將源代碼轉換成二進制代碼以供執行,總言之,就是不斷的解釋,執行,解釋,執行。。。。。。因此,解釋型程序是離不開解釋程序的。像早期的BASIC就是一門經典的解釋型語言,要執行BASIC程序,就得進入BASIC環境,而後才能加載程序源文件運行。解釋型程序中,因爲程序老是以源代碼的形式出現,所以只要有相應的解釋器,移植幾乎不成問題。編譯型程序雖然源代碼也能夠移植,但前提是必須針對不一樣的系統分別進行編譯,對於複雜的工程來講,的確是一件不小的時間消耗,何況極可能一些細節的地方仍是要修改源代碼。並且,解釋型程序省卻了變異的步驟,修改調試也分廠方便,編輯完畢以後便可以當即運行,沒必要像編譯型程序同樣每次進行小小改動都要耐心等待漫長的編譯和連接過程。不過因爲解釋型程序是將編譯的過程放到執行的過程當中,這就決定了解釋型程序註定要比編譯型慢,幾百倍的速度差距也是不足爲奇的shell
編譯型與解釋型各有優缺點又相互對立,因此一批新興的語言都有把二者折衷起來的趨勢,例如java語言雖然比較接近解釋型語言的特徵,但在執行前已經預編譯,生成的代碼是介於機器碼和java源代碼之間的中介代碼,運行的時候則由JVM(java的虛擬平臺)解釋執行。它既保留了源代碼的高抽象,可移植的特色,又已經完成了對源代碼的大部分預編譯工做,因此執行起來比純解釋型程序要快不少,而像VB6,C#這樣的語言,雖然表面上看生成的是.exe可執行程序文件,但VB6編譯後實際生成的也是一種中介代碼,只不過編譯器在前面按查了一段自動調用某個外部解釋器的代碼(該解釋程序獨立於用戶編寫的程序,存放於系統的某個DLL文件中,因此以VB6編譯生成的可執行程序都要用到它),以解釋執行世紀的程序體。C#則是生成.net目標代碼,實際執行時則由.net解釋系統進行執行、固然.net目標代碼已經至關"低級",比較接近機器語言了,因此將其視爲編譯語言,並且其可移植程度也沒有java號稱的這麼強大,Java號稱是「一次編譯,處處執行"編程
而.net則是一次編碼,處處編譯。總之,隨着設計技術與硬件的不斷髮展,編譯型與解釋型兩種方式的界限正在不斷變的模糊vim
當咱們編寫python代碼時,咱們獲得的是一個包含python代碼的以.py爲擴展名的文本文件。要運行代碼,就須要python解釋器去執行.py文件windows
因爲整個Python語言從規範到解釋器都是開源的,因此理論上,只要水平夠高,任何人均可以編寫Python解釋器來執行Python代碼(固然難度很大)。事實上,確實存在多種Python解釋器。
這個解釋器是用C語言開發的,因此叫CPython。在命令行下運行python
就是啓動CPython解釋器。
IPython是基於CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所加強,可是執行Python代碼的功能和CPython是徹底同樣的。比如不少國產瀏覽器雖然外觀不一樣,但內核其實都是調用了IE。
CPython用>>>
做爲提示符,而IPython用In [
序號
]:
做爲提示符。
PyPy是另外一個Python解釋器,它的目標是執行速度。PyPy採用JIT技術,對Python代碼進行動態編譯(注意不是解釋),因此能夠顯著提升Python代碼的執行速度。
Jython是運行在Java平臺上的Python解釋器,能夠直接把Python代碼編譯成Java字節碼執行。
IronPython和Jython相似,只不過IronPython是運行在微軟.Net平臺上的Python解釋器,能夠直接把Python代碼編譯成.Net的字節碼。
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
1 Old:print "The answer is",2*2 2 New:print("The answer is",2*2) 3 Old:print x,#Trailing comma suppresses newline 4 New:print(x,end=" ") #Appends a space instead of a newline 5 Old:print #Prints a newline 6 New:print() #You must call the function 7 Old:print >>sys.stderr,"fatal error" 8 New:print("fatal error",file=sys.stderr) 9 Old:(x,y) #print repr((x,y)) 10 New:((x,y)) #Not the same as print (x,y)!
You can also customize the separator between items,eg:
1 print("There are <",2**32,">possibilities!",sep="")
ALL IS UNICODE NOW
(A,*REST,B)=RANG(5)
1 >>> a,*rest,b = range(5) 2 >>> a,rest,b 3 (0, [1, 2, 3], 4)
某些庫更名了
Old Name | New Name |
_winreg | winreg |
ConfigParser | configoarser |
copy_reg | copyreg |
Queue | queue |
SocketServer | socketserver |
markupbase | _markupbase |
repr | reprlib |
test.test_support | test.support |
在linux 下建立hello.py並輸入
1 print("hello world")
而後執行命令:python hello.py 輸出
1 localhost:~morgana$vim hello.py 2 localhost:~morgana$python hello.py 3 helloworld
上一步中執行python hello.py時,明確的指出hello.py腳本是由python解釋器來執行
若是想要相似於執行shell腳本同樣執行python腳本,例如:./hello.py,那麼都須要在hello.py文件的頭部指定解釋器,以下
1 #!/usr/bin/env python 2 3 print("hello,world")
如此一來執行:./hello.py便可
ps:執行前需給予 hello.py 執行權限,chmod 755 hello.py
除了把程序寫在文件裏,還能夠直接調用python自帶的交互器運行代碼
1 root@iZ25j36rr97Z:~# python 2 Python 2.7.12 (default, Jul 1 2016, 15:12:24) 3 [GCC 5.4.0 20160609] on linux2 4 Type "help", "copyright", "credits" or "license" for more information. 5 >>> print("Hello World!") 6 Hello World! 7 >>>
1 #_*_ coding:utf-8 _*_ 2 3 name = "morgana"
上述代碼聲明瞭一個變量,變量名爲:name,變量name的值爲"morgana"
變量名只能是字母,數字或下劃線的任意組合
變量名的第一個字符不能是數字
如下關鍵字不能聲明爲變量名
1 'and','as','assert','break','class','continue', 2 'def','del','elif','else','except','exec','finally', 3 'for','form','global','if','import','in','is','lambda', 4 'not','or','pass','print','raise','return','try','while','with','yield'
1 name= "morgnana" 2 3 name2= name 4 print(name,name2) 5 6 name = "jack" 7 8 print ("What is the value of name2 now?")
python解釋器在加載.py文件中的代碼時,會對內容進行編碼(默認ascill) ASCII(American Standard Code For Information Interchange,美國標準信息交換代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其餘西歐語言,其最多隻能用8位來表示(一個字節),即:2**8 = 256 -1 ,因此ASCII碼最多隻能表示255個符號
爲了處理漢字,程序員設計了用於簡體中文的GB2312和用於繁體中文的big5
GB2313(1980年)一共收錄了7445個字符,包括了6763個漢字和682個其餘符號,漢字區的內碼範圍高字節從B0-F7,低字節從A1-FE,佔用的碼位是72*94=6768.其中有5個空位是D7FA-D7FE
GB2312 支持的漢字太少。1995年的漢字擴展規範GBK1.0收錄了21886個符號,它分爲漢字區和圖形符號區。漢字區包括21003個字符。2000年的 GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。如今的PC平臺必須支持GB18030,對嵌入式產品暫不做要求。因此手機、MP3通常只支持GB2312。
從ASCII、GB23十二、GBK 到GB18030,這些編碼方法是向下兼容的,即同一個字符在這些方案中老是有相同的編碼,後面的標準支持更多的字符。在這些編碼中,英文和中文能夠統一地處理。區分中文編碼的方法是高字節的最高位不爲0。按照程序員的稱呼,GB23十二、GBK到GB18030都屬於雙字節字符集 (DBCS)。
有的中文Windows的缺省內碼仍是GBK,能夠經過GB18030升級包升級到GB18030。不過GB18030相對GBK增長的字符,普通人是很難用到的,一般咱們仍是用GBK指代中文Windows內碼。
顯然ASCII碼沒法將世界上的各類文字和符號所有表示,因此,就須要新出一種能夠表明全部字符和符號的編碼,即:Unicode
Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,它爲每種語言中的每一個字符設定了統一而且惟一的二進制編碼,規定雖有的字符和符號最少由 16 位來表示(2個字節),即:2 **16 = 65536,
注:此處說的的是最少2個字節,可能更多
UTF-8,是對Unicode編碼的壓縮和優化,他再也不使用最少使用2個字節,而是將全部的字符和符號進行分類:ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存...
因此,python解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(默認ascill),若是是以下代碼的話:
報錯:ascii碼沒法表示中文
1 #!/usr/bin/env python 2 3 print "你好,世界"
改正:應該顯示的告訴python解釋器,用什麼編碼來執行源代碼,即:
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 4 print "你好,世界"
1 當行註釋:#被註釋內容 2 3 多行註釋:"""被註釋內容"""
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 4 6 #name = raw_input("What is your name?") #only on python 2.x 7 8 name = input("What is your name?") 9 10 print("Hello" + name)
輸入密碼時,若是想要不可見,須要利用getpass模塊中的getpass,即
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 4 import getpass 5 6 #將用戶輸入的內容賦值給name變量 7 pwd = getpass.getpass("請輸入密碼:") 8 9 #打印輸入的內容 10 print(pwd)
python 的強大之處在於他有很是豐富和強大的標準庫的第三方庫,幾乎你想實現的任何功能都有相應的python庫支持
1 #!/usr/bin/env python 2 #_*_ coding:utf-8_*_ 3 4 import sys 5 6 print(sys.argv) 7 8 輸出 9 10 $ python test.py hello world 11 ['test.py','hello','world'] #把執行腳本時傳遞的參數獲取到了
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 4 import os 5 6 os.system("df -h") #調用系統命令
徹底結合一下
#!/usr/bin/env python #_*_coding:utf-8_*_ import os,sys os.system('',join(sys.argv[1:])) #把用戶的輸入的參數看成一條命令交給os.system來執行
python tab補全模塊
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 5 import sys 6 import readline 7 import rlcompleter 8 9 if sys.platform == 'darwin' and sys.version_info[0] == 2: 10 readline.parse_and_bind("bind ^I rl_complete") 11 else: 12 readline.parse_and_bind("tab:complete") 13 #linux and python3 on mac
#!/usr/bin/env python #_*_ coding:utf-8_*_ import sys import readline import rlcompleter import atexit import os #tab completion readline.parse_and_bind('tan:complete') #history file histfile = os.path.join(os.environ['HOME'],'.pythonhistory') try: readline.read_history_file(histfile) except IOError: pass atexit.register(readline.write_history_file,histfile) del os.histfile,readline,rlcompleter
簡述Python的運行過程
咱們在硬盤上看到的pyc天然沒必要多說,而其實PyCodeObject則是Python編譯器真正編譯成的結果。咱們先簡單知道就能夠了,繼續向下看。
當python程序運行時,編譯的結果則是保存在位於內存中的PyCodeObject中,當Python程序運行結束時,Python解釋器則將PyCodeObject寫回到pyc文件中。
當python程序第二次運行時,首先程序會在硬盤中尋找pyc文件,若是找到,則直接載入,不然就重複上面的過程。
因此咱們應該這樣來定位PyCodeObject和pyc文件,咱們說pyc文件實際上是PyCodeObject的一種持久化保存方式。
1 2 是一個整數的例子 2 長整數 不過是大一些的整數 3 3.23和52.3E-4是浮點數的例子。E標記表示10的冪。在這裏52.3E-4表示52.3*10-4 4 (-5+4j)和(2.3-4.6j)是複數的例子,其中-5.4爲實數,j爲虛數,數學中表示負數的是什麼呢
1 在32位機器上,整數的位數爲32位,取值範圍爲-2**31~2**31-1,即-2147483648~2147483647 2 在64位系統上,整數的位數爲64位,取值範圍爲-2**63~2**63-1,
即-9223372036854775808~9223372036854775807
long(長整型)
1 跟C語言不一樣,Python的長整數沒有指定位寬,即:Python沒有限制長整數數值的大小,
但實際上因爲機器內存有限,咱們使用的長整數數值不可能無限大。 2 注意,自從Python2.2起,若是整數發生溢出,Python會自動將整數數據轉換爲長整數,
因此現在在長整數數據後面不加字母L也不會致使嚴重後果了
1 浮點數用來處理實數,即帶有小數的數字。相似於C語言中的double類型, 2 佔8個字節(64位),其中52位表示底,11位表示指數,剩下的一位表示符號。complex(複數) 4 複數由實數部分和虛數部分組成,通常形式爲x+yj,其中的x是複數的實數部分,y是複數的虛數部分,這裏的x和y都是實數。 5 注:Python中存在小數字池:-5 ~ 257
1 真或假 2 1或0
1 "hello world"
萬惡的字符串拼接:
python中的字符串在C語言中體現爲是一個字符數組,每次建立字符串時候須要在內存中開闢一塊連續的空間,而且一旦須要修改字符串的話,就須要再次開闢空間,萬惡的+號每出現一次就會在內存中從新開闢一塊空間
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 4 name = "morgnana" 5 print "i am %s" % name 6 7 #輸出 i am morgnana
PS :字符串是%s;整數%d;浮點數%f
建立列表:
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 4 name_list = ['alex','seven','eric'] 5 或 6 name_list = list(['alex','seven','eric'])
基本操做:
建立元祖:
1 #!/usr/bin/env python 2 # _*_coding:utf-8 _*_ 3 ages = (11,22,33,44,55) 4 或 5 ages = tuple((11,22,33,44,55))
建立字典:
1 #!/usr/bin/env python 2 # _*_coding:utf-8 _*_ 3 4 persion = {"name":"mr.gai","age":"18"} 5 或 6 persion = dict ({"name":"mr.gai","age":"18"})
經常使用操做:
身份運算
位運算:
1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 4 a = 60 5 # 60 = 0011 1100 6 b = 13 7 # 13 = 0000 1101 8 9 c = a & b; 10 # 12 = 0000 1100 11 print "Line 1 - Value of c is",c 12 13 c = a|b; 14 # 61 = 0011 1101 15 print "Line 2 - Value of c is",c 16 17 c = a ^ b; 18 # 49 = 0011 0001 19 print "Line 3 - Value of c is",c 20 21 c = ~a; 22 # -61 = 1100 0011 23 print "Line 4 - Value of c is",c 24 25 c = a << 2; 26 # 240 = 1111 0000 27 print "Line 5 - Value of c is",c 28 29 c = a >> 2; 30 # 15 = 0000 1111 31 print "Line 6 - Value of c is",c
場景一,用戶登陸驗證
1 #!/usr/bin/env python3 2 #_*_ coding:utf-8 _*_ 3 4 """ 5 提示輸入用戶名和密碼 6 驗證用戶名和密碼 7 若是錯誤,則輸出用戶名密碼錯誤 8 若是成功,則輸出歡迎,xxx! 9 """ 10 11 import getpass 12 13 name = input("請輸入用戶名:") 14 PassWd = getpass.getpass("請輸入密碼") 15 16 if name == "morgana" and PassWd == "123456": 17 print ("welcome %s" %name ) 18 else: 19 print ("用戶名密碼錯誤")
場景二 猜年齡遊戲
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ """ 在程序裏設定好你的年齡,而後啓動程序讓用戶猜想, 用戶輸入後,根據他的輸入提示輸入的是否正確, 若是錯誤,提示是猜大了仍是小了 """ Age = 31 Guess_Age= input ("請輸入猜想年齡") if Guess_Age == Age: print("bingo") elif Guess_Age > Age: print("more small") elif Guess_Age < Age: print("more big") else: print("something wrong")
外層變量,能夠被內層代碼使用
內層變量,不該被外層代碼使用
1 #!/usr/bin/env python3 2 #_*_ coding:utf-8 _*_ 3 4 __author__="morgnana" 5 6 for i in range(10): 7 print ("loop:",i)
需求一:仍是上面的程序,可是遇到小於5的循環次數就不走了,直接跳入下一次循環
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 4 for i in range(10): 5 if i < 5: 6 continue 7 print('loop:',i)
需求二:仍是上面的程序,可是遇到大於5的循環次數就不走了,直接退出
1 #!/usr/bin/env python3 2 #_*_ coding:utf8 _*_ 3 4 5 for i in range(10): 6 if i > 5: 7 break 8 print('loop:',i)
死循環
#!/usr/bin/env python3 # _*_ coding:utf-8 _*_ count = 0 while True: print ("welcome morgana",count) count+=1
上面代碼100次後退出
1 #!/usr/bin/env python3 2 # _*_ coding:utf-8 _*_ 3 4 count = 0 5 6 while True: 7 print ("welcome morgana",count) 8 count+=1 9 if count == 100: 10 break
回到上面for 循環的例子,如何實現讓用戶不斷的猜年齡,但只給最多3次機會,再猜不對就退出程序
1 #!/usr/bin/env python3 2 # _*_ coding:utf-8 _*_ 3 4 Age=31 5 Count=0 6 7 while Count < 3: 8 Guess_Age=input('請輸入年齡:') 9 if Guess_Age == Age: 10 print('bingo') 11 elif Guess_Age > Age: 12 print('more small') 13 elif Guess_Age < Age: 14 print('more big') 15 else: 16 print('someting wrong') 17 Count+=1 18 else: 19 print('wrong')
做業一:博客
做業二:編寫登錄接口