Python进阶
目錄
基礎(chǔ)必會
文字的編碼
函數(shù)定義 function
def 語句
函數(shù)的調(diào)用
return 語句
函數(shù)的調(diào)用傳參
局部變量和全局變量
global 語句
lambda 表達(dá)式(又稱匿名函數(shù))
id(x) 函數(shù)
is / is not 運算符
None 對象
函數(shù)式編程
python 中的常用高階函數(shù)
python 中常用的函數(shù)
map函數(shù)
filter 函數(shù)
sorted 函數(shù)
模塊
import 語句
python 的第三方模塊
random 模塊
time 模塊
datetime 模塊
異常
try 語句
raise 語句
文件
with 語句
sys模塊
os 模塊
os.path 模塊
shutil 模塊
生成器
生成器函數(shù)
生成器表達(dá)式
面向?qū)ο缶幊?Object-Oriented Programming(OOP)
class 語句
實例方法(instance method)
初始化方法(也叫構(gòu)造器方法)
繼承(inheritance)和派生(derived)
三個魔法方法
正則表達(dá)式 (regular express)
多線程編程
基礎(chǔ)必會
- 表達(dá)式
? ????????- 字面值
?????????? ? ? - 字符串 str
?????????? ? ? - 數(shù)字
??? ? ????????????????? - 整數(shù) int
???????????????????? ?? - 浮點數(shù) float
???????????? ???????? ?? - 布爾類型bool
?????????? ? ? - 容器
????? ????????????????- 列表 list
????????????????????? - 元組 tuple
????????????????????? - 字典 dict
????????????????????? - 集合 set 和 固定集合 frozenset
????????????????????? - 字節(jié)串 bytes 和 字節(jié)數(shù)組bytearray(后面在學(xué))
????????? - 運算符
?????????? ? ?? - 算術(shù)運算符
+ - * / // % **?????????? ? ?? - 比較運算符
< > <= >= == !=??? ? ? ? ? ?? - 布爾運算符
and or not L = [1, 2, 3, 4, 5, 6]print(L[2])print(L[2:5])??? ??????????? - 條件表達(dá)式
'及格' if score >= 60 else '不及格'???????????????? - in / not in 運算符
'王昭君' in ['孫悟空', '趙云']???????????????? - 索引和切片???
> 用于 str, list, tuple, bytes, bytearray L = [1, 2, 3, 4, 5, 6]print(L[2])print(L[2:5])? - 函數(shù)
??????????? - 構(gòu)造函數(shù)(函數(shù)名和類名相同的函數(shù))
str() ---> '' int() --> 0 float() bool() list() tuple() dict()set() frozenset()??????????? - 函數(shù)
print() input() len(x) max(x) min(x)sum(x) range() type(x)
????? ```
- 語句
????????? - 簡單語句
??? ????????????????- 表達(dá)式語句
??????????????????? - 賦值語句
??????????????????? - del 語句
??????????????????? - pass 語句
??????????????????? - break 語句
??????????????????? - contiue 語句
? - 復(fù)合語句
??????????????????? - if 語句
??? ????????????????- while 語句
??? ????????????????- for 語句
> 所有的容器類都是可迭代對象,可以用 for 語句遍歷其中的全部內(nèi)容
文字的編碼
Python3的字符串內(nèi)部存儲的是文字的UNICODE編碼
-
字符串中存儲的是什么?
-
是一個圖片(文字)對應(yīng)的編碼(code)
-
-
字符相關(guān)的函數(shù)
函數(shù)
說明
chr(x)
根據(jù)x的UNICODE編碼值得到對應(yīng)的字符
ord(x)
可以返回一個 字符的 UNICODE 編碼值
英文的編碼值 詳見 ASCII 編碼
man ascii
ord(x) 函數(shù)的返回值如果是0~127 則 x 是英文字符,中文字符串一個編碼值一定大于128
示例
>>> chr(98) 'b' >>> chr(20000) '丠' >>> chr(20001) '両' >>> chr(20002) '丟' >>> chr(20003) '丣' >>> chr(20004) '兩' >>> ord('兩') 20004 >>> ord('A') # 65 >>> ord('B') # 66 # 英文的編碼值在 0~127 之間 >>> ord('中') # 20013- 在python的交互模式下打印全世界的文字
函數(shù)定義 function
-
什么是函數(shù)
-
函數(shù)是可以重復(fù)執(zhí)行的語句塊,可以重復(fù)調(diào)用
-
-
作用
用于封裝語句塊, 提高代碼的重用性。
函數(shù)是面向過程編程的最小單位
def 語句
-
作用
用來定義( 創(chuàng)建)函數(shù)
語法
def 函數(shù)名(形式參數(shù)列表):語句塊- 說明
函數(shù)的名字就是語句塊的名稱
函數(shù)名必須是標(biāo)識符
函數(shù)名是一個變量,不要輕易對其賦值
函數(shù)有自己的名字空間,在函數(shù)外部不可以訪問函數(shù)內(nèi)部的變量,在函數(shù)內(nèi)部可以訪問函數(shù)外部的變量,但不能輕易對其改變
函數(shù)的形參列表如果不需要傳入?yún)?shù),形式參數(shù)列表可以為空
-
示例
# 定義一個函數(shù),用 say_hello 變量綁定 def say_hello():print("hello world!")print("hello tarena!")print("hello everyone!")# 定義一個函數(shù),傳入兩個參數(shù),讓這個函數(shù)把最大的值打印到終端 def mymax(a, b):if a > b:print("最大值是", a)else:print("最大值是", b)
函數(shù)的調(diào)用
-
語法
函數(shù)名(實際調(diào)用傳遞參數(shù))
-
說明
-
函數(shù)調(diào)用是一個表達(dá)式
-
如果函數(shù)內(nèi)沒有return 語句,函數(shù)執(zhí)行完畢后返回 None 對象
-
-
示例
# 調(diào)用 say_hello() # 調(diào)用一次 say_hello() # 調(diào)用第二次 ? # 調(diào)用 mymax(100, 200) mymax(999, 1) mymax('abc', 'cba')
return 語句
-
語法
return [表達(dá)式]
注: [] 代表 內(nèi)部的內(nèi)容可以省略
-
作用
用于函數(shù)的內(nèi)部,結(jié)束當(dāng)前函數(shù)的執(zhí)行,返回到調(diào)用此函數(shù)的地方,同時返回一個對象的引用關(guān)系
-
說明
-
return 語句后面的表達(dá)式可以省略,省略后相當(dāng)于 return None
-
如果函數(shù)內(nèi)部沒有 return 語句, 則函數(shù)執(zhí)行完畢后返回None, 相當(dāng)于在最后一條語句后有一條return None
-
示例
def say_hello():print("hello aaa")print("hello bbb")return 1 + 2print("hello ccc") ? r = say_hello() print(r) # 3
函數(shù)的調(diào)用傳參
-
位置傳參
實際參數(shù)傳遞時,實參和形參 按位置來依次對應(yīng)
-
關(guān)鍵字傳參
實際參數(shù)傳遞時,實參和形參 按名稱依次對應(yīng)
注: 位置傳參要先于關(guān)鍵字傳參
示例
def myfun1(a, b, c):print('a=', a)print('b=', b)print('c=', c) # 位置傳參 myfun1(1, 2, 3) # 關(guān)鍵字傳參 myfun1(c=33, a=11, b=22) # 位置傳參要先于關(guān)鍵字傳參 myfun1(111, c=333, b=222) # 正確函數(shù)的形式參數(shù)定義方法
函數(shù)的缺省參數(shù)
語法
def 函數(shù)名(形參名1=默認(rèn)實參1, 形參名2=默認(rèn)實參2, ... ):
? ? 語句塊
說明
缺省參數(shù)必須自右向左依次存在(即,如果一個參數(shù)有缺省參數(shù),則其右側(cè)的所有參數(shù)都必須有缺省參數(shù))
示例
def myadd4(a, b, c=0, d=0):return a + b + c + d print(myadd4(1, 2)) print(myadd4(1, 2, 3)) print(myadd4(1, 2, 3, 4))錯誤示例>>> def myadd(a, b=0, c): # 報錯 ... pass ?形參的定義
-
位置形參
-
星號元組形參(*args)
-
命名關(guān)鍵字形參
-
雙星號字典形參(**kwargs)
1) 位置形參
-
語法:
def 函數(shù)名(形參名1, 形參名2, ...):pass
2) 星號元組形參
-
語法
def 函數(shù)名(*元組形參名):pass -
作用
收集多余的位置實參
元組形參名 一般命名為args
-
示例
def myfunc2(*args):print("len(args)=", len(args))print('args=', args)myfunc2() # args=() myfunc2(1, 2, 3) # args=(1, 2, 3) ? def myfunc3(a, b, *args):print(a, b, args) ? myfunc3(1, 2) # 1-->a, 2-->b, ()--->args myfunc3(1, 2, 3, 4) # # 1-->a, 2-->b, (3, 4)--->args
3)命名關(guān)鍵字形參
-
語法
def 函數(shù)名(*, 命名關(guān)鍵字形參1, 命名關(guān)鍵字形參2, ...):pass # 或者 def 函數(shù)名(*args, 命名關(guān)鍵字形參1, 命名關(guān)鍵字形參2, ...):pass -
作用
強(qiáng)制,所有的參數(shù)都必須用關(guān)鍵字傳參
-
示例
def myfunc4(a, b,*args, c, d):print(a, b, c, d) ? myfunc4(1, 2, d=4, c=3) # 正確,c,d 必須關(guān)鍵字傳參 myfunc4(1, 2, 3, 4) # 錯誤
4)雙星號字典形參
-
語法
def 函數(shù)名(**字典形參名):pass -
作用
收集多余的關(guān)鍵字傳參
字典形參名 最多有一個,
字典形參名 一般命名為 kwargs
示例
def myfunc5(**kwargs):print(kwargs) ? # {'name': 'tarena', 'age': 18}-->kwargs myfunc5(name='tarena', age=18)函數(shù)的形參定義方法說明
-
位置形參,星號元組形參,命名關(guān)鍵字參數(shù),雙星號字典形參,缺省參數(shù)可以混合使用。
-
函數(shù)的形參定義自左至右的順序為:位置形參,星號元組形參,命名關(guān)鍵字參數(shù),雙星號字典形參
示例:
def fn(a, b, *args, c, d, **kwargs):pass ? fn(100, 200, 300, 400, c='C', e='E', d='D')局部變量和全局變量
-
局部變量
-
定義在函數(shù)內(nèi)部的變量稱為局部變量(函數(shù)的形參也是局部變量)
-
局部變量只能在函數(shù)的內(nèi)部使用
-
局部變量在函數(shù)調(diào)用時才能夠被創(chuàng)建,在函數(shù)調(diào)用之后會自動銷毀
-
-
全局變量
-
定義在函數(shù)外部,模塊內(nèi)部的變量稱為全局變量
-
全局變量, 所有的函數(shù)都可以直接訪問(取值,但函數(shù)內(nèi)部不能直接將其賦值改變)
-
-
局部變量示例
-
全局變量示例
全局變量示例2
a = 100 # 全局變量 def fx(b):a = 666 # 創(chuàng)建局部變量,不是改變?nèi)肿兞縞 = 300print(a, b, c) # 優(yōu)先訪問局部變量fx(200) # 666 200 300 print(a) # 100 ?global 語句
-
問題
-
作用
告訴python 的解釋執(zhí)行器, global 語句聲明的一個或多個變量, 這些變量是全局變量
-
語法
global 變量名1, 變量名2, ....
示例
# 如何用一個變量來記錄一個函數(shù)調(diào)用的次數(shù) count = 0 ? def hello(name):global count # 聲明 global 是全局變量print('hello', name)count += 1 # 等同于 count = count + 1 ? hello('小張') hello('小李') hello('小魏') ? print('您共調(diào)用hello函數(shù)', count, '次') # 3 次global 說明
-
全局變量如果要在函數(shù)內(nèi)部被賦值,則必須經(jīng)過全局聲明 global
-
默認(rèn)全局變量在函數(shù)內(nèi)部可以使用,但只能取值,不能賦值
-
不能先聲明為局部變量,再用 global 聲明為全局變量,此做法不符合語法規(guī)則
-
函數(shù)的形參已經(jīng)時局部變量,不能用 global 聲明為全局變量
錯誤示例
a = 100b = 200def fa(a):b = 20 # SyntaxError: name 'b' is assigned to before global declarationglobal bb = 222lambda 表達(dá)式(又稱匿名函數(shù))
-
語法
lambda [函數(shù)的參數(shù)列表]: 表達(dá)式 -
作用
-
創(chuàng)建一個匿名函數(shù)對象
-
同 def 類似,但不提供函數(shù)名
-
-
說明
lambda 表達(dá)式 的創(chuàng)建函數(shù)只能包含一個表達(dá)式
-
示例
def myadd(x, y):return x + y ? print('1 + 2 =', myadd(1, 2)) # 3 ? # myadd 函數(shù)可以改寫成 myadd2 = lambda x, y: x + y print('3 + 4 =', myadd2(3, 4)) # 7 -
示例2
>>> mymul = lambda a, b, c: a * b + c >>> >>> mymul(3, 4, 5) 17 >>> def mymul2(a, b, c): ... return a * b + c ... >>> mymul2(3, 4, 5) 17 ?
id(x) 函數(shù)
-
作用
返回一個對象在內(nèi)存中的地址
-
示例
is / is not 運算符
-
is 作用
判斷兩個對象的id ,如果為同一個地址,返回True, 否則返回False
is not 返回值與 is 相反
-
示例
None 對象
python 內(nèi)部只有一個None 對象
通常判斷一個變量是否綁定None,用 is 運算符(很少用 == 運算符)
函數(shù)式編程
用一系列函數(shù)來解決問題
求 1 + 2 + 3 + 4 + ..... 99 + 100 的和 # 用函數(shù)式編程 print(sum(range(1, 101)))python 中的常用高階函數(shù)
高階函數(shù)是指,函數(shù)的參數(shù)可以傳入函數(shù)
>>> def fb(a, b): ... print(a) ... print(b) ... print(b(a)) # b([1, 2, 3, 4]) # 等用于 sum([1, 2, 3, 4]) ... >>> fb([1, 2, 3, 4], sum) [1, 2, 3, 4] <built-in function sum> 10python 中常用的函數(shù)
-
map 函數(shù)
-
filter 函數(shù)
-
sorted 函數(shù)
| map(func, 可迭代對象1, ...) | 返回一個可迭代對象, 此可迭代對象的每個數(shù)據(jù)用函數(shù)func 處理后返回 |
| filter(func, 可迭代對象) | 返回一個可迭代對象, 此可迭代對象的數(shù)據(jù)用func 函數(shù)進(jìn)行篩選后過濾 |
| sorted(可迭代對象, key=None,reverse=False) | 返回一個列表, 所有的可迭代對象用key 的返回值進(jìn)行排序 |
map函數(shù)
>>> def power2(x): ... return x ** 2 ... >>> L = [8, 5, 1, 3] # 求出 列表內(nèi) 平方并打印 >>> for x in map(power2, L): # 把 power2 函數(shù)和 列表 L 交給 map 函數(shù) ... print(x) ... 64 25 1 9filter 函數(shù)
>>> def is_odd(x): ... return x % 2 == 1 ... >>> is_odd(3) True >>> is_odd(10) False >>> L = [8, 5, 2, 1, 8, 6, 9, 7] >>> # 把列表里所有的奇數(shù)取出來 >>> L2 = list(filter(is_odd, L)) >>> L2 [5, 1, 9, 7]sorted 函數(shù)
>>> L = [5, -2, 4, -3, 1] >>> sorted(L) # 默認(rèn)是升序排序 [-3, -2, 1, 4, 5] >>> sorted(L, reverse=True) # 降序排序 [5, 4, 1, -2, -3] >>> abs(-2) # abs 用來返回一個 數(shù)的絕對值 2 >>> abs(2) 2 >>> sorted(L, key=abs) # [1, -2, -3, 4, 5] # 用每個數(shù)據(jù) abs 的返回值作為排序依據(jù)進(jìn)行排序 [1, -2, -3, 4, 5]模塊
一個.py 文件就是一個模塊
模塊是含有一些列數(shù)據(jù),函數(shù),類等的程序
-
作用
把相關(guān)功能的函數(shù)等放在一起有利于管理,有利于多人合作開發(fā)
-
模塊的分類
模塊名如果要給別的程序?qū)?#xff0c;則模塊名必須是 標(biāo)識符
-
內(nèi)置模塊(在python3 程序內(nèi)部,可以直接使用)
-
標(biāo)準(zhǔn)庫模塊(在python3 安裝完后就可以使用的 )
-
第三方模塊(需要下載安裝后才能使用)
-
自定義模塊(用戶自己編寫)
????????? 模塊名如果要給別的程序?qū)?#xff0c;則模塊名必須是 標(biāo)識符
-
實例
調(diào)用模塊
# file: test_mod.py # 小李寫的程序,小李想調(diào)用 小張寫的 mymod.py 里的兩個函數(shù)和兩個字符串# 用import 語句導(dǎo)入模塊 import mymodprint(mymod.name1) # Audi print(mymod.name2) # teslamymod.mysum(100) # 調(diào)用 mymod 模塊里的 mysum 函數(shù) print(mymod.get_name()) # 'tarena'import 語句
導(dǎo)入
-
語法
導(dǎo)入一個模塊到當(dāng)前程序
from 模塊名 import 模塊屬性名 [as 屬性新名]導(dǎo)入一個模塊內(nèi)部的部分屬性到當(dāng)前程序
from 模塊名 import *導(dǎo)入一個模塊內(nèi)部的全部屬性到當(dāng)前程序
示例
import mymod mymod.mysum(10) # 要加模塊名 ? from mymod import get_name print(get_name()) # 調(diào)用get_name 時不需要加 "模塊名." ? from mymod import * print(get_name()) print(name2)- 模塊的內(nèi)部屬性
python 的第三方模塊
PyPI · The Python Package IndexThe Python Package Index (PyPI) is a repository of software for the Python programming language.https://pypi.org/
random 模塊
生成隨機(jī)數(shù)
文檔位置: https://docs.python.org/zh-cn/3/library/random.html
>>> import random >>> random.randint(1, 6) # random.randint(a,b) 生產(chǎn) a~b的隨機(jī)整數(shù) 3 >>> random.randint(1, 6) 4 >>> random.random() # random.random 生成包含0 但不包含1 的浮點數(shù) 0.5884109388439075 >>> random.choice("ABCD") # 從一個序列中,隨機(jī)返回一個元素 'C' >>> random.choice("ABCD") 'B' >>> L = [1, 2, 3, 6, 9] >>> random.choice(L) 6 >>> random.shuffle(L) # random.shuffer(x) # 把列表X 打亂 >>> L [1, 6, 2, 9, 3]time 模塊
time --- 時間的訪問和轉(zhuǎn)換 — Python 3.9.7 文檔https://docs.python.org/zh-cn/3/library/time.html
時間戳:從 1970年1月1日 0:0:0 UTC 時間 開始計時到現(xiàn)在的秒數(shù)
UTC 時間 : 世界協(xié)調(diào)時間
struct_time 用 含有9個元素的元組來表示時間
>>> import time >>> time.time() # 返回當(dāng)前時間的時間戳 1617117219.0382686 >>> time.ctime() #返回當(dāng)前的UTC 時間的字符串 'Tue Mar 30 23:14:48 2021' >>> t1 = time.localtime() # 返回當(dāng)前的本地時間元組 >>> t1 time.struct_time(tm_year=2021, tm_mon=3, tm_mday=30, tm_hour=23, tm_min=18, tm_sec=22, tm_wday=1, tm_yday=89, tm_isdst=0) >>> t1.tm_year 2021 >>> t1.tm_yday 89 >>> time.sleep(3) # time.sleep(n) # 讓程序睡眠 n 秒 >>> time.strftime("%Y-%m-%d", t1) # 格式化時間 '2021-03-30' >>> time.strftime("%y-%m-%d", t1) '21-03-30' >>> time.strftime('%Y-%m-%d %H:%M:%S', t1) '2021-07-21 17:37:41'# 用時間元組來創(chuàng)建一個自定義的時間 >>> t2 = time.struct_time ( (2021,1, 1, 10, 11, 20, 0, 0, 0) )datetime 模塊
datetime --- 基本日期和時間類型 — Python 3.9.7 文檔https://docs.python.org/zh-cn/3/library/datetime.html
>>> import datetime >>> d1 = datetime.datetime.now() # 返回當(dāng)前的時間 >>> d1 datetime.datetime(2021, 3, 30, 23, 32, 7, 342559) >>> d1.year 2021 >>> d1.year, d1.month, d1.day, d1.hour, d1.minute, d1.second, d1.microsecond # 用 datetime 的各個屬性可以得到 具體的信息 (2021, 3, 30, 23, 32, 44, 757673) >>> d1.strftime("%Y-%m-%d") '2021-03-30' ? # 計算時間差 >>> delta_time = datetime.timedelta(days=2, hours=1) # 生成 2天1小時后的時間差 >>> delta_time datetime.timedelta(2, 3600) >>> t1 = datetime.datetime.now() # 得到當(dāng)前時間 >>> t1 datetime.datetime(2021, 3, 30, 23, 39, 26, 863109) >>> t1 + delta_time # 計算 未來時間異常
-
用作
信號通知,通知上層調(diào)用者有錯誤產(chǎn)生需要處理
try 語句
-
語法
-
作用
嘗試捕獲異常,得到異常通知,將程序由異常狀態(tài)變?yōu)檎顟B(tài)
-
說明
except 子句可以有 1個或多個
except: 不給錯誤類型,可以匹配全部的錯誤類型
else 子句里的語句會在 沒有錯誤發(fā)生時執(zhí)行,當(dāng)處于異常時不執(zhí)行
finally 子句里的語句,無論何時都執(zhí)行
-
示例
raise 語句
問題
# 寫一個函數(shù), get_score 函數(shù),讀取用戶輸入的整數(shù)成績, # 成績的正常值是0~100 之間, 要求, 如果不在0~100 之間 # 報 ValueError類型的錯誤 def get_score():x = int(input('請輸入成績:'))if 0 <= x <= 100:return xraise ValueError?? 語法
raise 異常類型 或 raise 異常對象-
作用
-
拋出一個錯誤,讓程序進(jìn)入異常狀態(tài)
-
發(fā)送錯誤通知給調(diào)用者
-
-
示例:
- ?異常類型的可選種類
詳見:
>>> help(__builtins__)
?字節(jié)串 bytes 和字節(jié)數(shù)組 bytearray
1 一個字節(jié)(byte)是8個二進(jìn)制的位 (bit)
1個byte的取值范圍是 0 ~ 255
bytes 不可變
bytearray 可變
字節(jié)串的字面值
>>> b'' >>> b"" >>> b'''''' >>> b'''''' >>> b'ABC' >>> bytes([65, 66, 67, 68]) >>> bytes([65, 66, 67, 68, 200,255]) >>> bytes([65, 66, 67, 68, 200,255, 300]) # 300 超出了255 報錯 >>> bytearray([65, 66, 67, 68, 200,255]) # 字節(jié)數(shù)組的創(chuàng)建必須使用bytearray函數(shù)-
字節(jié)串的運算
字節(jié)串是序列,運算規(guī)則同元組一樣
+ += * *= > >= < <= == != in / not in 索引和切片 -
示例
>>> b = bytes([65, 66, 67, 68, 200,255]) >>> b b'ABCD\xc8\xff' >>> b[0] 65 >>> b[:2] b'AB' >>> b += b'123' >>> b b'ABCD\xc8\xff123' >>> len(b) 9 -
bytes 和 str 的區(qū)別
bytes 存儲的字節(jié) (0~255 之間的數(shù))
str 存儲的是字符的編碼
-
bytes 與 str 轉(zhuǎn)換?
編碼(encode) str -------------> bytesb = s.encode(encoding='utf-8')解碼(decode) bytes -----------> strs = b.decode(encoding='utf-8')示例
>>> s = 'hello 小張' >>> >>> b = s.encode() # 將字符串編碼成為字節(jié)串 >>> b b'hello \xe5\xb0\x8f\xe5\xbc\xa0' # 在utf-8 編碼中,1個漢字通常用3個字節(jié)進(jìn)行編碼 >>> len(b) 12 >>> s2 = b.decode() # 將字節(jié)串解碼成為字符串 >>> s2 'hello 小張'
文件
-
什么是文件
文件通常用來存儲以字節(jié)為單位的數(shù)據(jù)
-
文件的操作流程
-
打開文件
-
讀/寫文件
-
關(guān)閉文件
-
打開文件用open 函數(shù)
open(file, mode='rt') # open 函數(shù)返回文件流對象 # 打開失敗回收到異常通知 # mode 的缺省值的 'rt' myfile = open('/etc/passwd', 'rt') s = myfile.read() # 用 myfile 綁定的文件流對象的read() 方法,得到 文件內(nèi)部的數(shù)據(jù) print(s) myfile.close() # 關(guān)閉文件-
示例
-
-
兩種操作文件的模式
-
直接用 字節(jié)串操作文件(內(nèi)部可以存儲文字,也可以存儲圖片等信息)
????????打開模式 mode = 'b' # b是binary
-
用字符串操作文本文件(內(nèi)部存儲的都是文字)
打開模式 mode='t' # t 是text 的首字母(默認(rèn)為't')
-
示例見
f = open('mynote.txt', 'rt') # 'r 代表讀 ? s = f.read() # 在't' 模式下 ,read 返回字符串 print(s) ? f.close() # 關(guān)閉 f = open('mynote.txt', 'rb') # 'r' 代表讀 'b' 代表以二進(jìn)制方式操作 ? b = f.read() # 在't' 模式下 ,read 返回字節(jié)串 print(b) ? s = b.decode() # 將字節(jié)串轉(zhuǎn)成了字符串 print(s) f.close() # 關(guān)閉 -
用字符串操作文件
-
用字節(jié)串操作文件
-
文件的打開模式 mode
模式
說明
't'
以文本(字符串) 的模式操作文件(默認(rèn))
'b'
以二進(jìn)制(字節(jié)串) 的模式操作文件
-
文件的打開方式 mode
方式
說明
'r'
讀取文件(默認(rèn))
'w'
寫和覆蓋寫文件(如果文件不存在則創(chuàng)建文件 )
'a'
寫并且追加文件內(nèi)容(如果文件不存在則創(chuàng)建文件)
python 文件流對象的方法
方法名
說明
F.close()
關(guān)閉文件
讀取文件的方法
F.read(size=-1)
讀取文件(不給出size 參數(shù)過讀取全部)
F.readline()
讀取文件中的一行,以'\n' 作為行分隔符
F.readlines()
讀取文件中的全部,以'\n' 作為行分隔符, 返回行的列表
寫文件的方法
F.write(x)
寫文件: 'b'模式 x 必須是字節(jié)串, 't'模式x必須是字符串, 如果文件不存在則新建文件
mynote.txt 文件中的內(nèi)容
????????我是小眀
????????我在 tarena
讀數(shù)據(jù)
>>> f = open('mynote.txt', 'rb') >>> f.read() # 返回全部 b'\xe6\x88\x91\xe6\x98\xaf\xe9\xad\x8f\xe7\x9c\x80\xe6\x8b\xa9\n\xe6\x88\x91\xe5\x9c\xa8 tarena\n' >>> f.read() # 當(dāng)?shù)竭_(dá)文件尾部,返回空 b'' >>> f.close() >>> f = open('mynote.txt', 'r') >>> f.read() '我是小明\n我在 tarena\n' >>> f.close() ? >>> f = open('mynote.txt', 'r') >>> f.readline() # 返回一行 '我是小眀\n' >>> f.readline() '我在 tarena\n' >>> f.readline() '' >>> f.close() ? >>> f = open('mynote.txt', 'r') >>> f.readlines() # 取出所有的行數(shù)據(jù),返回列表 ['我是小眀\n', '我在 tarena\n'] >>> f.close()?寫數(shù)據(jù)
>>> f = open('python.log', 'w') # 以字符串方式寫文件, 如果文件文件不存在回新建一個文件 >>> f.write('該吃飯了') 4 >>> f.write('!') 1 >>> f.write('\n') # 寫一個換行 1 >>> f.write('下課') 2 >>> f.close()-
移動文件的讀寫指針seek 方法
F.seek(偏移量, whence=相對位置)
? ? ?? 偏移量(整數(shù))
? ? ? ? ? ?? 大于0 向文件末尾方向
? ? ? ? ? ?? 小于0 向文件頭方向
? ? ?? 相對位置:
? ? ? ? ? ?? 0 代表從文件頭開始偏移
? ? ? ? ? ?? 1 代表從當(dāng)前的讀寫位置開始偏移
? ? ? ? ? ?? 2 代表從文件末尾開始偏移?-
在讀寫二進(jìn)制模式打開的文件,在不關(guān)閉文件的情況下, 可以使用seek 方法移動文件的讀寫指針
-
-
tell() 方法,返回文件的讀寫指針的位置
F.tell() # 返回整數(shù) -
示例
mynote3.txt 的內(nèi)容
????????????????1234567890ABCDE
-
示例程序
myfile = open('mynote2.txt', 'rb') ? print('剛打開文件時,文件指針的位置是:', myfile.tell()) # 0 b = myfile.read(2) print(b) # b'12' print('讀取兩個字節(jié)后,文件指針的位置是:', myfile.tell()) # 2 # 讀取 67890 這個5個字節(jié) # myfile.seek(5, 0) # 0 開始位置,向后移動5個字節(jié) # myfile.seek(3, 1) # 1 當(dāng)前位置,向后移動3個字節(jié) myfile.seek(-10, 2) # 2 文件末尾位置,向前移動10個字節(jié) print('myfile.seek()后,文件指針的位置是:', myfile.tell()) # 5 b = myfile.read(5) # b'67890' print('myfile.read(5)后,文件指針的位置是:', myfile.tell()) # 10 print(b) ? myfile.close()
with 語句
通過with 語句打開文件,with 語句結(jié)束,則文件會自動關(guān)閉
-
語法
with 表達(dá)式1 as 變量1[, 表達(dá)式2 as 變量2, ...]:語句塊 -
示例
# file: mynote2.txt # 不用with 語句 f = open('mynote2.txt') s = f.read() print(s) f.close() ? # 用with 語句 with open('mynote2.txt') as f:s = f.read()print(s)
sys模塊
Shell 的位置參數(shù) $0 $1 $2
#! /usr/bin/python3 ? # file 04_myprog.py import sys print(sys.argv) # ['./04_myprog', '/root', 'hello']# 如下是shell 中運行的內(nèi)容 $ chmod +x myprog.py $ ./myprog /root hello # $0='./04_myprog' $1='/root' $2='hello'os 模塊
-
python 上獲取命令行參數(shù)
-
對操作系統(tǒng)的訪問大多使用 python 中的os 模塊
-
官方文檔: os --- 多種操作系統(tǒng)接口 — Python 3.9.7 文檔
>>> import os >>> os.getcwd() # 返回當(dāng)前的工作路徑,pwd '/root/桌面/py02/day03_code' >>> os.mkdir('/tmp/nsd21xx') # mkdir /tmp/nsd21xx >>> os.makedirs('/tmp/nsd21xx/a/b/c') # mkdir -p /tmp/nsd21xx/a/b/c >>> os.listdir() # ls ['mygames.py', '.idea', 'mynote.txt', 'python.log', 'mynote2.txt', '03_file_seek.py', '04_myprog.py', '05_cp.py', '01_read_text_file_by_string.py', '02_read_text_file_by_bytes.py'] >>> os.listdir('/tmp') # ls /tmp # 列出所有的文件夾 [ 'nsd21xx', 'dir1', 'dir2'] >>> os.chdir('/tmp/nsd21xx') # cd /tmp/nsd21xx >>> os.getcwd() # pwd '/tmp/nsd21xx' >>> os.symlink('/etc/passwd', '/tmp/abc') # ln -s /etc/passwd /tmp/abc >>> os.mknod('/tmp/myfile.txt') # touch /tmp/myfile.txt >>> os.chmod('/tmp/myfile.txt', 0o755) # chmod 755 /tmp/myfile.txt >>> os.rename('/tmp/myfile.txt', '/tmp/a.txt') # mv /tmp/myfile.txt /tmp/a.txt >>> os.rmdir('/tmp/dir2') # rmdir /tmp/dir2 >>> os.remove('/tmp/a.txt') # rm /tmp/a.txt-
字符串用于去掉空白字符串的方法
????????空白字符是指 ' ', '\n' '\r' '\t'
os.path 模塊
用于路徑的操作的模塊
>>> import os >>> os.path.isabs('/root/abc.txt') # 判斷是否為絕對路徑 True >>> os.path.isdir('/tmp/nsd21xx') # 判斷是否是文件夾 True >>> os.mknod('/tmp/b.txt') # touch /tmp/b.txt >>> os.path.isfile('/tmp/b.txt') # 判斷是否是文件 True >>> os.path.islink('/tmp/abc') # 判斷是否是軟連接? True >>> os.path.ismount('/home') # 存在并且是掛載點 True >>> os.path.exists('/root') # 判斷文件或文件夾是否存在 True >>> os.path.basename('/tmp/nsd21xx/hello.py') # 返回文件名 'hello.py' >>> os.path.dirname('/tmp/nsd21xx/hello.py') # 返回路徑 '/tmp/nsd21xx' >>> os.path.split('/tmp/nsd21xx/hello.py') # 拆分 路徑和文件名 ('/tmp/nsd21xx', 'hello.py') >>> os.path.join('/tmp/nsd21xx', 'world.py') # 拼接路徑 '/tmp/nsd21xx/world.py'os.walk() 函數(shù)
遍歷文件夾[root@localhost tmp]# tree /tmp/nsd21xx/ /tmp/nsd21xx/ ├── a │ ├── aaa.txt │ └── b │ ├── bbb.txt │ └── c └── aa└── bb└── cc ?示例
>>> for x in os.walk('/tmp/nsd21xx'): ... print(x) ... # (路徑 , 路徑內(nèi)的所有文件夾列表 , 路徑內(nèi)的所有文件列表) ('/tmp/nsd21xx', ['a', 'aa'], []) ('/tmp/nsd21xx/a', ['b'], ['aaa.txt']) ('/tmp/nsd21xx/a/b', ['c'], ['bbb.txt']) ('/tmp/nsd21xx/a/b/c', [], []) ('/tmp/nsd21xx/aa', ['bb'], []) ('/tmp/nsd21xx/aa/bb', ['cc'], []) ('/tmp/nsd21xx/aa/bb/cc', [], [])shutil 模塊
官方文檔: shutil --- 高階文件操作 — Python 3.9.7 文檔
>>> import shutil >>> f1 = open('/etc/passwd', 'rb') >>> f2 = open('/tmp/mypass.txt', 'wb') >>> shutil.copyfileobj(f1, f2) >>> f1.close() >>> f2.close() >>> >>> shutil.copy('/etc/passwd', '/tmp/mypass2.txt') # cp /etc/passwd /tmp/mypass2.txt '/tmp/mypass2.txt' >>> shutil.copytree('/root/桌面/py02/day03_code', '/tmp/mycode') # cp -r /root/桌面/py02/day03_code /tmp/mycode '/tmp/mycode' >>> shutil.move('/tmp/mypass.txt', '/tmp/nsd21xx/a.txt') # mv /tmp/mypass.txt /tmp/nsd21xx/a.txt >>> shutil.rmtree('/tmp/mycode') # rm -rf /tmp/mycode >>> shutil.chown('/tmp/mypass.txt', user='xxx', group='yyy') # 改屬主屬組生成器
生成器是在程序運行時生成數(shù)據(jù),與容器不同,它通常不會在內(nèi)存中保留大量的數(shù)據(jù),而是現(xiàn)用現(xiàn)生成。
生成器可以用算法動態(tài)的生成數(shù)據(jù)
生成器有兩種
生成器函數(shù)
生成器表達(dá)式
生成器函數(shù)
含有yield 語句的函數(shù) 是生成器函數(shù),此函數(shù)調(diào)用回返回一個生成器對象,生成器也是可迭代對象
yield 語句的語法
yield 表達(dá)式生成器函數(shù)示例:
# 定義一個生成器函數(shù), 有 yield 的函數(shù)調(diào)用后回返回生成器對象 def myrange(stop):i = 0while i < stop:yield i # 為 遍歷次生產(chǎn)器的for 語句提供數(shù)據(jù)i += 1 ? for x in myrange(5):print('x=', x)生成器表達(dá)式
-
語法:
????????[] 內(nèi)容代表可以省略
-
作用
用推導(dǎo)式的形式創(chuàng)建一個生成器
-
示例
生成器表達(dá)式
-
語法:
[] 內(nèi)容代表可以省略
-
作用
用推導(dǎo)式的形式創(chuàng)建一個生成器
-
示例
面向?qū)ο缶幊?Object-Oriented Programming(OOP)
程序 = 數(shù)據(jù) + 算法(操作數(shù)據(jù)的方式可方法)
-
數(shù)據(jù)
數(shù)字
字符串
容器
-
算法
函數(shù)
-
模塊
數(shù)據(jù) + 函數(shù) + 類
函數(shù)式編程, 數(shù)據(jù)和行為(函數(shù)) 是分開的
Person1 = {'name': 'weimingze','age': 35 } Person2 = {'name': 'xiaozhang','age': 18 } def update_age(person):person['age'] += 1 ? update_age(Person1) update_age(Person2)-
對象
是指現(xiàn)實世界的物體
-
什么是面向?qū)ο?/p>
把一切看成對象(實例), 用各個對象的關(guān)系來描述事物
-
對象的特征
-
對象有很多屬性(名詞,形容詞,...), 數(shù)據(jù)
-
姓名, 年齡,性別....
-
-
對象有很多行為(動作,動詞), 方法(屬于某個對象的函數(shù))
-
學(xué)習(xí),吃飯, 踢球,工作
-
-
-
類
擁有相同屬性和行為的對象分為一組,即為一個類
?
? ?? /-------> BYD? E6(京A.88888) ?? 實例(也叫對象)
車(類)
? ?? \-------> BWM? X5(京B.66666) ?? 實例(也叫對象)
?
? ? ? /-------> 100 ?? (對象)
int(類)
? ? ? \-------> 200 ?? (對象)
? ? ?? /---> True
bool(類)
? ? ?? \---> False
class 語句
-
語法
class 類名 (繼承列表):語句 -
作用
創(chuàng)建一個類
類用于描述對象的行為和屬性
類可以創(chuàng)建一個或多個對象
-
示例
class Car:pass
構(gòu)造函數(shù)
-
調(diào)用表達(dá)式
類名(實參)
-
作用
創(chuàng)建這個類的實例對象
-
示例
car1 = Car() # 創(chuàng)建 第一個Car 類型的對象car2 = Car() # 創(chuàng)建 另一個Car 類型的對象#L1 = list() 創(chuàng)建 第一個 list 類型的列表L2 = list() 創(chuàng)建 另一個 list 類型的列表
實例屬性
每個對象可以有自己的變量,稱之為實例屬性
屬性的使用語法
????????實例.屬性名
遵循變量的賦值規(guī)則
-
示例
刪除屬性用 del 語句
# 如 del car1.color實例方法(instance method)
-
定義的語法
class 類名[繼承列表]:def 實例方法名(self, 形參名1, 形參名2, 形參名3, ....):語句塊 -
作用
用于描述一個對象的行為,讓此類型的全部對象都有相同的行為
-
說明
實例方法的實質(zhì)是一個函數(shù),他是定義在類內(nèi)的函數(shù)
實例方法至少有一個形參,第一個形參綁定調(diào)用這個方法的實例,一般命名為 self
-
調(diào)用語法
實例.實例方法名(實參列表)
# 或
類名.實例方法名(實例,實參列表) -
示例
# 類的定義 class Car:# 實例object方法def run(self, km):print(self.color, '的', self.brand, self.plate, '正在以', km, '公里/小時的速度行使') ? .... 此處省略了創(chuàng)建對象的和添加屬性的代碼 ? # 調(diào)用方法 car1.run(110) car2.run(180) # 方法2 # Car.run(car1, 120) # Car.run(car2, 160)
初始化方法(也叫構(gòu)造器方法)
-
作用
對新創(chuàng)建的對象添加屬性
-
語法格式
class 類名:def __init__(self [,形參列表]):語句塊 -
說明
-
初始化方法名 必須為 __init__
-
初始化方法會在類創(chuàng)建實例時自動調(diào)用,且將實例對象通過第一個參數(shù)傳入 __init__方法
-
構(gòu)造函數(shù)的實參將通過__init__的參數(shù)列表傳入到__init__ 方法中
-
初始化方法內(nèi)如果需要用return 語句返回,則必須返回None
-
練習(xí)
答案
# 寫一個小狗類 class Dog:def __init__(self, color, kind):self.color = colorself.kind = kindself.foods = [] # 用來記錄吃過的食物 ?def eat(self, weight, food):print(self.color, '的', self.kind, '吃了', weight, '斤', food)self.foods.append(food) # 追加到 foods 列表里 ?def info(self):print(self.color, '的', self.kind, '吃過', self.foods) ? ? dog1 = Dog('白色', '藏獒') dog1.eat(1, '羊肉') # 白色 的 藏獒 吃了 1 斤 羊肉, dog2 = Dog('灰色', '導(dǎo)盲犬') dog2.eat(2, '狗糧') # 灰色 的 導(dǎo)盲犬 吃了 2 斤 狗糧, ? dog1.eat(2, '牛肉') # 白色 的 藏獒 吃了 2 斤 牛肉, dog1.info() # 白色 的 藏獒 吃過 ['羊肉', '牛肉'] dog2.info() # 灰色 的 導(dǎo)盲犬 吃過 ['狗糧'] ?繼承(inheritance)和派生(derived)
繼承是從已經(jīng)有的類中派生出新類,新類具有父類的屬性和行為,并能擴(kuò)展新的能力
派生是從已經(jīng)有的類中衍生出新類,在新類的基礎(chǔ)上可以添加屬性和行為
-
作用
-
用繼承派生機(jī)制,可以將一些共有的功能加在基類(也叫父類)中,實現(xiàn)代碼共享
-
在不改變基類代碼的基礎(chǔ)上,改變原有的功能。
-
語法
class 類名(基類名):語句塊 -
示例1
?# 繼承的示例 # Human 類派生出 Student 類 ? class Human: # 定義一個人類def say(self, what):'說'print("說:", what) ?def walk(self, distance):'走路'print('走了', distance, '公里') ? ? class Student(Human): # 定義一個學(xué)生了def study(self, subject):print('學(xué)習(xí)', subject) ? class Teacher(Human):def teach(self, language):print('教', language) ? h1 = Human() h1.say('天氣真好') h1.walk(5) ? s1 = Student() s1.walk(4) s1.say('有點累') s1.study('面向?qū)ο?#39;) ? t1 = Teacher() t1.teach('Python') t1.say('今天周四') t1.walk(6) -
顯式調(diào)用基類的初始化方法 super 函數(shù)
super() # 返回父類對象
覆蓋
覆蓋是指在有繼承關(guān)系的類中,子類中實現(xiàn)了與父類中同名的方法,在子類實例調(diào)用該方法時,實際調(diào)用的是子類中的覆蓋版本,這種現(xiàn)象叫覆蓋
組合
class MyList:def __init__(self):self.data = []def append(self, n):self.data.append(n)def insert_head(self, n):self.data.insert(0, n) L1 = MyList() # MyList 類型的對象中包含一個 list 類型的對象,這種叫組合 L1.append(100) L1.insert_head(0)繼承
class MyList(list):def insert_head(self, n):self.insert(0, n) ? L1 = MyList() # MyList 類型的對象中包含一個 list 類型的對象,這種叫組合 L1.append(100) L1.insert_head(0) print(L1)多繼承
多繼承是指一個子類由兩個或兩個以上的父類(基類)
-
語法
-
示例
多繼承可能會帶來程序運行的不確定性,謹(jǐn)慎使用
>>> class A: ... def m(self): ... print('A') ... >>> class B: ... def m(self): ... print("B") ... >>> class C(A, B): ... pass ... >>> c = C() >>> c.m() A >>> class D(B, A): ... pass ... >>> d = D() >>> d.m() B-
常用魔法方法, 在類定義中,很多以 雙下劃線開頭和結(jié)尾的方法被稱為魔法方法,是python 定義特殊功能的方法,
用dir函數(shù)可以查看對象的全部方法
>>> dir(list) ...
三個魔法方法
class Book:
? ?def __init__(self, title, author):
? ? ? ?'''初始化方法,在實例化時自動調(diào)用'''
? ? ? ?self.title = title ?# 標(biāo)題
? ? ? ?self.author = author ?# 作者
?
? ?def __str__(self): ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?'''將對象轉(zhuǎn)成字符的時候會調(diào)用'''
? ? ? ?return "《%s》" % self.title
?
? ?def __call__(self):
? ? ? ?'''將實例當(dāng)成函數(shù)來調(diào)用,執(zhí)行此函數(shù)內(nèi)的代碼'''
? ? ? ?print('《%s》是%s 編著的' %(self.title, self.author) )
?
if __name__ == '__main__':
? ?b1 = Book('Linux 運維之道', '丁明一')
? ?print(b1)
? ?b1()
?
正則表達(dá)式 (regular express)
正則表達(dá)式是表示 文字的排列規(guī)則的一個字符串, 使用來匹配文字的匹配模式.
-
作用
用于文字的定位,搜索和內(nèi)容的提取
元字符
| 匹配字符 | . [...] [^...] \d \D \w \W \s \S |
| 匹配重復(fù) | * + ? {n} {m,n} |
| 匹配位置 | ^ $ \b \B |
| 其他 | | () \ |
示例
# 標(biāo)識符 的正則表達(dá)式 [A-Za-z_][A-Za-z_0-9]* # a* -> '' 'a' 'aaaaa' a+ -> 'a' 'aaaaaa' [ab]+ --> 'a' 'b' 'abaaabbb' [ab]{3} --> 'aaa' 'bbb' 'aba' [ab]{3,5}--> 'aaa' 'aaaaa' 'aabb' # 匹配 .mp3 文件 '\w\.mp3$'---> 'abc.mp3' '(\w\.mp3$)|(\w\.MP3$)' 'abc.mp3' 'abc.MP3' '\w\.[mM][pP]3$' 'abc.mP3' 'abc.mp3' 'abc.MP3'-
普通字符
'ab' # 普通字符 只匹配'ab'>>> import re # 導(dǎo)入正則表表達(dá)式模塊 >>> s = 'abcdeabca' >>> re.findall('ab', s) ['ab', 'ab'] -
或關(guān)系
| 匹配兩側(cè)任意的正則表達(dá)式>>> import re # 導(dǎo)入正則表表達(dá)式模塊 >>> s = 'abcdeabca' >>> re.findall('ab|de', s) ['ab', 'de', 'ab'] -
匹配單個字符串
. 匹配除換行符 以外的任意的一個字符>>> import re >>> re.findall('張.豐', '張三豐,張四豐,張老師') ['張三豐','張四豐'] -
匹配字符集
[字符集] 匹配其中的一個字符>>> import re >>> s = 'How are you!' >>> re.findall('[aeiou]', s) ['o', 'a', 'e', 'o', 'u'] >>> re.findall('[0-9A-Za-z]', 'A$%^^%b!#$@!#$0') ['A', 'b','0']^ 匹配目標(biāo)字符的開始位置 $ 匹配目標(biāo)字符的結(jié)束位置>>> re.findall('^hello', 'hello world') ['hello'] >>> re.findall('^hello', 'a hello world') [] >>> re.findall('world$', 'hello world') ['world']* 匹配前面的字符出現(xiàn) 0 或多次 + 匹配前面的字符出現(xiàn) 1 或多次 ? 匹配前面的字符出現(xiàn) 0 或1次>>> re.findall('wo*', 'wooooooo~~w! woo') ['wooooooo', 'woo'] >>> re.findall('[A-Z][a-z]+', 'Hello World abcd') ['Hello','World'] >>> re.findall('-?[0-9]+', 'name: Jame, age: 18, money:-100') ['18', '-100']{n} # 前面的字符出現(xiàn)n 次 {m,n} # 前面的字符出現(xiàn)m到n次>>> re.findall('[0-9]{3}', '888 9999 1000000') ['888', '999', '100', '000'] >>> re.findall('[0-9]{4,10}', '888 9999 1000000') ['9999', '1000000']\d 匹配任意的數(shù)字 [0-9] \D 匹配任意的非數(shù)字>>> re.findall('\d{1,5}', 'MySql: 3306, http:80') ['3306', '80']\w 匹配普通字符 \W 匹配非普通字符普通字符是指 數(shù)字,字母,下劃線,漢字>>> re.findall('\w+', 'MySql: 3306, http:80') ['MySql', '3306', 'http', '80']\s 匹配空字符 \S 匹配非空字符空字符是指 '\r' '\n' '\t' '\v' '\f'>>> re.findall('\w+\s+\w+', 'hello world') ['hello world']\b 表示單詞的邊界 \B 表示非單詞的邊界>>> re.findall(r'\bis\b', 'This is a test') ['is']>>> s = '''SERVER = 192.168.9.102 PORT = 80 SERVERNAME = GAME1 ? REMOTE = 188.3.69.888 ''' >>> server_re = r'SERVER\s*=\s*[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' server_ip = re.findall(server_re, s) >>> server_re = r'SERVER\s*=\s*[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' >>> server_ip = re.findall(server_re, s) >>> server_ip ['SERVER = 192.168.9.102'] >>> ip_list = re.findall(r'[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}', server_ip[0]) >>> print("SERVER=", ip_list[0])
-
模塊內(nèi)的 __name__ 屬性
如果 一個模塊是主模塊,則 __name__ 綁定 '__main__'
如果 一個模塊不是主模塊,則 __name__ 綁定文件名
-
super() 函數(shù)
-
作用
顯示的調(diào)用被覆蓋的父類方法
-
示例
class A:def say_hello(self):print('Hello A') ? class B(A):def say_hello(self):print("hello B")# self.say_hello() 無限遞歸調(diào)用# 能否在此方法內(nèi)調(diào)用 A類里面的 say_hello()# 方法1# A.say_hello(self)# 方法2 ,super() 會把self 看成是A類的對象super().say_hello() ? b = B() b.say_hello() # hello B Hello A
-
多線程編程
一個進(jìn)程可以有多個執(zhí)行路徑,通常可以每個執(zhí)行路徑分配在不同的CPU 上并行執(zhí)行, 這種運行方式是多線程
文檔:threading --- 基于線程的并行 — Python 3.9.7 文檔
-
問題
如何能讓下面的兩個函數(shù)同時執(zhí)行
使用多線程
-
創(chuàng)建線程對象的方法
-
啟動線程
用 Thread對象的start() 方法來啟動線程,讓 線程中 target 綁定的函數(shù),異步執(zhí)行
t.start() -
完整示例
json
json 全稱( Javascript Object Notation) , 是一種輕量級的數(shù)據(jù)交互格式
json 是基于 Javascript 編程語言的格式
JSON 采用完全獨立于編程語言的文本格式
標(biāo)準(zhǔn)JSON的合法符號:
????????{}(大括號) ?
????????"(雙引號)
????????:(冒號)
????????,(逗號)
????????[ ](中括號)
Json 的數(shù)據(jù)類型
????????對象 object {}
????????數(shù)組 array? []
????????字符串 string? ""
????????數(shù)值 number (整數(shù)和浮點數(shù))
????????布爾值 bool? (true/false)
????????空值: null
????????字典中的兩個人
[{'name': 'weimingze','age': 35},{'name': '小王','age': 18,'score': [90, 100, 85]}, ]JSON中的兩個人
[ {"name": "weimingze","age": 35},{"name": "小王","age": 18,"score": [90, 100, 85]}, ]json 和 Python 的類型和值
Python Json dict {}object(對象) list, tuple []array數(shù)組 str "" string 字符串 int, float number 數(shù)字 True/False true/false None nulljson 模塊
內(nèi)建模塊
import jsonjson模塊的四個常用函數(shù)
函數(shù) 說明 json.dump(obj, fw) 把python 對象編碼為json 字符串并寫入文件fw中 json.dumps(obj) 把python 對象編碼為json 字符串并返回 json.load(fr) 從文件流對象fr中讀取json數(shù)據(jù)解碼后返回python對象 json.loads(json) 從json 字符串中解碼Python 對象示例見:
>>> infos = [{'name': 'weimingze','age': 35,'gender': True,'score': None},{'name': '小王','age': 18,'score': [90, 100, 85]}, ] >>> infos [{'name': 'weimingze', 'age': 35, 'gender': True, 'score': None}, {'name': '小王', 'age': 18, 'score': [90, 100, 85]}] >>> >>> import json >>> s = json.dumps(infos) # 將infos 綁定的對象轉(zhuǎn)為json 的字符串 >>> s '[{"name": "weimingze", "age": 35, "gender": true, "score": null}, {"name": "\\u5c0f\\u738b", "age": 18, "score": [90, 100, 85]}]' >>> objs = json.loads(s) # 將 json 的字符串,轉(zhuǎn)為 python 的對象 >>> objs [{'name': 'weimingze', 'age': 35, 'gender': True, 'score': None}, {'name': '小王', 'age': 18, 'score': [90, 100, 85]}] >>> type(objs) <class 'list'>API
Application Programming Interface 應(yīng)用程序接口。在Web中,API 通常指HTTP協(xié)議的接口
示例
中國天氣網(wǎng)查詢天氣情況的 API: http://www.weather.com.cn/data/sk/城市代碼.html
城市代碼:
http://www.weather.com.cn/data/sk/101010100.html # 城市代碼碼表 https://blog.csdn.net/wangqjpp/article/details/39957091requests 模塊
作用
發(fā)送HTTP 協(xié)議的請求,得到服務(wù)器響應(yīng)的數(shù)據(jù)
模擬瀏覽器的行為
安裝方法:
pip3 install requestsHTTP? 協(xié)議的請求方式:
????????GET 請求
????????????????????????相當(dāng)于查看 ,get請求可以獲取網(wǎng)站的數(shù)據(jù),請求參數(shù)通常跟在URL 的后面
????????POST請求
????????????????????????原意是創(chuàng)建或者添加, post請求通常用于提交表單或上傳文件等
https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E9%AA%B0%E5%AD%90&fenlei=256&rsv_pq=854e3d6f00038104&rsv_t=920aUYsotvE%2BTTV%2B4%2Fpf%2Fv1geYxMZTZFzMYCH5Fw%2Bg%2FZaWsk5SmRve30MRQ&rqlang=cn&rsv_enter=1&rsv_dl=ih_2&rsv_sug3=1&rsv_sug1=1&rsv_sug7=001&rsv_sug2=1&rsv_btype=i&rsp=2&rsv_sug9=es_2_1&inputT=7546&rsv_sug4=8033&rsv_sug=9示例
使用request模塊獲取網(wǎng)頁數(shù)據(jù)
>>> import requests # 向 https://www.baidu.com/s?wd=weimingze 發(fā)送GET請求得到響應(yīng) >>> r = requests.get('https://www.baidu.com/s?wd=weimingze') >>> r.text # 得到響應(yīng)內(nèi)容的文本信息 '<html>\r\n<head>\r\n\t<script>\r\n\t\tlocation.replace(location.href.replace("https://","http://"));\r\n\t</script>\r\n</head>\r\n<body>\r\n\t<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>\r\n</body>\r\n</html>' >>> r = requests.get('http://photo.qc188.com/upload/20197/31/24820/l_1_20190731145347532.jpg') >>> r.content # 響應(yīng)的字節(jié)串??使用request模塊下載文件
>>> import requests >>> r = requests.get('http://photo.qc188.com/upload/20197/31/24820/l_1_20190731145347532.jpg') >>> r.content # 響應(yīng)的字節(jié)串 # 下載圖片 >>> r = requests.get('http://photo.qc188.com/upload/20197/31/24820/l_1_20190731145347532.jpg') >>> >>> with open('benz.jpg', 'wb') as fw: ... fw.write(r.content) # 將 響應(yīng)的內(nèi)容(bytes) 寫入文件 ... 155157?用request模塊獲取 中國天氣網(wǎng)的json 數(shù)據(jù)
>>> import requests >>> url = 'http://www.weather.com.cn/data/sk/101010100.html' >>> r = requests.get(url) >>> r.content # 返回字節(jié)串 b'{"weatherinfo":{"city":"\xe5\x8c\x97\xe4\xba\xac","cityid":"101010100","temp":"27.9","WD":"\xe5\x8d\x97\xe9\xa3\x8e","WS":"\xe5\xb0\x8f\xe4\xba\x8e3\xe7\xba\xa7","SD":"28%","AP":"1002hPa","njd":"\xe6\x9a\x82\xe6\x97\xa0\xe5\xae\x9e\xe5\x86\xb5","WSE":"<3","time":"17:55","sm":"2.1","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB"}}' >>> r.json() # 將字節(jié)串,轉(zhuǎn)化為python 的對象,相當(dāng)于 json.loads(r.content.decode()) {'weatherinfo': {'city': '?\x8c\x97?o?', 'cityid': '101010100', 'temp': '27.9', 'WD': '?\x8d\x97é£\x8e', 'WS': '?°\x8f?o\x8e3?o§', 'SD': '28%', 'AP': '1002hPa', 'njd': '?\x9a\x82?\x97\xa0??\x9e?\x86μ', 'WSE': '<3', 'time': '17:55', 'sm': '2.1', 'isRadar': '1', 'Radar': 'JC_RADAR_AZ9010_JB'}} >>> r.encoding # 查看當(dāng)前的字符編碼 'ISO-8859-1' >>> r.encoding = 'utf8' # 將編碼改為 UTF-8 >>> r.json() {'weatherinfo': {'city': '北京', 'cityid': '101010100', 'temp': '27.9', 'WD': '南風(fēng)', 'WS': '小于3級', 'SD': '28%', 'AP': '1002hPa', 'njd': '暫無實況', 'WSE': '<3', 'time': '17:55', 'sm': '2.1', 'isRadar': '1', 'Radar': 'JC_RADAR_AZ9010_JB'}}requests.get ()為連接添加查詢字符串使用params 字典完成
i
mport requests ? url = 'https://www.sogou.com/web' # https://www.sogou.com/web?query=linux s = input('請輸入查詢的內(nèi)容:') params = {'query': s} r = requests.get(url, params=params) # 發(fā)出get請求,傳入 ?query=s 查詢字符串# 相當(dāng)于請求:https://www.sogou.com/web?query=linux with open('sogou_' + s + '.html', 'wb') as fw:fw.write(r.content) # 把 r.content 字節(jié)串寫入文件 ? ? # https://www.sogou.com/web?query=linux s = input('請輸入查詢的內(nèi)容:') params = {'query': s} r = requests.get(url, params=params) # 發(fā)出get請求,傳入 ?query=s 查詢字符串# 相當(dāng)于請求:https://www.sogou.com/web?query=linux with open('sogou_' + s + '.html', 'wb') as fw:fw.write(r.content) # 把 r.content 字節(jié)串寫入文件request 可以通過 headers 傳遞請求頭
url = 'https://www.sogou.com/web' params = {'query': 'linux'} headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36' } # 帶上 'User-Agent' 請求頭,把自己偽裝成瀏覽者 r = requests.get(url, params=params, headers=headers) r.text # 返回網(wǎng)頁的內(nèi)容完整代碼:
import requests ? url = 'https://www.sogou.com/web' # https://www.sogou.com/web?query=linux s = input('請輸入查詢的內(nèi)容:') params = {'query': s} headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36' } # 帶上 'User-Agent' 請求頭,把自己偽裝成瀏覽者 ? r = requests.get(url, params=params, headers=headers) # 發(fā)出get請求,傳入 ?query=s 查詢字符串# 相當(dāng)于請求:https://www.sogou.com/web?query=linux with open('sogou_' + s + '.html', 'wb') as fw:fw.write(r.content) # 把 r.content 字節(jié)串寫入文件 ?總結(jié)
- 上一篇: 安装python 的包控制mysql的P
- 下一篇: Python 的电子邮件编程