文章目錄
- Python語法學習
- 1. 序列
- 1.1 list API
- 1.2 序列統計函式
- 1.3 str API
- 1.4 dict API
- 2. 函式
- 2.1 zip函式
- 2.2 內置函式物件API
- 3. 模塊
- 3.1 `__init__.py`
- 3.2 copy模塊
- 3.3 random模塊
- 3.4 創建虛擬環境
- 3.5 模塊打包
- 3.6 模塊發布
- 4. 類和物件
- 4.1 Python屬性
- 4.2 封裝
- 4.3 繼承
- 4.4 多型
- 5. 特殊方法
- 5.1 物件操作支持
- 5.2 屬性操作支持
- 6. 例外處理
- 7. 序列結構擴展
- 7.1 set API
- 7.2 deque API
- 7.3 heapq API
- 7.4 `enum`列舉
- 7.5 **yield生成器**
- 7.6 日期時間
- 7.6.1time模塊
- 7.6.2 datetime模塊
- 7.7 正則運算式
- 8. os模塊
Python語法學習
1. 序列
1.1 list API
| list API | |
|---|---|
| append(data) | |
| clear() | |
| copy() | |
| count(data) | 計算data出現次數 |
| extend(list) | 附加串列 |
| index(data) | 回傳data第一次出現的index |
| pop(index) | 洗掉對應index處的值 |
| remove(data) | 洗掉串列中對應的值 |
| reverse() | 串列翻轉 |
| sort() | 串列排序 |
1.2 序列統計函式
| 序列統計函式 | |
|---|---|
| len(seq) | |
| max(seq) | |
| min(seq) | |
| sum(seq) | |
| any(seq) | 有一個為TRUE則為True |
| all(seq) | 有一個為False則為False |
1.3 str API
| str API | |
|---|---|
| center(length) | 字串總長度為length,居中處理 |
| find(data) | 回傳找到的索引,否則回傳-1 |
| join(data) | 按照指定連接符將序列內容連接為一個完整的字串 |
| split(data,[,limit]) | 字串拆分 |
| lower() | 字串小寫 |
| upper() | 字串大寫 |
| replace(old,new) | 字串替換 |
| strip() | 洗掉左右空格 |
1.4 dict API
| dict API | |
|---|---|
| clear() | 清空 |
| update({k=v,}) | 大規模更新字典 |
| fromkeys(seq,[value]) | 將串列轉換為字典 |
| get(key) | |
| pop(key) | 洗掉key的映射 |
| popitem() | 洗掉映射 |
| keys() | |
| values() | |
| items() |
2. 函式
2.1 zip函式
zip([iterable...])#壓縮一個或者多個迭代器
#回傳元組串列
*zipped #解壓縮
2.2 內置函式物件API
| 內置物件函式API | |
|---|---|
| callable(object) | 判斷給定物件是否可以呼叫(是否是函式) |
| eval(object) | 單行代碼計算 |
| exec(object) | 多行代碼計算 |
| compile(source,filename,mode) | 對傳入的source進行編譯 |
3. 模塊
3.1 __init__.py
所有包除了定義模塊之外還需定義一個__init__.py,考慮到通配符*的作用,可以配置__all__系統變數設定引入模塊,例如在com/yootk/info/__init__.py中配置__all__=["Message"],

3.2 copy模塊
| Python的copy模塊 | |
|---|---|
| copy(obj) | 淺拷貝 |
| deepcopy(obj) | 深拷貝 |
3.3 random模塊
| random API | |
|---|---|
| random() | 0<=n<=1.0隨機浮點數 |
| uniform(x,y) | x<=n<=y隨機浮點數 |
| randint(x,y) | x<=n<=y隨機整數 |
| random.randrange(x,y,step) | 從指定范圍[x:y:step]中生成亂數 |
| choice(seq) | 從序列中隨機抽取資料 |
| shuffle(seq) | 將串列中資料打亂 |
| sample(seq,k) | 從串列中獲取指定序列分片,分片大小為2 |
| MapReduce API | |
|---|---|
| filter(func,seq) | 資料篩選 |
| map(func,seq) | 資料處理 |
| reduce(func,seq) | 統計 |
3.4 創建虛擬環境
-
安裝
virtualenv工具pip install virtualenv -
創建一個python虛擬環境
D:\python_project>virtualenv venv -
激活虛擬環境
D:\python_project\venv\Scripts\activate.bat之后pip install安裝包存放在
{專案目錄}\{虛擬環境名稱}\Lib\site-packages -
退出虛擬環境
D:\python_project\venv\Scripts\deactivate.bat
3.5 模塊打包
Python使用setuptools模塊進行打包,將模塊打包為.whl檔案,檔案中會有對應的包和模塊程式定義,wheel是python對打包檔案的統稱,本質是一個.zip的二進制壓縮包,

模塊打包步驟
- 使用
setuptools.setup()函式定義打包檔案setup.py - 進行模塊打包操作
python setup.py bdist_wheel - 如果要安裝到本地
python setup.py install
3.6 模塊發布
PyPI(Python Package Index)公共倉庫
模塊發布步驟
-
安裝twine工具
pip install twine -
通過twine工具上傳
twine upload dist/*
4. 類和物件
4.1 Python屬性
設定實體屬性兩種方法
# coding : utf-8
# 1.python實體屬性可以在函式中添加
class Member:
info = "www.baidu.com"#類屬性(static靜態屬性)
def set_info(self,name,age):
self.name = name#實體屬性
self.age = age
def print_info(self):
print("姓名:%s 年齡:%d"%(self.name,self.age))
# 2.在類外部通過添加實體化屬性
# coding : utf-8
class Member:
def print_info(self):
print("姓名:%s 年齡:%d 分數%d"%(self.name,self.age,self.score))
def main():
mem = Member()
mem.name = 'lcx'
mem.age = 19
mem.score = 99
mem.print_info()
物件使用參考傳遞
4.2 封裝
# 私有成員變數
class Member:
def set_info(self,name,age,score):
'''
在屬性前加__表示該屬性為私有屬性,在外部不能直接訪問,也就是print(),但是如果賦值可能會當做添加新實體屬性
'''
self.__name = name
self.__age = age
self.__score = score
def get_name(self):
return self.__name
def get_age(self):
return self.__age
def get_score(self):
return self.__score
def main():
mem = Member()
mem.set_info('lcx',19,99)
mem.__name = 'wyz'#當做重新添加的屬性
print("姓名:%s 年齡:%d 分數:%d"%(mem.get_name(),mem.get_age(),mem.get_score()))
if __name__=="__main__":
main()
建構式、解構式
class Member:
def __init__(self,name,age):#帶引數構造方法
self.name = name
self.age = age
def __del__(self):#解構式
print("地址空間為%d記憶體已釋放"%id(self))
def show_info(self):
print("姓名:%s 年齡:%d"%(self.name,self.age))
class Member:
def __init__(self,**kwargs):#帶關鍵字引數的構造方法
self.name = kwargs["name"]
self.age = kwargs["age"]
def show_info(self):
print("姓名:%s 年齡:%s"%(self.name,self.age))
def main():
# 匿名物件
Member(name='lcx',age=19).show_info()
if __name__=='__main__':
main()
4.3 繼承
class 子類(父類,父類,,,,,):
pass
構造方法呼叫
-
當父類定義構造方法,子類沒有定義構造方法,實體化物件會自動呼叫父類提供的無參構造方法,如果此時子類同時繼承多個父類,按照順序依次呼叫父類的無參構造
-
當子類定義構造方法時,默認不使用父類中任何構造方法,但是可以手工呼叫
獲取繼承結構資訊的函式和變數API
| 函式或變數 | |
|---|---|
__class__ |
回傳型別type() |
issubclass(clazz,父類) |
判斷一個class物件是否是某一個類的子類 |
4.4 多型
- 方法覆寫
- 物件多型性
5. 特殊方法
5.1 物件操作支持
class Message:
def __new__(cls,*args,**kwargs):
print("【new】cls=%s、args=%s、kwargs=%s"%(cls,args,kwargs))
return object.__new__(cls)
def __init__(self,**kwargs):
print("【init】kwargs=%s"%kwargs)
__new__比__init__優先執行,一般用于創建一些公共類屬性配置,即設定一些靜態變數,
__str__()類似java的toString(),覆寫__str__就可達到toString()的效果
5.2 屬性操作支持
呼叫攔截,開發者在呼叫類中方法或者屬性時可通過__getattribute__(self,item)攔截,
# coding : utf-8
import os
class Message:
def __getattribute__(self,item):#攔截的item為被呼叫屬性名稱
if item=='content':
return "www.baidu.com"
print("【getattribute】函式攔截呼叫")
return object.__getattribute__(self,item)#完成任務必備
def send(self,info):
print("訊息發送:%s"%info)
def main():
msg = Message()
print(msg.content)
msg.send("www.youth.com")
if __name__ == '__main__':
main()
實體屬性字典,python最大的特點就是每個實體化物件能夠動態進行實體化屬性配置,所有實體屬性保存在object類的__dict__字典變數中,
class Member:
pass
def main():
mem = Member()
mem.name = 'lcx'
print(mem.__dict__)
if __name__=='__main__':
main()
6. 例外處理
-
拋出例外 raise相當于java和c++的throw
-
自定義例外類直接繼承Exception即可
-
利用with進行背景關系管理,替代try,exception,finally的復雜操作
# coding : utf-8
class Message:
class __Connect:
def build(self):
print("【connect】建立通道")
return True
def close(self):
print("【connect】釋放通道")
def send(self,msg):
print("【Message】發送訊息%s"%msg)
def __enter__(self):#with陳述句開始執行時觸發此方法執行,進行資源初始化
print("【enter】with陳述句開始執行")
self.__conn = Message.__Connect()
if not self.__conn.build():
print("【Error】訊息通道建立失敗")
return self
def __exit__(self,type,value,trace):#with陳述句結束后觸發執行,釋放資源
print("【exit】with陳述句結束執行")
self.__conn.close()
def main():
with Message() as msg:
msg.send("www.baidu.com")
msg.send("www.baidu.com")
if __name__ == '__main__':
main()
7. 序列結構擴展
7.1 set API
set API |
運算子簡化 | |
|---|---|---|
| add(self,element) | 向集合追加資料 | |
| clear(self) | 清空集合 | |
| copy(self) | 集合淺拷貝 | |
| difference(self,t) | 計算差集s-t | s-t |
| intersection(self,t) | 計算交集 | s&t |
| symmetric_difference(self,t) | 對稱差集 | s^t |
| union(self,t) | 計算并集 | s|t |
| discard(self,element) | 如果元素存在,洗掉 | |
| update(self,seq) | 更新集合資料 | |
| remove(self,element) | 從集合中洗掉資料,元素不存在報錯 | |
| pop(self) | 從集合中洗掉一個元素 |
7.2 deque API
| deque API | |
|---|---|
| append(self,element) | 佇列后端添加資料 |
| appendleft(self,element) | 佇列前端添加資料 |
| clear() | 清空佇列資訊 |
| count(self,element) | 獲取指定元素在佇列中出現次數 |
| pop(self) | 從佇列前端彈出資料 |
| popleft(self) | 從佇列后端彈出資料 |
| remove(self,element) | 洗掉佇列中指定資料 |
| reverse(self) | 佇列反轉 |
7.3 heapq API
| heapq API | |
|---|---|
| heapify(iterable) | 堆化 |
| heappush(heap,element) | 向堆中添加資料 |
| heappop(heap) | 從堆中移出一個最小值 |
| nlargest(n,heap,key=fun) | 獲取前n個最大值 |
| nsmallest(n,heap,key=func) | 獲取前n個最小值 |
7.4 enum列舉
import enum
class Week(enum.Enum):
Monday = 0
Tuesday = 1
Wendesday = 2
Thursday = 3
Firday = 4
Saturday = 5
Sunday = 6
def main():
monday = Week.Monday
print("name:%s value:%s"%(monday.name,monday.value))
7.5 yield生成器
不會一次生成全部資料,根據需要動態控制生成器資料,避免占用過多記憶體,yield呼叫需要通過外部的next()控制,當呼叫next()觸發yield回傳資料;也可以利用生成器物件.send()向yield呼叫處發送資訊,并且回傳下一次yield內容,
def generator(maxnum):
for i in range(maxnum):
yield "baidu-%s"%i
# yield from等價于上面的操作
yield from ["baidu-%s"%i for i in range(maxnum)]
def main():
for i in generator(99):#每次for回圈才會回傳資料
print(i)
7.6 日期時間
7.6.1time模塊
函式主要為了實作時間戳、時間元組、格式化日期時間三者轉換,
時間戳,每個時間戳產生時,首先通過hash函式加密形成摘要,然后將摘要發送到DTS,DTS加入收到檔案的日期和時間資訊再對檔案進行加密最后將資料發送給用戶,
- 需加時間戳的檔案摘要
- DTS,收到檔案的日期和時間
- 數字簽名
時間元組
(tm_year,tm_mon,tm_mday,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)
格式化日期時間
# 年月日時分秒
string = '%Y-%m-%d %H:%M:%S'
time API

7.6.2 datetime模塊
datetime模塊是對time模塊的重新封裝,包括五個類:date類、time類、datetime類、timedelta類、tzinfo類
# coding : utf-8
import datetime
def main():
# datetime.date
print(datetime.date.today())
now = datetime.date(2017,2,17)
print(now)
#datetime.time
now = datetime.time(21,15,32,123678)
print(now)
print(now.hour,now.minute,now.second,now.microsecond)
# datetime.datetime
now = datetime.datetime.today()
print(now)
now = datetime.datetime(2020,9,8,12,11,15,32)
print(now)
# datatime.timedelta
now = datetime.datetime.today()
# 30個小時之后
print(now+datetime.timedelta(hours=30))
# 30個小時之前
print(now-datetime.timedelta(hours=30))
if __name__ == '__main__':
main()
7.7 正則運算式
| re API | |
|---|---|
| compile(pattern,flags=0) | 重用pattern |
| findall(pattern,string,flags=0) | 將匹配內容以串列形式回傳 |
| finditer(pattern,string,flag=0) | 將匹配內容以迭代物件形式回傳 |
| match(pattern,string,flags=0) | 字串匹配 |
| search(pattern,string,flags=0) | 在任意位置上進行匹配 |
| split(pattern,string,flags=0) | 拆分字串 |
match(pattern,string,flags)函式會從頭開始匹配,如果匹配成功,會回傳一個match類物件,在該物件中可以使用span()函式獲取匹配位置索引,如果匹配不成功,回傳None
res = re.match("baidu","baidu.com",re.I)
print(res)
print(res.span())
search(pattern,string,flags)可以匹配一個字串的任意位置,同時回傳匹配結果的索引位置,如果不匹配回傳None
res = re.search("baidu","www.baidu.com",re.I)
print(res)
print(res.span())
范圍匹配符
| 范圍匹配符號 | |
|---|---|
| [abc] | abc中任意一位 |
| [^abc] | 不是abc中任意一位 |
| [a-zA-Z] | 某一位字母 |
| [0-9] | 一位數字 |
| 邊界匹配符 | |
|---|---|
| ^ | 匹配開頭 |
| $ | 匹配結尾 |
| 正則運算式數量匹配 | |
|---|---|
| ? | 字符出現0-1次 |
| * | 字符出現0次、1次或多次 |
| + | 字符出現 1次或多次 |
| {n} | 某字符正好出現n次 |
| {n,} | 某字符出現n次以上 |
| {n,m} | 某字符出現n~m次 |
| 簡化正則運算式 | |
|---|---|
| \A | ^ |
| \Z | $ |
| \d | [0-9] |
| \D | [^0-9] |
| \s | [\t\n\r\f\v] |
| \S | [^\t\n\r\f\v] |
| \w | [a-zA-Z0-9_] |
| \W | [^a-zA-Z0-9_] |
| . | 匹配任意一位字符 |
| 正則邏輯運算式 | |
|---|---|
| 正則運算式A正則運算式B | A之后緊跟著B |
| 正則運算式A|正則運算式B | A或者B |
#如果字串前不加r,則\\d+表示\d+的意思
pattern = r'\d+'
| 正則運算式匹配模式 | |
|---|---|
| I(Ignorecase) | 忽略大小寫 |
| L(Locale) | 字符集本地化表示 |
| M(Multiline) | 多行匹配模式 |
| S(Dotall) | 修改.匹配任意模式,可匹配任何字符 |
| X(Verbose) | 忽略正則運算式中的空白或者注釋資訊 |
可以使用|設定多個模式同時使用
分組,正則運算式使用圓括號完成分組
# coding : utf-8
import re
string = 'id:lcx,phone:10086,birthday:2000-11-12'
#普通分組索引
pattern = r'(\d{4})-(\d{2})-(\d{2})'
result = re.search(pattern, string)
print(result.span())
print(result.group(0))#整體正則運算式作為一個分組
print("年:"+str(result.group(1)))
print("月:"+str(result.group(2)))
print("日:"+str(result.group(3)))
# 給索引命名
string = 'id:lcx,phone:10086,birthday:2000-11-12'
pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
result = re.search(pattern, string)
print(result.group("year"))
print(result.group("month"))
print(result.group("day"))
8. os模塊
| os API | |
|---|---|
| getcwd() | 獲取當前作業目錄 |
| chdir(path) | 修改作業目錄 |
| system() | 執行作業系統命令 |
| popen(cmd,mode,buffering=-1) | 開啟命令管道 |
| symlink(src,dst) | 創建軟鏈接 |
| link(src,dst) | 創建硬鏈接 |
| os.path API | 進行路徑處理操作 |
|---|---|
| abspath(path) | 獲取絕對路徑 |
| basename(path) | 獲取檔案名稱 |
| dirname(path) | 回傳父路徑 |
| exists(path) | 判斷路徑是否存在 |
| isfile(path) | 判斷路徑是否為檔案 |
| isdir(path) | 判斷路徑是否為目錄 |
| join(path1,path2,path3) | 路徑合并 |
| samefile(path1,path2) | 判斷是否為統一路徑 |
| split(path) | 將路徑分割為dirname和basename |
| curdir | 表示當前檔案夾. |
| pardir | 表示父檔案夾… |
| sep | 獲取系統路徑分隔符 |
目錄操作
| os下目錄操作API | |
|---|---|
| listdir(path) | 列出當前目錄下所有子路徑 |
| mkdir(path) | 創建單級目錄 |
| mkdirs(name,mode=0o777,exists_ok=False) | 創建多級目錄 |
| rename(src,dst) | 為目錄或檔案重命名 |
| remove(path) | 洗掉當前目錄 |
| removedirs(path) | 洗掉多級目錄 |
| walk(path) | 列出指定目錄中內容結構 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/4814.html
標籤:其他
