MOOC —— Python语言基础与应用 by 北京大学 第九章 高级扩展模块
第九章 高級(jí)擴(kuò)展模塊
- 49、例外處理
- 50、推導(dǎo)式
- 51、生成器函數(shù) generator object
- 52、上機(jī)練習(xí):生成器
- 53、圖像處理庫
- 54、Web服務(wù)框架
- 55、網(wǎng)絡(luò)爬蟲
- 56、數(shù)據(jù)可視化
- 57、上機(jī)練習(xí):高級(jí)擴(kuò)展模塊應(yīng)用
49、例外處理
try…except…finally語句,利用它在異常出現(xiàn)時(shí)及時(shí)捕獲并從內(nèi)部消化掉
try:print('try..')r = 10 / 'xyz'print('result:', r) except TypeError as e:print('TypeError:', e) except ZeroDivisionError as e:print('ZeroDivisionError:', e) else: # try 里面沒出錯(cuò),則執(zhí)行print('no error!') finally: # 無論出錯(cuò)否,都執(zhí)行print('finally..') print('END') try.. TypeError: unsupported operand type(s) for /: 'int' and 'str' finally.. END50、推導(dǎo)式
推導(dǎo)式是從一個(gè)或者多個(gè)迭代器快速創(chuàng)建數(shù)據(jù)結(jié)構(gòu)的方法,有時(shí)間就把做過的習(xí)題用推導(dǎo)式再做一遍,推導(dǎo)式返回一個(gè)生成器對(duì)象,也是可迭代對(duì)象。生成器不立即產(chǎn)生全部元素,僅在要用到元素的時(shí)候才生成,可以極大節(jié)省內(nèi)存。都這么說了,建議熟悉推導(dǎo)式的語法
列表推導(dǎo)式: [xx for x in range(10)]
字典推導(dǎo)式: {‘k%d’ %(x,):x**3 for x in range(10)}
集合推導(dǎo)式: {x+y for x in range(10) for y in range(x)}
[xx for x in range(10) if x % 2 ==0]
生成器推導(dǎo)式(注意不是元組):( x*x for x in range(10))
51、生成器函數(shù) generator object
生成器是用來創(chuàng)建數(shù)據(jù)序列的一種對(duì)象,極大的省內(nèi)存,通常是為迭代器產(chǎn)生數(shù)據(jù)
在函數(shù)里把return 換成yield 即可
yield和return不同, 如,你想用函數(shù)返回一個(gè)列表[1,2,3,4],用return時(shí),調(diào)用函數(shù)后一次返回[1,2,3,4]給你;用yield時(shí),返回一個(gè)生成器對(duì)象,調(diào)用函數(shù)一次,先返回[1],再調(diào)用一次,返回[1,2],再調(diào)用,返回[1,2,3],直到取完為止。讓我們看兩段代碼
我們看到的
[1, 2, 3, 4] # 用return一次返回所有數(shù)據(jù) <generator object _yield at 0x00000286D04331B0>generator object = 生成器對(duì)象,然后我們用__next__方法來顯式地看yield的取值過程,直到不能再next了,生成器里沒有可迭代的元素了,函數(shù)結(jié)束
>>> a = _yield(4) >>> a <generator object _yield at 0x00000286D04331B0> >>> a.__next__() [1] >>> a.__next__() [1, 2] >>> a.__next__() [1, 2, 3] >>> a.__next__() [1, 2, 3, 4] >>> a.__next__() Traceback (most recent call last):File "<pyshell#63>", line 1, in <module>a.__next__() StopIteration52、上機(jī)練習(xí):生成器
編寫程序,輸入兩個(gè)數(shù),輸出它們的商,采用例外處理來處理兩種錯(cuò)誤, 給出用戶友好的提示信息
1)除數(shù)為0
2)輸入了非數(shù)值
編寫一個(gè)推導(dǎo)式,生成包含100以內(nèi) 所有勾股數(shù)(i,j,k)的列表
a = [(i, j, k) for i in range(1, 101) for j in range(i + 1, 101)for k in range(j + 1, 101) if k ** 2 == i ** 2 + j ** 2]print(a)編寫一個(gè)生成器函數(shù),能夠生成斐波那契數(shù)列
def fib(): ….
for fn in fib():
print (fn)
if fn>1000:
break
53、圖像處理庫
Pillow庫
from PIL import Image,ImageFilter # 注意,要用什么方法就import什么方法 im = Image.open(<路徑+圖像名+文件格式>) # 打開圖像 im.show() # 顯示圖像 im.save(<文件名>) # 保存圖像 thumbnail(size,Image.ANTIALIAS) # 生成縮略圖 im.filter(ImageFilter.BLUR) # 模糊濾鏡 font = ImageFont.truetype('simsun.ttc',100) # 設(shè)置待添加文字大小為100,字體為宋體 draw = ImageDraw.Draw(im) draw.text((100,10),'添加的文字',(255,0,0),font=font) # 添加文字用PIL生成驗(yàn)證碼
from PIL import Image, ImageDraw, ImageFont, ImageFilter import random # 隨機(jī)字母: def rndChar():return chr(random.randint(65,90)) # 隨機(jī)顏色1 def rndColor():return (random.randint(64,255),\random.randint(64,255),\random.randint(64,255)) # 隨機(jī)顏色2 def rndColor2():return (random.randint(32,127),\random.randint(32,127),\random.randint(32,127)) # 240 x 60 width = 60 * 4 height = 60 image = Image.new('RGB', (width, height), (255,255,255)) # 創(chuàng)建Font對(duì)象: font = ImageFont.truetype('Arial.ttf',36) # 如顯示這里失敗,這里需要字體所在的路徑 # 創(chuàng)建Draw對(duì)象: draw = ImageDraw.Draw(image) # 填充每個(gè)像素: for x in range(width):for y in range (height):draw.point((x,y), fill=rndColor()) # 輸出文字 for t in range(4):draw.text((60*t +10,10), rndChar(),font=font,fill=rndColor2()) # 模糊: image = image.filter(ImageFilter.BLUR) image.save('code.jpg','jpeg')54、Web服務(wù)框架
什么是框架:Web服務(wù)器會(huì)處理與瀏覽器客戶端交互的HTTP協(xié)議具 體細(xì)節(jié),但對(duì)具體內(nèi)容的處理還需要自己編寫代碼 一個(gè)Web框架至少要具備處理瀏覽器客戶端請(qǐng)求和服 務(wù)端響應(yīng)的能力
框架的特性:
路由: 解析URL并找到對(duì)應(yīng)的服務(wù)端文件或者Python服務(wù)器代碼
模板: 把服務(wù)端數(shù)據(jù)合并成HTML頁面。
認(rèn)證和授權(quán): 處理用戶名、密碼和權(quán)限
Session: 處理用戶在多次請(qǐng)求之間需要存儲(chǔ)的數(shù)據(jù)
Flask框架的小例子
在瀏覽器中訪問:http://127.0.0.1:5000/ 看看成果
下面是照抄老師的ppt,一個(gè)運(yùn)用表單插件的例子,然而運(yùn)行失敗,顯示404錯(cuò)誤,先放上代碼再慢慢理解
from flask_wtf import Form from wtforms import StringField from wtforms.validators import DataRequiredclass Myform(Form):user = StringField('Username', validators=[DataRequired()]) from flask import Flask, render_templateapp = Flask(__name__) app.secret_key = '1234567'@app.route('/login', methods=('GET', 'POST')) def login():form = Myform()if form.validate_on_submit():# if form.user.data == 'admin':if form.data['user'] == 'admin':return 'Admin login successfully!'else:return 'Wrong user!'return render_template(r'login.html', form=form)if __name__ == "__main__":app.run()55、網(wǎng)絡(luò)爬蟲
安裝requests和Beautiful Soup兩個(gè)庫,最簡單的爬蟲工具
爬蟲的基本流程
1、分析網(wǎng)頁結(jié)構(gòu)
2、爬取頁面
3、解析頁面
56、數(shù)據(jù)可視化
請(qǐng)?jiān)彅?shù)學(xué)底子不好,有興趣的同學(xué)自動(dòng)去琢磨。。
numpy矩陣處理庫
matplotlib繪圖庫
57、上機(jī)練習(xí):高級(jí)擴(kuò)展模塊應(yīng)用
信息隱藏工具
輕微改變圖片中像素的RGB值,肉眼無法 察覺
將8bit R/G/B中的最低1bit,用于隱藏一 個(gè)數(shù)據(jù)文件(如文本)
每3個(gè)像素可以隱藏1個(gè)字節(jié)
注意使用不失真圖像格式
BMP/PNG格式
要求:
1)提供圖片和數(shù)據(jù)文件,生成隱藏信息的圖片
2)從隱藏信息的圖片中提取數(shù)據(jù)文件
請(qǐng)轉(zhuǎn)向:python實(shí)戰(zhàn)XX
開發(fā)一個(gè)單用戶的微博系統(tǒng)
可以瀏覽、發(fā)帖、刪帖、回復(fù)
利用Flask編程/shelve持久存儲(chǔ)
蒙特卡羅方法求圓周率
蒙特卡羅方法原理
通過大量隨機(jī)樣本,去了解一個(gè)系統(tǒng),進(jìn)而得到所要 計(jì)算的值
用蒙特卡羅方法計(jì)算圓周率π
正方形內(nèi)部有一個(gè)相切的圓 在這個(gè)正方形內(nèi)部,隨機(jī)產(chǎn)生10000個(gè)點(diǎn),計(jì)算它們 與中心點(diǎn)的距離,從而判斷是否落在圓的內(nèi)部
如果這些點(diǎn)均勻分布,那么圓內(nèi)的點(diǎn)應(yīng)該占到所有點(diǎn) 的 π/4
用matplotlib可視化
| Python語言基礎(chǔ)與應(yīng)用 課程結(jié)束 |
總結(jié)
以上是生活随笔為你收集整理的MOOC —— Python语言基础与应用 by 北京大学 第九章 高级扩展模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sentinel 2 MSI 波段组合
- 下一篇: python给excel排序_用pyth