日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python进阶

發布時間:2025/3/21 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python进阶 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

基礎必會

文字的編碼

函數定義 function

def 語句

函數的調用

return 語句

函數的調用傳參

局部變量和全局變量

global 語句

lambda 表達式(又稱匿名函數)

id(x) 函數

is / is not 運算符

None 對象

函數式編程

python 中的常用高階函數

python 中常用的函數

map函數

filter 函數

sorted 函數

模塊

import 語句

python 的第三方模塊

random 模塊

time 模塊

datetime 模塊

異常

try 語句

raise 語句

文件

with 語句

sys模塊

os 模塊

os.path 模塊

shutil 模塊

生成器

生成器函數

生成器表達式

面向對象編程 Object-Oriented Programming(OOP)

class 語句

實例方法(instance method)

初始化方法(也叫構造器方法)

繼承(inheritance)和派生(derived)

三個魔法方法

正則表達式 (regular express)

多線程編程


基礎必會

- 表達式

? ????????- 字面值

?????????? ? ? - 字符串 str
?????????? ? ? - 數字
??? ? ????????????????? - 整數 int
???????????????????? ?? - 浮點數 float
???????????? ???????? ?? - 布爾類型bool
?????????? ? ? - 容器
????? ????????????????- 列表 list
????????????????????? - 元組 tuple
????????????????????? - 字典 dict
????????????????????? - 集合 set 和 固定集合 frozenset
????????????????????? - 字節串 bytes 和 字節數組bytearray(后面在學)

????????? - 運算符

?????????? ? ?? - 算術運算符

+ - * / // % **

?????????? ? ?? - 比較運算符

< > <= >= == !=

??? ? ? ? ? ?? - 布爾運算符

and or not L = [1, 2, 3, 4, 5, 6]print(L[2])print(L[2:5])

??? ??????????? - 條件表達式

'及格' 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])

? - 函數

??????????? - 構造函數(函數名和類名相同的函數)

str() ---> '' int() --> 0 float() bool() list() tuple() dict()set() frozenset()

??????????? - 函數

print() input() len(x) max(x) min(x)sum(x) range() type(x)


????? ```

- 語句

????????? - 簡單語句
??? ????????????????- 表達式語句
??????????????????? - 賦值語句
??????????????????? - del 語句
??????????????????? - pass 語句
??????????????????? - break 語句
??????????????????? - contiue 語句
? - 復合語句
??????????????????? - if 語句
??? ????????????????- while 語句
??? ????????????????- for 語句

> 所有的容器類都是可迭代對象,可以用 for 語句遍歷其中的全部內容

文字的編碼

Python3的字符串內部存儲的是文字的UNICODE編碼

  • 字符串中存儲的是什么?

    • 是一個圖片(文字)對應的編碼(code)

  • 字符相關的函數

    函數

    說明

    chr(x)

    根據x的UNICODE編碼值得到對應的字符

    ord(x)

    可以返回一個 字符的 UNICODE 編碼值

    英文的編碼值 詳見 ASCII 編碼

    man ascii

    ord(x) 函數的返回值如果是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的交互模式下打印全世界的文字
for ch in range(65536):print(chr(ch), end='')

函數定義 function

  • 什么是函數

    • 函數是可以重復執行的語句塊,可以重復調用

  • 作用

    用于封裝語句塊, 提高代碼的重用性。

函數是面向過程編程的最小單位

def 語句

  • 作用

    用來定義( 創建)函數

語法

def 函數名(形式參數列表):語句塊
  • 說明
  • 函數的名字就是語句塊的名稱

  • 函數名必須是標識符

  • 函數名是一個變量,不要輕易對其賦值

  • 函數有自己的名字空間,在函數外部不可以訪問函數內部的變量,在函數內部可以訪問函數外部的變量,但不能輕易對其改變

  • 函數的形參列表如果不需要傳入參數,形式參數列表可以為空

    • 示例

      # 定義一個函數,用 say_hello 變量綁定 def say_hello():print("hello world!")print("hello tarena!")print("hello everyone!")# 定義一個函數,傳入兩個參數,讓這個函數把最大的值打印到終端 def mymax(a, b):if a > b:print("最大值是", a)else:print("最大值是", b)

    函數的調用

    • 語法

      函數名(實際調用傳遞參數)

    • 說明

      • 函數調用是一個表達式

      • 如果函數內沒有return 語句,函數執行完畢后返回 None 對象

    • 示例

      # 調用 say_hello() # 調用一次 say_hello() # 調用第二次 ? # 調用 mymax(100, 200) mymax(999, 1) mymax('abc', 'cba')

    return 語句

    • 語法

      return [表達式]

      注: [] 代表 內部的內容可以省略

    • 作用

      用于函數的內部,結束當前函數的執行,返回到調用此函數的地方,同時返回一個對象的引用關系

    • 說明

    • return 語句后面的表達式可以省略,省略后相當于 return None

    • 如果函數內部沒有 return 語句, 則函數執行完畢后返回None, 相當于在最后一條語句后有一條return None

    • 示例

      def say_hello():print("hello aaa")print("hello bbb")return 1 + 2print("hello ccc") ? r = say_hello() print(r) # 3

    函數的調用傳參

    • 位置傳參

      實際參數傳遞時,實參和形參 按位置來依次對應

    • 關鍵字傳參

      實際參數傳遞時,實參和形參 按名稱依次對應

    注: 位置傳參要先于關鍵字傳參

    示例

    def myfun1(a, b, c):print('a=', a)print('b=', b)print('c=', c) # 位置傳參 myfun1(1, 2, 3) # 關鍵字傳參 myfun1(c=33, a=11, b=22) # 位置傳參要先于關鍵字傳參 myfun1(111, c=333, b=222) # 正確

    函數的形式參數定義方法

    函數的缺省參數

    語法

    def 函數名(形參名1=默認實參1, 形參名2=默認實參2, ... ):
    ? ? 語句塊

    說明

    缺省參數必須自右向左依次存在(即,如果一個參數有缺省參數,則其右側的所有參數都必須有缺省參數)

    示例

    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)

    • 命名關鍵字形參

    • 雙星號字典形參(**kwargs)

    1) 位置形參

    • 語法:

      def 函數名(形參名1, 形參名2, ...):pass

    2) 星號元組形參

    • 語法

      def 函數名(*元組形參名):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)命名關鍵字形參

    • 語法

      def 函數名(*, 命名關鍵字形參1, 命名關鍵字形參2, ...):pass # 或者 def 函數名(*args, 命名關鍵字形參1, 命名關鍵字形參2, ...):pass

    • 作用

      強制,所有的參數都必須用關鍵字傳參

    • 示例

      def myfunc4(a, b,*args, c, d):print(a, b, c, d) ? myfunc4(1, 2, d=4, c=3) # 正確,c,d 必須關鍵字傳參 myfunc4(1, 2, 3, 4) # 錯誤

    4)雙星號字典形參

    • 語法

      def 函數名(**字典形參名):pass

    • 作用

      收集多余的關鍵字傳參

      字典形參名 最多有一個,

      字典形參名 一般命名為 kwargs

    示例

    def myfunc5(**kwargs):print(kwargs) ? # {'name': 'tarena', 'age': 18}-->kwargs myfunc5(name='tarena', age=18)

    函數的形參定義方法說明

    • 位置形參,星號元組形參,命名關鍵字參數,雙星號字典形參,缺省參數可以混合使用。

    • 函數的形參定義自左至右的順序為:位置形參,星號元組形參,命名關鍵字參數,雙星號字典形參

    示例:

    def fn(a, b, *args, c, d, **kwargs):pass ? fn(100, 200, 300, 400, c='C', e='E', d='D')

    局部變量和全局變量

    • 局部變量

      • 定義在函數內部的變量稱為局部變量(函數的形參也是局部變量)

      • 局部變量只能在函數的內部使用

      • 局部變量在函數調用時才能夠被創建,在函數調用之后會自動銷毀

    • 全局變量

      • 定義在函數外部,模塊內部的變量稱為全局變量

      • 全局變量, 所有的函數都可以直接訪問(取值,但函數內部不能直接將其賦值改變)

    • 局部變量示例

    >>> def fn(a, b): ... c= 100 ... print(a, b, c) # a, b, c三個都是局部變量 >>> fn(1, 2) >>> print(a, b, c) # 報錯, 因為a,b,c 在調用后就銷毀了
    • 全局變量示例

    a = 100 # 全局變量 def fx(b, c): # b,c 局部變量d = 400 # d 局部變量print(a, b, c, d) fx(200, 300) print(a) # 100 print(b) # 報錯, 因為此時 b 不存在了

    全局變量示例2

    a = 100 # 全局變量 def fx(b):a = 666 # 創建局部變量,不是改變全局變量c = 300print(a, b, c) # 優先訪問局部變量fx(200) # 666 200 300 print(a) # 100 ?

    global 語句

    • 問題

    # 如何用一個變量來記錄一個函數調用的次數 count = 0 ? def hello(name):print('hello', name)count += 1 # 等同于 count = count + 1 # 如何讓 此語句能改變全局變量而不是創建局部變量 ? hello('小張') hello('小李') ? print('您共調用hello函數', count, '次') # 2 次
    • 作用

      告訴python 的解釋執行器, global 語句聲明的一個或多個變量, 這些變量是全局變量

    • 語法

      global 變量名1, 變量名2, ....

    示例

    # 如何用一個變量來記錄一個函數調用的次數 count = 0 ? def hello(name):global count # 聲明 global 是全局變量print('hello', name)count += 1 # 等同于 count = count + 1 ? hello('小張') hello('小李') hello('小魏') ? print('您共調用hello函數', count, '次') # 3 次

    global 說明

    • 全局變量如果要在函數內部被賦值,則必須經過全局聲明 global

    • 默認全局變量在函數內部可以使用,但只能取值,不能賦值

    • 不能先聲明為局部變量,再用 global 聲明為全局變量,此做法不符合語法規則

    • 函數的形參已經時局部變量,不能用 global 聲明為全局變量

    錯誤示例

    a = 100b = 200def fa(a):b = 20 # SyntaxError: name 'b' is assigned to before global declarationglobal bb = 222

    lambda 表達式(又稱匿名函數)

    • 語法

      lambda [函數的參數列表]: 表達式

    • 作用

      • 創建一個匿名函數對象

      • 同 def 類似,但不提供函數名

    • 說明

      lambda 表達式 的創建函數只能包含一個表達式

    • 示例

      def myadd(x, y):return x + y ? print('1 + 2 =', myadd(1, 2)) # 3 ? # myadd 函數可以改寫成 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) 函數

    • 作用

      返回一個對象在內存中的地址

    • 示例

    >>> L = list(range(10)) >>> id(L) 140416266741832 >>> L2 = list(range(10)) >>> id(L2) 140416266741896 >>> L [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> L2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> L is L2 False

    is / is not 運算符

    • is 作用

      判斷兩個對象的id ,如果為同一個地址,返回True, 否則返回False

      is not 返回值與 is 相反

    • 示例

    >>> weimingze = "小眀" >>> weilaoshi = weimingze # 兩個變量同時綁定同一個字符串"魏明擇" >>> >>> weilaoshi is weimingze # id(weilaoshi) == id(weimingze) 返回True True >>> laowei = "我是" + "小明" # 創建一個新的字符串"我是小明" >>> >>> weimingze is laowei # id(weiweimingze) == id(laowei) # 返回False False

    None 對象

    python 內部只有一個None 對象

    通常判斷一個變量是否綁定None,用 is 運算符(很少用 == 運算符)

    函數式編程

    用一系列函數來解決問題

    求 1 + 2 + 3 + 4 + ..... 99 + 100 的和 # 用函數式編程 print(sum(range(1, 101)))

    python 中的常用高階函數

    高階函數是指,函數的參數可以傳入函數

    >>> 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> 10

    python 中常用的函數

    • map 函數

    • filter 函數

    • sorted 函數

    函數說明
    map(func, 可迭代對象1, ...)返回一個可迭代對象, 此可迭代對象的每個數據用函數func 處理后返回
    filter(func, 可迭代對象)返回一個可迭代對象, 此可迭代對象的數據用func 函數進行篩選后過濾
    sorted(可迭代對象, key=None,reverse=False)返回一個列表, 所有的可迭代對象用key 的返回值進行排序

    map函數

    >>> def power2(x): ... return x ** 2 ... >>> L = [8, 5, 1, 3] # 求出 列表內 平方并打印 >>> for x in map(power2, L): # 把 power2 函數和 列表 L 交給 map 函數 ... print(x) ... 64 25 1 9

    filter 函數

    >>> 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] >>> # 把列表里所有的奇數取出來 >>> L2 = list(filter(is_odd, L)) >>> L2 [5, 1, 9, 7]

    sorted 函數

    >>> L = [5, -2, 4, -3, 1] >>> sorted(L) # 默認是升序排序 [-3, -2, 1, 4, 5] >>> sorted(L, reverse=True) # 降序排序 [5, 4, 1, -2, -3] >>> abs(-2) # abs 用來返回一個 數的絕對值 2 >>> abs(2) 2 >>> sorted(L, key=abs) # [1, -2, -3, 4, 5] # 用每個數據 abs 的返回值作為排序依據進行排序 [1, -2, -3, 4, 5]

    模塊

    一個.py 文件就是一個模塊

    模塊是含有一些列數據,函數,類等的程序

    • 作用

      把相關功能的函數等放在一起有利于管理,有利于多人合作開發

    • 模塊的分類

      模塊名如果要給別的程序導入,則模塊名必須是 標識符

    • 內置模塊(在python3 程序內部,可以直接使用)

    • 標準庫模塊(在python3 安裝完后就可以使用的 )

    • 第三方模塊(需要下載安裝后才能使用)

    • 自定義模塊(用戶自己編寫)

    ????????? 模塊名如果要給別的程序導入,則模塊名必須是 標識符

    • 實例

    # file: mymod.py ''' 小張寫了一個模塊,內部有兩個函數,兩個字符串 ... 此處省略 200字 '''name1 = 'audi' name2 = 'tesla'def mysum(n):'''此函數用來求和by weimingze'''print("正在計算, 1 + 2 + 3 + .... + n的和 ")def get_name():return "tarena"

    調用模塊

    # file: test_mod.py # 小李寫的程序,小李想調用 小張寫的 mymod.py 里的兩個函數和兩個字符串# 用import 語句導入模塊 import mymodprint(mymod.name1) # Audi print(mymod.name2) # teslamymod.mysum(100) # 調用 mymod 模塊里的 mysum 函數 print(mymod.get_name()) # 'tarena'

    import 語句

    導入

    • 語法

    import 模塊名 [as 模塊新名字1]

    導入一個模塊到當前程序

    from 模塊名 import 模塊屬性名 [as 屬性新名]

    導入一個模塊內部的部分屬性到當前程序

    from 模塊名 import *

    導入一個模塊內部的全部屬性到當前程序

    示例

    import mymod mymod.mysum(10) # 要加模塊名 ? from mymod import get_name print(get_name()) # 調用get_name 時不需要加 "模塊名." ? from mymod import * print(get_name()) print(name2)
    • 模塊的內部屬性
    __file__ 綁定 模塊的路徑 __name__ 綁定模塊的名稱如果是主模塊(首先啟動的模塊)則綁定 '__main__'如果不是主模塊則 綁定 xxx.py 中的 xxx 這個模塊名

    python 的第三方模塊

    PyPI · The Python Package IndexThe Python Package Index (PyPI) is a repository of software for the Python programming language.https://pypi.org/

    random 模塊

    生成隨機數

    文檔位置: https://docs.python.org/zh-cn/3/library/random.html

    >>> import random >>> random.randint(1, 6) # random.randint(a,b) 生產 a~b的隨機整數 3 >>> random.randint(1, 6) 4 >>> random.random() # random.random 生成包含0 但不包含1 的浮點數 0.5884109388439075 >>> random.choice("ABCD") # 從一個序列中,隨機返回一個元素 '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 --- 時間的訪問和轉換 — Python 3.9.7 文檔https://docs.python.org/zh-cn/3/library/time.html

    時間戳:從 1970年1月1日 0:0:0 UTC 時間 開始計時到現在的秒數

    UTC 時間 : 世界協調時間

    struct_time 用 含有9個元素的元組來表示時間

    >>> import time >>> time.time() # 返回當前時間的時間戳 1617117219.0382686 >>> time.ctime() #返回當前的UTC 時間的字符串 'Tue Mar 30 23:14:48 2021' >>> t1 = time.localtime() # 返回當前的本地時間元組 >>> 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'# 用時間元組來創建一個自定義的時間 >>> 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() # 返回當前的時間 >>> 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() # 得到當前時間 >>> t1 datetime.datetime(2021, 3, 30, 23, 39, 26, 863109) >>> t1 + delta_time # 計算 未來時間

    異常

    • 用作

    信號通知,通知上層調用者有錯誤產生需要處理

    try 語句

    • 語法

    try:可能發生異常的語句塊 except 錯誤類型1 [as 變量名1]:異常處理語句塊1 except 錯誤類型2 [as 變量名2]:異常處理語句塊2 ... except 錯誤類型n [as 變量名n]:異常處理語句塊n except:異常處理語句塊other else:未發生異常的語句 finally:最終的處理語句
    • 作用

      嘗試捕獲異常,得到異常通知,將程序由異常狀態變為正常狀態

    • 說明

      except 子句可以有 1個或多個

      except: 不給錯誤類型,可以匹配全部的錯誤類型

      else 子句里的語句會在 沒有錯誤發生時執行,當處于異常時不執行

      finally 子句里的語句,無論何時都執行

    • 示例

    try:x = int(input("請輸入一個整數:"))print('x=', x) except ValueError:print('您的輸入不能轉成整數')print("程序結束")

    raise 語句

    問題

    # 寫一個函數, get_score 函數,讀取用戶輸入的整數成績, # 成績的正常值是0~100 之間, 要求, 如果不在0~100 之間 # 報 ValueError類型的錯誤 def get_score():x = int(input('請輸入成績:'))if 0 <= x <= 100:return xraise ValueError

    ?? 語法

    raise 異常類型 或 raise 異常對象
    • 作用

      • 拋出一個錯誤,讓程序進入異常狀態

      • 發送錯誤通知給調用者

    • 示例:

    # 寫一個函數, get_score 函數,讀取用戶輸入的整數成績, # 成績的正常值是0~100 之間, 要求, 如果不在0~100 之間 # 報 ValueError類型的錯誤 def get_score():x = int(input('請輸入成績:'))if 0 <= x <= 100:return x# raise ValueErrorraise ValueError('用戶輸入的成績不在 0~100 之間')try:score = get_score()print(score) except ValueError as err:print("成績輸入有誤 err=", err)
    • ?異常類型的可選種類

    詳見:

    >>> help(__builtins__)

    ?字節串 bytes 和字節數組 bytearray

    1 一個字節(byte)是8個二進制的位 (bit)

    1個byte的取值范圍是 0 ~ 255

    bytes 不可變

    bytearray 可變

    字節串的字面值

    >>> 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]) # 字節數組的創建必須使用bytearray函數
    • 字節串的運算

      字節串是序列,運算規則同元組一樣

      + += * *= > >= < <= == != 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 的區別

      bytes 存儲的字節 (0~255 之間的數)

      str 存儲的是字符的編碼

    • bytes 與 str 轉換?

      編碼(encode) str -------------> bytesb = s.encode(encoding='utf-8')解碼(decode) bytes -----------> strs = b.decode(encoding='utf-8')

      示例

      >>> s = 'hello 小張' >>> >>> b = s.encode() # 將字符串編碼成為字節串 >>> b b'hello \xe5\xb0\x8f\xe5\xbc\xa0' # 在utf-8 編碼中,1個漢字通常用3個字節進行編碼 >>> len(b) 12 >>> s2 = b.decode() # 將字節串解碼成為字符串 >>> s2 'hello 小張'

    文件

    • 什么是文件

      文件通常用來存儲以字節為單位的數據

    • 文件的操作流程

    • 打開文件

    • 讀/寫文件

    • 關閉文件

    • 打開文件用open 函數

      open(file, mode='rt') # open 函數返回文件流對象 # 打開失敗回收到異常通知 # mode 的缺省值的 'rt' myfile = open('/etc/passwd', 'rt') s = myfile.read() # 用 myfile 綁定的文件流對象的read() 方法,得到 文件內部的數據 print(s) myfile.close() # 關閉文件
      • 示例

    • 兩種操作文件的模式

    • 直接用 字節串操作文件(內部可以存儲文字,也可以存儲圖片等信息)

      ????????打開模式 mode = 'b' # b是binary

    • 用字符串操作文本文件(內部存儲的都是文字)

      打開模式 mode='t' # t 是text 的首字母(默認為't')

    • 示例見

      f = open('mynote.txt', 'rt') # 'r 代表讀 ? s = f.read() # 在't' 模式下 ,read 返回字符串 print(s) ? f.close() # 關閉 f = open('mynote.txt', 'rb') # 'r' 代表讀 'b' 代表以二進制方式操作 ? b = f.read() # 在't' 模式下 ,read 返回字節串 print(b) ? s = b.decode() # 將字節串轉成了字符串 print(s) f.close() # 關閉
    • 用字符串操作文件

    • 用字節串操作文件

    • 文件的打開模式 mode

      模式

      說明

      't'

      以文本(字符串) 的模式操作文件(默認)

      'b'

      以二進制(字節串) 的模式操作文件

    • 文件的打開方式 mode

      方式

      說明

      'r'

      讀取文件(默認)

      'w'

      寫和覆蓋寫文件(如果文件不存在則創建文件 )

      'a'

      寫并且追加文件內容(如果文件不存在則創建文件)

      python 文件流對象的方法

      方法名

      說明

      F.close()

      關閉文件

      讀取文件的方法

      F.read(size=-1)

      讀取文件(不給出size 參數過讀取全部)

      F.readline()

      讀取文件中的一行,以'\n' 作為行分隔符

      F.readlines()

      讀取文件中的全部,以'\n' 作為行分隔符, 返回行的列表

      寫文件的方法

      F.write(x)

      寫文件: 'b'模式 x 必須是字節串, 't'模式x必須是字符串, 如果文件不存在則新建文件

    mynote.txt 文件中的內容

    ????????我是小眀
    ????????我在 tarena

    讀數據

    >>> 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() # 當到達文件尾部,返回空 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() # 取出所有的行數據,返回列表 ['我是小眀\n', '我在 tarena\n'] >>> f.close()

    ?寫數據

    >>> f = open('python.log', 'w') # 以字符串方式寫文件, 如果文件文件不存在回新建一個文件 >>> f.write('該吃飯了') 4 >>> f.write('!') 1 >>> f.write('\n') # 寫一個換行 1 >>> f.write('下課') 2 >>> f.close()
    • 移動文件的讀寫指針seek 方法

      F.seek(偏移量, whence=相對位置)
      ? ? ?? 偏移量(整數)
      ? ? ? ? ? ?? 大于0 向文件末尾方向
      ? ? ? ? ? ?? 小于0 向文件頭方向
      ? ? ?? 相對位置:
      ? ? ? ? ? ?? 0 代表從文件頭開始偏移
      ? ? ? ? ? ?? 1 代表從當前的讀寫位置開始偏移
      ? ? ? ? ? ?? 2 代表從文件末尾開始偏移?

      • 在讀寫二進制模式打開的文件,在不關閉文件的情況下, 可以使用seek 方法移動文件的讀寫指針

    • tell() 方法,返回文件的讀寫指針的位置

      F.tell() # 返回整數
    • 示例

      mynote3.txt 的內容

    ????????????????1234567890ABCDE

    • 示例程序

      myfile = open('mynote2.txt', 'rb') ? print('剛打開文件時,文件指針的位置是:', myfile.tell()) # 0 b = myfile.read(2) print(b) # b'12' print('讀取兩個字節后,文件指針的位置是:', myfile.tell()) # 2 # 讀取 67890 這個5個字節 # myfile.seek(5, 0) # 0 開始位置,向后移動5個字節 # myfile.seek(3, 1) # 1 當前位置,向后移動3個字節 myfile.seek(-10, 2) # 2 文件末尾位置,向前移動10個字節 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 語句結束,則文件會自動關閉

    • 語法

      with 表達式1 as 變量1[, 表達式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 的位置參數 $0 $1 $2

    #! /usr/bin/python3 ? # file 04_myprog.py import sys print(sys.argv) # ['./04_myprog', '/root', 'hello']# 如下是shell 中運行的內容 $ chmod +x myprog.py $ ./myprog /root hello # $0='./04_myprog' $1='/root' $2='hello'

    os 模塊

    • python 上獲取命令行參數

      • 對操作系統的訪問大多使用 python 中的os 模塊

    官方文檔: os --- 多種操作系統接口 — Python 3.9.7 文檔

    >>> import os >>> os.getcwd() # 返回當前的工作路徑,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'

    >>> s = ' \n \t hello world \n' >>> s.strip() # 去掉左右兩側的空白字符 'hello world' >>> s.lstrip() # 去掉左側的空白字符 'hello world \n' >>> s.rstrip() # 去掉右側的空白字符 ' \n \t hello world'

    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() 函數

    遍歷文件夾[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) ... # (路徑 , 路徑內的所有文件夾列表 , 路徑內的所有文件列表) ('/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') # 改屬主屬組

    生成器

    生成器是在程序運行時生成數據,與容器不同,它通常不會在內存中保留大量的數據,而是現用現生成。

    生成器可以用算法動態的生成數據

    生成器有兩種

  • 生成器函數

  • 生成器表達式

  • 生成器函數

    含有yield 語句的函數 是生成器函數,此函數調用回返回一個生成器對象,生成器也是可迭代對象

    yield 語句的語法

    yield 表達式

    生成器函數示例:

    # 定義一個生成器函數, 有 yield 的函數調用后回返回生成器對象 def myrange(stop):i = 0while i < stop:yield i # 為 遍歷次生產器的for 語句提供數據i += 1 ? for x in myrange(5):print('x=', x)

    生成器表達式

    • 語法:

    ( 表達式 for 變量 in 可迭代對象 [if 真值表達式])

    ????????[] 內容代表可以省略

    • 作用

      用推導式的形式創建一個生成器

    • 示例

    >>> [x ** 2 for x in range(1, 5)] # 列表解析(列表推導式) [1, 4, 9, 16] >>> >>> (x ** 2 for x in range(1, 5)) # 生成器表達式 <generator object <genexpr> at 0x7f41dcd30a40> >>> for y in (x ** 2 for x in range(1, 5)): ... print(y) ... 1 4 9 16

    生成器表達式

    • 語法:

    ( 表達式 for 變量 in 可迭代對象 [if 真值表達式])

    [] 內容代表可以省略

    • 作用

      用推導式的形式創建一個生成器

    • 示例

    >>> [x ** 2 for x in range(1, 5)] # 列表解析(列表推導式) [1, 4, 9, 16] >>> (x ** 2 for x in range(1, 5)) # 生成器表達式 <generator object <genexpr> at 0x7f41dcd30a40> >>> for y in (x ** 2 for x in range(1, 5)): ... print(y) ... 1 4 9 16 ?

    面向對象編程 Object-Oriented Programming(OOP)

    程序 = 數據 + 算法(操作數據的方式可方法)

    • 數據

      數字

      字符串

      容器

    • 算法

      函數

    • 模塊

      數據 + 函數 + 類

    函數式編程, 數據和行為(函數) 是分開的

    Person1 = {'name': 'weimingze','age': 35 } Person2 = {'name': 'xiaozhang','age': 18 } def update_age(person):person['age'] += 1 ? update_age(Person1) update_age(Person2)
    • 對象

      是指現實世界的物體

    • 什么是面向對象

      把一切看成對象(實例), 用各個對象的關系來描述事物

    • 對象的特征

      • 對象有很多屬性(名詞,形容詞,...), 數據

        • 姓名, 年齡,性別....

      • 對象有很多行為(動作,動詞), 方法(屬于某個對象的函數)

        • 學習,吃飯, 踢球,工作

    • 擁有相同屬性和行為的對象分為一組,即為一個類

    ?
    ? ?? /-------> BYD? E6(京A.88888) ?? 實例(也叫對象)
    車(類)
    ? ?? \-------> BWM? X5(京B.66666) ?? 實例(也叫對象)
    ?
    ? ? ? /-------> 100 ?? (對象)
    int(類)
    ? ? ? \-------> 200 ?? (對象)
    ? ? ?? /---> True
    bool(類)
    ? ? ?? \---> False

    int float dict list tuple

    class 語句

    • 語法

      class 類名 (繼承列表):語句

    • 作用

      創建一個類

      類用于描述對象的行為和屬性

      類可以創建一個或多個對象

    • 示例

      class Car:pass

    構造函數

    • 調用表達式

      類名(實參)

    • 作用

      創建這個類的實例對象

    • 示例

      car1 = Car() # 創建 第一個Car 類型的對象car2 = Car() # 創建 另一個Car 類型的對象#L1 = list() 創建 第一個 list 類型的列表L2 = list() 創建 另一個 list 類型的列表

    實例屬性

    每個對象可以有自己的變量,稱之為實例屬性

    屬性的使用語法

    ????????實例.屬性名

    遵循變量的賦值規則

    • 示例

    car1.color = '紅色' # 顏色 為 car1 創建屬性 color 綁定 '紅色' car1.brand = '比亞迪' # brand 品牌 car1.plate = '京A.88888' # 牌照 ? car2.color = '白色' car2.brand = '寶馬' car2.plate = '京B.66666'

    刪除屬性用 del 語句

    # 如 del car1.color

    實例方法(instance method)

    • 定義的語法

      class 類名[繼承列表]:def 實例方法名(self, 形參名1, 形參名2, 形參名3, ....):語句塊

    • 作用

      用于描述一個對象的行為,讓此類型的全部對象都有相同的行為

    • 說明

      實例方法的實質是一個函數,他是定義在類內的函數

      實例方法至少有一個形參,第一個形參綁定調用這個方法的實例,一般命名為 self

    • 調用語法

      實例.實例方法名(實參列表)
      # 或
      類名.實例方法名(實例,實參列表)

    • 示例

      # 類的定義 class Car:# 實例object方法def run(self, km):print(self.color, '的', self.brand, self.plate, '正在以', km, '公里/小時的速度行使') ? .... 此處省略了創建對象的和添加屬性的代碼 ? # 調用方法 car1.run(110) car2.run(180) # 方法2 # Car.run(car1, 120) # Car.run(car2, 160)

    初始化方法(也叫構造器方法)

    • 作用

      對新創建的對象添加屬性

    • 語法格式

      class 類名:def __init__(self [,形參列表]):語句塊
    • 說明

    • 初始化方法名 必須為 __init__

    • 初始化方法會在類創建實例時自動調用,且將實例對象通過第一個參數傳入 __init__方法

    • 構造函數的實參將通過__init__的參數列表傳入到__init__ 方法中

    • 初始化方法內如果需要用return 語句返回,則必須返回None

    • 練習

    # 寫一個小狗類 class Dog:def __init__(self, ...):passdog1 = Dog('白色', '藏獒') dog1.eat(1, '羊肉') # 白色 的 藏獒 吃了 1 斤 羊肉, dog2 = Dog('灰色', '導盲犬') dog2.eat(2, '狗糧') # 灰色 的 導盲犬 吃了 2 斤 狗糧, ? dog1.eat(2, '牛肉') # 白色 的 藏獒 吃了 2 斤 牛肉, dog1.info() # 白色 的 藏獒 吃過 ['羊肉', '牛肉'] dog2.info() # 灰色 的 導盲犬 吃過 ['狗糧']

    答案

    # 寫一個小狗類 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('灰色', '導盲犬') dog2.eat(2, '狗糧') # 灰色 的 導盲犬 吃了 2 斤 狗糧, ? dog1.eat(2, '牛肉') # 白色 的 藏獒 吃了 2 斤 牛肉, dog1.info() # 白色 的 藏獒 吃過 ['羊肉', '牛肉'] dog2.info() # 灰色 的 導盲犬 吃過 ['狗糧'] ?

    繼承(inheritance)和派生(derived)

    繼承是從已經有的類中派生出新類,新類具有父類的屬性和行為,并能擴展新的能力

    派生是從已經有的類中衍生出新類,在新類的基礎上可以添加屬性和行為

    • 作用

    • 用繼承派生機制,可以將一些共有的功能加在基類(也叫父類)中,實現代碼共享

    • 在不改變基類代碼的基礎上,改變原有的功能。

    • 語法

      class 類名(基類名):語句塊
    • 示例1

      ?# 繼承的示例 # Human 類派生出 Student 類 ? class Human: # 定義一個人類def say(self, what):'說'print("說:", what) ?def walk(self, distance):'走路'print('走了', distance, '公里') ? ? class Student(Human): # 定義一個學生了def study(self, subject):print('學習', 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('面向對象') ? t1 = Teacher() t1.teach('Python') t1.say('今天周四') t1.walk(6)
    • 顯式調用基類的初始化方法 super 函數

      super() # 返回父類對象

    覆蓋

    覆蓋是指在有繼承關系的類中,子類中實現了與父類中同名的方法,在子類實例調用該方法時,實際調用的是子類中的覆蓋版本,這種現象叫覆蓋

    組合

    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)

    多繼承

    多繼承是指一個子類由兩個或兩個以上的父類(基類)

    • 語法

    class 類名(基類1,基類2, ...):語句塊
    • 示例

    class Plane:def fly(self, height):print("飛機以海拔", height,'米的高度飛行')class Car:def run(self, speed):print("汽車以", speed, '公里/小時的速度行駛')class PlaneCar(Plane, Car):pass ? pc = PlaneCar() pc.run(120) pc.fly(10000)

    多繼承可能會帶來程序運行的不確定性,謹慎使用

    >>> 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
    • 常用魔法方法, 在類定義中,很多以 雙下劃線開頭和結尾的方法被稱為魔法方法,是python 定義特殊功能的方法,

      用dir函數可以查看對象的全部方法

      >>> dir(list) ...

    三個魔法方法

    class Book:
    ? ?def __init__(self, title, author):
    ? ? ? ?'''初始化方法,在實例化時自動調用'''
    ? ? ? ?self.title = title ?# 標題
    ? ? ? ?self.author = author ?# 作者
    ?
    ? ?def __str__(self): ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
    ? ? ? ?'''將對象轉成字符的時候會調用'''
    ? ? ? ?return "《%s》" % self.title
    ?
    ? ?def __call__(self):
    ? ? ? ?'''將實例當成函數來調用,執行此函數內的代碼'''
    ? ? ? ?print('《%s》是%s 編著的' %(self.title, self.author) )
    ?
    if __name__ == '__main__':
    ? ?b1 = Book('Linux 運維之道', '丁明一')
    ? ?print(b1)
    ? ?b1()
    ?

    正則表達式 (regular express)

    正則表達式是表示 文字的排列規則的一個字符串, 使用來匹配文字的匹配模式.

    • 作用

      用于文字的定位,搜索和內容的提取

    元字符

    類別

    元字符

    匹配字符

    . [...] [^...] \d \D \w \W \s \S

    匹配重復

    * + ? {n} {m,n}

    匹配位置

    ^ $ \b \B

    其他

    | () \

    示例

    # 標識符 的正則表達式 [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 # 導入正則表表達式模塊 >>> s = 'abcdeabca' >>> re.findall('ab', s) ['ab', 'ab']
    • 或關系

      | 匹配兩側任意的正則表達式>>> import re # 導入正則表表達式模塊 >>> 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']^ 匹配目標字符的開始位置 $ 匹配目標字符的結束位置>>> re.findall('^hello', 'hello world') ['hello'] >>> re.findall('^hello', 'a hello world') [] >>> re.findall('world$', 'hello world') ['world']* 匹配前面的字符出現 0 或多次 + 匹配前面的字符出現 1 或多次 ? 匹配前面的字符出現 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} # 前面的字符出現n 次 {m,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 匹配任意的數字 [0-9] \D 匹配任意的非數字>>> re.findall('\d{1,5}', 'MySql: 3306, http:80') ['3306', '80']\w 匹配普通字符 \W 匹配非普通字符普通字符是指 數字,字母,下劃線,漢字>>> 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])
    • 模塊內的 __name__ 屬性

      如果 一個模塊是主模塊,則 __name__ 綁定 '__main__'

      如果 一個模塊不是主模塊,則 __name__ 綁定文件名

    • super() 函數

      • 作用

        顯示的調用被覆蓋的父類方法

      • 示例

        class A:def say_hello(self):print('Hello A') ? class B(A):def say_hello(self):print("hello B")# self.say_hello() 無限遞歸調用# 能否在此方法內調用 A類里面的 say_hello()# 方法1# A.say_hello(self)# 方法2 ,super() 會把self 看成是A類的對象super().say_hello() ? b = B() b.say_hello() # hello B Hello A

    多線程編程

    一個進程可以有多個執行路徑,通常可以每個執行路徑分配在不同的CPU 上并行執行, 這種運行方式是多線程

    文檔:threading --- 基于線程的并行 — Python 3.9.7 文檔

    • 問題

      如何能讓下面的兩個函數同時執行

    import time ? def say_hello():for x in range(10):print("hello!!!")time.sleep(1) ? def say_world():for y in range(10):print('world!!!')time.sleep(1) ? say_hello() say_world() ?

    使用多線程

    • 創建線程對象的方法

    import threading # 用threading 的 Thread 類來創建一個線程對象 threading.Thread(target=None, args=(), kwargs={}, *, daemon=None)示例import threading import time ? def say_hello():for x in range(10):print("hello!!!")time.sleep(1) ? # 用threading 的 Thread 類來創建一個線程對象 用 t 變量綁定 t = threading.Thread(target=say_hello)
    • 啟動線程

      用 Thread對象的start() 方法來啟動線程,讓 線程中 target 綁定的函數,異步執行

      t.start()
    • 完整示例

    import threading # 導入多線程模塊 import time ? def say_hello():for x in range(10):print("hello!!!")time.sleep(1) ? def say_world():for y in range(10):print('world!!!')time.sleep(1) ? if __name__ == '__main__':# 用多線程來并行# 1. 創建一個線程,綁定 say_hello 函數t1 = threading.Thread(target=say_hello)t1.start() # 啟動 t1 線程t2 = threading.Thread(target=say_world)t2.start() ?print("主線程運行結束") ?# 串行# say_hello()# say_world()

    json

    json 全稱( Javascript Object Notation) , 是一種輕量級的數據交互格式

    json 是基于 Javascript 編程語言的格式

    JSON 采用完全獨立于編程語言的文本格式

    標準JSON的合法符號:

    ????????{}(大括號) ?

    ????????"(雙引號)

    ????????:(冒號)

    ????????,(逗號)

    ????????[ ](中括號)

    Json 的數據類型

    ????????對象 object {}

    ????????數組 array? []

    ????????字符串 string? ""

    ????????數值 number (整數和浮點數)

    ????????布爾值 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數組 str "" string 字符串 int, float number 數字 True/False true/false None null

    json 模塊

    內建模塊

    import json

    json模塊的四個常用函數

    函數 說明 json.dump(obj, fw) 把python 對象編碼為json 字符串并寫入文件fw中 json.dumps(obj) 把python 對象編碼為json 字符串并返回 json.load(fr) 從文件流對象fr中讀取json數據解碼后返回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 綁定的對象轉為json 的字符串 >>> s '[{"name": "weimingze", "age": 35, "gender": true, "score": null}, {"name": "\\u5c0f\\u738b", "age": 18, "score": [90, 100, 85]}]' >>> objs = json.loads(s) # 將 json 的字符串,轉為 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 應用程序接口。在Web中,API 通常指HTTP協議的接口

    示例

    中國天氣網查詢天氣情況的 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/39957091

    requests 模塊

    作用

    發送HTTP 協議的請求,得到服務器響應的數據

    模擬瀏覽器的行為

    安裝方法:

    pip3 install requests

    HTTP? 協議的請求方式:

    ????????GET 請求

    ????????????????????????相當于查看 ,get請求可以獲取網站的數據,請求參數通常跟在URL 的后面

    ????????POST請求

    ????????????????????????原意是創建或者添加, 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模塊獲取網頁數據

    >>> import requests # 向 https://www.baidu.com/s?wd=weimingze 發送GET請求得到響應 >>> r = requests.get('https://www.baidu.com/s?wd=weimingze') >>> r.text # 得到響應內容的文本信息 '<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 # 響應的字節串

    ??使用request模塊下載文件

    >>> import requests >>> r = requests.get('http://photo.qc188.com/upload/20197/31/24820/l_1_20190731145347532.jpg') >>> r.content # 響應的字節串 # 下載圖片 >>> 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) # 將 響應的內容(bytes) 寫入文件 ... 155157

    ?用request模塊獲取 中國天氣網的json 數據

    >>> import requests >>> url = 'http://www.weather.com.cn/data/sk/101010100.html' >>> r = requests.get(url) >>> r.content # 返回字節串 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() # 將字節串,轉化為python 的對象,相當于 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 # 查看當前的字符編碼 'ISO-8859-1' >>> r.encoding = 'utf8' # 將編碼改為 UTF-8 >>> r.json() {'weatherinfo': {'city': '北京', 'cityid': '101010100', 'temp': '27.9', 'WD': '南風', '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('請輸入查詢的內容:') params = {'query': s} r = requests.get(url, params=params) # 發出get請求,傳入 ?query=s 查詢字符串# 相當于請求:https://www.sogou.com/web?query=linux with open('sogou_' + s + '.html', 'wb') as fw:fw.write(r.content) # 把 r.content 字節串寫入文件 ? ? # https://www.sogou.com/web?query=linux s = input('請輸入查詢的內容:') params = {'query': s} r = requests.get(url, params=params) # 發出get請求,傳入 ?query=s 查詢字符串# 相當于請求:https://www.sogou.com/web?query=linux with open('sogou_' + s + '.html', 'wb') as fw:fw.write(r.content) # 把 r.content 字節串寫入文件

    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 # 返回網頁的內容

    完整代碼:

    import requests ? url = 'https://www.sogou.com/web' # https://www.sogou.com/web?query=linux s = input('請輸入查詢的內容:') 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) # 發出get請求,傳入 ?query=s 查詢字符串# 相當于請求:https://www.sogou.com/web?query=linux with open('sogou_' + s + '.html', 'wb') as fw:fw.write(r.content) # 把 r.content 字節串寫入文件 ?

    總結

    以上是生活随笔為你收集整理的Python进阶的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。