Python自動化 【第三篇】:Python基礎-集合、文件操作、字符編碼與轉碼、函數
1. 集合
1.1 特性
集合是一個無序的,不重復的數據組合,主要作用如下:
- 去重,把一個列表變成集合實現自動去重。
- set可以看成數學意義上的無序和無重復元素的集合,因此,兩個set可以做數學意義上的交集、并集等操作。
1.2 常用操作:
s = set([3,5,9,10]) |
# 創建一個數值集合 |
t = set("Hello") |
# 創建一個唯一字符的集合 |
a = t | s |
# 求 t 和 s 的并集 |
b = t & s |
# 求 t 和 s 的交集 |
c = t – s |
# 求差集(項在 t 中,但不在 s 中) |
d = t ^ s |
# 求對稱差集(項在 t 或 s 中,但不同時出現在二者中) |
1.3 基本操作:
t.add('x') |
# 添加一項 |
s.update([10,37,42]) |
# 在 s 中添加多項 |
t.remove('H') |
# 刪除一項 |
len(s) |
# s e t 的長度 |
x in s |
# 測試 x 是否是 s 的成員 |
x not in s |
# 測試 x 是否不是 s 的成員 |
s.issubset(t) s <= t |
# 測試是否 s 中的每一個元素都在 t 中 |
s.issuperset(t) s >= t |
# 測試是否 t 中的每一個元素都在 s 中 |
s.union(t) s | t |
# 返回一個新的 set 包含 s 和 t 中的每一個元素 |
s.intersection(t) s & t |
# 返回一個新的 set 包含 s 和 t 中的公共元素 |
s.difference(t) s - t |
# 返回一個新的 set 包含 s 中有但是 t 中沒有的元素 |
s.symmetric_difference(t) s ^ t |
# 返回一個新的 set 包含 s 和 t 中不重復的元素 |
s.copy() |
# 返回 set “s”的一個淺復制 |
2. 文件操作
2.1 文件操作流程
示例文件:


root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin
2.2 基本操作
f = open('file.txt') |
# 打開文件 |
first_line = f.readline() |
|
print('first line:',first_line) |
# 讀一行 |
print('我是分隔線'.center(50,'-')) |
|
data = f.read() |
# 讀取剩下的所有內容,文件大時不要用 |
print(data) |
# 打印文件 |
f.close() |
# 關閉文件 |
2.3 打開文件的模式
-
r,只讀模式(默認)。
-
w,只寫模式。【不可讀;不存在則創建;存在則刪除內容;】
-
a,追加模式。【可讀;不存在則創建;存在則只追加內容;】
"+" 表示可以同時讀寫某個文件
> r+,可讀寫文件。【可讀;可寫;可追加】
> w+,寫讀
> a+,同a
"b" 表示處理二進制文件
> rb
> wb
> ab
2.4 with語句
為了避免打開文件后忘記關閉,可以通過管理上下文,即:
1 2 3 |
with open('log','r') as f:
... |
3. 字符編碼與轉碼
3.1 字符編碼方式
3.1.1 ASCII編碼
ASCII(American Standard Code for Information Interchange,美國信息交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單字節編碼系統,并等同于國際標準ISO/IEC 646。
3.1.2 Unicode編碼
Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一并且唯一的二進制編碼,所有的字符和符號最少(可能更多)由 16 位來表示(2個字節),即:2 **16 = 65536,這里還有個問題:字節數增加后使用空間會直接翻倍!舉例還說:同樣是ABCD這些字符存儲一篇相同的文章,使用ASCII碼如果是1M的話,那么Unicode存儲至少2M可能還會更多。
3.1.3 UTF-8編碼
是對Unicode編碼的壓縮和優化,他不再使用最少使用2個字節,而是將所有的字符和符號進行分類:ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存... 通過這種可擴展的方式來存儲。
在2.x版本的Python中,解釋.py文件的時候,默認是給他一個編碼的就是ASCII碼,如果在2.x版本中不指定編碼并且在.py文件中寫了一個ASCII碼中沒有的字符就會顯示亂碼,不過這個問題在Python3中就不存在了,因為在Python3中默認就是Unicode編碼
3.2 Python編碼轉化
3.2.1 Python3中的編碼轉換
#在Python3中默認就是unicode編碼


#!/usr/bin/env python #-*- coding:utf-8 -*- name = '小岳岳' #轉為UTF-8編碼 print(name.encode('UTF-8')) #轉為GBK編碼 print(name.encode('GBK')) #轉為ASCII編碼(報錯為什么?因為ASCII碼表中沒有‘小岳岳’這個字符集~~) print(name.encode('ASCII'))
3.2.2 Pyton2.x中的編碼轉換
#因為在python2.x中默認是ASCII編碼,你在文件中指定編碼為UTF-8,但是UTF-8如果你想轉GBK的話是不能直接轉的,需要Unicode做一個轉接站點。
GBK轉換為UTF-8格式流程:
> 首先通過解碼(decode)轉換為Unicode編碼
> 然后通過編碼(encode)轉換為UTF-8編碼
UTF-8轉換為GBK格式流程:
> 首先通過解碼(decode)轉換為Unicode編碼
> 然后通過編碼(encode)轉換為GBK編碼


#!/usr/bin/env python #-*- coding:utf-8 -*- import chardet name = '小岳岳' print chardet.detect(name) #先解碼為Unicode編碼,然后再從Unicode編碼為GBK new_name = name.decode('UTF-8').encode('GBK') print chardet.detect(new_name)
4. 函數
4.1 基本語法
函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可。
特性:
- 減少重復代碼
- 使程序變的可擴展
- 使程序變得易維護
語法:
def function_name():#函數名
print("Hello, World!")
function_name() #調用函數
可以帶參數:
def calc(x,y):
res = x**y
return res #返回函數執行結果
c = calc(a,b) #結果賦值給c變量
print(c)
4.2 函數參數與變量
4.2.1 函數參數
形參是在函數被調用時才分配內存單元,調用結束時立即釋放所分配的內存單元,so,形參只在函數內部有效。
實參可以是常量、變量、表達式、函數等,實參在進行函數調用時必須有確,以便把這些值傳給形參。故應預先用賦值,輸入等辦法使參數獲得確定值。
上述函數中x,y是形參,a,b是實參。
默認參數
Def stu_register(name,age,country=”CN”):
這樣,country參數在調用時不指定就是默認參數CN,指定了的話就是你指定的值。默認參數必須放在未指定默認值的后面。
關鍵參數
若給函數傳參是不想按順序的話可以指定關鍵字參數,只需指定參數名即可,但是,關鍵參數必須放在位置參數之后。
語法:
Stu_register(age=22,name=”poker”)
非固定參數
若函數定義時不確定用戶想出入多少個參數,可使用非固定參數
Def stu_register(name,age,*args) #args會把多傳入的參數變成一個元組形式
Print(name,age,args)
Stu_register(“poker”,22)
#輸出
Poker 22 () #后面這個空元組就是args,因為沒傳參所以空
Stu_register(“Tom”,28,”CN”,”Python”)
#輸出
Tom 28 (‘CN’,’Python’)
還有一個**kwargs
Def stu_register(name,age,*args,**kwargs): #kwargs會把多傳入的參數變成一個字典形式
Print(name,age,kwargs)
Stu_register(‘poker’,22)
#輸出
#poker 22 () {} #后面這個{}就是kwargs,因為沒傳值,所以為空
Stu_register(“Tom”,28,”CN”,”Python”,sex=”Male”,school=”Qinghua”)
#輸出
#Tom 28 (‘CN’,’Python’) {‘school’:’Qinghua’,’sex’:’Male’}
4.2.2 全局與局部變量
在子程序中定義的變量稱為局部變量,在程序的一開始定義的變量稱為全局變量。
全局變量作用域是整個程序,局部變量作用域是定義該變量的子程序。
當全局變量與局部變量同名時,在定義局部變量的子程序內,局部變量起作用;在其它地方全局變量起作用。
返回值
Return語句可以返回函數的返回值
> 函數執行時遇到return就會停止執行并返回結果,也代表著函數的結束
> 未指定return,函數返回None
遞歸
函數內部可以調用其他函數,若函數內部調用自身,該函數為遞歸函數。


def calc(n): print(n) if int(n/2) ==0: return n return calc(int(n/2)) calc(10)
輸出:
10
5
2
1
遞歸特性:
> 需明確結束條件
> 進入更深一層遞歸時,規模要比上次有所減少
> 遞歸效率不高,遞歸層次過多會導致棧溢出
高階函數
變量可以指向函數,函數的參數能接收變量,那么一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數。
1 2 3 4 5 6 |
def add(x,y,f): return f(x) + f(y)
res = add(3,-6,abs) print(res) |
文章列表