python:基礎(chǔ)知識詳解

$課程筆記

image

python相關(guān)函數(shù)查詢

官方API文檔

菜鳥教程python

w3school教程python

一.基本元素

變量
  • 變量賦值:
a="hello world"
  • 變量命名:
    ? 字母:a-z, A-Z, 其他語言的字母符號
    ? 數(shù)字:0-9 (不可以出現(xiàn)在首字符)
    ? 下劃線:_ (可以單用)
  • 注意事項
    ? 在賦值時,變量即被創(chuàng)建菩混,變量的值和類
    型在賦值的時候被確定驳糯。
    ? 不需要聲明(declaration)
    ? 變量名大小寫敏感:A, a是不同的變量
    ? 變量可以被重新賦值
變量類型
  • 數(shù)值類型
    ? 整數(shù) Integers: 12 0 -12987 0123 0X1A2 10294L
    大致相當(dāng)于C語言的 ‘int’ 或 ‘long’
    范圍可以非常大(大致無限)
    八進(jìn)制數(shù)以“0” 開始 (0981 是非法的!)
    十六進(jìn)制以0X開始
    ? 浮點(diǎn)數(shù)Floating point: 12.03 1E1 -1.54E-21
    相當(dāng)于C語言的double
    ? 復(fù)數(shù)Complex numbers: 1+3J
    語言原生支持
    運(yùn)算注意事項:
    ? 操作符和C語言類似,例如 +, -, /, , %
    ? 冪操作:
    **
    ? 優(yōu)先級和括號的作用相似
  • 邏輯類型
    ? 預(yù)定義值:True False
    ? 數(shù)值 0 認(rèn)為是假蜀漆,其他值認(rèn)為是真
    ? 操作符:not, and, or
    運(yùn)算注意事項:
    ? 比較運(yùn)算獲得邏輯值嗅剖,運(yùn)算符: <, <=, >, >=,
    ==, !=
  • 字符串類型
    ? 使用函數(shù)str, int, float等類型名進(jìn)行轉(zhuǎn)換
b=int(a)
c=flaot(a)
d=str(a)

? 字符串的拼接和整數(shù)乘法

a="hello"+"world"
b="hello"*2
語句
  • 代碼縮進(jìn)
    ? Python語 語 言 的 行 前 空 白 是 有 語 法 意 義 的
    ? 在源文件中参滴,應(yīng)該統(tǒng)一采取一種縮進(jìn)格式
    縮進(jìn)進(jìn)4個空格 ( 推 薦 標(biāo) 準(zhǔn) )
    縮進(jìn)2個空格
    縮進(jìn)1制表符(tab)
    上述縮進(jìn)不可以混用
    ? 連續(xù)處于相同縮進(jìn)層次的語句構(gòu)成一個語句塊(Block)
  • 條件語句
if 條件:
elif 條件:
else:
  • 循環(huán)語句(for)
    ? 循環(huán)語句for
    ? range(n)表明從0開始聘惦,到n-1(含)癣蟋。
s = 0
for i in range(10): # 0,1,...9
    s += i
print(s)
  • 循環(huán)語句(while)
s = 0
i = 0
while s<10:
    s += i
    i += 1
print(s)
  • 導(dǎo)入語句
    三種寫法:
from math import *
# use pi, cos, sin, ...
from math import cos, sin
# only use cos, sin
import math
# use math.cos, math.sin, ...
  • 定義函數(shù)
    ? 用def定義函數(shù),可以有參數(shù)和返回值
def double(x):
    return x * 2
turtle庫詳解

python:turtle庫詳解

python類型

類型

? 標(biāo)量類型
—— 邏輯類型(bool)
—— 整數(shù)(int)猜煮、浮點(diǎn)數(shù)(float)拗胜、復(fù)數(shù)(complex)
—— 空 類型 型(None)
? 集合類型
—— 字符串(str)
—— 列表(list)
—— 字典(dict)
—— 元組(tuple)
—— 集合(set)
? 自定義類型
—— 類 class

數(shù)值類型

? 除法有兩種:/, // 后者是整除
—— 7/3 = 2.3333333333333335
—— 7//3 = 2
—— 7.0 // 3.0 = 2.0
? 冪運(yùn)算允許實數(shù)
—— 7 ** 2 = 49
—— 7 ** 0.5 = 2.6457513110645907
? 不同類型的數(shù)值運(yùn)算就高不就低
—— int —— float —— complex

三元操作符

? 表達(dá)式

 x if c else y 

相當(dāng)于

 c? x : y
字符串

? 字符串的進(jìn)階操作

'p' in s 

? 下標(biāo)以0為開始

 s[0] # index: offset 0
 s[2:6] # slice: part of string
 s[:6] 
 s[6:]

? 逆序的下標(biāo)

 s[-1]
 s[-3:-1]
 s[1:-1]
 s[-3:]

? 步長:begin:end:step

 s[::2]
 s[1::3]
 s[5:1::-1]
 "live"[::-1]
不可修改類型 Immutable

? 數(shù)值類型、字符串類型是不可修改類型
—— 后續(xù)講解的元組(tuple)類型也是不可修改類型
? 它們的值是常數(shù)檀训,不可以修改
—— 我們并不能把“1”修改為“2”柑潦,把“abc”改為“def”;
—— 作為值峻凫,它的含義是確定的渗鬼、不變的。
? 賦值語句(Assignment)是給這些常數(shù)的值賦予不同的名稱

字符串方法
 s = 'I love Python'
 s.count('on') # 查找子串出現(xiàn)次數(shù)
 s.find('ove') # 查找子串首見位置
 s.replace('Python', 'C++') # 替換

 three = '3'
 three.isdigit() # 是否為數(shù)字字符?
列表
  • 相關(guān)事項
    ? 表(或稱為列表荧琼,廣義表)是python最重要
    和常用的容器類
    ? 由一系列有序排列的對象構(gòu)成(Ordered
    collection of objects)~ C語言的數(shù)組
    ? 異構(gòu)(Heterogenous)譬胎,一個列表可以包含
    多種類型的對象。
 r = [1, 2.0, 3, 5] # list的字面構(gòu)造
 r[1] # 正數(shù)下標(biāo)自首部計數(shù)命锄,首部為0
 r[-1] # 負(fù)數(shù)下標(biāo)自尾部計數(shù)堰乔,尾部為-1
 r[1:3] # 前閉后開區(qū)間
 w = r + [10, 19] # 連接
 t = [0.0] * 10 # 重復(fù)
 len(r)
  • 列表操作
 r = [[9, 8], 2.0, 3, 'word']
 r[0:3] = [1, 2, 5, 6] # 修改片段

 r[1:3] = [] # 刪除元素

 r[1:1] = [ 'new' ] # 賦值語句左右側(cè)都是片段;等價于插入[1, 'new', 6, 'word']
 r[len(r):] = [ 'last' ] # 在尾部插入[1, 'new', 6, 'word', 'last']
  • 列表的方法
 r.insert(0, 'f') # 在0位置增加新元素'f'
 del r[0]
 r.append(9) # 尾部增加元素
 r.sort() # in-place 排序
 r.reverse() # 逆序
  • 判斷兩個變量是否指向同一對象
    ? 利用id函數(shù)脐恩,返回對象的唯一標(biāo)志
    ? id(x) == id(y) 表明x和y實際上是同一對象
    ? x is y
  • 列表推導(dǎo)
[i for i in range(9)]
[i*2 for i in range(9)]
[i for i in range(100) if '4' not in str(i)]

? 補(bǔ)充
—— Python 一行語句過長镐侯,可以用 \ 續(xù)行
—— 若在括號(花方圓均可)內(nèi)可以自由換行

字典
  • 基本事項
    ? 字典是一種數(shù)據(jù)組織方式,它根據(jù) key獲得對應(yīng)的value
    ? key稱為鍵驶冒,key是無序的苟翻,或者說不關(guān)注其順序韵卤。
    ? value稱為值,可以是任意的對象袜瞬。
    ? 字典也稱為映射(mapping)怜俐、哈希(hash)表、查找表(lookup table)等邓尤。
  • 字典操作
 g = {'Tom': 'boy', 'Mary': 'girl'}
 g['Tom'] # 以key為索引
 g.has_key('Mary')
 g['Jack'] = 'boy' # 增加鍵值對
 del g['Tom'] # 刪除鍵拍鲤,刪除鍵到值的綁定

 h = {'Tom': 12, 'Mary': 'good'}
 'Per' in h # 在鍵的集合中檢測
 h.get('Per', 'unknown') # 如果查找失敗則返回缺省值
 h.keys() # 由鍵組成的列表,順序不確定
 h.values() # 由值組成的列表汞扎,順序不確定
 h.items() # 順序同上
 len(h) # 鍵的數(shù)量
元組
  • 注意事項
    ? 與list相同季稳,但不可改變(immutable)
    ? 一旦創(chuàng)建,不可修改澈魄。(Once created, can’t be changed.)
 t = (1, 3, 2)
 t[1] # 3
 (a, b, c) = t # 元組賦值
 a, b, c # (1, 3, 2)
集合
  • 注意事項
    ? 數(shù)學(xué)中的集合景鼠,無序,不重復(fù)(set)
    ? 去重的時候很有用
s = set()
s = {1, 2, 3}
s.add(4) # {1,2,3,4}
s.add(1) # {1,2,3,4}
t = {1,2}
# &交集痹扇,|并集 - 差集
s - t # {3,4}
容器間轉(zhuǎn)換

? list, set, dict 作為類型名可以實現(xiàn)轉(zhuǎn)換
—— list("abc") = ["a", "b", "c"]
—— set([1,2,2]) = {1,2}

Python語句

pass語句

? pass是一個(占位)空語句铛漓,不做任何事情
? 動因
—— python利用縮進(jìn)表達(dá)語句塊,如果語句塊是空的鲫构,不寫會有錯浓恶;
—— 這種情況下,可以寫上pass

for循環(huán)語句

? for可以遍歷任意的容器
—— 對詞典遍歷的是keys()
? range(n)是一個內(nèi)置函數(shù)结笨,返回0~n-1的列表
? range(start, stop, step)

break語句

? 跳出最內(nèi)層的循環(huán)
? python沒有直接跳出外層循環(huán)的語法手段
—— 通常會借助額外的flag變量
—— 異常處理

continue語句

? 它結(jié)束當(dāng)前迭代包晰,并跳到下一次迭代開頭。即跳過循環(huán)體中余下的語句炕吸,但不結(jié)束循環(huán)伐憾。
? 可以用等價的if語句描述

for/while-else語句

? 只要不是break跳出循環(huán),就執(zhí)行else語句
? 相比C語言減少一個flag變量

r = [1, 3, 10, 98, -2, 48]
for i in r:
    if i < 0:
        print('input contains negative value!')
        break
else:
    print('input is OK')
exec和eval

? 動態(tài)地編寫Python代碼赫模,并將其作為語句進(jìn)
行執(zhí)行或作為表達(dá)式進(jìn)行計算
? 函數(shù)exec將字符串作為代碼執(zhí)行
? eval計算用字符串表示的Python表達(dá)式的值树肃,
并返回結(jié)果。
? 如下代碼來創(chuàng)建一個Python計算器

assert斷言語句

? 要求某些條件得到滿足嘴瓤,否則將引發(fā)異常
? 確保程序的參數(shù)合理
? 對于不合理的情況扫外,明確引發(fā)異常

異常處理
  • 完整的異常處理
try:
    1 / 0
except NameError:
    print("Unknown variable")         出現(xiàn)異常時執(zhí)行。廓脆。筛谚。
else:
    print("That went well!")             沒有出現(xiàn)異常時執(zhí)行
finally:
    print("Cleaning up.")             任何情況下都會執(zhí)行
函數(shù)

? 函數(shù)名:規(guī)則與變量名相同
? 參數(shù)列表:調(diào)用函數(shù)時傳遞給它的值
—— 可以由零個,一個或者多個參數(shù)組成
—— 當(dāng)有多個參數(shù)時停忿,各個參數(shù)用逗號分隔
? 函數(shù)體:函數(shù)被調(diào)用時執(zhí)行的代碼
—— 由一個或多個語句組成
—— 在執(zhí)行到末尾或return語句時退出函數(shù)
—— 返回結(jié)果
? 函數(shù)調(diào)用的形式
—— 函數(shù)名( 參數(shù)列表 )
? 形式參數(shù)(名):定義函數(shù)時驾讲,函數(shù)名后面圓括號中的變量。形參只在函數(shù)內(nèi)部有效。
? 實際參數(shù)(值):調(diào)用函數(shù)時吮铭,函數(shù)名后面圓括號中的變量时迫。

參數(shù)能否修改:總結(jié)

? 凡是Immutable類型的參數(shù),傳入的對象值不可能修改
? 對于Mutable類型的參數(shù):
—— 若對形參進(jìn)行賦值谓晌,并不能改變傳入對象的值
—— 若對形參進(jìn)行in-place的修改掠拳,則該修改也反應(yīng)在傳入的對象上

關(guān)鍵字參數(shù)的缺省值

? 可以設(shè)定一些參數(shù)的缺省值(默認(rèn)值)
? 如果調(diào)用者沒有提供,則使用缺失值

def hello(name, greeting="Hello"):

? 允許用戶提供任意數(shù)量的參數(shù)

def sum_of_all(*values):
作用域
  • 注意事項
    ? 如果沒有局部變量和全局變量同名纸肉,可以直接讀取全局變量溺欧。
    ? 如果有一個局部變量與待訪問的全局變量同名,則無法直接訪問全局變量柏肪,因為它被局部變量遮住了姐刁。
    ? 可以使用關(guān)鍵字 global(nonlocal)修飾變量名,表明和全局(外層)變量關(guān)聯(lián)烦味。
    ? Python的函數(shù)可以作為返回值
匿名函數(shù)

? lambda可以用來定義函數(shù)

pow2_a = lambda x: x*x

def pow2_b(x):
      return x*x

兩者功能相同

模塊

? 對于稍微大型的程序聂使,代碼量較大,不宜
放在一個文件中
? 模塊可以將代碼分散在不同的文件

主模塊
if __name__ == "__main__":
      do_something()

文本處理

字符的分類

? 數(shù)字 digits 01234567890
? 字母 letter
大寫ABCDEFGHIJKLMNOPQRSTUVWXYZ
小寫 abcdefghijklmnopqrstuvwxyz
? 空白字符:空格谬俄,\t\n\r\v
? 對應(yīng)Unicode柏靶,上述概念有一定拓展。

字符串對象方法
  • capitalize() 字符串首字母大寫
  • lower() 轉(zhuǎn)為小寫
  • upper() 轉(zhuǎn)為大寫
  • find(s)/rfind(s) 正向/逆向查找子串s的出現(xiàn)位置
  • count(s) 查找s出現(xiàn)的次數(shù)
  • strip() 移除開始和結(jié)束的空白
  • lstrip()/rstrip()移除開始/結(jié)束的空白
  • replace(s, r) 將子串s替換為r(缺省為全替換溃论,可以僅替換指定次數(shù))
  • isalpha()/isdigit() 是否是字母宿礁、數(shù)字等……
  • isupper()/Islower() 是否大寫小寫等….
  • startswith(s)/endswith(s) 是否以s作為字符串的開始或結(jié)尾
  • s.split(sep) 將字符串sep作為分隔符,對字符串s進(jìn)行分解蔬芥,返回列表
  • sep.join(parts) 將各部分用分隔符sep連接在一起
格式化

? 字符串的格式化有三種方法
? %, format, f-string

  • % 操作符
    用法: str % parameter_tuple
"the number is %d" % 30
  • %-format
    %c character
    %s string conversion via str() prior to formatting
    %i signed decimal integer
    %d signed decimal integer
    %u unsigned decimal integer
    %o octal integer
    %x hexadecimal integer (lowercase letters)
    %X hexadecimal integer (UPPERcase letters)
    %e exponential notation (with lowercase 'e')
    %E exponential notation (with UPPERcase 'E')
    %f floating point real number
    %g the shorter of %f and %e
    %G the shorter of %f and %E
    * argument specifies width or precision
    - left justification
    + display the sign
    <sp> leave a blank space before a positive number
    # add the octal leading zero ( '0' ) or hexadecimal leading '0x'or '0X', depending on whether 'x' or 'X' were used.
    0 pad from left with zeros (instead of spaces)
    % '%%' leaves you with a single literal '%'
    (var) mapping variable (dictionary arguments)
    m.n. m is the minimum total width and n is the number of digitsto display after the decimal point (if appl.)
name = "John"
age = 23
print("%s is %d years old." % (name, age))
  • str.format方法
    ? 原先的用法:'%s %s' % ('one', 'two')
    ? 目前的用法:'{} {}'.format('one', 'two')
"{0} {1}, you may have won ${2}" .format("Mr.", "Smith",10000)
 'int, {0:5}, in a field of width 5'.format(7)
 ' {0:10.5f}, fixed at 5 decimal places.'.format(3.1415926)
  • f-string
 name = "Eric"
 age = 24
 f"Hello, {name}. You are {age}."

f-string是python3版本的新語法,是一種表達(dá)式控汉。

  • split-join
    ? split用于將長字符串進(jìn)行分解
    ? join用于合并短字符串
    ? 常見的分隔符號有:\t , ; . - /
 "www.ustb.edu.cn".split(".")
 [ int(i) for i in "166.111.4.80".split(".") ]
 ".".join([ f"{i}" for i in [166, 111, 4, 80] ])
正則表達(dá)式
  • 通配符:匹配任意字符
  • 字符組(類)
    ? 字符類 [] 用于匹配一組字符
    ? 可以用 [^] 表達(dá)不匹配組里面的任意字符
    ? Ranges 可以表示一個范圍的字符
    —— [1-9] 即 [123456789]
    —— [abcde] 即 [a-e]
    —— [abcde123456789] 即 [a-e1-9]
  • 預(yù)定義的字符組
    \d 數(shù)字 [0-9]
    \D 非數(shù)字 [^0-9]
    \s 空白字符 [ \f\n\r\t\v]
    \S 非空白字符 [^ \f\n\r\t\v]
    \w 字母數(shù)字下劃線 [A-Za-z0-9_]
    \W 非字母數(shù)字下劃線 [^A-Za-z0-9_]
  • 錨 Anchors
    ? ^ 即行首 beginning of the line笔诵,在多行模式下匹配每行的開始位置
    ? $ 即行尾 means end of the line,在多行模式下匹配每行的結(jié)束位置
    ? \A 僅行首
    ? \Z 僅行尾
    ? \b 匹配單詞的邊界
    —— 從字母數(shù)字到非字母數(shù)字的過渡邊界姑子,\w\W 或 \W\w
  • 重復(fù)指示Repetions
    ? 三種 * + ?
    ? * 指示其前置內(nèi)容0~+inf次出現(xiàn)乎婿,也就是
    任意多次
    ? + 1~+inf
    ? ? 0~1
  • 重復(fù)數(shù)量的范圍指示
    ? 可以用 {n,m} 指示范圍
    —— {n,m} 表示n~m次
    —— {n} 表示恰好n次 exactly n occurrences
    —— {n,} 表示至少n次 at least n occurrences
    ? 示例:
    —— .{0,} 等價于 .*
    —— a{2,} 等價于 aaa*
  • 子表達(dá)式
    ? 重復(fù)指示僅修飾其前面的一個符號,如果
    想表示多個符號街佑,需要對正則表達(dá)式進(jìn)行
    分組谢翎,用 ()進(jìn)行劃分,稱為子表達(dá)式
    ? 子表達(dá)式作為一個整體被修飾
    —— a* 匹配a的0次貨多次出現(xiàn)
    —— abc* 匹配 ab, abc, abcc, abccc, …
    —— (abc)* 匹配 abc, abcabc, abcabcabc, …
    —— (abc){2,3} 匹配 abcabc or abcabcabc

  • ? 符號 | 表示匹配該符號前面的或后面的子表達(dá)式
    —— (T|Fl)an 匹配 Tan or Flan
    —— ^(From|Subject): 匹配郵件頭部
    ? 優(yōu)先級最低沐旨,可以用 () 改變
    ? 示例:
    —— At(ten|nine)tion 匹配Attention or Atninetion
    —— 不能匹配Atten or ninetion 除非未加括號即Atten|ninetion
  • 轉(zhuǎn)義
    ? 很多字符(如“.”)在正則表達(dá)式中有特殊含義森逮,如果只代表它原本的字面意義就需要轉(zhuǎn)義,例如“.”僅匹配句點(diǎn)本身磁携。
    —— 目標(biāo)僅匹配單個句點(diǎn): .
    —— 在正則表達(dá)式層面需要看到: .
    —— 在字符串書寫時需要寫: "\."
    ? 匹配反斜線
    —— 目標(biāo)僅匹配單個反斜線:
    —— 在正則表達(dá)式層面需要看到: \
    —— 在字符串書寫時需要寫: "\\"
    ? 匹配數(shù)字\d
    —— 在正則表達(dá)式層面需要看到: \d
    —— 在字符串書寫時需要寫: "\d"

? 匹配國內(nèi)電話號碼:\d{3}‐\d{8}|\d{4}‐\d{7}
—— 如 0511-4405222 或 021-87888822
? 騰訊QQ號:[1‐9][0‐9]{4,}
—— 騰訊QQ號從10000開始
? 中國郵政編碼:[1‐9]\d{5}(?!\d)
—— 中國郵政編碼為6位數(shù)字
? 匹配身份證:\d{15}|\d{18}
—— 中國的身份證為15位或18位
? 匹配ip地址:\d+.\d+.\d+.\d+
—— 提取ip地址時有用

  • 子表達(dá)式的引用
    ? \n 此處n是一個數(shù)字褒侧,表示第n個子表達(dá)式的值。子表達(dá)式的序號按左括號計數(shù)。
    ? 例如:
    —— (.+) \1 匹配 55 55闷供,或者the the
    ? 可以給子表達(dá)式予以命名
    ? (?P<name>...)
    ? (?P=name)
Python的正則表達(dá)式模塊

? 模塊導(dǎo)入 import re
? 匹配:re.match() 查找字符串的開始部分是否匹配烟央,不向后查找(類似字符串startswith)
? 查找:re.search() 查找是否存在匹配(類似字符串find)
? 替換:re.sub() 替換正則表達(dá)式(類似字符串replace)

  • match的用例
 s = "2019‐03‐20 is a rainy day"
 pat = "\\d‐\\d‐\\d"
 m = re.match(pat, s)

 m.start()
 m.end()
 m.group()  #返回匹配對象(Match),有start, end, group方法
  • search的用例
s = "It is reported that 2019‐03‐20 is a rainyday."
pat = "\\d‐\\d‐\\d"
m = re.search(pat, s)
m.start()
m.end()
m.group() 
  • 多次查找findall/finditer
s = """You smiled and talked to me of nothing and I felt that for this I had been waiting long."
re.findall("\\b(\\w+ed)\\b", s)
re.finditer(...) # 類似歪脏,但返回一個個Match對象
  • 替換sub
    ? 04/30/2018 轉(zhuǎn)換為 2018-04-30
    ? 利用re.sub
import re
print re.sub("([0‐9]{2})/([0‐9]{2})/([0‐9]{4})",
"\\3‐\\1‐\\2",
"This is a test 01/30/2019.")
文件
  • 基礎(chǔ)概念
    ? 文件包括兩種類型:文本文件和二進(jìn)制文件
    ? 二進(jìn)制文件:直接由比特0和比特1組成疑俭,沒有統(tǒng)一字符編碼,文件內(nèi)部數(shù)據(jù)的組織格式與文件用途有關(guān)婿失。
    ? 文本文件:以ASCII碼方式存儲的文件钞艇。
    ? 二進(jìn)制文件和文本文件區(qū)別:僅編碼(人為的理解)存在差異。
    ? 文件包括兩種類型:文本文件和二進(jìn)制文件
    ? 二進(jìn)制文件:直接由比特0和比特1組成移怯,沒有統(tǒng)一字符編碼香璃,文件內(nèi)部數(shù)據(jù)的組織格式與文件用途有關(guān)。
    ? 文本文件:以ASCII碼方式存儲的文件舟误。
    ? 二進(jìn)制文件和文本文件區(qū)別:僅編碼(人為的理解)存在差異葡秒。
  • 文件操作
    ? 打開文件 open
    —— 建立磁盤上的文件與程序中的對象相關(guān)聯(lián)
    —— 通過相關(guān)的文件對象獲得
    ? 文件操作
    —— 讀取
    —— 寫入
    —— 定位
    —— 其它:追加、計算等
    ? 關(guān)閉文件 close
    —— 切斷文件與程序的聯(lián)系
    —— 寫入磁盤嵌溢,并釋放文件緩沖區(qū)
  • 文件打開操作
    ? 打開文件
    —— Python使用open()函數(shù)打開文件并返回文件對象:
<變量名>=open(file, mode = 'r')

—— open函數(shù)有兩個參數(shù):文件名和打開模式眯牧。文件名可以是包含完整路徑的名字,或當(dāng)前路徑下的文件名赖草。
—— 第二個參數(shù)制定文件打開模式学少。
? open()函數(shù)提供7種基本的打開模式
'r' 以只讀方式打開文件(默認(rèn))如果文件不存在,返回異常FileNotFoundError秧骑。
'w' 以寫入的方式打開文件版确,文件不存在則創(chuàng)建,會覆蓋已
存在的文件乎折。
'x' 打開一個新文件來寫數(shù)據(jù)绒疗。文件不存在則創(chuàng)建,如果數(shù)
據(jù)已經(jīng)存在則返回異常FileExistsError骂澄。
'a' 以寫入模式打開吓蘑,文件不存在則創(chuàng)建,如果文件存在坟冲,
則在末尾追加寫入磨镶。
'b' 以 二進(jìn)制模式打開文件。
't' 以 文本模式打開 (默認(rèn))健提。
'+' 可讀寫模式(可添加到其它模式中使用)琳猫。
? 模式的組合使用
—— 'r','w','x','a'可以和'b','t','+'組合使用,形成既表達(dá)讀寫又表達(dá)文件模式的方式私痹。
例如:
——'wb'表示“寫二進(jìn)制數(shù)據(jù)”
——'x+b'表示讀寫一個新的二進(jìn)制文件

  • 文件的讀寫操作
    ? 文件的讀寫:根據(jù)打開方式不同可以對文件進(jìn)行相應(yīng)的讀寫操作沸移,Python提供4個常用的文件內(nèi)容讀取方法痪伦。
    <file>.readall() 讀入整個文件內(nèi)容,返回一個字符串或字節(jié)流雹锣。
    <file>.read(size=‐1) 從文件讀取size個字符网沾,當(dāng)未給定size或給定負(fù)值的時候,讀取剩余的所有字符蕊爵,文件指針指向文件末尾辉哥。
    <file>.readline(size=‐1) 從文件中讀入一行內(nèi)容,如果給出參數(shù)攒射,讀入該行前size長度的字符串或字節(jié)流醋旦。
    <file>.readline(hint=‐1)從文件中讀入所有行,以每行為元素形成一個列表会放,如果給出參數(shù)饲齐,讀入hint行。
    ? Python提供3個與文件內(nèi)容寫入有關(guān)的方法咧最。
    <file>.write(str) 將字符串str寫入文件捂人。
    <file>.writelines(lines)將一個元素為字符串的列表寫入文件。
    <file>.seek(offset,from)改變當(dāng)前文件操作指針的位置矢沿,從from(0代表文件起始位置滥搭,1代表當(dāng)前位置,2代表文件末尾)偏移offset個字節(jié)捣鲸。
  • 文件操作示例
    ? 文本文件逐行打印輸出
fo = open(fname ,"rt")
for line in fo.readlines():
    print(line)
fo.close()
  • 文件操作示例
f1 = open(f1name, "rt")
f2 = open(f1name, "wt")
f2.write(f1.read().upper())
f1.close()
f2.close()
  • with語句
    ? 容易忘記關(guān)閉(close)文件
f = open('todos.txt')
for chore in f
    print(chore, end='')
tasks.close()
#使用with語句重寫這個代碼
with open('todos.txt') as f:
for chore in f:
    print(chore, end='')

? with確保即使發(fā)生異常瑟匆,也可以正確的關(guān)閉文件

  • 編碼的文件
    ? 若打開有編碼的文件,需要用codecs模塊
    ? import codecs
f1 = codecs.open(fname, "r", "utf‐8")
f2 = codecs.open(fname, "w", "gb2312")
  • 詞頻統(tǒng)計
f = open("alice.txt", "rt")
all = f.read()
f.close()
count_word = {}
for w in all.split():
    w_lowercase = w.lower()
    count_word[w_lowercase] = \
                                        count_word.get(w_lowercase, 0) + 1
result = [(v, k) for k, v in count_word.items()]
result.sort()

top10 = result[‐10:]
for v,k in top10[::‐1]:
    print(f"Word {k}, occurs {v} times")
漢字的處理
  • 導(dǎo)入庫
    ? pip install regex
    ? import regex as re
    ? \p{han} 匹配漢字
  • 漢字分詞
    ? jieba是Python中一個重要的第三方中文分詞函數(shù)庫栽惶。
    ? 第三方庫愁溜,需要安裝
    jieba.cut(s) 精確模式,返回一個可迭代的數(shù)據(jù)類型
    jieba.cut(s,cut all=True) 全模式外厂,輸出文本s中所有可能單詞
    jieba.cut_for_search(s) 搜索引擎模式祝谚,適合搜索引擎建立索引的分詞結(jié)果
    jieba.lcut(s) 精確模式,返回一個列表類型酣衷,建議使用
    jieba.lcut(s,cut all=True) 全模式,返回一個列表類型次泽,建議使用
    jieba.lcut_for_search(s) 搜索引擎模式穿仪,返回一個列表類型,建議使用
    jieba.add_word(w) 向分詞詞典中增加新詞w

OOP編程

? 類是類型概念的發(fā)展意荤。
—— 對象是廣義的“數(shù)據(jù)值”啊片。
—— 對象所屬的數(shù)據(jù)類型就是“類”。
—— 用于描述復(fù)雜數(shù)據(jù)的靜態(tài)和動態(tài)行為玖像。
? 類(class):描述相似對象的共性紫谷。包括
—— 數(shù)據(jù)
—— 操作:方法(method)
? 對象是類的實例(instance)
—— 創(chuàng)建對象
? 類的封裝:數(shù)據(jù)和操作結(jié)合成一個程序單元,對外部隱藏內(nèi)部實現(xiàn)細(xì)節(jié)。
—— 不允許用戶直接操作類中被隱藏的信息。
—— 用戶也無需了解隱藏的信息就能使用該類笤昨。
? 類對外公開方法名稱和調(diào)用格式,即界面祖驱。
—— 外界向?qū)ο蟀l(fā)消息。(方法名及參數(shù))
—— 對象響應(yīng)消息,執(zhí)行相應(yīng)方法瞒窒。
—— 外界只能按對象允許的方式來處理對象數(shù)據(jù)捺僻。
? 封裝的好處
—— 安全:對象自己的方法處理自己的數(shù)據(jù)
—— 易用:使用者無需了解內(nèi)部實現(xiàn)細(xì)節(jié)
—— 易維護(hù):實現(xiàn)者修改內(nèi)部實現(xiàn)不會影響使用者
—— 標(biāo)準(zhǔn)化:同類甚至不同類的對象對使用者都呈現(xiàn)同樣的操作界面
? 方法定義同函數(shù)定義

def <methodname>(self, other params):

—— 方法是依附于類的函數(shù),普通函數(shù)則是獨(dú)立的。
—— 方法的第一個參數(shù)是專用的崇裁,習(xí)慣用名字self匕坯。
—— 大體上等價于C++的this
—— 只能通過向?qū)ο蟀l(fā)消息來調(diào)用方法。
? 對象是數(shù)據(jù)和操作的結(jié)合拔稳。
—— 方法對應(yīng)于操作
—— 對象的數(shù)據(jù)以實例變量形式定義葛峻。
—— 實例變量:self.varname
—— 對象變量和所指向的數(shù)據(jù)本質(zhì)上是一個詞典
—— self.varname 即 self["varname"]
—— 實例變量的賦值主要出現(xiàn)在init()方法中。

  • 類的定義實例
class Circle:
""" Class definition for a circle """
def __init__(self, radius):
    self.radius = radius
def getRadius(self):
    return self.radius
def getArea(self):
" Obtain the area of a circle"
    return math.pi*self.radius**2
  • 創(chuàng)建實例
    ? 實例創(chuàng)建
    < 變量> = < 類名> (< 實參> )
    這里<類名>相當(dāng)于一個函數(shù)巴比,稱為構(gòu)造器术奖,用來構(gòu)造實例。
    ? 成員訪問
    ? 方法調(diào)用
    —— 類似函數(shù)調(diào)用,但需指明實例(對象)
    —— < 實例>.< 方法名>(< 實參>)
    —— <實例>就是與形參self對應(yīng)的實參
    ? 數(shù)據(jù)成員訪問
    —— < 實例>.< 數(shù)據(jù)成員名>
繼承

? 在OOP程序設(shè)計中匿辩,當(dāng)我們定義一個class的時候腰耙,可以從某個現(xiàn)有的class繼承,新的class稱為子類(Subclass)铲球,而被繼承的class稱為基類挺庞、父類或超類(Base class、Super class) 稼病。
? 繼承是面向?qū)ο蟮闹匾卣髦谎∏龋^承是兩個類或者多個類之間的父子關(guān)系,子類繼承了父類的所有實例變量和方法然走。
? 繼承實現(xiàn)了代碼的重用援制。重用已經(jīng)存在的數(shù)據(jù)和行為,減少代碼的重新編寫芍瑞。
? Python在類名后用一對圓括號表示繼承關(guān)系晨仑,括號中的類表示父類。

class 類名(被繼承的類):
  • 實例和類的關(guān)系判定
    ? isinstance(s, t)函數(shù)判定s是否t類型(及其子類型)
    —— isinstance(c, Circle)
    —— isinstance(c, DrawableCircle)
    ? 繼承關(guān)系:is-a (注:相當(dāng)于c++的公有繼承)
    ? DrawableCircle is a Circle
    ? 一個實例屬于某個子類拆檬,則也屬于父類洪己,反之則不行。
多態(tài)

? 當(dāng)對一個對象調(diào)用draw()函數(shù)時竟贯,它會根據(jù)自己的對象類型執(zhí)行不同的draw方法
—— FilledDrawableCircle.draw()
—— DrawableCircle.draw()
? 對于相同的方法答捕,會有不同的實現(xiàn)版本,這就是多態(tài)(Polymorphism)

科學(xué)計算與可視化

Numpy

? NumPy(Numeric Python)是Python語言的一個擴(kuò)展包屑那。
? 由多維數(shù)組對象和數(shù)組計算函數(shù)共同組成的庫拱镐,支持多維數(shù)組艘款、矩陣運(yùn)算以及大量數(shù)值計算功能。

  • Numpy產(chǎn)生動機(jī)
    ? 標(biāo)準(zhǔn)的Python中用列表(list)保存一組值沃琅,可以作為數(shù)組使用哗咆。
    ? Python列表的元素可以是任何對象,因此對象需要額外的信息保存其類型等信息阵难,Python本身是解釋型語言岳枷。因此,對數(shù)值運(yùn)算來說呜叫,效率較低空繁。
    —— 1000*1000的矩陣乘法,基于python實現(xiàn)三層循環(huán)超過10分鐘朱庆。
    —— Numpy 大約0.03秒盛泡。
    ? 計算效率直接影響了科學(xué)計算、機(jī)器學(xué)習(xí)的可用性娱颊。
    ? Python的列表不支持?jǐn)?shù)值計算語義
    ? 能否實現(xiàn)矢量傲诵、矩陣的加法?乘法箱硕?逆拴竹?
    ? 因此,需要原生支持?jǐn)?shù)值計算語義的剧罩,高效率的Python庫
    ? NumPy的誕生彌補(bǔ)了這些不足
    ? NumPy提供了兩種基本的對象
    —— ndarray(ndimensional array object )
    —— ufunc( universal function object)
    ? ndarray(數(shù)組)是存儲單一數(shù)據(jù)類型的多維數(shù)組栓拜。
    ? ufunc 是對數(shù)組進(jìn)行處理的函數(shù)畔派。
? 安裝:pip install numpy
? 導(dǎo)入:import numpy as np
  • Numpy的優(yōu)勢
    ? NumPy 通 常 與 SciPy(Scientific Python)和Matplotlib(繪圖庫)一起使用砸讳,這種組合廣泛用于替代Matlab,已成為流行的技術(shù)方案价淌。
    ? Python:通用語言
    ? Matlab:專用語言
    ? NumPy是開源的(Open-Source)
  • Numpy做什么
    ? 矢量镇防、矩陣和高維數(shù)組(張量)的數(shù)值運(yùn)
    算和邏輯運(yùn)算
    ? 線性代數(shù)相關(guān)的操作
    ? 隨機(jī)數(shù)生成
    ? 傅立葉變換
    ? 圖形操作
    ? 其他功能

  • ? 矢量 Vectors
    ? 矩陣 Matrices
    ? 圖像 Images
    ? 張量 Tensors
  • Ndarray
    ? ndarray:N維數(shù)組類型
    ? 描述相同類型的元素集合
    ? 使用基于零的索引訪集合中的項目
    ? ndarray中的每個元素類型(dtype)相同啦鸣,占用的內(nèi)存大小也相同。
  • Ndarray的創(chuàng)建
    ? numpy.array(object, dtype = None, order =None)
    ? object通常是一個容器或迭代器来氧,根據(jù)其內(nèi)容生成一個ndarray對象實例
    ? dtype如果不指定诫给,自動從實際數(shù)據(jù)中推斷
    ? order和內(nèi)存中數(shù)據(jù)排列有關(guān)
  • dtype
    ? int8, int16, int32, int64
    ? uint8, uint16, uint32, uint64
    ? float16, float32, float64
    ? complex64, complex128
  • 數(shù)組屬性
    ? 數(shù)組的維度:ndim
    ? 數(shù)組的形狀:shape
import numpy as np
x = np.array([1, 2, 3])
y = np.array([4.0, 5, 6])
print(x.dtype, x.shape, x.ndim)
print(y.dtype, y.shape, y.ndim)
z = x + y
print(z)
  • 數(shù)組創(chuàng)建
    ? 數(shù)組創(chuàng)建的其他方法
    —— numpy.empty:空,不初始化值啦扬,值可能任意
    —— numpy.zeros:0
    —— numpy.ones:1
    —— numpy.arange:start, stop, step 可以為浮點(diǎn)數(shù)中狂,但是不推薦用在浮點(diǎn)數(shù)場合。
    —— numpy.linspace:start, stop, number 實現(xiàn)均勻劃分(默認(rèn)含右側(cè)端點(diǎn))考传,推薦在浮點(diǎn)數(shù)場合使用。
array = np.array([[0,1,2],[2,3,4]])
# [[0 1 2]
#  [2 3 4]]
array = np.zeros((2,3))
# [[0. 0. 0.]
# [0. 0. 0.]]
array = np.ones((2,3))
# [[1. 1. 1.]
# [1. 1. 1.]]

? eye 單位矩陣
? 浮點(diǎn)數(shù)優(yōu)先用linspace证鸥,避免累計誤差
? np.random 類似于random

array = np.eye(3)
# [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
array = np.arange(0, 10, 2)
# [0, 2, 4, 6, 8]
array = np.linspace(0, 1, 11)
# [0. , 0.1, 0.2, 0.3,…, 0.7, 0.8, 0.9, 1. ]
array = np.random.randint(0, 10, (3,3))
# [[6 4 3]
# [1 5 6]
# [9 8 5]])
  • 索引和切片(slice)
    ? 一維數(shù)組的索引和切片大體與list相同
a = np.arange(9)
a[0]
# 0
a[3:7]
# array([3, 4, 5, 6])
a[:7:2]
# array([0, 2, 4, 6])
a[::‐1]
#array([8, 7, 6, 5, 4, 3, 2, 1, 0])

? 多維數(shù)組:每一個維度都可以進(jìn)行索引或切片僚楞,
返回一個標(biāo)量或多維的子數(shù)組(view)勤晚。
? 對此子數(shù)組的修改可能會反應(yīng)在原數(shù)據(jù)上!

b = np.array([[0,1,2],[3,4,5]])
#[[0 1 2]
#  [2 3 4]]
b[0,1]
# 1
b[1,:]
#[3,4,5]
b[:,2]
#[2,5]
  • 數(shù)組的運(yùn)算
    ? shape相同的多維數(shù)組泉褐,支持+ ‐ * / % < > == >= <= 等運(yùn)算赐写,對應(yīng)的元素逐個進(jìn)行運(yùn)算,返回具有相同shape的多維數(shù)組
    ? 單目運(yùn)算作用在數(shù)組上膜赃,對每個元素逐個實施挺邀,包括負(fù)號 ‐ 以及單自變量函數(shù) sin,cos 等
    ? 上述運(yùn)算是element-wise意義上的
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
print(arr)
[[1. 2. 3.]
[4. 5. 6.]]
print(arr * arr)
[[ 1. 4. 9.]
[16. 25. 36.]]
print(arr ‐ arr)
[[0. 0. 0.]
[0. 0. 0.]]
  • 數(shù)組的運(yùn)算:廣播
    ? shape不相同的數(shù)組如何運(yùn)算?
    ? 一般意義的逐元素的運(yùn)算不可實現(xiàn)跳座。
    ? 但可以通過廣播實現(xiàn)端铛,小的數(shù)組被廣播為大的數(shù)組,從而使得兩個數(shù)組兼容疲眷。
    ? 在下列規(guī)則滿足時可以廣播:
    —— 維數(shù)小的數(shù)組禾蚕,在它的shape前面補(bǔ)“1”
    —— 在某個維度兩個數(shù)組大小或者相同或者有一個是“1”
    —— 如果在某個維度是“1”,則需要任何下標(biāo)[*]時狂丝,用[0]元素代替(相當(dāng)于復(fù)制為很多份)
    ? 等價地說换淆,廣播運(yùn)算在下列情況之一成立時可以執(zhí)行
    —— 具有相同的shape
    —— 具有相同的維度,shape每一維的值或者相同或者有一方為1
    —— 具有不同的維度几颜,但是維數(shù)少的在前面補(bǔ)齊“1”后符合上述條件
  • 邏輯型數(shù)組索引
    ? 邏輯型數(shù)組可以作為索引
    —— 如比較運(yùn)算的結(jié)果為一個邏輯型數(shù)組
    ? 掩碼(Mask)倍试,表示僅取索引True的元素,構(gòu)成一個子數(shù)組蛋哭。
x = np.arange(10)
mod5 = x % 1 == 1
x [ mod5 ] # [1, 6]
x [ x > 5 ] ?

? 整數(shù)型數(shù)組(或list)可以作為索引
? 逐個取出每個整數(shù)對應(yīng)下標(biāo)的元素县习,得到ndarray數(shù)組的子集

x = np.arange(10)*10
# array([ 0, 10, 20, 30, 40,
50, 60, 70, 80, 90])
x[[1,3]]
# array([ 10, 30])
x[[5,3,7]]
# array([ 50, 30, 70])
  • view和copy
    ? 為了提高效率、節(jié)約空間具壮,有些numpy操作返回的是view准颓,對view的修改可以改動原始數(shù)組中的數(shù)據(jù)改動原始數(shù)組中的數(shù)據(jù)。
    ? 具體返回view或copy需要查看函數(shù)說明棺妓。
    ? 顯式的復(fù)制可以用copy函數(shù)攘已。
    —— a.copy()
    —— np.copy(a)
  • 數(shù)組的拼接
    ? np.concatenate([a1, a2, ...],axis=0, out=None)
    ? 參數(shù)說明:
    —— a1, a2, … : 一系列的ndarray,必需是相同的shape怜跑,除非在第axis維可以存在差異样勃。
    —— axis : int, 缺省為0
    ? 按照第axis維把上述數(shù)組拼接在一起
A = np.ones((4,1))
array([[1.],
[1.],
[1.],
[1.]]
B = np.zeros((4,2))
array([[0., 0.],
[0., 0.],
[0., 0.],
[0., 0.]])
C = np.concatenate([A, B], axis=1)
array([[1., 0., 0.],
[1., 0., 0.],
[1., 0., 0.],
[1., 0., 0.]])
  • 數(shù)組的創(chuàng)建
    ? np.zeros_like
    ? np.ones_like
    ? np.empty_like
    ? 參數(shù)是另一個數(shù)組,按照其形狀創(chuàng)建一個0/1/空的數(shù)組
  • reshape
    ? 在保持總元素的數(shù)目不變的條件下性芬,數(shù)組的形狀可以更改
    ? 默認(rèn)的order是row-major
a = np.array([1,2,3,4,5,6])
a = a.reshape(3,2)
"""array([[1, 2],
[3, 4],
[5, 6]])"""
a = a.reshape(2,‐1)
  • 平坦化
    ? .ravel()
    ? .flat
x = np.array([[1, 2, 3], [4, 5, 6]])
print(np.ravel(x))
[1 2 3 4 5 6]
for i in x.flat: #屬性峡眶,不需要加(),返回iterator
    print(i)
  • 轉(zhuǎn)置
    ? .transpose 交換兩個軸 axes
    ? .T 相當(dāng)于transposes前兩個軸
x = np.arange(4).reshape((2,2))
"""array([[0, 1],
[2, 3]])"""
np.transpose(x) # x.transpose((1,0)), or x.T
"""array([[0, 2],
[1, 3]])"""
  • 數(shù)組的IO
    ? 可以存儲為NPY/NPZ文件
    ? 可以同時存儲多個數(shù)組
    ? save存儲為非壓縮格式
    ? savez存儲壓縮格式
np.savez('data.npz', a=a)
data = np.load('data.npz')
a = data['a'] # data是一個詞典

? 讀入文本文件
? 可以指定注釋植锉、分隔符辫樱、編碼等

from io import StringIO
# 用字符串模擬一個file對象
c = StringIO("0 1\n2 3")
np.loadtxt(c)
array([[ 0., 1.],
[ 2., 3.]])

? 讀入圖像文件

from scipy.misc import imread
im = imread("lenna.png")
print(im.shape, im.dtype)
# (330, 330, 3) uint8
im_grey = im[:,:,0]*0.299 + im[:,:,1]*0.587 + im[:,:,2]*0.114
import matplotlib.pyplot as plt
plt.imshow(im_grey, cmap='gray')
plt.show()
  • ufunc
    ? 除了四則運(yùn)算,常見的數(shù)學(xué)函數(shù)也作為ufunc提供俊庇,可以在數(shù)組上操作.
    ? 單次numpy.sin的速度只有math.sin的1/4狮暑,但大數(shù)組的numpy.sin比math.sin快20多倍鸡挠。這是因為numpy.sin在C語言級別進(jìn)行循環(huán)計算。
  • 聚集運(yùn)算
    ? np.sum(a) 對數(shù)組a求和
    ? 其他參數(shù):
    —— axis=None 在特定的維度上求和搬男,默認(rèn)為全部
    求和
    —— out=None 輸出直接存入該參數(shù)
    —— initial=初始值
 np.sum([[0, 1], [0, 5]])
#6
 np.sum([[0, 1], [0, 5]], axis=0)
#array([0, 6])
 np.sum([[0, 1], [0, 5]], axis=1)
#array([1, 5])
 np.sum([])
#0.0
  • 其他聚集操作
    ? all 布爾型:與
    ? any 布爾型:或
    ? max 最大值
    ? min 最小值
    ? mean 均值
    ? std 標(biāo)準(zhǔn)差
  • 類型轉(zhuǎn)換
    .astype(T) 轉(zhuǎn)為T類型
x = array([[0, 1],
[2, 3]])
x.astype(np.float32)
"""
array([[0., 1.],
[2., 3.]], dtype=float32)
"""
  • 矩陣運(yùn)算
    ? NumPy對于多維數(shù)組的運(yùn) 算拣展,缺省情況下并不使用矩陣運(yùn)算(特指 乘除法)。
    ? numpy庫提供了matrix類缔逛,使用matrix類創(chuàng)建矩陣對象备埃,它們的加減乘除運(yùn)算缺省采用矩陣方式計算
    ? NumPy中同時存在ndarray和matrix對象,容易混淆褐奴,需要注意按脚。
  • 矩陣運(yùn)算
    ? 矩陣的乘積可以使用dot函數(shù)進(jìn)行計算。
    ? dot
    —— 對于兩個一維的數(shù)組歉糜,計算的是這兩個數(shù)組對
    應(yīng)下標(biāo)元素的乘積和(內(nèi)積)乘寒。
    —— 對于二維數(shù)組,計算的是兩個數(shù)組的矩陣乘積匪补。
    —— 對于多維數(shù)組伞辛,通用計算公式為數(shù)組a的最后一維上的所有元素與數(shù)組b的倒數(shù)第二維上的所有元素的乘積和:
    ? dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
a = np.array([[2, 0], [0, 1]])
b = np.array([[4, 1], [2, 2]])
c = np.dot(a, b)  
"""
array([[8, 2],
[2, 2]])
"""
  • 排序
    ? .sort() 對數(shù)組進(jìn)行排序,將改變數(shù)組的內(nèi)容夯缺。
    ? .argsort() 返冋數(shù)組的排序下標(biāo)
 a = np.array([5,3,2,4,1])
 a.argsort()
array([4, 2, 1, 3, 0], dtype=int64)
  • NumPy模塊
    ? numpy.linalg模塊
    —— 包含線性代數(shù)的函數(shù)蚤氏。可以計算逆矩陣踊兜、求特征值竿滨、奇異值分解、解線性方程組以及求解行列式捏境、秩等
    ? numpy.fft模塊
    —— 提供了快速傅里葉變換及其逆變換于游。
    ? numpy.random 模塊
    —— 支持二項分布、超幾何分布垫言、正態(tài)分布等
  • numpy.linalg
    ? 解方程
    3 * x0 + x1 = 9
    x0 + 2 * x1 = 8
 a = np.array([[3,1], [1,2]])
 b = np.array([9,8])
 x = np.linalg.solve(a, b)
 x
array([ 2., 3.])
np.allclose(np.dot(a, x), b)
MATPLOTLIB

? Python繪圖庫贰剥。
? 由 John Hunter (1968-2012) 創(chuàng)建。
? 擁有一套和Matlab幾乎相同語法的繪圖庫筷频。
? 也擁有另一套面向?qū)ο蟮睦L圖庫蚌成。
? http://matplotlib.org/ 參考 Example 和 Gallery。

  • 導(dǎo)入
    ? import matplotlib.pyplot as plt
    ? from matplotlib.pyplot import *
    ? pyplot模塊模擬了matlab接口
  • 入門示例
import numpy as np
from matplotlib.pyplot import *
#or: from matplotlib.pylab import * 
# pylab = pyplot + numpy
x = np.linspace(0, 5, 10)
y = x ** 2
figure()
plot(x, y, 'r‐o')
xlabel('x')
ylabel('y')
title('title')
show()
  • Plot
    ? x:如果缺少x則按照(0,1,2,3…)
    ? y
    ? "r‐o": red, 實線, 圓點(diǎn)
    —— 類似有 "g‐‐x" 綠色虛線X
    ? plot改為semilogx, semilogy, loglog
    可以變?yōu)閷?shù)坐標(biāo)尺度
  • 顏色
    ? 單詞凛捏,如'red'
    ? 字母担忧,如'r'
    ? 6位16進(jìn)制數(shù),如'#FF0000'或'#ff0000'
    ? 三(RGB)或四(RGBA)元組坯癣,如(1, 0, 0)或(1,0,0,1)
    ? 灰度字符串瓶盛,如'0.8'
import numpy as np
import matplotlib.pyplot as plt
a = b = np.linspace(0, 3, 50)
c = np.exp(a)
d = c[::‐1]
plt.plot(a, c, 'r‐‐', label='Model length')
plt.plot(a, d, 'b:', label='Data length')
plt.plot(a, c+d, 'k', label='Total message length')
legend = plt.legend(loc='upper center', shadow=True)
legend.get_frame().set_facecolor('#00FFCC')
plt.show()
  • 保存繪圖
    ? plt.savefig()
    —— 文件名是必需參數(shù)。
    —— 示例:plt.savefig("abc.png", bbox_inches='tight')
    —— bboxinches='tight' 去掉不需要的白邊。
    ? plt.show()
    —— 只在屏幕上顯示惩猫。
  • 多個繪圖
x = np.linspace(0.0, 6.28, 100)
y1 = np.cos(x)
y2 = np.sin(x)
plt.subplot(2, 1, 1)
plt.plot(x, y1, 'yo‐')
plt.grid(True)
plt.subplot(2, 1, 2)
plt.plot(x, y2, 'r.‐')
plt.xlabel('time (s)')
plt.show()
  • 直方圖
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
n, bins, patches = plt.hist(x, 50,
normed=1,
facecolor='g',
alpha=0.75)
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, .025,
r'$\mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
  • 散點(diǎn)圖
x = np.random.random(50)
y = np.random.random(50)
c = np.random.random(50)  # color of points
s = 500 * np.random.random(50)  # size of points
fig, ax = plt.subplots()
im = ax.scatter(x, y, c=c, s=s, cmap=plt.cm.jet)
# Add a colorbar
fig.colorbar(im, ax=ax)
# set the color limits
im.set_clim(0.0, 1.0)

網(wǎng)絡(luò)爬蟲

檢查網(wǎng)站地圖

? Sitemap(網(wǎng)站地圖)
? 網(wǎng)站提供的Sitemap文件可以幫助爬蟲定位網(wǎng)站所有網(wǎng)頁的鏈接窒所;
? Sitemap文件提供了爬取網(wǎng)站的有效方式,但該文件經(jīng)常存在缺失帆锋、過期或不完整。

檢測網(wǎng)站構(gòu)建技術(shù)

? 構(gòu)建網(wǎng)站的技術(shù)類型會對爬取產(chǎn)生影響禽额。
—— 例如網(wǎng)頁是動態(tài)生成的還是靜態(tài)頁面锯厢。
? 安裝 builtwith 庫,將URL作為參數(shù)脯倒,該庫
返回網(wǎng)站使用的技術(shù)特征实辑。
? pip install builtwith

調(diào)研網(wǎng)站的所有者

? 根據(jù)網(wǎng)站的所有者,判定爬蟲的下載速度等藻丢;
? 為了找到網(wǎng)站的所有者剪撬,可以使用WHOIS協(xié)議查詢域名的注冊者。
? 安裝:pip install python-whois

下載單個網(wǎng)頁

? python提供了urllib2, requests等庫

import requests
url = 'http://www.weather.com.cn/weather/101010100.shtml' # URL地址
header = {
'User‐Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36
Core/1.53.3226.400 QQBrowser/9.6.11681.400'
}
req = requests.get(url, headers=header, timeout=60)
req.encoding = 'utf‐8' # 設(shè)置文本編碼
code = req.status_code # 返回狀態(tài)悠反,200代表OK
print(code)

? 遇到錯誤怎么辦残黑?(code!=200)
? 下載時遇到的錯誤經(jīng)常是臨時性的:
_ 如服務(wù)器過載時返回的503 Service Unavailable錯誤;
_ 對于此類錯誤斋否,可以嘗試重新下載梨水。
? 非臨時性錯誤
_ 如果服務(wù)器返回的是404 Not Found錯誤,說明該網(wǎng)頁目前并不存在茵臭,再次嘗試同樣的請求也通常會再次出錯疫诽。
? 400+錯誤發(fā)生在客戶端,500+錯誤則發(fā)生在服務(wù)端旦委。
? 在code為500+時可以重試下載奇徒,但通常應(yīng)該等待一段時間。

分析網(wǎng)頁的三類技術(shù)

? 正則表達(dá)式
_ 無視HTML語言缨硝,直接利用正則表達(dá)式篩選出所需的部分摩钙,包括天氣和URL;
? BeatifulSoup
_ 將HTML進(jìn)行解析追葡,利用樹結(jié)構(gòu)進(jìn)行分析腺律;
? lxml
_ 將HTML進(jìn)行解析,基于XPATH查詢語言進(jìn)行分析宜肉。

  • BeatifulSoup
    ? Beautiful Soup 是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python庫匀钧;
    ? 支持慣用的文檔導(dǎo)航、查找谬返、修改文檔的方式之斯;
    ? 提高效率,通常較正則表達(dá)式可以節(jié)省數(shù)小時甚至數(shù)天的工作時間遣铝。
    ? pip install beautifulsoup4
from bs4 import BeautifulSoup
html_doc = """<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters;
and their names were
<a  class="sister"
id="link1">Elsie</a>,
<a  class="sister"
id="link2">Lacie</a> and
<a  class="sister"
id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html_doc)
print(soup.prettify()) # 排版

soup.title
# <title>The Dormouse's story</title>
soup.title.name
# 'title'
soup.title.string
# 'The Dormouse's story'
soup.title.parent.name
# 'head'
soup.p
# <p class="title"><b>The Dormouse's story</b></p>
soup.p['class']
# 'title'

soup.a
# <a class="sister" 
id="link1">Elsie</a>
soup.find_all('a')
# [<a class="sister" 
id="link1">Elsie</a>,
#  <a class="sister" 
id="link2">Lacie</a>,
#  <a class="sister" 
id="link3">Tillie</a>]
soup.find(id="link3")
# <a class="sister" 
id="link3">Tillie</a>

? 從文檔中找到所有<a>標(biāo)簽的鏈接

for link in soup.find_all('a'):
      print(link.get('href'))
# http://example.com/elsie
# http://example.com/lacie
# http://example.com/tillie

? 從文檔中獲取所有文字內(nèi)容

print(soup.get_text())
# The Dormouse's story
#
# The Dormouse's story
#
# Once upon a time there were three little sisters; and their\names were
# Elsie, Lacie and ...
  • 如何遍歷網(wǎng)頁內(nèi)容
    ? BS4提供了children, parents, next_element等
    一系列方法佑刷,可以對元素的子元素莉擒、父元
    素、兄弟元素等進(jìn)行導(dǎo)航瘫絮,從而遍歷整個
    網(wǎng)頁涨冀。
    ? BS4也提供了正則表達(dá)式等方法。
    ? BS4的介紹可以參考:
    https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
  • 鏈接爬蟲
    ? 鏈接爬蟲表現(xiàn)得更像普通用戶麦萤,它跟蹤鏈接鹿鳖,訪問感興趣的內(nèi)容。
    ? 通過跟蹤所有鏈接的方式壮莹,可以下載整個網(wǎng)站的頁面翅帜。
    ? 這種方法會下載大量并不需要的網(wǎng)頁,通常應(yīng)該利用正則表達(dá)式匹配/過濾需要爬取的網(wǎng)頁命满。
    ? 避免鏈接爬蟲陷阱
    ? 某些網(wǎng)站會動態(tài)生成頁面內(nèi)容涝滴,有可能造成理論上無限多的頁面。
    ——例如:日歷網(wǎng)站胶台,鏈接指向“下個月”
    ? 通常應(yīng)該定義爬蟲最大深度歼疮,避免爬蟲陷阱。

圖形界面開發(fā)GUI

python圖形化GUI:pyQt5詳解
python圖形化GUI:pyQt5-tools詳解

MVC

? Model(模型)是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部
分诈唬,通常模型對象負(fù)責(zé)在數(shù)據(jù)庫中存取數(shù)據(jù)腋妙。
? View(視圖)是應(yīng)用程序中處理數(shù)據(jù)顯示的部分。通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的讯榕。
? Controller(控制器)是應(yīng)用程序中處理用戶交互的部分骤素。通常控制器負(fù)責(zé)從視圖讀取數(shù)據(jù)愚屁,控制用戶輸入济竹,并向模型發(fā)送數(shù)據(jù)。
? MVC 分層有助于管理復(fù)雜的應(yīng)用程序霎槐,因為您可以在一個時間內(nèi)專門關(guān)注一個方面送浊。例如,您可以在不依賴業(yè)務(wù)邏輯的情況下專注于視圖設(shè)計丘跌。同時也讓應(yīng)用程序的測試更加容易袭景。
? MVC 分層同時也簡化了分組開發(fā)。不同的開發(fā)人員可同時開發(fā)視圖闭树、控制器邏輯和業(yè)務(wù)邏輯耸棒。

python:PIL圖像處理

自動化

EXCEL自動化

? Excel 是 Windows 環(huán)境下流行的、強(qiáng)大的電子表格應(yīng)用报辱。
—— 包括LibreOffice Calc与殃,OpenOffice Calc,WPS等軟件也可以讀寫xlsx格式。
? openpyxl 模塊讓 Python 程序能讀取和修改Excel 電子表格文件幅疼。最新版本2.6.2米奸。
? https://openpyxl.readthedocs.io
? 安裝:pip install openpyxl

  • 取得工作簿及工作表
 import openpyxl
 wb = openpyxl.load_workbook('example.xlsx')
 wb.sheetnames
 sheet = wb['Sheet3']
 sheet.title
 anotherSheet = wb.active
 anotherSheet
  • 取得單元格
 sheet = wb['Sheet1']
 sheet['A1']
 sheet['A1'].value
 c = sheet['B1']
 c.value

for i in range(1, 5):
    print(i, sheet.cell(row=i, column=2).value)
  • 取得矩形區(qū)域
 for rowOfCellObjects in sheet['A1':'C3']:
      for cellObj in rowOfCellObjects:
            print(cellObj.coordinate, cellObj.value)
      print('‐‐‐ END OF ROW ‐‐‐')
  • 取得行或者列:支持循環(huán)迭代
for i in sheet.rows:
      print(i)
for i in sheet.columns:
      print(i)
  • 數(shù)據(jù)結(jié)果的保存
    ? 保存在txt文件中
    ? 保存在csv文件中
    ? 保存在py文件中
import pprint
resultFile = open('result.py', 'w')
resultFile.write(
'pay_sum = ' + pprint.pformat(pay_sum)
)
resultFile.close()
  • 創(chuàng)建空白工作簿和表
import openpyxl
wb = openpyxl.Workbook()
print(wb.sheetnames)
sh = wb.active
sh.title = "My Data"
wb.save("mydata.xlsx")
  • 創(chuàng)建和刪除工作表
import openpyxl
>>> wb = openpyxl.Workbook()
>>> wb.get_sheet_names()
['Sheet']
>>> sh1 = wb.create_sheet()
<Worksheet "Sheet1">
>>> wb.get_sheet_names()
['Sheet', 'Sheet1']
>>> wb.create_sheet(index=0, title='First Sheet')
<Worksheet "First Sheet">
>>> wb.get_sheet_names()
['First Sheet', 'Sheet', 'Sheet1']
>>> wb.remove_sheet(sh1)   #刪除表
>>> wb.get_sheet_names()
['First Sheet', 'Sheet']
  • 將值寫入單元格
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
sheet['A1'].value = 'Hello world!'
wb.save("hello.xlsx")
  • 其他功能
    ? 改變字體
    ? 使用公式
    ? 設(shè)置行高和列寬
    ? 單元格拆分
    ? 繪制圖表
    例子:乘法表
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
for i in range(1, 10):
sheet.cell(row=i+1, column=1).value = i
sheet.cell(row=1, column=i+1).value = i
for i in range(1, 10):
for j in range(1, 10):
sheet.cell(row=i+1, column=j+1).value=i*j
wb.save("99.xlsx")
WORD自動化

? Microsoft公司的Word是一套功能豐富的辦公軟件,所提供的docx格式可以存儲文本以及字體爽篷、顏色等豐富的信息悴晰。
? docx的讀寫比txt文件要復(fù)雜,需要第三方庫的支持逐工。
? pip install python‐docx
? 注意:導(dǎo)入的時候用 import docx

  • docx文件結(jié)構(gòu)
    ? docx 文件有很多結(jié)構(gòu)膨疏。
    ? 這些結(jié)構(gòu)在 python-docx 中用 3 種不同的類型來表示。
    ? Document 對象表示整個文檔钻弄。
    ? Document 對象包含一個 Paragraph 對象的列表,Paragraph即文檔中的段落者吁。
    ? 每個 Paragraph 對象都包含一個 Run 對象的列表窘俺。
  • 讀取文檔
import docx
doc = docx.Document('libai.docx')
print(len(doc.paragraphs)
# 8
print(doc.paragraphs[0].text)
# '鐵杵成針'
print(doc.paragraphs[2].text)
# '李白是唐代的大詩人,但是小時候讀書并不用功复凳。...'
print(doc.paragraphs[2].runs)
#[<docx.text.run.Run at 0x1e0e56a3c50>,...]
print(doc.paragraphs[2].runs[0].text)
#'李白是唐代的大詩人瘤泪,'
print(doc.paragraphs[2].runs[1].text)
#'但是小時候讀書并不用功'
  • 獲取Word中的純文本
    ? 如果不關(guān)注樣式,只希望獲得所有的文本
    ? 參考代碼實現(xiàn):
import docx
def getText(filename):
      doc = docx.Document(filename)
      fullText = []
      for para in doc.paragraphs:
            fullText.append(para.text)
      return '\n'.join(fullText)
  • Word中的樣式
    ? Word有很多樣式育八,可以通過段落或run對象的style屬性獲得对途。
    ? 可以通過設(shè)置下列屬性產(chǎn)生不同的樣式


    image.png
  • 修改樣式
import docx
doc = docx.Document('libai.docx')
doc.paragraphs[2].runs[0].underline = True
doc.save('restyled‐libai.docx')
  • 生成Word文檔
    ? doc.add_paragraph(text) 新建一個段落,返回段落對象髓棋。
    ? para.add_run(text) 新建一個run实檀,返回run對象。
    ? doc.add_heading(text, level) 新建一個標(biāo)題按声,層級為level
    ? doc.add_picture(filename) 新建一個圖片
import docx
doc = docx.Document()
doc.add_heading('靜夜思', 0)
doc.add_heading('李白', 1)
for s in ["床前明月光", "疑是地上霜", "舉頭望明月",
"低頭思故鄉(xiāng)"]:
para = doc.add_paragraph(s)
para.add_run("/")
doc.add_picture("green.jpg")
doc.save('mydoc.docx')
PDF自動化

? PDF 表示 Portable Document Format 便攜式文件格式膳犹,由Adobe Systems在1993年用于文件交換所發(fā)展出的文件格式。
? 本部分專注兩件事:
—— 從 PDF 讀取文本內(nèi)容
—— 從已有的文檔頁面生成新的 PDF签则。
? pip install pyPDF2

  • PDF讀取文字
import PyPDF2
with open('04067093.pdf', 'rb') as pdfFile:
pdfReader = PyPDF2.PdfFileReader(pdfFile)
print("Total pages: ", pdfReader.numPages)
page0 = pdfReader.getPage(0)
print(page0.extractText())
  • 合并PDF
import PyPDF2
pdf1File = open('00294849.pdf', 'rb')
pdf2File = open('04067093.pdf', 'rb')
pdf1Reader = PyPDF2.PdfFileReader(pdf1File)
pdf2Reader = PyPDF2.PdfFileReader(pdf2File)
pdfWriter = PyPDF2.PdfFileWriter()
for pageNum in range(pdf1Reader.numPages):
      pageObj = pdf1Reader.getPage(pageNum)
      pdfWriter.addPage(pageObj)
for pageNum in range(pdf2Reader.numPages):
      pageObj = pdf2Reader.getPage(pageNum)
      pdfWriter.addPage(pageObj)
pdfOutputFile = open('combined.pdf', 'wb')
pdfWriter.write(pdfOutputFile)
pdfOutputFile.close(); pdf1File.close(); pdf2File.close()
  • 頁面旋轉(zhuǎn)和疊加
    ? rotateClockwise(0, 90, 180, 270)
    ? rotateCounterClockwise(...)
    _ 可以將頁面對象旋轉(zhuǎn)
    ? mergePage(anotherPage)
    _ 可以將頁面疊加(水有氪病)
    ? 綜合上述功能,可以實現(xiàn)pdf文件的合并渐裂、頁面抽取豺旬、旋轉(zhuǎn)、疊印等功能柒凉。
  • PDF中文編碼問題
    ? pyPDF2不能讀取中文編碼的文字族阅;
    ? 可以使用pdfminer庫或其他類似的庫。
import io
from pdfminer.converter import TextConverter
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfpage import PDFPage
def extract_text_from_pdf(pdf_path):
    resource_manager = PDFResourceManager()
    fake_file_handle = io.StringIO()
    converter = TextConverter(resource_manager, fake_file_handle)
    page_interpreter = PDFPageInterpreter(resource_manager, converter)
    with open(pdf_path, 'rb') as fh:
        for page in PDFPage.get_pages(fh, caching=True):
            page_interpreter.process_page(page)
        text = fake_file_handle.getvalue()
    converter.close()
    fake_file_handle.close()
    if text:
        return text

if __name__ == '__main__':
print(extract_text_from_pdf('CH9‐圖形界面開發(fā)A.pdf'))
圖像處理自動化

? 圖像處理已經(jīng)是深入日常生活膝捞,Photoshop的縮寫已經(jīng)成為圖像處理的代名詞耘分。
? 如果需要編輯大量的圖像,手工編輯可能是漫長、枯燥的工作求泰。
? Pillow 是一個第三方 Python 模塊央渣,用于處理圖像文件。該模塊包含一些函數(shù)渴频,可以很容易地裁剪圖像芽丹、調(diào)整圖像大小,以及編輯圖像的內(nèi)容卜朗,從而輕松地自動編輯成千上萬的圖像拔第。

  • 顏色和 RGBA 值
    ? 計算機(jī)程序通常將圖像中的顏色表示為RGBA 值。RGBA 值是一組數(shù)字场钉,指定顔色中的紅蚊俺、綠、藍(lán)和 alpha(透明度)的值逛万。
    ? 這些值是從 0到 255(最高)的整數(shù)泳猬。
    ? 這些 RGBA 值分配給單個像素,像素是計算機(jī)屏幕上能顯示一種顏色的最小點(diǎn)宇植。
    ? 像素的 RGB 設(shè)置準(zhǔn)確地告訴它應(yīng)該顯示哪種顏色的色彩得封。
  • Alpha通道
    ? 圖像也有一個 alpha 值,用于生成 RGBA 值指郁。如果圖像顯示在屏幕上忙上,遮住了背景圖像或桌面墻紙,alpha 值決定了“透過”顏色可以看到多少程度的背景闲坎。
    ? 如果alpha 值為 0疫粥,表示完全透明。
    ? 如果alpha 值為 255腰懂,表示完全不透明手形。
  • 獲取顏色
>>> from PIL import ImageColor
>>> ImageColor.getcolor('red', 'RGBA')
(255, 0, 0, 255)
>>> ImageColor.getcolor('RED', 'RGBA')
(255, 0, 0, 255)
>>> ImageColor.getcolor('Black', 'RGBA')
(0, 0, 0, 255)
>>> ImageColor.getcolor('chocolate', 'RGBA')
(210, 105, 30, 255)
>>> ImageColor.getcolor('CornflowerBlue', 'RGBA')
(100, 149, 237, 255)
  • 圖像坐標(biāo)系
    ? 左上角坐標(biāo)為(0,0)
    ? y正方向向下
    ? x正方向向右
  • Box
    ? 一個矩形元組參數(shù),表示圖像中的一個矩形區(qū)域悯恍。四個整數(shù)按順序分別是:
    _左:該矩形的最左邊的 x 坐標(biāo)库糠。
    _頂:該矩形的頂邊的 y 坐標(biāo)。
    _右:該矩形的最右邊右面一個像素的 x 坐標(biāo)涮毫。
    _底:該矩形的底邊下面一個像素的 y 坐標(biāo)瞬欧。
    ? 矩形元組(3, 1, 9, 6)
  • 圖像的打開和存儲
>>> from PIL import Image
>>> img = Image.open('horse.jpg')
>>> img.size
  (1674, 1116)
>>> width, height = img.size
>>> img.format
'JPG'
>>> img.save('horse.png')
  • 生成新圖像
from PIL import Image
im = Image.new('RGBA', (100, 200), 'purple')
im.save('purpleImage.png')
im2 = Image.new('RGBA', (20, 20))
im2.save('transparentImage.png')
  • 裁剪圖片
croppedIm = img.crop(
(600, 200, 1000, 800))
croppedIm.save('cropped‐horse.png')
  • 復(fù)制和粘貼
from PIL import Image
img = Image.open('horse.jpg')
croppedIm = img.crop((600, 200, 1000, 800))
horsehead = croppedIm.copy()
img.paste(horsehead, (1200, 200))
img.save('horse2.jpg')
  • 調(diào)整圖像大小及旋轉(zhuǎn)圖像
from PIL import Image
img = Image.open('horse.jpg')
width, height = img.size
img44 = img.resize((width//4, height//4), Image.NEAREST)
img42 = img.resize((width//4, height//2), Image.NEAREST)
imgr30 = img.rotate(30)
img44.save('horse44.jpg')
img42.save('horse42.jpg')
imgr30.save('horse_r30.jpg')
  • 更改單個像素
    ? 單個像素的顏色通過 getpixel()和putpixel()方法取得和設(shè)置。它們都接受一個元組罢防,表示像素的 x 和 y坐標(biāo)艘虎。
    ? putpixel()方法還接受一個元組,作為該像素的顏色咒吐。這個顔色參數(shù)是四整數(shù) RGBA 元組或三整數(shù) RGB 元組野建。
    ? 注:1. 能改一個像素就能進(jìn)行任意的圖像編輯属划;
  1. 圖片像素很多時,本方法很慢候生。
img = Image.new('RGB', (200, 100), 'black')
print(img.getpixel((0, 0)))
for x in range(100):
for y in range(50):
img.putpixel((x, y), (210, 210, 210))
img.save('putPixel.png')
  • 繪制形狀
    ? ImageDraw 方法在圖像上繪制各種形狀同眯。
    ? 點(diǎn):point(xy, fill)方法繪制單個像素。xy 參數(shù)表示要畫的點(diǎn)的列表唯鸭。該列表可以是 x和 y 坐標(biāo)的元組的列表须蜗,例如[(x, y), (x, y), ...],或是沒有元組的 x和 y 坐標(biāo)的列表目溉,例如[x1, y1, x2, y2, ...]明肮。
    ? 線:line(xy, fill, width)方法繪制一條線或一系列的線。xy 是一個元組的列表缭付,例如[(x, y), (x,y), ...]柿估,或整數(shù)列表,例如[x1, y1, x2, y2, ...]陷猫。每個點(diǎn)都是正在繪制的線上的一個連接點(diǎn)秫舌。
    ? 矩形、橢圓烙丛、多邊形、文字等羔味。
from PIL import Image, ImageDraw
im = Image.new('RGBA', (200, 200), 'white')
draw = ImageDraw.Draw(im)
draw.line([(0, 0), (199, 0), (199, 199), (0, 199), (0,
0)], fill='black')
draw.rectangle((20, 30, 60, 60), fill='blue')
draw.ellipse((120, 30, 160, 60), fill='red')
draw.polygon(((57, 87), (79, 62), (94, 85), (120, 90),
(103, 113)), fill='brown')
for i in range(100, 200, 10):
draw.line([(i, 0), (200, i ‐ 100)], fill='green')
im.save('drawing.png')
鍵盤鼠標(biāo)自動化

? 白盒:完成了解docx/xlsx格式細(xì)節(jié)河咽,通過python直接生成符合格式的文檔。
? 灰色:Word/Excel提供某種控制接口(如COM接口)赋元,通過COM接口操作Word/Excel軟件達(dá)到預(yù)期目標(biāo)忘蟹。
? 黑色:缺乏控制接口,僅能通過模擬鍵盤和鼠標(biāo)事件驅(qū)動GUI軟件搁凸。

  • pyautogui
    ? pyautogui模塊可以模擬鼠標(biāo)移動媚值、按鍵和滾動鼠標(biāo)滾輪等。
    ? 本節(jié)僅介紹pyautogui的部分功能护糖。
    ? http://pyautogui.readthedocs.org/
    ? 安裝:
    _ pip install PyGetWindow==0.0.1
    _ pip install pyautogui
  • 注意事項
    ? Python 能以想象不到的高速移動鼠標(biāo)并擊鍵褥芒。它可能太快,導(dǎo)致被控程序跟不上嫡良。
    ? 如果出了問題锰扶,而程序仍然繼續(xù)到處移動鼠標(biāo),計算機(jī)就會失去控制(因為你的鍵盤和鼠標(biāo)被人控制了)寝受。
    —— 如果程序自己在移動鼠標(biāo)坷牛,停止它可能很難。你可能無法點(diǎn)擊“關(guān)閉”按鈕
    ? Windows 和 Linux 上很澄,注銷的熱鍵是 Ctrl-Alt-Del 京闰,有可能會失去目前沒有保存的文檔颜及。
  • 預(yù)防措施
    ? 設(shè)置腳本在每次函數(shù)調(diào)用后暫停一段時間,讓用戶有很短的時間窗口來控制鼠標(biāo)和鍵盤蹂楣。
    —— 將pyautogui.PAUSE 變量設(shè)置為要暫停的秒數(shù)俏站。如設(shè)置:pyautogui.PAUSE = 1.5。
    ? 開啟pyautogui 自動防故障功能捐迫。
    —— 將鼠標(biāo)移到屏幕的左上角乾翔,將導(dǎo)致pyautogui.FailSafeException 異常。
    —— 故障時應(yīng)盡可能快地向左上移動鼠標(biāo)施戴,以觸發(fā)異常反浓。
    —— 該異常可以用try語句捕獲赞哗。
  • 屏幕坐標(biāo)系
    ? 左上角為原點(diǎn)
    ? x向右為正方向
    ? y向下為正方向
import pyautogui as ag
width, height = ag.size()
print(width, height)
#1366, 768
  • 移動鼠標(biāo)
import pyautogui
for i in range(10):
ag.moveTo(100, 100, duration=0.25)
ag.moveTo(200, 100, duration=0.25)
ag.moveTo(200, 200, duration=0.25)
ag.moveTo(100, 200, duration=0.25)
  • 獲取鼠標(biāo)位置
    ? position()函數(shù)獲得鼠標(biāo)當(dāng)前的位置忱辅。
    ? 為了持續(xù)跟蹤獲得鼠標(biāo)位置,可以采用下述代碼:
print('Press Ctrl‐C to quit.')
try:
    while True:
        x, y = pyautogui.position()
        print(f"mouse at {x:4d}, {y:4d}")
except KeyboardInterrupt:
    print('\nDone.')
  • 點(diǎn)擊鼠標(biāo)
    ? 當(dāng)前位置點(diǎn)擊 click() 方法趋距。
    ? 若在位置(x,y) 點(diǎn)擊呜袁,采用click(x,y)方法。
    ? 默認(rèn)情況下點(diǎn)擊左鍵藤乙。若指定鼠標(biāo)按鍵猜揪,則需要button關(guān)鍵字參數(shù),取值為 'left'坛梁、'middle'或'right'而姐。
    ? 例:
    _ click(100, 150, button='left')
    _ click(200, 250, button='right')
    ? 模擬鼠標(biāo)按下:mouseDown()
    ? 釋放鼠標(biāo)按鍵:mouseUp()
    ? 函數(shù)參數(shù)與 click()
    _ click = mouseDown + mouseUp
    ? 鼠標(biāo)雙擊:doubleClick()
  • 拖動鼠標(biāo)
    ? Drag即按住一個按鍵不放同時移動鼠標(biāo)。
    _ 通過拖動文件圖標(biāo)划咐,在文件夾之間移動文件拴念;
    _ 可以拖動繪圖。
    ? dragTo() 和 dragRel() 函數(shù)將鼠標(biāo)拖動到一個新的位置褐缠,或相對當(dāng)前的位置政鼠。
    _ 函數(shù)的參數(shù)與moveTo() 和 moveRel() 相似。
import pyautogui as ag
import time
time.sleep(5)
ag.click()
distance = 200
while distance > 0:
    ag.dragRel(distance, 0, duration=0.2) # move right
    distance = distance ‐ 5
    ag.dragRel(0, distance, duration=0.2) # move down
    ag.dragRel(‐distance, 0, duration=0.2) # move left
    distance = distance ‐ 5
    ag.dragRel(0, ‐distance, duration=0.2) # move up
  • 獲取屏幕內(nèi)容
import pyautogui
im = pyautogui.screenshot()
im.save("capture.png")

? 做GUI自動測試時队魏,可以利用截圖分析按鈕是否正彻悖或者變灰(利用Pillow庫的getpixel方法)。
? 可以做一個軟件胡桨,隨著鼠標(biāo)移動俐载,自動取得不同位置的顏色。

  • 屏幕圖像識別
    ? 提前準(zhǔn)備一幅(截圖后取出)的局部圖像:
    ? locateOnScreen('want.png')
    ? 找到屏幕上完全匹配的圖像所在的box登失,然后可在box的中心(或其他位置)進(jìn)行點(diǎn)擊遏佣。
  • 鍵盤
    ? typewrite()方法模擬發(fā)送按鍵
    _ typewrite('Hello world!')
    _ typewrite(['a', 'b', 'left', 'left','X', 'Y'])
    _ 前者均為正常按鍵
    _ 后者的'left'表示“左方向鍵”
  • 鍵盤:特殊鍵


    image.png
  • 鍵盤模擬
    ? keyDown()和keyUp()將向計算發(fā)送虛擬的按鍵和釋放。
    ? press() 函數(shù)模擬完整的擊鍵揽浙。
keyDown('shift');
press('1');
keyUp('shift')

相當(dāng)于 Shift-1 状婶,即“ ! ”鍵
? hotkey() 按參數(shù)自左向右依次模擬按鍵倒序模擬釋放意敛。
_ hotkey('ctrl', 'alt', 'shift', 's')

  • 可能完成的任務(wù)
    ? 模擬鍵盤及鼠標(biāo),實現(xiàn)自動填表膛虫;
    ? 填寫Excel表格草姻;
    ? 編寫Word文件。
    ? 自動玩游戲稍刀;
    ? 網(wǎng)絡(luò)爬蟲:
    ? 模擬鍵盤輸入關(guān)鍵字撩独,發(fā)送“回車”鍵,獲得頁面账月;
    ? 利用鍵盤另存當(dāng)前頁面综膀;
    ? 點(diǎn)擊“下一頁”,繼續(xù)另存當(dāng)前頁面
    ? 聊天機(jī)器人
    ? 模擬鍵盤輸入微信局齿、QQ等
    ? 在AI時代剧劝,視覺、聽覺和模擬發(fā)聲抓歼、模擬形象都可以實現(xiàn)讥此。

數(shù)據(jù)存儲與程序調(diào)試

python:數(shù)據(jù)存儲與程序調(diào)試

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谣妻,隨后出現(xiàn)的幾起案子萄喳,更是在濱河造成了極大的恐慌,老刑警劉巖蹋半,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件他巨,死亡現(xiàn)場離奇詭異,居然都是意外死亡湃窍,警方通過查閱死者的電腦和手機(jī)闻蛀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門匪傍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來您市,“玉大人,你說我怎么就攤上這事役衡∫鹦荩” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵手蝎,是天一觀的道長榕莺。 經(jīng)常有香客問我,道長棵介,這世上最難降的妖魔是什么钉鸯? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮邮辽,結(jié)果婚禮上唠雕,老公的妹妹穿的比我還像新娘贸营。我一直安慰自己,他們只是感情好岩睁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布钞脂。 她就那樣靜靜地躺著,像睡著了一般捕儒。 火紅的嫁衣襯著肌膚如雪冰啃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天刘莹,我揣著相機(jī)與錄音阎毅,去河邊找鬼。 笑死栋猖,一個胖子當(dāng)著我的面吹牛净薛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒲拉,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼肃拜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雌团?” 一聲冷哼從身側(cè)響起燃领,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锦援,沒想到半個月后猛蔽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灵寺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年曼库,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片略板。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡毁枯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叮称,到底是詐尸還是另有隱情种玛,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布瓤檐,位于F島的核電站赂韵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挠蛉。R本人自食惡果不足惜祭示,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谴古。 院中可真熱鬧质涛,春花似錦悄窃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瞬测,卻和暖如春横媚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背月趟。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工灯蝴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人孝宗。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓穷躁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親因妇。 傳聞我的和親對象是個殘疾皇子问潭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容