天天看點

Python基礎01-20160508

一、Python簡介

1.1 Python介紹

Python的創始人:Guido van Rossum

最新的TIOBE排行榜:http://www.tiobe.com/tiobe_index

1.2 Python應用

Python可以應用于衆多領域,如:資料分析、元件內建、網絡服務、圖像處理、數值計算和科學計算等衆多領域。目前業内幾乎所有大中型網際網路企業都在使用Python,如:Youtube、Dropbox、BT、Quora(中國知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、騰訊、汽車之家、美團等。

目前Python主要應用領域:

雲計算: 雲計算最火的語言, 典型應用OpenStack

WEB開發: 衆多優秀的WEB架構,衆多大型網站均為Python開發,Youtube, Dropbox, 豆瓣。。。, 典型WEB架構有Django

科學運算、人工智能: 典型庫NumPy, SciPy, Matplotlib, Enthought librarys,pandas

系統運維: 運維人員必備語言

金融:量化交易,金融分析,在金融工程領域,Python不但在用,且用的最多,而且重要性逐年提高。原因:作為動态語言的Python,語言結構清晰簡單,庫豐富,成熟穩定,科學計算和統計分析都很牛逼,生産效率遠遠高于c,c++,java,尤其擅長政策回測

圖形GUI: PyQT, WxPython,TkInter

Python在一些公司的應用:

谷歌:Google App Engine 、code.google.com 、Google earth 、谷歌爬蟲、Google廣告等項目都在大量使用Python開發

CIA: 美國中情局網站就是用Python開發的

NASA: 美國航天局(NASA)大量使用Python進行資料分析和運算

YouTube:世界上最大的視訊網站YouTube就是用Python開發的

Dropbox:美國最大的線上雲存儲網站,全部用Python實作,每天網站處理10億個檔案的上傳和下載下傳

Instagram:美國最大的圖檔分享社交網站,每天超過3千萬張照片被分享,全部用python開發

Facebook:大量的基礎庫均通過Python實作的

Redhat: 世界上最流行的Linux發行版本中的yum包管理工具就是用python開發的

豆瓣: 公司幾乎所有的業務均是通過Python開發的

知乎: 國内最大的問答社群,通過Python開發(國外Quora)

春雨醫生:國内知名的線上醫療網站是用Python開發的

除上面之外,還有搜狐、金山、騰訊、盛大、網易、百度、阿裡、淘寶 、洋芋、新浪、果殼等公司都在使用Python完成各種各樣的任務。

1.3 Python解釋器

1)Cpython(官方)

當我們從Python官方網站下載下傳并安裝好Python 2.7後,我們就直接獲得了一個官方版本的解釋器:CPython。這個解釋器是用C語言開發的,是以叫CPython。在指令行下運作python就是啟動CPython解釋器。CPython是使用最廣的Python解釋器。

2)IPython

IPython是基于CPython之上的一個互動式解釋器,也就是說,IPython隻是在互動方式上有所增強,但是執行Python代碼的功能和CPython是完全一樣的。好比很多國産浏覽器雖然外觀不同,但核心其實都是調用了IE。

CPython用>>>作為提示符,而IPython用In [序号]:作為提示符。

3)PyPy

PyPy是另一個Python解釋器,它的目标是執行速度。PyPy采用JIT技術,對Python代碼進行動态編譯(注意不是解釋),是以可以顯著提高Python代碼的執行速度。

絕大部分Python代碼都可以在PyPy下運作,但是PyPy和CPython有一些是不同的,這就導緻相同的Python代碼在兩種解釋器下執行可能會有不同的結果。如果你的代碼要放到PyPy下執行,就需要了解PyPy和CPython的不同點。

4)Jython

Jython是運作在Java平台上的Python解釋器,可以直接把Python代碼編譯成Java位元組碼執行。

5)IronPython

IronPython和Jython類似,隻不過IronPython是運作在微軟.Net平台上的Python解釋器,可以直接把Python代碼編譯成.Net的位元組碼。

小結:

Python的解釋器很多,但使用最廣泛的還是CPython。如果要和Java或.Net平台互動,最好的辦法不是用Jython或IronPython,而是通過網絡調用來互動,確定各程式之間的獨立性。

二、Python發展曆史

1989年,為了打發聖誕節假期,Guido開始寫Python語言的編譯器。Python這個名字,來自Guido所摯愛的電視劇Monty Python’s Flying Circus。他希望這個新的叫做Python的語言,能符合他的理想:創造一種C和shell之間,功能全面,易學易用,可拓展的語言。

1991年,第一個Python編譯器誕生。它是用C語言實作的,并能夠調用C語言的庫檔案。從一出生,Python已經具有了:類,函數,異常處理,包含表和詞典在内的核心資料類型,以及子產品為基礎的拓展系統。

Granddaddy of Python web frameworks, Zope 1 was released in 1999

Python 1.0 - January 1994 增加了 lambda, map, filter and reduce.

Python 2.0 - October 16, 2000,加入了記憶體回收機制,構成了現在Python語言架構的基礎

Python 2.4 - November 30, 2004, 同年目前最流行的WEB架構Django 誕生

Python 2.5 - September 19, 2006

Python 2.6 - October 1, 2008

Python 2.7 - July 3, 2010

In November 2014, it was announced that Python 2.7 would be supported until 2020, and reaffirmed that there would be no 2.8 release as users were expected to move to Python 3.4+ as soon as possible

Python 3.0 - December 3, 2008

Python 3.1 - June 27, 2009

Python 3.2 - February 20, 2011

Python 3.3 - September 29, 2012

Python 3.4 - March 16, 2014

Python 3.5 - September 13, 2015

三、Python 2.X vs Python 3.X

3.1 概述

Python 2.7 是一個過渡版本

Python 3.x 是長期版本

3.2 詳細差異

1)編碼問題 Python3.x無需再特意指定UTF-8,預設支援UTF-8編碼

2)print函數差別

C:\Users\Administrator>python
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:32:19) [MSC v.1500 32 bit (
Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print "Hello World"
Hello World
>>>

C:\Users\Administrator>python3
Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:16:59) [MSC v.1900 32 bit (In
tel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print "Hello World"
  File "<stdin>", line 1
    print "Hello World"
                      ^
SyntaxError: Missing parentheses in call to 'print'
>>> print("Hello World")
Hello World      

3)某些庫改名了

4)使用者輸入

Python 2.x:raw_input
Python 3.x:input      

5)1/2問題

C:\Users\Administrator>python
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:32:19) [MSC v.1500 32 bit (
Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 1/2
0
>>>
C:\Users\Administrator>python3
Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:16:59) [MSC v.1900 32 bit (In
tel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 1/2
0.5      

6)class定義

7)性能

Py3.0運作 pystone benchmark的速度比Py2.5慢30%。Guido認為Py3.0有極大的優化空間,在字元串和×××操作上可

以取得很好的優化結果。

Py3.1性能比Py2.5慢15%,還有很大的提升空間。

8)range()

Python 2.x
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> type(range(10))
<type 'list'>

Python 3.x
>>> range(10)
range(0, 10)
>>> type(range(10))
<class 'range'>      

四、Python安裝

4.1 安裝介紹

詳見:http://madsstudy.blog.51cto.com/6249249/1770483

4.2 使用建議

Window 下開發工具較多,優先在Windows環境開發

Linux環境适用于代碼調試和簡單的運維腳本編寫

五、第一個Python程式

mads@mads-virtual-machine:~/python$ cat hello.py 
#!/usr/bin/env python3         # 明确的指出hello.py腳本由python解釋器來執行
#_*_coding:utf-8_*_

print("Hello World!")

mads@mads-virtual-machine:~/python$ chmod +x hello.py # 執行前需給予hello.py執行權限    
mads@mads-virtual-machine:~/python$ ./hello.py 
Hello World!      

對比其他語言hello world

http://madsstudy.blog.51cto.com/6249249/1771215

六、變量

6.1 變量聲明

#!/usr/bin/env python
# encoding: utf-8
 
name = "zhangsan"      

注:聲明了一個變量,變量名為: name,變量name的值為:"zhangsan" 

6.2 變量定義規則

1)變量名隻能是 字母、數字或下劃線的任意組合

2)變量名的第一個字元不能是數字,可以是下劃線及字母

3)不能與Python關鍵字重複

['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']      

6.3 變量指派

name1 = "zhangsan"
name2 = name1
print(name1,name2)
print(id(name1),id(name2))
name1 = "lisi"
print(name1,name2)
print(id(name1),id(name2))      

解釋為何最後name1 與 name2的值不同?

1)給name1變量配置設定一個記憶體位址存放name的值zhangsan

2)把name2變量的值等于nam1e記憶體位址中存放的值zhangsan

3)将name1的變量值修改為lisi,是重新配置設定一個記憶體位址存放name1的新值,此時 name1=lisi 而name2不變等于zhangsan

七、字元編碼

字元編碼出現的時間:ASCII>Unicode>UTF-8

三種編碼的特點

ASCII:(American Standard Code for Information

Interchange,美國标準資訊交換代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言,其最多隻能用 8

位來表示(一個位元組),即:2**8 = 256-1,是以,ASCII碼最多隻能表示 255 個符号

Unicode:Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字元編碼。Unicode

是為了解決傳統的字元編碼方案的局限而産生的,它為每種語言中的每個字元設定了統一并且唯一的二進制編碼,規定雖有的字元和符号最少由 16

位來表示(2個位元組),即:2 **16 = 65536,

注:此處說的的是最少2個位元組,可能更多

UTF-8:UTF-8,是對Unicode編碼的壓縮和優化,他不再使用最少使用2個位元組,而是将所有的字元和符号進行分類:ascii碼中的内容用1個位元組儲存、歐洲的字元用2個位元組儲存,東亞的字元用3個位元組儲存...

Python解釋器在加載.py檔案中的代碼時,會對内容進行編碼(預設ASCII),如下報錯:

mads@mads-virtual-machine:~/python$ cat hello.py 
#!/usr/bin/env python
print('你好')
mads@mads-virtual-machine:~/python$ python hello.py 
  File "hello2.py", line 3
SyntaxError: Non-ASCII character '\xe4' in file hello2.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details      

解決:

mads@mads-virtual-machine:~/python$ cat hello.py
#!/usr/bin/env python
#_*_coding:utf-8_*_
print(u'你好')
mads@mads-virtual-machine:~/python$ python hello.py
你好      

Python 3.X已經不存在這個問題

mads@mads-virtual-machine:~/python$ cat hello.py
#!/usr/bin/env python3
print('你好')
mads@mads-virtual-machine:~/python$ python3 hello.py
你好      

八、注釋

注釋原則:源程式有效注釋量應該在20%以上,注釋的原則是有助于對程式的閱讀了解,在該加的地方都加了,注釋不宜太多也不能太少,注釋語言必須準确、易懂、簡潔。    

開發規範1:每行不能超過80個字元

單行注釋:# 我被注釋掉了,僅到行尾為止
多行注釋:''' 在這個範圍内的所有内容都經被注釋'''      

九、使用者輸入

9.1 正常使用

#!/usr/bin/env python3
# encoding: utf-8

name = input("Please input your name:")      # Python 3.x
name = raw_input("Please input your name:")  # Python 2.x
print(name)      

9.2 隐藏輸入内容實作

getpass子產品(适用範圍 linux可以, window不行; Python 2.x不行,Python 3.x可以)

mads@mads-virtual-machine:~/python$ cat test_getpass.py
#!/usr/bin/python
#-*-coding:utf-8-*-
 
import getpass
 
username = input("username:")
password = getpass.getpass("password:")
print (username,password)
mads@mads-virtual-machine:~/python$ python3 test_getpass.py 
username:root
password:
root sss      

十、子產品

Python的強大之處在于他有非常豐富和強大的标準庫和第三方庫,幾乎你想實作的任何功能都有相應的Python庫支援

sys:

mads@mads-virtual-machine:~/python$ cat input.py 
#!/usr/bin/env python
#_*_coding:utf-8_*_
import sys
if len(sys.argv)<2:
   print "\033[32;1m"+"Usages: Host Port"+"\033[0m"
   sys.exit(2)
   
host = sys.argv[1]
port = sys.argv[2]

print "host:%s port:%s" % (host,port)
mads@mads-virtual-machine:~/python$ python input.py 192.168.1.1 22
host:192.168.1.1 port:22      

os:

>>> import os
>>> os.mkdir('student')                  # 建立目錄
>>> os.system('ls -l')                    # 檢視目前目錄内容總用量 20
-rwxrwxr-x 1 mads mads   83 5月   8 15:39 hello.py
drwxrwxr-x 2 mads mads 4096 5月   8 18:02 __pycache__
drwxrwxr-x 2 mads mads 4096 5月   8 18:16 student
-rwxrwxr-x 1 mads mads  151 5月   8 18:00 test_getpass.py
-rwxrwxr-x 1 mads mads   73 5月   5 15:53 test.py0
>>> cmd_res = os.system('ls -l')          # 僅儲存指令執行的傳回值總用量 20
-rwxrwxr-x 1 mads mads   83 5月   8 15:39 hello.py
drwxrwxr-x 2 mads mads 4096 5月   8 18:02 __pycache__
drwxrwxr-x 2 mads mads 4096 5月   8 18:16 student
-rwxrwxr-x 1 mads mads  151 5月   8 18:00 test_getpass.py
-rwxrwxr-x 1 mads mads   73 5月   5 15:53 test.py
>>> print cmd_res0    
>>> cmd_res = os.popen('ls -l').read()    # 儲存指令的執行結果
>>> print cmd_res                     
總用量 20
-rwxrwxr-x 1 mads mads   83 5月   8 15:39 hello.py
drwxrwxr-x 2 mads mads 4096 5月   8 18:02 __pycache__
drwxrwxr-x 2 mads mads 4096 5月   8 18:16 student
-rwxrwxr-x 1 mads mads  151 5月   8 18:00 test_getpass.py
-rwxrwxr-x 1 mads mads   73 5月   5 15:53 test.py      

sys和os結合

import sys,os
os.system(''.join(sys.argv[1:]))      

編寫tab補全子產品

vim中設定(待補充)

windows環境

# python startup file for window 
import sys
import readline
import rlcompleter
import atexit
import os
# tab completion
readline.parse_and_bind('tab: complete')

del os,readline, rlcompleter      

linux環境

#!/usr/bin/env python 
# python startup file 
import sys
import readline
import rlcompleter
import atexit
import os
# tab completion 
readline.parse_and_bind('tab: 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      

mac環境

import sys
import readline
import rlcompleter
if sys.platform == 'darwin' and sys.version_info[0] == 2:
    readline.parse_and_bind("bind ^I rl_complete")
else:
    readline.parse_and_bind("tab: complete")  # linux and python3 on mac      

注:儲存内容為tab.py,使用import tab指令引用該子產品。如果想在系統的何何一個地方都使用,要把這個tab.py放到python全局環境變量目錄裡。print(sys.path) 可以檢視python環境變量清單,基本一般都放在一個叫 Python/2.7/site-packages 目錄下,這個目錄在不同的OS裡放的位置不一樣。

注意:環境清單的第一個' '表示目前目錄,即環境查找的順序問題

十一、Python語言

1)編譯型和解釋型

編譯型:首先由編譯器編譯成機器能識别的機器碼,才能開始執行

解釋型:一般翻譯一遍執行

2)動态類型語言和靜态類型語言

動态類型語言:在運作期間才會做資料類型的檢查的語言

靜态類型語言:在編寫程式的時候就要聲明所有變量的資料類型

3)強類型定義語言和弱類型定義語言

強類型定義語言:變量一旦被指派,必須經過強制轉換才能被再次使用

弱類型定義語言:與強類型語言相反,一個變量可以附不用資料類型的值

結論:python是一門動态解釋性的強類型定義語言

十二、資料類型

12.1 資料類型

1)整數

2)浮點型

3)字元串 轉義字元

轉義字元\可以轉義很多字元,比如\n表示換行,\t表示制表符,字元\本身也要轉義,是以\\表示的字元就是\

4)布爾類型

False True

可以進行and,or和not運算

5)空值

12.2 字元串格式化

Python采用的格式化方式和C語言類似

%運算符就是用來格式化字元串的。在字元串内部,%s表示用字元串替換,%d表示用整數替換,有幾個%?占位符,後面就跟幾個變量或者值,順序要對應好。如果隻有一個%?,括号可以省略。

%s永遠起作用,它會把任何資料類型轉換為字元串

對于Unicode字元串,用法完全一樣,但最好確定替換的字元串也是Unicode字元串

有些時候,字元串裡面的%是一個普通字元怎麼辦?這個時候就需要轉義,用%%來表示一個%:

py3 的字元串格式化 提倡使用 format 函數

案例:

方法1:

name = raw_input("Please input your name:")
age = int(raw_input("Please input your age:"))
provice = raw_input("Please input your provice:")
company = raw_input("Please input your company:")
msg = '''
Infomation of user %s
-------------------------
name    :   %s
age     :   %2f
provice :   %s
company :   %s
-----------End-----------
''' % (name,name,age,provice,company)
print msg      

方法2:字元拼接

name = input("Please input your name:")
age = int(input("Please input your age:"))
provice = input("Please input your provice:")
company = input("Please input your company:")
print("Infomation of:" + name + "\nname:" + name + "\nage:" + str(age) + "\npprovice:" + provice + "\ncompany:" + company)      

十三、資料運算

詳見:http://www.runoob.com/python/python-operators.html