Python【NO.1】:Python簡介和入門

Python簡介

①Python前世此生

     python的創始人爲吉多·範羅蘇姆(Guido van Rossum)。1989年的聖誕節期間,吉多·範羅蘇姆爲了在阿姆斯特丹打發時間,決心開發一個新的腳本解釋程序,做爲ABC語言的一種繼承。 

最新的TIOBE排行榜,Python趕超PHP佔據第五!!!html

Python能夠應用於衆多領域:python

數據分析    組件集成linux

網絡服務    圖像處理git

數值計算    科學計算等程序員

Python在互聯網企業中的使用狀況:web

Youtube、Dropbox、BT、Quora(中國知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA等。shell

互聯網公司普遍使用Python來作的事通常有:自動化運維、自動化測試、大數據分析、爬蟲、Web 等。數組

②爲何是Pythonn

C 和 Python、Java、C#等
      C語言: 代碼編譯獲得 機器碼
      其餘語言: 代碼編譯獲得 字節碼
Python 和 C
      對於使用:Python的類庫齊全而且使用簡潔
      對於速度:Python的運行速度相較與C,絕逼是慢了
Python 和 Java、C#等
  對於使用:Linux原裝Python,其餘語言沒有
  對於速度:Python在速度上可能稍顯遜色
編-到字節碼;相對慢;linux自帶

③Python 種類

Cpython
  Python的官方版本,使用C語言實現,使用最爲普遍,CPython實現會將源文件(py文件)轉換成字節碼文件(pyc文件),而後運行在Python虛擬機上。
Jyhton
  Python的Java實現,Jython會將Python代碼動態編譯成Java字節碼,而後在JVM上運行轉換後的程序
IronPython
  Python的C#實現,而且它將Python代碼編譯成C#中間代碼(與Jython相似)
PyPy
  Python實現的Python
RubyPython、Brython、Pyobjc .
 
對應關係和執行流程以下:
pyp,相對使Python有所提高:

Python 環境搭建

安裝安全

windos - linux 安裝相對比較簡單bash

..略..

PS:linux 更新新版本的python後,會致使yum執行異常,只需從新指引原版本號就行

查看默認Python版本
python -V

一、安裝gcc,用於編譯Python源碼
    yum install gcc
二、下載源碼包,https://www.python.org/ftp/python/
三、解壓並進入源碼文件
四、編譯安裝
    ./configure
    make all
    make install
五、查看版本
    /usr/local/bin/python2.7 -V
六、修改默認Python版本
    mv /usr/bin/python /usr/bin/python2.6
    ln -s /usr/local/bin/python2.7 /usr/bin/python
七、防止yum執行異常,修改yum使用的Python版本
    vi /usr/bin/yum
    將頭部 #!/usr/bin/python 修改成 #!/usr/bin/python2.6

Python 入門

1、Python 內部執行過程

本身寫的.py文件是自定義模塊

執行能夠經過終端輸入和文件兩種方式來實現

讀文件-->>詞法-->>語法分析-->>編譯-->>內容-->>執行

2、解釋器

像shell同樣,使用./腳本名時,其第一行頂格寫明指向的解釋器。

#!/usr/bin/env python

3、內部編碼

ASCII(American Standard Code for Information Interchange,美國標準信息交換代碼):2**8=256  沒法表示中文

Unicode(統一碼、萬國碼、單一碼):最少由 16 位來表示(2個字節),即:2 **16 = 65536 

UTF-8,是對Unicode編碼的壓縮和優化:ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存(好處節省磁盤空間)

因此,python解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(默認ascill),

腳本中編碼聲明

#!/usr/bin/env python
# -*- coding: utf-8 -*-

print "你好,世界"

搞清楚了 ASCII、Unicode 和 UTF-8 的關係,咱們就能夠總結一下如今計算機系統通用的
字符編碼工做方式:
在計算機內存中,統一使用 Unicode 編碼,當須要保存到硬盤或者須要傳輸的時候,就轉
換爲 UTF-8 編碼。
用記事本編輯的時候,從文件讀取的 UTF-8 字符被轉換爲 Unicode 字符到內存裏,編輯完
成後,保存的時候再把 Unicode 轉換爲 UTF-8 保存到文件:

 

Python 執行 -->>讀進內存 Unicode -->>寫入磁盤 UTF-8 

4、註釋

單行:#被註釋內容

多行:"""被註釋內容"""

5、捕獲腳本傳入參數

Python有大量的模塊,從而使得開發Python程序很是簡潔。類庫有包括三中:

  Python內部提供的模塊

  業內開源的模塊

  程序員本身開發的模塊

Python內部提供一個 sys 的模塊,其中的 sys.argv 用來捕獲執行執行python腳本時傳入的參數

#!/usr/bin/env python
# -*- coding: utf-8 -*-
  
import sys
  
print sys.argv 

  

6、pyc文件
執行Python代碼時,若是導入了其餘的 .py 文件,那麼,執行過程當中會自動生成一個與其同名的 .pyc 文件,該文件就是Python解釋器編譯以後產生的字節碼。

兩個命名同樣的.py  .pyc文件執行順序

python內部將2文件比較,.py優先

7、變量

一、聲明變量

name = "abc"

變量名:name

name變量的值:"abc"

變量的做用:暱稱,其代指內存裏某個地址中保存的內容

 

變量定義的三條規則:

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

  變量名的第一個字符不能是數字

  如下關鍵字不能聲明爲變量名

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

PS  不一樣大小寫的相同暱稱的變量表明不用的變量名

二、變量賦值

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
name1 = "abci"
name2 = "123"

  

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
name1 = "abc"
name2 = name1

  

 

變量賦值會從新開通內存空間,變量的值指向內存地址的內容。

除以上狀況外,python 自身優化功能:

Python是由C編寫的,多個變量指向同一個值時,會通過預先規定好的範圍進行優化,指向同一個值再也不從新開通內存空間,而是指向同一個內存地址。

>>> a='abc'
>>> b='abc'
>>> id(a),id(b)
(140692465670928, 140692465670928)
>>> c=500
>>> d=500
>>> id(c),id(d)
(18646952, 18646856)
>>> e=10
>>> f=10
>>> id(e),id(f)
(18371168, 18371168)

  

剖析Python源代碼

 8、用戶交互

輸入:raw_input()   getpass.getpass()

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
import getpass
 
# 將用戶輸入的內容賦值給 name 變量
name = raw_input(">>>")
print name
 
# 將用戶輸入的內容賦值給 name 變量
pwd = getpass.getpass(">>>")
print pwd

 

9、流程控制和縮進

If ….else….

If … elif … elif … else

Split

Strip

Len()

While True:

Break

Continue

多層循環

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import getpass

name = raw_input("請輸入用戶名:") # 輸入alex
pwd = getpass.getpass("請輸入密碼:")

if name == "eric" and pwd == "123": 
    print "登陸成功,普通,123"
elif name == "tony" and pwd == "123": 
    print "登陸成功,超級,123"
elif name == "alex" and pwd == "123": 
    print "登陸成功,超神,123"
else:
    print "登陸失敗"

""" 嵌套
if pwd == "123":
    if name == "eric":
        print "eric,普通"
    elif name == "tony":
        print " tony,超級"
    elif name == "alex":
        print " alex,超神"
    else:
        print "登陸失敗"
else:
    print "登陸失敗"
    
"""
# eric,普通,123
# tony,超級,123
# alex,超神,123

 

#_*_ coding:utf-8 _*_
import random #導入模塊

real_num = random.randrange(10)  #設置隨機數0~10
#guess_num = raw_input("Please guess the real number:") #輸入的是字符串。
#計算機底層會吧字符串變成一個二進制來表示這個字符串,因此因此字符串和數字
#比較是不會出錯的,但不能這麼比較。
# print type(guese_num)   ord(guess_num)#看二進制位
retry_num = 0  #定義輸入的次數
while retry_num < 3: #循環每次提示輸入,最多重試3次
    guess_num = raw_input("Please guess the real number:").strip()
    if len(guess_num) == 0:  #若是輸入空格或者回車就從新輸入
        continue
    if guess_num.isdigit():  #判斷字符串裏包含數字是true,而後轉成數字
        guess_num = int(guess_num)
    else:
        print "you need input a integer instead of string"
    if guess_num > real_num:
        print "wrong!you need try smaller!"
    elif guess_num < real_num:
        print "wrong!you need try bigger!"
    else:
        print "you got it!"
        break #輸入正確跳出整個while循環
    retry_num +=1  #輸入錯誤循環次數加1
else: #當猜錯了執行下面命令
    print "The real num is", real_num
 BUG: 輸如「回車」保持,回車是不能轉intraw_input後面輸入「空格」「回車」會當作一個字符串處理,能夠用用字符串內置的方法strip(),默認會把空格和回車都去掉。這裏須要判斷是否是一個「空格」「或者回車」,每個字符長度是1,輸入空格默認長度也是1

 

break----continue:

break是負責跳出整個循環,但continue是跳出本次循環,繼續下一次循環。就是說,循環過程當中,若是遇到continue,那這一次循環本應該執行的後面的代碼就不執行了,直接跳過了,直接進行下一次循環了。

外層變量,能夠被內層變量使用
內層變量,沒法被外層變量使用
 
10、數據類型
    '數據類型按特徵劃分':{
         '數字類型':{
            '整型':['布爾型','長整型','標準整型'],
             '非整型':['雙精度浮點型','複數','decimal(不是內建類型)']
             },
        '序列類型':['字符串str','元組tuple','列表list'],
        '映像類型':'字典dict',
        '集合類型':['可變集合set','不可變集合frozenset']
        },
    '數據類型按可變性劃分':{
        '可哈希的不可變數據類型':['數字類型','字符串str','元組tuple','不可變集合frozenset'],
        '可變數據類型':['字典dict','可變集合set','列表list']
        }

一、數字

2 是一個整數的例子。 長整數 不過是大一些的整數。 3.23和52.3E-4是浮點數的例子。E標記表示10的冪。在這裏,52.3E-4表示52.3 * 10-4。 (-5+4j)和(2.3-4.6j)是複數的例子。

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(浮點型)  浮點數用來處理實數,即帶有小數的數字。 complex(複數)   複數由實數部分和虛數部分組成,通常形式爲x+yj,其中的x是複數的實數部分,y是複數的虛數部分,這裏的x和y都是實數。
注:Python中存在小數字池:-5 ~ 257
 
二、布爾值
  真或假
  1 或 0
>>> a = True
>>> if a :print "it is ok"
... 
it is ok
True 是1
Flase是0
C語言中須要定義整型類型,若是超出就報錯,python能夠自動轉換。

  

三、字符串
"hello world"
萬惡的字符串拼接:
  python中的字符串在C語言中體現爲是一個字符數組,每次建立字符串時候須要在內存中開闢一塊連續的空,而且一旦須要修改字符串的話,就須要再次開闢空間,萬惡的+號每出現一次就會在內從中從新開闢一塊空間。

字符串格式化 

_author_ = "xu"

name = raw_input("please input your name:")
#age = int(raw_input("please input your age:"))
age = input("please input your age:")
sex = raw_input("please input your sex:")
job = raw_input("please input your job:")
print '''information of %s staff
NAME:%s
AGE:('%d') %f  %.2f
SEX:%s
JOB:%s
''' %(name,name,age,age,age,sex,job)

PS: 字符串是 %s;整數 %d;浮點數%f

字符串經常使用功能:

  •移除空白
  •分割
  •長度
  •索引
  •切片

四、列表

建立列表:

name_list = ['alex', 'seven', 'eric']
或
name_list = list(['alex', 'seven', 'eric'])

基本操做:
 •索引
 •切片
 •追加
 •刪除
 •長度
 •切片
 •循環
 •包含

切片:

>>> shopping_list
['Iphone', 'Mac', 'Bike', 'Coffee', 'Car', 'Clothes', 'Food', 'Gift']
>>> shopping_list[0:3] #取0到第3個元素,不包括第4個
['Iphone', 'Mac', 'Bike']
>>> shopping_list[:3]   #同上,取0到第3個元素,不包括第4個,0能夠不寫
['Iphone', 'Mac', 'Bike']
>>> shopping_list[2:5]  #取第3至第5個元素
['Bike', 'Coffee', 'Car']
>>> shopping_list[:-3] #取從0至倒數第3個元素
['Iphone', 'Mac', 'Bike', 'Coffee', 'Car']
>>> shopping_list[-3:] #取最後3個元素
['Clothes', 'Food', 'Gift']
>>> shopping_list[1:8:2]	#從1至8隔一個取一個,後面的2是步長,即每隔幾個元素取一個
['Mac', 'Coffee', 'Clothes', 'Gift']
>>> shopping_list[::2] #從頭到位每隔一個取一個
['Iphone', 'Bike', 'Car', 'Food']

五、元祖

建立元祖:
ages = (11, 22, 33, 44, 55)
或
ages = tuple((11, 22, 33, 44, 55))

基本操做:
 •索引
 •切片
 •循環
 •長度
 •包含

  tuple和list很是相似,可是tuple一旦初始化就不能修改。它也沒有append(),insert()這樣的方法。其餘獲取元素的方法和list是同樣的,但不能賦值成另外的元素。由於tuple不可變,因此代碼更安全。
只有1個元素的tuple定義時必須加一個逗號,,來消除歧義:

>>> t = (1,) >>> t (1,)

六、字典(無序)

建立字典:
person = {"name": "mr.wu", 'age': 18}
或
person = dict({"name": "mr.wu", 'age': 18})

經常使用操做:
 •索引
 •新增
 •刪除
 •鍵、值、鍵值對
 •循環
 •長度

for key in date :
   print key,date[key]
和下面的到的結果是同樣的,但有區別。前者在循環取的時候效率相對高不少。
for key,val in date.items():
    print key,val
ps: 索引是從0開始的

 11、運算

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

12、文件的基本操做

  file_obj = file("文件路徑","模式")

  不少時候咱們寫的程序都須要對文件進行讀、寫操做,好比你要分析日誌、存儲數據等,和其它語言同樣,Python也內置了對文件進行操做的函數,下面一塊兒來學習一下。
  讀寫文件前,咱們先必須瞭解一下,在磁盤上讀寫文件的功能都是由操做系統提供的,現代操做系統不容許普通的程序直接操做磁盤,因此,讀寫文件就是請求操做系統打開一個文件對象(一般稱爲文件描述符),而後,經過操做系統提供的接口從這個文件對象中讀取數據(讀文件),或者把數據寫入這個文件對象(寫文件)

 

1. 除了r\w\a三種最經常使用處理文件的模式以外,還有如下幾種:
2. r+ 以讀寫模式打開,其實跟追加的效果是同樣的,即能讀,又能寫,但寫實際上是追加內容,可是若是文件不存在的話,不會像a同樣建立文件,而是報錯
3. w+ 以寫讀模式打開,
4. a+ 以追加和讀的模式打開
5. rb,wb,ab 是指以二進制的模式打開並處理文件,當處理的文件是非文本文件時,就應該以二進制的格式打開文件,但有的同窗說了,我不加b也不出錯呀,沒錯,即便不加b,file也能正常處理二進制文件,可是當你的程序涉及到跨平臺時,就可能有問題了,由於在Linux和Windows的換行標誌位是不同的,Linux是」\n」,Windows是」\r\n」,因此Windows上的文件在Linux下通常會在換行處顯示^M,須要特別轉換一下才能正常處理。 當你把Windows的文件copy到Linux並用Python file方法處理時,你在打開模式上加上b,Python就會幫你把^M轉成\n,不然你的程序就不知道該在哪換行了嘍!因此,咱們建議,若是你預計可能會處理Windows上產生的文件,那仍是默認就加上b吧。

 

文件其它方法
1. f.mode              顯示文件打開格式
2. f.flush()             把緩衝區中的數據刷到硬盤,當你往文件裏寫數據時,python會先把你寫的內容寫到內存中的緩衝區,等緩衝區滿了再統一自
                動寫入硬盤,所以減小了對硬盤的操做次數,畢竟硬盤的速度比內存慢多了。
3. f.read()            把文件一次性讀入內存
4. f.readline()          讀一行內容
5. f.readlines()         把文件都讀入內存,而且每行轉成列表中的一個元素
6. f.tell()             顯示程序光標所在該文件中的當前的位置
7. f.seek()            跳到指定位置,f.seek(0) 是返回文件開始
8. f.truncate()         f.truncate(10) 從文件開頭截取10個字符,超出的都刪除。
9. f.writelines()          參數需爲一個列表,將一個列表中的每一個元素都寫入文件
10. f.xreadlines()                   以迭代的形式循環文件,在處理大文件時效率極高,只記錄文件開頭和結尾,每循環一次,只讀一行,所以不須要將整個文件都一
               次性加載到內存,而若是用readlines(),則須要把整個文件都加載到內存,處理大文件不適合,容易把內存撐爆。
相關文章
相關標籤/搜索