第三章、函數編程
(一)三元運算
三元運算又稱三目運算,對簡單條件語句的簡寫,如:
if 條件成立:
val =1
else:
val =2
三元運算:
val =1 if 條件成立 else 2
(二)文件處理
f=open(file="file_path",mode=‘r‘,encoding=‘utf-8‘)
data=f.read()
f.close()
1、二進制模式
r:文本只讀模式,默認將二進制轉換為字符串
rb:二進制模式讀取,不進行轉碼,硬盤怎麽存儲怎麽讀取。如網絡傳輸的文本或
2、智能檢測編碼工具,chardet
chardet.detect()
3、寫模式操作文件:
w:可寫模式,創建新文件。有則覆蓋,無責創建
wb:二進制模式寫入,無需encoding參數。寫視頻,圖片等。
4、追加模式:
a:普通追加模式
ab:二進制模式追加
5、混合模式:
r+:先讀取內容,支持內容追加
w+:先寫入(創建)內容,支持內容讀取
6、文件操作其他方法:
fileno()返回文件句柄在內核中的索引值,IO多路復用可用
flush()把文件從內存buffer(緩存)裏強制刷新到硬盤
readline()只讀一行,遇到\n或\r為止
seek()移動光標到指定位置 ,按字節移動光標,utf-8三個字節一個字符,gbk兩個字節一個字符
seekable()判斷文件是否可進行seek操作
tell()返回光標所在位置,按字節返回光標
truncate()按指定長度截斷文件,按指定長度截取文件,均從首位截取
writable()判斷文件是否可寫
7、文件修改
逐行,os.rename()重命名,truncate()截取
(三)函數編程
1、函數基本介紹
將一組語句集合通過一個名字封裝起來,想要執行這個函數,只需要調用其函數名即可。
def sayhi():#函數名
print("Hello,I‘m nobody!")
減少重復代碼
使程序變的可擴展,易維護
2、函數默認參數
形參:只有在被調用時,才分配內存單元。只在內部有效。函數調用結束返回主調用函數後不能在使用該形參變量
實參:可以是常量、變量、表達式、函數等,無論類型,在調用時他們都必須有確定的值,以便將這些值傳
默認參數:默認參數必須跟在位置參數(非默認參數)後面
3、函數關鍵參數
只需要在調用的時候指定參數名,關鍵參數也必須放在位置參數之後。
4、非固定參數
*形參名,將參數組成元組。一般都寫成*args。可直接傳遞列表或元組。傳入列表將打包成元組的第一個參數,為避免該問題,在列表或元組前面加*符號。
**行參名,一般寫成**kwargs,單個字典傳入需在實參前加**符號
5、返回值
默認返回None,return只能放函數最後位置,表示一個函數終止。支持任意類型數據返回,包括函數名
6、函數局部變量
在函數內部定義的變量稱局部變量,只能在函數內部使用,函數執行完則回收。裏面能調用外面參數,外面不能調用函數內部變量。如果函數內部和外部都有一個同名變量,函數將從內至外查找。
7、函數全局變量
定義在函數外部一級代碼的變量,叫全局變量,從上至下全局可用。函數內部默認無法修改全部變量,修改默認則創建局部變量。
8、函數內部修改全局變量
用global關鍵字聲明
9、函數內部修改全局列表
可修改列表內容,不能修改列表整體。修改整體需global關鍵字。
10、函數嵌套
函數內部再定義函數。要想執行必須調用
11、函數作用域
在py中,一個函數就是一個作用域。局部變量放置在其作用域中。一個變量定義完成後,作用域就已經確定
12、匿名函數
多行語句變為一行,減少代碼量,看著更高級
#常規函數
def calc(x,y):
if x < y:
return x*y
else:
return x/y
#聲明匿名函數
func=lambda x,y:x*y if x<y else x/y
print(calc(9,8))
print(func(9,8))
和其他方法混用
#求一個列表元素平方
data=list(range(10))
print(data)
for index,i in enumerate(data):
data[index]=i*i
print(data)
#匿名函數方法
print(list(map(lambda x:x*x,data)))
13、高階函數
變量可以指向函數,函數的參數能接收變量,那麽一個函數就可以接受另一個函數作為參數,這種函數稱為高階函數。
(五)數據類型
1、浮點數
(1)、定義:有限小數和無線循環小數統稱為浮點數
(2)、Python中精確度:只能精確到小數點後16位,因存儲結構問題,其他語言也有相似問題。
(3)、高精度計算方法:用decimal中的getcontshext()和Decimal()方法
2、列表
列表是一個有序數據集合,集合內可以放任何數據,可對集合操作增刪改查操作。
(1)、創建:L1=[]或L1=list()
(2)、查詢:通過索引進行查詢。查找索引值index(),只能找到第一個匹配項。統計count()方法
(3)、切片:L2=L1[x:y:j],顧頭(x)不顧尾(x)原則,j為步長
(4)、增加:append()方法追加元素到末尾,insert(i,x)方法插入元素到指定位置,兩個列表相加可用"+"符號連接,也可用L1.extend(L2)方法
(5)、修改:L1[i]="new obj"或L1[x:y]="new obj"
(6)、刪除:L1.pop()刪除末尾元素並返回該對象。L1.remove(obj)刪除指定對象(查找的第一個),L1.remove(i)刪除index為i的元素。Del L1刪除列表L1對象,del L1[x:y]刪除多個元素。清空列表L1.clear()
(7)、循環:
(8)、排序:L1.sort(),只能通類型排序。L1.reverse()反轉序列
(9)、copy:只能第一層列表獨立即淺復制,需要整個列表對象完全獨立需用導入copy模塊,用copy.deepcopy()方法
3、字符串
字符串是一個有序的字符的集合,用於存儲和表示基本的文本信息,一對單、雙、三引號中間包含的內容稱之為字符串。
1、特性:
?.有序
?.不可變
2、方法:
s.swapcase()大小寫轉換
s. capitalize()首字母大寫,其他小寫
s. casefold()轉換成小寫
s.center()格式化字符串,指定字符串長度和兩邊占位符
s.count()統計字符串,可指定統計範圍
s.endswith()判斷是否以某字符結尾
s.expandtabs()擴展table鍵,即指定table鍵的長度
s.find()返回指定字符索引,找不到返回-1,也可指定範圍
s.format()字符串格式化,
s.index()返回自定字符的索引,可指定開始和結束
s.isalnum()是否是阿拉伯字符,包括數字和字母
s.isalpha()是否全是字母
s.isdigit()類似s.isdecimal()或s.isnumeric()是是否全是整數
s.isidentifier()是否為可用變量名
s.isprintable()
s.isspace()判斷是否為空格
s.istitle()第一個字符均大寫
s.isupper()是否均為大寫
s.lower()轉換為小寫
s.upper()轉換為大寫
s.join()字符串拼接
s.ljust()從左邊開始,將字符串變為指定長度字符串,類似rjust()
s.strip()去掉指定字符串,默認為空格和換行
s.lstrip()去掉左邊指定字符串rstrip()
str.maketrans()創建對應表格
s.translate()更具表格翻譯字符串
s.partition()以某字符串將字符串分割成兩半,左邊查找到的第一個字符rpartition相反
s.replace()替換字符串,可指定更換個數
s.rfind()查找最右邊指定字符,找不到返回-1
s.rindex()類似rfind,找不到則報錯
s.strip()根據自定字符分割成列表
s.rstrip()默認和strip無區別
s.splitlines()按行分割
s.startwith()判斷以某字符串開始
s.endwith()判斷以某字符結束
s.title()變為title格式
s.zfill()將字符串變為指定長度,不夠的左邊填零
3、元組
一旦創建,便不能再修改,也叫只讀列表
?功能:
index
count
切片
?作用:顯示告知,不能修改,如配置信息等
4、hash
將任意長度的消息壓縮到某一固定長度的消息後再輸出。不通的輸入通過散列算法可能會散列成相同的輸出,所以不能從散列值來唯一確定輸入值。因此被hash的值必須是不可變的,如數字、字符串、元組等。
用途:
文件簽名
Md5加密
密碼驗證
語法:
hash(obj)
5、字典
字典是一種key-value的數據類型,key必須唯一,且可hash,字典無序的,且查找速度快。
判斷是否存在:in方法
獲取:get(),有則返回,無則返回None。直接中括號獲取,無則報KeyError
刪除:pop(‘key‘)刪除指定key並返回key對應的value,popitem()隨機刪除一個,clear(),del d[‘key‘]
多級嵌套:
copy():類似列表copy
values():打印所有值
keys():打印所有key
items():key和value組成元組,並放入一個列表中
update():類似list中extend(),兩個字典合並成一個,重復key則覆蓋
setdefault():有key則獲取,無key則設置
fromkeys():批量生成字典
6、集合
無序,不重復的數據集合。作用為去重(把列表變為集合自動去重)和關系測試
列表和元組可轉換為集合。
add():增加,只能添加一個
pop():隨機刪除一個值
remove():刪除指定對象,不存在則報錯
discard():刪除指定對象,不存在也不報錯
update():兩個集合聯合在一起,可添加多個值,列表方式
clear():清空
關系測試:
交集:intersection()或&
差集:difference()或-
並集:union()或|
取交集相反(對稱差集):symmetric_difference()
判斷是否子集:issubset()或<=
判斷是否為超集:issuperset()或>=
判斷兩個集合是否相交:isdisjoint()
(六)進制拾遺
1、python中進制轉換
oct(int):轉八進制
hex(int):轉十六進制
bin(int):轉二進制
2、為何使用十六進制
八進制很少使用。
在操作系統和編碼中均使用十六進制,方便查看,統一規範,便於網絡抓包分析。
3、十六進制與二進制轉換
二進制轉16進制:取四合一(從左朝右取四位二進制轉換成10進制)
16進制轉二進制:剛好與二進制轉16進制相反
表示:0x前綴(有時會將0忽略掉)或BH後綴
(七)字符編碼
1、UTF是unicode編碼設計得一種在存儲和傳輸時節省空間得編碼方案
2、decode(),encode()
3、可通過type()查看字符類型
4、python3中文件默認為utf-8編碼,字符串編碼是unicode
python2文件默認是ascii嘛,字符串默認是ascii碼,若文件頭有聲明編碼類型,則字符串編碼也就是該類型。unicode類型在python2中是單獨一個類型。
5、python中bytes類型:
?、在py2中,bytes和str是一回事兒,因為要表示圖片視頻等二進制格式得數據,所以有bytes類型。py2以utf8編碼的字符串在Windows下無法顯示。decode()或聲明為unicode。
?、在py3中,str等於unicode
第三章、函數編程