Python發展史 html
3、Python 2 or 3?java
In summary : Python 2.x is legacy, Python 3.x is the present and future of the languagepython
Python 3.0 was released in 2008. The final 2.x version 2.7 release came out in mid-2010, with a statement oflinux
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,web
3.4 in 2014, and 3.5 in 2015. This means that all recent standard library improvements, for example, are onlyshell
available by default in Python 3.x.vim
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.windows
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). 數組
py2與3的詳細區別
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:
You can also customize the separator between items, e.g.:
1 |
print("There are <", 2**32, "> possibilities!", sep="") |
ALL IS UNICODE NOW
今後再也不爲討厭的字符編碼而煩惱
還能夠這樣玩: (A,*REST,B)=RANGE(5)
1 2 3 4 |
<strong>>>> a,*rest,b = range(5) >>> a,rest,b (0, [1, 2, 3], 4) </strong> |
某些庫更名了
Old Name |
New Name |
_winreg |
winreg |
ConfigParser |
configparser |
copy_reg |
copyreg |
Queue |
queue |
SocketServer |
socketserver |
markupbase |
_markupbase |
repr |
reprlib |
test.test_support |
test.support |
還有誰不支持PYTHON3?
One popular module that don't yet support Python 3 is Twisted (for networking and other applications). Most
actively maintained libraries have people working on 3.x support. For some libraries, it's more of a priority than
others: Twisted, for example, is mostly focused on production servers, where supporting older versions of
Python is important, let alone supporting a new version that includes major changes to the language. (Twisted is
a prime example of a major package where porting to 3.x is far from trivial
4、Python安裝
windows
1 2 3 4 5 6 7 |
一、下載安裝包 https://www.python.org/downloads/
二、安裝 默認安裝路徑:C:\python27 三、配置環境變量 【右鍵計算機】--》【屬性】--》【高級系統設置】--》【高級】--》【環境變量】--》【在第二個內容框中找到 變量名爲Path 的一行,雙擊】 --> 【Python安裝目錄追加到變值值中,用 ; 分割】 如:原來的值;C:\python27,切記前面有分號 |
linux、Mac
1 2 3 |
無需安裝,原裝Python環境
ps:若是自帶2.6,請更新至2.7 |
在運行處輸入cmd
因爲python文件在C:\Users\user\Python\Python36這個文件夾中,因此這樣寫能夠運行
選擇典型從新安裝到user文件夾後,獲得
5、Hello World程序
在linux 下建立一個文件叫hello.py,並輸入
1 |
print("Hello World!") |
而後執行命令:python hello.py ,輸出
1 2 3 |
localhost:~ jieli$ vim hello.py localhost:~ jieli$ python hello.py Hello World! |
指定解釋器
上一步中執行 python hello.py 時,明確的指出 hello.py 腳本由 python 解釋器來執行。
若是想要相似於執行shell腳本同樣執行python腳本,例: ./hello.py ,那麼就須要在 hello.py 文件的頭部指定解釋器,以下:
1 2 3 |
#!/usr/bin/env python
print "hello,world" |
如此一來,執行: ./hello.py 便可。
ps:執行前需給予 hello.py 執行權限,chmod 755 hello.py
在交互器中執行
除了把程序寫在文件裏,還能夠直接調用python自帶的交互器運行代碼,
1 2 3 4 5 6 |
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! |
對比下其它語言的hello world
C++
C
JAVA
PHP
RUBY
Go
6、變量\字符編碼
Variables are used to store information to be referenced and manipulated in a computer program. They also provide a way of labeling data with a descriptive name, so our programs can be understood more clearly by the reader and ourselves. It is helpful to think of variables as containers that hold information. Their sole purpose is to label and store data in memory. This data can then be used throughout your program.
聲明變量
1 2 3 |
#_*_coding:utf-8_*_
name = "Alex Li" |
上述代碼聲明瞭一個變量,變量名爲: name,變量name的值爲:"Alex Li"
變量定義的規則:
變量的賦值
1 2 3 4 5 6 7 8 |
name = "Alex Li"
name2 = name print(name,name2)
name = "Jack"
print("What is the value of name2 now?") |
7、字符編碼
python解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(默認ascill)
ASCII(American Standard Code for Information Interchange,美國標準信息交換代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其餘西歐語言,其最多隻能用 8 位來表示(一個字節),即:2**8 = 256-1,因此,ASCII碼最多隻能表示 255 個符號。
關於中文
爲了處理漢字,程序員設計了用於簡體中文的GB2312和用於繁體中文的big5。
GB2312(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 2 3 |
#!/usr/bin/env python
print "你好,世界" |
改正:應該顯示的告訴python解釋器,用什麼編碼來執行源代碼,即:
1 2 3 4 |
#!/usr/bin/env python # -*- coding: utf-8 -*-
print "你好,世界" |
註釋
當行注視:# 被註釋內容
多行註釋:""" 被註釋內容 """
8、用戶輸入
1 2 3 4 5 6 7 |
#!/usr/bin/env python #_*_coding:utf-8_*_
#name = raw_input("What is your name?") #only on python 2.x name = input("What is your name?") print("Hello " + name ) |
輸入密碼時,若是想要不可見,須要利用getpass 模塊中的 getpass方法,即:
1 2 3 4 5 6 7 8 9 10 |
#!/usr/bin/env python # -*- coding: utf-8 -*-
import getpass
# 將用戶輸入的內容賦值給 name 變量 pwd = getpass.getpass("請輸入密碼:")
# 打印輸入的內容 print(pwd) |
9、模塊初識
Python的強大之處在於他有很是豐富和強大的標準庫和第三方庫,幾乎你想實現的任何功能都有相應的Python庫支持,之後的課程中會深刻講解經常使用到的各類庫,如今,咱們先來象徵性的學2個簡單的。
sys
1 2 3 4 5 6 7 8 9 10 11 |
#!/usr/bin/env python # -*- coding: utf-8 -*-
import sys
print(sys.argv)
#輸出 $ python test.py helo world ['test.py', 'helo', 'world'] #把執行腳本時傳遞的參數獲取到了 |
os
1 2 3 4 5 6 |
#!/usr/bin/env python # -*- coding: utf-8 -*-
import os
os.system("df -h") #調用系統命令 |
徹底結合一下
1 2 3 |
import os,sys
os.system(''.join(sys.argv[1:])) #把用戶的輸入的參數看成一條命令交給os.system來執行 |
本身寫個模塊
python tab補全模塊
for mac
for Linux
寫完保存後就可使用了
1 2 3 4 5 |
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. >>> import tab |
你會發現,上面本身寫的tab.py模塊只能在當前目錄下導入,若是想在系統的何何一個地方都使用怎麼辦呢? 此時你就要把這個tab.py放到python全局環境變量目錄裏啦,基本通常都放在一個叫 Python/2.7/site-packages 目錄下,這個目錄在不一樣的OS裏放的位置不同,用 print(sys.path) 能夠查看python環境變量列表。
10、.pyc是個什麼鬼?
1. Python是一門解釋型語言?
我初學Python時,聽到的關於Python的第一句話就是,Python是一門解釋性語言,我就這樣一直相信下去,直到發現了*.pyc文件的存在。若是是解釋型語言,那麼生成的*.pyc文件是什麼呢?c應該是compiled的縮寫纔對啊!
爲了防止其餘學習Python的人也被這句話誤解,那麼咱們就在文中來澄清下這個問題,而且把一些基礎概念給理清。
2. 解釋型語言和編譯型語言
計算機是不可以識別高級語言的,因此當咱們運行一個高級語言程序的時候,就須要一個「翻譯機」來從事把高級語言轉變成計算機能讀懂的機器語言的過程。這個過程分紅兩類,第一種是編譯,第二種是解釋。
編譯型語言在程序執行以前,先會經過編譯器對程序執行一個編譯的過程,把程序轉變成機器語言。運行時就不須要翻譯,而直接執行就能夠了。最典型的例子就是C語言。
解釋型語言就沒有這個編譯的過程,而是在程序運行的時候,經過解釋器對程序逐行做出解釋,而後直接運行,最典型的例子是Ruby。
經過以上的例子,咱們能夠來總結一下解釋型語言和編譯型語言的優缺點,由於編譯型語言在程序運行以前就已經對程序作出了「翻譯」,因此在運行時就少掉了「翻譯」的過程,因此效率比較高。可是咱們也不能一律而論,一些解釋型語言也能夠經過解釋器的優化來在對程序作出翻譯時對整個程序作出優化,從而在效率上超過編譯型語言。
此外,隨着Java等基於虛擬機的語言的興起,咱們又不能把語言純粹地分紅解釋型和編譯型這兩種。
用Java來舉例,Java首先是經過編譯器編譯成字節碼文件,而後在運行時經過解釋器給解釋成機器文件。因此咱們說Java是一種先編譯後解釋的語言。
3. Python究竟是什麼
其實Python和Java/C#同樣,也是一門基於虛擬機的語言,咱們先來從表面上簡單地瞭解一下Python程序的運行過程吧。
當咱們在命令行中輸入python hello.py時,實際上是激活了Python的「解釋器」,告訴「解釋器」:你要開始工做了。但是在「解釋」以前,其實執行的第一項工做和Java同樣,是編譯。
熟悉Java的同窗能夠想一下咱們在命令行中如何執行一個Java的程序:
javac hello.java
java hello
只是咱們在用Eclipse之類的IDE時,將這兩部給融合成了一部而已。其實Python也同樣,當咱們執行python hello.py時,他也同樣執行了這麼一個過程,因此咱們應該這樣來描述Python,Python是一門先編譯後解釋的語言。
4. 簡述Python的運行過程
在說這個問題以前,咱們先來講兩個概念,PyCodeObject和pyc文件。
咱們在硬盤上看到的pyc天然沒必要多說,而其實PyCodeObject則是Python編譯器真正編譯成的結果。咱們先簡單知道就能夠了,繼續向下看。
當python程序運行時,編譯的結果則是保存在位於內存中的PyCodeObject中,當Python程序運行結束時,Python解釋器則將PyCodeObject寫回到pyc文件中。
當python程序第二次運行時,首先程序會在硬盤中尋找pyc文件,若是找到,則直接載入,不然就重複上面的過程。
因此咱們應該這樣來定位PyCodeObject和pyc文件,咱們說pyc文件實際上是PyCodeObject的一種持久化保存方式。
11、數據類型初識
一、數字
2 是一個整數的例子。
長整數 不過是大一些的整數。
3.23和52.3E-4是浮點數的例子。E標記表示10的冪。在這裏,52.3E-4表示52.3 * 10-4。
(-5+4j)和(2.3-4.6j)是複數的例子,其中-5,4爲實數,j爲虛數,數學中表示覆數是什麼?。
int(整型)
在32位機器上,整數的位數爲32位,取值範圍爲-2**31~2**31-1,即-2147483648~2147483647
在64位系統上,整數的位數爲64位,取值範圍爲-2**63~2**63-1,即-9223372036854775808~9223372036854775807
long(長整型)
跟C語言不一樣,Python的長整數沒有指定位寬,即:Python沒有限制長整數數值的大小,但實際上因爲機器內存有限,咱們使用的長整數數值不可能無限大。
注意,自從Python2.2起,若是整數發生溢出,Python會自動將整數數據轉換爲長整數,因此現在在長整數數據後面不加字母L也不會致使嚴重後果了。
float(浮點型)
先掃盲 http://www.cnblogs.com/alex3714/articles/5895848.html
浮點數用來處理實數,即帶有小數的數字。相似於C語言中的double類型,佔8個字節(64位),其中52位表示底,11位表示指數,剩下的一位表示符號。
complex(複數)
複數由實數部分和虛數部分組成,通常形式爲x+yj,其中的x是複數的實數部分,y是複數的虛數部分,這裏的x和y都是實數。
注:Python中存在小數字池:-5 ~ 257
二、布爾值
真或假
1 或 0
三、字符串
"hello world"
萬惡的字符串拼接:
python中的字符串在C語言中體現爲是一個字符數組,每次建立字符串時候須要在內存中開闢一塊連續的空,而且一旦須要修改字符串的話,就須要再次開闢空間,萬惡的+號每出現一次就會在內從中從新開闢一塊空間。
字符串格式化輸出
1 2 3 4 |
name = "alex" print "i am %s " % name
#輸出: i am alex |
PS: 字符串是 %s;整數 %d;浮點數%f
字符串經常使用功能:
四、列表
建立列表:
1 2 3 |
name_list = ['alex', 'seven', 'eric'] 或 name_list = list(['alex', 'seven', 'eric']) |
基本操做:
五、元組(不可變列表)
建立元組:
1 2 3 |
ages = (11, 22, 33, 44, 55) 或 ages = tuple((11, 22, 33, 44, 55)) |
六、字典(無序)
建立字典:
1 2 3 |
person = {"name": "mr.wu", 'age': 18} 或 person = dict({"name": "mr.wu", 'age': 18}) |
經常使用操做:
12、數據運算
算數運算:
比較運算:
賦值運算:
邏輯運算:
成員運算:
身份運算:
位運算:
*按位取反運算規則(按位取反再加1) 詳解http://blog.csdn.net/wenxinwukui234/article/details/42119265
運算符優先級:
更多內容:猛擊這裏
十3、表達式if ... else
場景1、用戶登錄驗證
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 提示輸入用戶名和密碼
# 驗證用戶名和密碼 # 若是錯誤,則輸出用戶名或密碼錯誤 # 若是成功,則輸出 歡迎,XXX!
#!/usr/bin/env python # -*- coding: encoding -*-
import getpass
name = raw_input('請輸入用戶名:') pwd = getpass.getpass('請輸入密碼:')
if name == "alex" and pwd == "cmd": print("歡迎,alex!") else: print("用戶名和密碼錯誤") |
場景2、猜年齡遊戲
在程序裏設定好你的年齡,而後啓動程序讓用戶猜想,用戶輸入後,根據他的輸入提示用戶輸入的是否正確,若是錯誤,提示是猜大了仍是小了
外層變量,能夠被內層代碼使用
內層變量,不該被外層代碼使用
十4、表達式for loop
最簡單的循環10次
1 2 3 4 5 6 |
#_*_coding:utf-8_*_ __author__ = 'Alex Li'
for i in range(10): print("loop:", i ) |
輸出:
1 2 3 4 5 6 7 8 9 10 |
loop: 0 loop: 1 loop: 2 loop: 3 loop: 4 loop: 5 loop: 6 loop: 7 loop: 8 loop: 9 |
需求一:仍是上面的程序,可是遇到小於5的循環次數就不走了,直接跳入下一次循環
1 2 3 4 |
for i in range(10): if i<5: continue #不往下走了,直接進入下一次loop print("loop:", i ) |
需求二:仍是上面的程序,可是遇到大於5的循環次數就不走了,直接退出
1 2 3 4 |
for i in range(10): if i>5: break #不往下走了,直接跳出整個loop print("loop:", i ) |
十5、while loop
有一種循環叫死循環,一經觸發,就運行個天荒地老、海枯石爛。
海枯石爛代碼
1 2 3 4 5 |
count = 0 while True: print("你是風兒我是沙,纏纏綿綿到天涯...",count) count +=1
|
其實除了時間,沒有什麼是永恆的,死loop仍是少寫爲好
上面的代碼循環100次就退出吧
回到上面for 循環的例子,如何實現讓用戶不斷的猜年齡,但只給最多3次機會,再猜不對就退出程序。