本節內容:html
Python發展歷史python
HOW TO RETURN words document: PUT {} IN collection FOR line IN document: FOR word IN split line: IF word not.in collection: INSERT word IN collection RETURN collection
HOW TO用於定義一個函數。一個Python程序員應該很容易理解這段程序。ABC語言使用冒號和縮進來表示程序塊。行尾沒有分號。for和if結構中也沒有括號() 。賦值採用的是PUT,而不是更常見的等號。這些改動讓ABC程序讀起來像一段文字。儘管已經具有了良好的可讀性和易用性,ABC語言最終沒有流行起來。在當時,ABC語言編譯器須要比較高配置的電腦才能運行。而這些電腦的使用者一般精通計算機,他們更多考慮程序的效率,而非它的學習難度。除了硬件上的困難外,ABC語言的設計也存在一些致命的問題: 可拓展性差。ABC語言不是模塊化語言。若是想在ABC語言中增長功能,好比對圖形化的支持,就必須改動不少地方。不能直接進行IO。ABC語言不能直接操做文件系統。儘管你能夠經過諸如文本流的方式導入數據,但ABC沒法直接讀寫文件。輸入輸出的困難對於計算機語言來講是致命的。你能想像一個打不開車門的跑車麼?過分革新。ABC用天然語言的方式來表達程序的意義,好比上面程序中的HOW TO 。然而對於程序員來講,他們更習慣用function或者define來定義一個函數。一樣,程序員更習慣用等號來分配變量。儘管ABC語言很特別,但學習難度也很大。傳播困難。ABC編譯器很大,必須被保存在磁帶上。當時Guido在訪問的時候,就必須有一個大磁帶來給別人安裝ABC編譯器。這樣,ABC語言就很難快速傳播。1989年,爲了打發聖誕節假期,Guido開始寫Python語言的編譯器。Python這個名字,來自Guido所摯愛的電視劇Monty Python's Flying Circus。他但願這個新的叫作Python的語言,能符合他的理想:創造一種C和shell之間,功能全面,易學易用,可拓展的語言。Guido做爲一個語言設計愛好者,已經有過設計語言的嘗試。這一次,也不過是一次純粹的hacking行爲。linux
pyc 文件:
執行Python代碼時,若是導入了其餘的 .py 文件,那麼,執行過程當中會自動生成一個與其同名的 .pyc 文件,該文件就是Python解釋器編譯以後產生的字節碼。
ps:代碼通過編譯能夠產生字節碼;字節碼經過反編譯也能夠獲得代碼。程序員
python2解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(默認ascill)web
python3解釋器的默認編碼爲unicode,顯然ASCII碼沒法將世界上的各類文字和符號所有表示,因此,就須要新出一種能夠表明全部字符和符號的編碼,即:Unicode正則表達式
注:此處說的的是最少2個字節,可能更多算法
因此,python解釋器在加載 .py 文件中的代碼時,會對內容進行編碼(默認ascill),若是是以下代碼的話:shell
報錯:ascii碼沒法表示中文數據庫
#!/usr/bin/env python print "你好,世界"
改正:應該顯示的告訴python解釋器,用什麼編碼來執行源代碼,即:編程
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print "你好,世界"
Python有大量的模塊,從而使得開發Python程序很是簡潔。類庫有包括三中:
Python內部提供一個 sys 的模塊,其中的 sys.argv 用來捕獲執行執行python腳本時傳入的參數
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys print sys.argv
單行注視:# 被註釋內容
多行註釋:""" 被註釋內容 """
if... elif... elif ...... else
while(break/continue) else 當跳出循環後執行else語句
for(break/continue) else 當跳出循環後執行else語句
爲了更充分的利用內存空間以及更有效率的管理內存,變量是有不一樣的類型的,以下所示:
怎樣知道一個變量的類型呢?
變量名:由字母、下劃線和數字組成,且數字不能開頭
result = 值1 if 條件 else 值2
若是條件爲真:result = 值1
若是條件爲假:result = 值2
python中的字符串在C語言中體現爲是一個字符數組,每次建立字符串時候須要在內存中開闢一塊連續的空,而且一旦須要修改字符串的話,就須要再次開闢空間,萬惡的+號每出現一次就會在內存中從新開闢一塊空間。
好比:經常使用的字符串、數字、列表、字典、元組都是來自於其對應的內置類,對應爲字符串類str、數字類int、列表類list、字典類dict、元組類tuple...
python2 |
python3 |
_winreg |
winreg |
ConfigParser |
configparser |
copy_reg |
copyreg |
Queue |
queue |
SocketServer |
socketserver |
markupbase |
_markupbase |
repr |
reprlib |
test.test_support |
test.support |
字符串的格式化輸出:
下面是完整的,它能夠與%符號使用列表:
格式符號 | 轉換 |
---|---|
%c | 字符 |
%s | 經過str() 字符串轉換來格式化 |
%i | 有符號十進制整數 |
%d | 有符號十進制整數 |
%u | 無符號十進制整數 |
%o | 八進制整數 |
%x | 十六進制整數(小寫字母) |
%X | 十六進制整數(大寫字母) |
%e | 索引符號(小寫'e') |
%E | 索引符號(大寫「E」) |
%f | 浮點實數 |
%g | %f和%e 的簡寫 |
%G | %f和%E的簡寫 |
age = 18 name = "qinglong"
# 幾種格式化輸出的方式 print("名字是 %s, 年齡是 %d" % (name, age)) print("名字是 {n}, 年齡是 {a}".format(n=name, a=age)) # 可使用format()函數進行格式化輸出 print("名字是 {0}, 年齡是 {1}".format(name, age)) print("名字是 {n}, 年齡是 {a}".format_map({"n": name, "a": age})) # format_map()函數傳入的參數是一個字典
python2中raw_input()
python3版本中,沒有raw_input()函數,只有input(),而且python3中的input()與python2中的raw_input()功能同樣
#!/usr/bin/env python # -*- coding: utf-8 -*- # 將用戶輸入的內容賦值給 name 變量
#name = raw_input("請輸入用戶名:") # python2 name = input("請輸入用戶名:") # python3 # 打印輸入的內容 print(name)
輸入密碼時,若是想要不可見,須要利用getpass 模塊中的 getpass方法,即:
#!/usr/bin/env python # -*- coding: utf-8 -*- import getpass # 將用戶輸入的內容賦值給 name 變量 pwd = getpass.getpass("請輸入密碼:") # 打印輸入的內容 print(pwd)
python支持如下幾種運算符
1.算術運算符
下面以a=10, b=20爲例進行計算
運算符 | 描述 | 實例 |
---|---|---|
+ | 加 | 兩個對象相加a + b 輸出結果30 |
- | 減 | 獲得負數或是一個數減去另外一個數a - b 輸出結果-10 |
* | 乘 | 兩個數相乘或是返回一個被重複若干次的字符串a * b 輸出結果200 |
/ | 除 | x除以yb / a 輸出結果 2 |
// | 取整除 | 返回商的整數部分9//2 輸出結果4 , 9.0//2.0 輸出結果4.0 |
% | 取餘 | 返回除法的餘數b % a 輸出結果 0 |
** | 冪 | 返回x的y次冪a**b 爲10的20次方, 輸出結果100000000000000000000 |
>>> 9/2.0 4.5 >>> 9//2.0 4.0
2.賦值運算符
運算符 | 描述 | 實例 |
---|---|---|
= | 賦值運算符 | 把=號右邊的結果給左邊的變量num=1+2*3 結果num的值爲7 |
>>> a, b = 1, 2 >>> a 1 >>> b 2
3.複合賦值運算符
運算符 | 描述 | 實例 |
---|---|---|
+= | 加法賦值運算符 | c += a 等效於c = c + a |
-= | 減法賦值運算符 | c -= a 等效於c = c - a |
*= | 乘法賦值運算符 | c *= a 等效於c = c * a |
/= | 除法賦值運算符 | c /= a 等效於c = c / a |
%= | 取模賦值運算符 | c %= a 等效於c = c % a |
**= | 冪賦值運算符 | c **= a 等效於c = c ** a |
//= | 取整除賦值運算符 | c //= a 等效於c = c // a |
4.經常使用的數據類型轉換
函數 | 說明 |
---|---|
int(x [,base ]) | 將x轉換爲一個整數 |
long(x [,base ]) | 將x轉換爲一個長整數 |
float(x ) | 將x轉換到一個浮點數 |
complex(real [,imag ]) | 建立一個複數 |
str(x ) | 將對象x 轉換爲字符串 |
repr(x ) | 將對象x 轉換爲表達式字符串 |
eval(str ) | 用來計算在字符串中的有效Python表達式,並返回一個對象 |
tuple(s ) | 將序列s 轉換爲一個元組 |
list(s ) | 將序列s 轉換爲一個列表 |
chr(x ) | 將一個整數轉換爲一個字符 |
unichr(x ) | 將一個整數轉換爲Unicode字符 |
ord(x ) | 將一個字符轉換爲它的整數值 |
hex(x ) | 將一個整數轉換爲一個十六進制字符串 |
oct(x ) | 將一個整數轉換爲一個八進制字符串 |
a = '100' # 此時a的類型是一個字符串,裏面存放了100這3個字符 b = int(a) # 此時b的類型是整型,裏面存放的是數字100 print("a=%d" % b)
5.比較(即關係)運算符
運算符 | 描述 | 示例 |
---|---|---|
== | 檢查兩個操做數的值是否相等,若是是則條件變爲真。 | 如a=3,b=3則(a == b) 爲true. |
!= | 檢查兩個操做數的值是否相等,若是值不相等,則條件變爲真。 | 如a=1,b=3則(a != b) 爲true. |
<> | 檢查兩個操做數的值是否相等,若是值不相等,則條件變爲真。 | 如a=1,b=3則(a <> b) 爲true。這個相似於!= 運算符 |
> | 檢查左操做數的值是否大於右操做數的值,若是是,則條件成立。 | 如a=7,b=3則(a > b) 爲true. |
< | 檢查左操做數的值是否小於右操做數的值,若是是,則條件成立。 | 如a=7,b=3則(a < b) 爲false. |
>= | 檢查左操做數的值是否大於或等於右操做數的值,若是是,則條件成立。 | 如a=3,b=3則(a >= b) 爲true. |
<= | 檢查左操做數的值是否小於或等於右操做數的值,若是是,則條件成立。 | 如a=3,b=3則(a <= b) 爲true. |
6.邏輯運算符
運算符 | 邏輯表達式 | 描述 | 實例 |
---|---|---|---|
and | x and y | 布爾"與" - 若是x 爲False,x and y 返回False,不然它返回y 的計算值。 | (a and b) 返回20。 |
or | x or y | 布爾"或" - 若是x 是True,它返回True,不然它返回y 的計算值。 | (a or b) 返回10。 |
not | not x | 布爾"非" - 若是x 爲True,返回False 。若是x 爲False,它返回True。 | not(a and b) 返回False |
1.打開文件
在python,使用open函數,能夠打開一個已經存在的文件,或者建立一個新文件
open(文件名,訪問模式)
訪問模式 | 說明 |
---|---|
r | 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。 |
w | 打開一個文件只用於寫入。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。 |
a | 打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。 |
rb | 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。 |
wb | 以二進制格式打開一個文件只用於寫入。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。 |
ab | 以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。 |
r+ | 打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
w+ | 打開一個文件用於讀寫。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。 |
a+ | 打開一個文件用於讀寫。若是該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。若是該文件不存在,建立新文件用於讀寫。 |
rb+ | 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
wb+ | 以二進制格式打開一個文件用於讀寫。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。 |
ab+ | 以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。若是該文件不存在,建立新文件用於讀寫。 |
2.關閉文件
close( )
示例以下:
f = open('test.txt', 'w') # 新建一個文件,文件名爲:test.txt f.close() # 關閉這個文件
3.文件的讀寫
<1>寫數據(write)
使用write()能夠完成向文件寫入數據
示例以下:
f = open('test.txt', 'w') # 打開文件
f.write('hello world, i am here!') # 寫入數據
f.close() # 關閉文件
注意:
若是文件不存在那麼建立,若是存在那麼就先清空,而後寫入數據
<2>讀數據(read)
使用read(num)能夠從文件中讀取數據,num表示要從文件中讀取的數據的長度(單位是字節),若是沒有傳入num,那麼就表示讀取文件中全部的數據
示例以下:
f = open('test.txt', 'r') # 以只讀方式打開文件
content = f.read(5) # 讀取5個字符 print(content) print("-" * 30)
content = f.read() # 讀取剩下的全部 print(content)
f.close()
注意:
若是open是打開一個文件,那麼能夠不用寫打開的模式,即只寫 open('test.txt'),默認以只讀方式打開
若是讀了屢次,那麼後面讀取的數據是從上次讀完後的位置開始的
<3>讀數據(readlines)
就像read沒有參數時同樣,readlines能夠按照行的方式把整個文件中的內容進行一次性讀取,而且返回的是一個列表,其中每一行的數據爲一個元素
# -*- coding:utf-8 -*- f = open('test.txt', 'r') contents = f.readlines() print(type(content)) # 是一個列表,每個元素爲一行
i=1 for line in contents: print("%d:%s" % (i, line)) i += 1 f.close()
<4>讀數據(readline)
# -*- coding:utf-8 -*- f = open('test.txt', 'r')
content = f.readline() print("1:%s" % content)
content = f.readline() print("2:%s"%content)
f.close()
想想:
若是一個文件很大,好比5G,試想應該怎樣把文件的數據讀取到內存而後進行處理呢?
製做文件的備份
1 # -*-coding:utf-8 -*- 2 3 oldFileName = input("請輸入要拷貝的文件名字:") 4 5 oldFile = open(oldFileName,'r') 6 7 # 若是打開文件 8 if oldFile: 9 10 # 提取文件的後綴 11 fileFlagNum = oldFileName.rfind('.') 12 if fileFlagNum > 0: 13 fileFlag = oldFileName[fileFlagNum:] 14 15 # 組織新的文件名字 16 newFileName = oldFileName[:fileFlagNum] + '[復件]' + fileFlag 17 18 # 建立新文件 19 newFile = open(newFileName, 'w') 20 21 # 把舊文件中的數據,一行一行的進行復制到新文件中 22 for lineContent in oldFile.readlines(): 23 newFile.write(lineContent) 24 25 # 關閉文件 26 oldFile.close() 27 newFile.close()