一、什么是python
Python(英國發音:/ pa θ n/ 美國發音:/ pa θɑ n/),是一種面向對象、直譯式的計算機程序語言。
每一門語言都有自己的哲學:
pythonde 設計哲學是:“優雅”、“明確”、“簡單”
二、python由來
1989年的圣誕節期間,吉多·范羅蘇姆為了在阿姆斯特丹打發時間,決心開發一個新的腳本解釋程序,作為ABC語言的一種繼承。之所以選中Python作為程序的名字,是因為他是BBC電視劇——蒙提·派森的飛行馬戲團(Monty Python‘s Flying Circus)的愛好者。
三、Python能做什么
Web程序
Python經常被用于Web開發。比如,通過mod_wsgi模塊,Apache可以運行用Python編寫的Web程序。使用Python語言編寫的Gunicorn作為Web服務器,也能夠運行Python語言編寫的Web程序。Python定義了WSGI標準應用接口來協調Http服務器與基于Python的Web程序之間的溝通。一些Web框架,如Django、Pyramid、TurboGears、Tornado、web2py、Zope、Flask等,可以讓程序員輕松地開發和管理復雜的Web程序。
Python對于各種網絡協議的支持很完善,因此經常被用于編寫服務器軟件、網絡蠕蟲。第三方庫Twisted支持異步在線編寫程序和多數標準的網絡協議(包含客戶端和服務器),并且提供了多種工具,被廣泛用于編寫高性能的服務器軟件。另有gevent這個流行的第三方庫,同樣能夠支持高性能高并發的網絡開發。
GUI開發
Python本身包含的Tkinter庫能夠支持簡單的GUI開發。但是越來越多的Python程序員選擇wxPython或者PyQt等GUI包來開發跨平臺的桌面軟件。使用它們開發的桌面軟件運行速度快,與用戶的桌面環境相契合。通過PyInstaller還能將程序發布為獨立的安裝程序包。
在很多操作系統里,Python是標準的系統組件。大多數linux發布版以及NetBSD、OpenBSD和Mac OS X都集成了Python,可以在終端機下直接運行Python。有一些Linux發布版的安裝器使用Python語言編寫,比如Ubuntu的Ubiquity安裝器、Red Hat Linux和Fedora的Anaconda安裝器。Gentoo Linux使用Python來編寫它的Portage包管理系統。Python標準庫包含了多個調用作業系統功能的庫。通過pywin32這個第三方軟件包,Python能夠訪問Windows的COM服務及其它Windows API。使用IronPython,Python程序能夠直接調用.Net Framework。
其他
NumPy、Scipy、Matplotlib可以讓Python程序員編寫科學計算程序。有些公司會使用Scons代替make構建C++程序。
很多游戲使用C++編寫圖形顯示等高性能模塊,而使用Python或者Lua編寫游戲的邏輯、服務器。相較于Python,Lua的功能更簡單、體積更小;而Python則支持更多的特性和數據類型。很多游戲,如EVE Online使用Python來處理游戲中繁多的邏輯。
YouTube、Google、Yahoo!、NASA都在內部大量地使用Python。OLPC的作業系統Sugar項目的大多數軟件都是使用Python編寫
所以他的應用范圍大概分為:
數據分析
系統編程
組件集成
網絡服務
圖像處理
數值計算和科學計算
四、設計哲學與定位
Python的設計哲學是“優雅”、“明確”、“簡單”。Python開發者的哲學是“用一種方法,最好是只有一種方法來做一件事”。在設計Python語言時,如果面臨多種選擇,Python開發者一般會拒絕花俏的語法,而選擇明確沒有或者很少有歧義的語法。這些準則被稱為“ Python格言”。在Python解釋器內運行import this可以獲得完整的列表
1.優美勝于丑陋(Python 以編寫優美的代碼為目標)
2.明了勝于晦澀(優美的代碼應當是明了的,命名規范,風格相似)
3.簡潔勝于復雜(優美的代碼應當是簡潔的,不要有復雜的內部實現)
4.復雜勝于凌亂(如果復雜不可避免,那代碼間也不能有難懂的關系,要保持接口簡潔,多加注釋!)
5.扁平勝于嵌套(優美的代碼應當是扁平的,不能有太多的嵌套)
6.間隔勝于緊湊(優美的代碼有適當的間隔,不要奢望一行代碼解決問題,一行代碼不能超過80個字符,你可以換行或起一個新的邏輯來寫)
7.可讀性很重要(優美的代碼是可讀的)
8.即便假借特例的實用性之名,也不可違背這些規則(這些規則至高無上),覺對不允許特列必須按照這個規則
9.不要包容所有錯誤,除非你確定需要這樣做(精準地捕獲異常,不寫 except:pass 風格的代碼)
10.當存在多種可能,不要嘗試去猜測!
11.而是盡量找一種,最好是唯一一種明顯的解決方案(如果不確定,就用窮舉法)
12.雖然這并不容易,因為你不是 Python 之父(這里的 Dutch 是指 Guido )
13.做也許好過不做,但不假思索就動手還不如不做(動手之前要細思量)
14.如果你無法向人描述你的方案,那肯定不是一個好方案;反之亦然(方案測評標準)
15.命名空間是一種絕妙的理念,我們應當多加利用(倡導與號召
PS:
簡單的拿php和python做對比:
python是綜合性的語言,他不光可以做web開發。他倆的對比應該僅限于web開發方向。不見其phpweb開發別python好,php是先入為主,python的web框架在2000才有的比較晚了
django起來的比較晚,他們的web開發都是很不錯了。你用php做的python都可以做。python給你的是一個完整的解決,前端和后端都可以用python。
簡單的拿C和python做對比:
Python慢,慢的嚴重,慢出風格,慢出自信!!!相同的程序Python比C慢幾百倍很正常
程序的快慢很大程度上程序員邏輯、SQL、算法,比起O(n)和O(n^2)的區別, 語言間的差異就顯得微乎其微
一、語法要求
–縮進統一
同一級別的代碼必須一致!(并且建議所有級別的代碼的縮進建議是相同的--必須,開發規范里建議4個空格)建議不要用table因為如果想把代碼在windows上運行,linux和windows的table的定義不同!!!!
好的編輯器能提高開發代碼的效率!
所有python,第一行一定要頂到行頭! 同一級別的新的都要頂到行頭。
二、變量
標識符的第一個字符必須是字母表中的字母(大寫或小寫)或者一個下劃線(‘ _ ’)
標識符名稱的其他部分可以由字母(大寫或小寫)、下劃線(‘ _ ’)或數字(0-9)組成。
有效 標識符名稱的例子有i、__my_name、name_23和a1b2_c3。
無效 標識符名稱的例子有2things、this is spaced out和my-name。
標識符名稱是對大小寫敏感的。例如,myname和myName不是一個標識符。注意前者中的小寫n和后者中的大寫N。
常量:數值不變的
變量:數值會變動的量
在python中沒有常量的,所有的數值都可以改變,但是他依然有個常量的概念,但是是人為的你不去改變他,定義一個常量應該用大寫的形式。
AGE = 10 這個就是常量,他是大寫的!是約定俗成的。但是他是可以改的!
name = 'Tim Luo' 這個是變量
##這里需要注意下,設置變量的時候不能設置python自帶的內置方法比如type
以下關鍵字不能聲明為變量名
1 ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'PRint', 'raise', 'return', 'try', 'while', 'with', 'yield']
變量的起名的方式就是標識符名稱,通過標識符去調用內存中的數據。
一、安裝python
windows:
1、下載安裝包 https://www.python.org/downloads/2、安裝 默認安裝路徑:C:/python273、配置環境變量 【右鍵計算機】--》【屬性】--》【高級系統設置】--》【高級】--》【環境變量】--》【在第二個內容框中找到 變量名為Path 的一行,雙擊】 --> 【Python安裝目錄追加到變值值中,用 ; 分割】 如:原來的值;C:/python27,切記前面有分號
linux:
無需安裝,原裝Python環境 ps:如果自帶2.6,請更新至2.7
二、更新python
windows:
卸載重裝即可
linux
Linux的yum依賴自帶Python,為防止錯誤,此處更新其實就是再安裝一個Python!
查看默認Python版本python -V 1、安裝gcc,用于編譯Python源碼 yum install gcc2、下載源碼包,https://www.python.org/ftp/python/3、解壓并進入源碼文件4、編譯安裝 ./configure make all make install5、查看版本 /usr/local/bin/python2.7 -V6、修改默認Python版本 mv /usr/bin/python /usr/bin/python2.6 ln -s /usr/local/bin/python2.7 /usr/bin/python7、防止yum執行異常,修改yum使用的Python版本 vi /usr/bin/yum 將頭部 #!/usr/bin/python 修改為 #!/usr/bin/python2.6
Python入門
一、第一句python
vim hello.py 創建一個文件
#!//usr/bin/env python#-*- conding:utf-8 -*- print "Hello World"
執行:
python hello.py 即可或者增加執行權限:chmod 755 hello.py ./hello.py
解釋:
1 #!//usr/bin/env python #腳本用env啟動的原因,是因為腳本解釋器在linux中可能被安裝于不同的目錄,env可以在系統的PATH目錄中查找。同時,env還規定一些系統環境變量。env就是:envirnment 環境變量)2 # -*- coding: utf-8 -*- 指定編碼類型為utf-8 (詳情繼續閱讀)
二、編碼
python解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(默認ascill)
ASCII(American Standard Code for Information Interchange,美國標準信息交換代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言,其最多只能用 8 位來表示(一個字節),即:2**8 = 256,所以,ASCII碼最多只能表示 256 個符號
顯然ASCII碼無法將世界上的各種文字和符號全部表示,所以,就需要新出一種可以代表所有字符和符號的編碼,即:Unicode
Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一并且唯一的二進制編碼,規定雖有的字符和符號最少由 16 位來表示(2個字節),即:2 **16 = 65536,
注:此處說的的是最少2個字節,可能更多
UTF-8,是對Unicode編碼的壓縮和優化,他不再使用最少使用2個字節,而是將所有的字符和符號進行分類:ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存...
所以,python解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(默認ascill),所以如果不指定編碼類型,如果有中文就會報錯。
三、Python的工作過程
python 把代碼讀到內存 2、詞法語法分析 3、放到編譯器 ---》 生成字節碼 4、執行字節碼 ---》生成機器碼 CPU執行
四、執行腳本傳入參數
Python有大量的模塊,從而使得開發Python程序非常簡潔。類庫有包括三中:
Python內部提供的模塊
業內開源的模塊
程序員自己開發的模塊
Python內部提供一個 sys 的模塊,其中的 sys.argv 用來捕獲執行執行python腳本時傳入的參數
#!/usr/bin/env python# -*- coding: utf-8 -*- import sys print sys.argv
五、pyc文件
執行Python代碼時,如果導入了其他的 .py 文件,那么,執行過程中會自動生成一個與其同名的 .pyc 文件,該文件就是Python解釋器編譯之后產生的字節碼。
ps:代碼經過編譯可以產生字節碼;字節碼通過反編譯也可以得到代碼。(任何字節碼通過反編譯都可以得到代碼)
六、變量
字符串的值是不能被修改的,他在內存里是連續的,如果想改的話必須在后面預留所以不支持修改!
字符串特性,一旦修改,重新創建
例子:
name1 = "tianshuai"name2 = name1這里然后把name1 = "shuaige"
name2 變不變呢?其實是不變的結合上面的規則來:字符串特性,一旦修改,重新創建
name1 = "shuaige" name1的值變了,他會重新開辟一塊內存空間!
注:
name1 = "tianshuai"name2 = "tianshuai"
這里雖然他們的內存地址是相同的但是:他們的原理是各自在內存里開辟了一塊內存空間,python給他進行了優化而已。有個池的概念(把你最常用的值做一個指向)!
集合又不相同:
name1 = ['tianshuai','eric','alex'] 如果把name2 = name1
name1 這個集合增加一個,現在name2 變不變呢?會變的集合和字符串不同他的各個元素不是連續的,所以name2=name1指向后,name1增加 一個元素不會開辟一塊新的空間,name2就會跟著改變。
七、輸入
#!/usr/bin/env python# -*- coding: utf-8 -*-# 將用戶輸入的內容賦值給 name 變量 name = raw_input("請輸入用戶名:") # 打印輸入的內容print name輸入密碼時,如果想要不可見,需要利用getpass 模塊中的 getpass方法,即:
#!/usr/bin/env python# -*- coding: utf-8 -*- import getpass # 將用戶輸入的內容賦值給 name 變量pwd = getpass.getpass("請輸入密碼:") # 打印輸入的內容print pwd
八、流程控制
if...else 和 if....elif...elif..........else
需求一、用戶身份認證
#!/usr/bin/env python#-*- coding:utf-8 -*-import getpassname = raw_input("請輸入用戶名:")pwd = raw_input("請輸入密碼:")if name == "tianshuai" and pwd == "123": print "登錄成功"else: print "登錄失敗"測試:
root@tim:/home/tim# python tianshuai.py 請輸入用戶名:tianshuai請輸入密碼:登錄成功root@tim:/home/tim# python tianshuai.py 請輸入用戶名:tianshuai請輸入密碼:登錄失敗root@tim:/home/tim#
需求二、根據用戶輸入內容輸出其權限
#!/usr/bin/env python#-*- coding:utf-8 -*-'''tianshuai--->普通用戶eric--->管理用戶alex--->超級用戶'''name = raw_input("請輸入用戶名:") if name == "tianshuai": print "普通用戶"elif name == "eric": print "管理用戶"elif name == "alex": print "超級用戶"else: print "沒有此用戶"輸出結果:
root@tim:/home/tim# python tianshuai.py 請輸入用戶名:tianshuai普通用戶root@tim:/home/tim# python tianshuai.py 請輸入用戶名:eric管理用戶root@tim:/home/tim# python tianshuai.py 請輸入用戶名:alex超級用戶root@tim:/home/tim# python tianshuai.py 請輸入用戶名:lksjdfsdf沒有此用戶root@tim:/home/tim#
for i in range(100) and for i in xrange(1,100)
需求一、猜數字游戲
有3次機會,如果3次中沒有猜中給予提示,3次都沒有猜中,鼓勵!
#!/usr/bin/env python#-*- coding:utf-8 -*-import random #隨機模塊rand_num = random.randrange(10) for i in range(3): guess_num = int(raw_input("請猜測數字:")) if guess_num == rand_num: print "太棒了你猜對了" break elif guess_num > rand_num: print "你猜測的有點大了,請嘗試小點的數字" else: print "你猜測的有點小了,請嘗試大點的數字"else: print "不要灰心,這次只是運氣不好,請下次嘗試" print "這個真正的數字是:%" % guess_num輸出結果:
root@tim:/home/tim# python tianshuai.py 請猜測數字:8你猜測的有點大了,請嘗試小點的數字請猜測數字:7你猜測的有點大了,請嘗試小點的數字請猜測數字:6你猜測的有點大了,請嘗試小點的數字不要灰心,這次只是運氣不好,請下次嘗試這個真正的數字是:6root@tim:/home/tim# python tianshuai.py 請猜測數字:5太棒了你猜對了這個真正的數字是:5
while 循環
他的原理是:當條件為真的時候運行,當條件為假的時候停止!
沒有一個規定次數,不設置條件永遠循環下去。
#!/usr/bin/env python#-*- coding:utf-8 -*-import timecount = 0while True: count +=1 print "loop",count time.sleep(3)#這個循環3秒鐘自+1 ,后無線循環只要這個條件為”真“,就無限循環下去那看下下面的例子#!/usr/bin/env python#-*- coding:utf-8 -*- import timecout = 0 while cout < 3: cout +=1 print "shuai",cout time.sleep(3) #這個循環每3秒循環一次,當條件cout < 3的時候為真(自己設置的條件),當cout 不小于3的時候為假(false)停止。
#!/usr/bin/env python#-*- coding:utf-8 -*-#import randomrand_num = random.randrange(10)try_cout = 0 while try_cout < 3: guess_num = int(raw_input("請輸入猜測的數字:")) if guess_num > 10: print "輸入的數字超出范圍了" continue if guess_num == rand_num: print "哇!太棒了你猜對了" break elif guess_num < rand_num: print "你猜的數字有點小了,請嘗試大點的數字" else: print "你猜的數字有點大了,請嘗試小點的數字" try_cout +=1else: print "不要灰心你,這次只是運氣不好,請下次嘗試"print "這個真正的數字是:%d" % guess_num#當執行到guess_num> 10 如果你輸入的是大于10的數字那么將會執行continue,就會跳出檔次循環,沒有執行try_cout +=1 所以沒有計數!
注:continue 是跳出當前循環,break是跳出整個循環!
有個需求,我想返回我的上層怎么做,用標識位!如下面的例子:
#!/usr/bin/env python#-*- coding:utf-8 -*-#while True: print "我是第一層" while True: print "我是第二層" while True: print "我是第三層"
這就是個死循環,當執行到第三個循環的時候就無限循環,這里有人回想,用break行不行,不行如下:
#!/usr/bin/env python#-*- coding:utf-8 -*-#while True: print "我是第一層" break while True: print "我是第二層" break while True: print "我是第三層" break
這個的輸出結果:
root@tim:/home/tim# python tianshuai.py 我是第一層
就只執行了第一個循環就跳出,不我們想要的效果,那就用到“標志位”了,工作中也有很多地方用到他:
#!/usr/bin/env python#-*- coding:utf-8 -*-#count = 0while True: print "我是第一層" jump_1_flag = False while True: print "我是第二層" jump_2_flag = False while True: count += 1 print "我是第三層" if count > 3: jump_2_flag = True break if jump_2_flag: print "第三層跳到我這里來了,我也要跳到第一層" jump_1_flag = True break if jump_1_flag: print "第二層和第三層跳到第一層了,我也要跳" break
執行結果:
九、Pthon運算符
Python算術運算符:
| 操作符 | 描述符 | 例子 |
|---|---|---|
| + | 加法 - 對操作符的兩側增加值 | a + b = 30 |
| - | 減法 - 減去從左側操作數右側操作數 | a - b = -10 |
| * | 乘法 - 相乘的運算符兩側的值 | a * b = 200 |
| / | 除 - 由右側操作數除以左側操作數 | b / a = 2 |
| % | 模 - 由右側操作數和余返回除以左側操作數 | b % a = 0 |
| ** | 指數- 執行對操作指數(冪)的計算 | a**b = 10 的冪 20 |
| // | 地板除 - 操作數的除法,其中結果是將小數點后的位數被除去的商。 | 9//2 = 4 而 9.0//2.0 = 4.0 |
>>> a = 21>>> b = 10>>> c = 0>>> c = a + b ; print c31>>> c = a -b ; print c11>>> c = a * b ; print c210>>> c = c / b ; print c21>>> c = c % b ; print c1
Python的比較操作符:
| 運算符 | 描述 | 示例 |
|---|---|---|
| == | 檢查,兩個操作數的值是否相等,如果是則條件變為真。 | (a == b) 不為 true. |
| != | 檢查兩個操作數的值是否相等,如果值不相等,則條件變為真。 | (a != b) 為 true. |
| <> | 檢查兩個操作數的值是否相等,如果值不相等,則條件變為真。 | (a <> b) 為 true。這個類似于 != 運算符 |
| > | 檢查左操作數的值是否大于右操作數的值,如果是,則條件成立。 | (a > b) 不為 true. |
| < | 檢查左操作數的值是否小于右操作數的值,如果是,則條件成立。 | (a < b) 為 true. |
| >= | 檢查左操作數的值是否大于或等于右操作數的值,如果是,則條件成立。 | (a >= b) 不為 true. |
| <= | 檢查左操作數的值是否小于或等于右操作數的值,如果是,則條件成立。 | (a <= b) 為 true. |
>>> a = 21>>> b = 10>>> c = 0>>> c = a + b ; print c31>>> c = a -b ; print c11>>> c = a * b ; print c210>>> c = c / b ; print c21>>> c = c % b ; print c1
Python賦值運算符:
| 運算符 | 描述 | 示例 |
|---|---|---|
| = | 簡單的賦值運算符,賦值從右側操作數左側操作數 | c = a + b將指定的值 a + b 到 c |
| += | 加法AND賦值操作符,它增加了右操作數左操作數和結果賦給左操作數 | c += a 相當于 c = c + a |
| -= | 減AND賦值操作符,它減去右邊的操作數從左邊操作數,并將結果賦給左操作數 | c -= a 相當于 c = c - a |
| *= | 乘法AND賦值操作符,它乘以右邊的操作數與左操作數,并將結果賦給左操作數 | c *= a 相當于 c = c * a |
| /= | 除法AND賦值操作符,它把左操作數與正確的操作數,并將結果賦給左操作數 | c /= a 相當于= c / a |
| %= | 模量AND賦值操作符,它需要使用兩個操作數的模量和分配結果左操作數 | c %= a is equivalent to c = c % a |
| **= | 指數AND賦值運算符,執行指數(功率)計算操作符和賦值給左操作數 | c **= a 相當于 c = c ** a |
| //= | 地板除,并分配一個值,執行地板除對操作和賦值給左操作數 | c //= a 相當于 c = c // a |
>>> a = 21>>> b = 10>>> c = 0>>> >>> c = a +b >>> c += a ; print c 52>>> c += a is c = c + a
Python位運算符:
| 操作符 | 描述 | 示例 |
|---|---|---|
| & | 二進制和復制操作了一下,結果,如果它存在于兩個操作數。 | (a & b) = 12 即 0000 1100 |
| | | 二進制或復制操作了一個比特,如果它存在一個操作數中。 | (a | b) = 61 即 0011 1101 |
| ^ | 二進制異或運算符的副本,如果它被設置在一個操作數而不是兩個比特。 | (a ^ b) = 49 即 0011 0001 |
| ~ | 二進制的補運算符是一元的,并有“翻轉”位的效果。 | (~a ) = -61 即 1100 0011以2的補碼形式由于帶符號二進制數。 |
| << | 二進位向左移位運算符。左操作數的值左移由右操作數指定的位數。 | a << 2 = 240 即 1111 0000 |
| >> | 二進位向右移位運算符。左操作數的值是由右操作數指定的位數向右移動。 | a >> 2 = 15 即 0000 1111 |
二進制“與”計算:(1和1=1 0和任意都為0)a = 10b = 49a&b10 0 0 0 0 1 0 1 049 0 0 1 1 0 0 0 1=0 0 0 0 0 0 0 0 0二進制“或”計算:(遇1得1)a|ba = 60 # 60 = 0 0 1 1 1 1 0 0 b = 13 #13 = 0 0 0 0 1 1 0 1= 0 0 1 1 1 1 0 1 = 0+0+32+16+8+4+0+1 = 61 二進制“異或”運算:(相同為0,不同為1)a^ba = 60 # 60 = 0011 1100 b = 13 # 13 = 0000 1101 0011 0001 = 0+0+32+16+0+0+0+1=49二進制取反運算:(0置換為1,1置換為0)~a a = 60 # 60 = 0011 1100 那么 -a = 1100 0011 128 + 64 +2 +1 = 二進位向左、右移位運算符:a=2 那么 往左移1位就是4如下:a<<1 = 4 ; a>>1 = 1
Python邏輯運算符:
| 運算符 | 描述 | 示例 |
|---|---|---|
| and | 所謂邏輯與運算符。如果兩個操作數都是真的,那么則條件成立。 | (a and b) 為 true. |
| or | 所謂邏輯OR運算符。如果有兩個操作數都是非零然后再條件變為真。 | (a or b) 為 true. |
| not | 所謂邏輯非運算符。用于反轉操作數的邏輯狀態。如果一個條件為真,則邏輯非運算符將返回false。 | not(a and b) 為 false. |
例子:and運算,都為真時為真>>> 9 > 8 and 9 < 10True>>> 9 > 8 and 9 > 10Falseor運算,有一個為真的時候即可為真>>> 9 > 8 or 9 > 10True>>> 9 < 8 or 9 > 10False>>>not運算,假為真真為假>>> not 6.2 <= 6True>>> not 6.2 >= 6False>>>
新聞熱點
疑難解答