第九章 高级扩展模块
49、例外处理
try…except…finally语句,利用它在异常出现时及时捕获并从内部消化掉
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 里面没出错,则执行
print('no error!')
finally: # 无论出错否,都执行
print('finally..')
print('END')
try..
TypeError: unsupported operand type(s) for /: 'int' and 'str'
finally..
END
50、推导式
推导式是从一个或者多个迭代器快速创建数据结构的方法,有时间就把做过的习题用推导式再做一遍,推导式返回一个生成器对象,也是可迭代对象。生成器不立即产生全部元素,仅在要用到元素的时候才生成,可以极大节省内存。都这么说了,建议熟悉推导式的语法
列表推导式: [xx for x in range(10)]
字典推导式: {‘k%d’ %(x,):x**3 for x in range(10)}
集合推导式: {x+y for x in range(10) for y in range(x)}
[xx for x in range(10) if x % 2 ==0]
生成器推导式(注意不是元组):( x*x for x in range(10))
51、生成器函数 generator object
生成器是用来创建数据序列的一种对象,极大的省内存,通常是为迭代器产生数据
在函数里把return 换成yield 即可
yield和return不同, 如,你想用函数返回一个列表[1,2,3,4],用return时,调用函数后一次返回[1,2,3,4]给你;用yield时,返回一个生成器对象,调用函数一次,先返回[1],再调用一次,返回[1,2],再调用,返回[1,2,3],直到取完为止。让我们看两段代码
def _return(n):
lst = []
for i in range(1, n + 1):
lst.append(i)
return lst
print(_return(4))
_____________________________________________
def _yield(n):
lst = []
for i in range(1, n + 1):
lst.append(i)
yield lst
print(_yield(4))
我们看到的
[1, 2, 3, 4] # 用return一次返回所有数据
<generator object _yield at 0x00000286D04331B0>
generator object = 生成器对象,然后我们用__next__方法来显式地看yield的取值过程,直到不能再next了,生成器里没有可迭代的元素了,函数结束
>>> 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__()
StopIteration
52、上机练习:生成器
编写程序,输入两个数,输出它们的商,采用例外处理来处理两种错误, 给出用户友好的提示信息
1)除数为0
2)输入了非数值
try:
n, m = int(input()), int(input())
print(n / m)
except ZeroDivisionError:
print('除数不能为0')
except ValueError as e:
print('请输入正确数字', e)
编写一个推导式,生成包含100以内 所有勾股数(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)
编写一个生成器函数,能够生成斐波那契数列
def fib(): ….
for fn in fib():
print (fn)
if fn>1000:
break
def fib(n):
a,b = 1,1
for i in range(n):
a,b = b,a+b
yield b
for fn in fib(1001):
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) # 设置待添加文字大小为100,字体为宋体
draw = ImageDraw.Draw(im)
draw.text((100,10),'添加的文字',(255,0,0),font=font) # 添加文字
用PIL生成验证码
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
# 随机字母:
def rndChar():
return chr(random.randint(65,90))
# 随机颜色1
def rndColor():
return (random.randint(64,255),\
random.randint(64,255),\
random.randint(64,255))
# 随机颜色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))
# 创建Font对象:
font = ImageFont.truetype('Arial.ttf',36) # 如显示这里失败,这里需要字体所在的路径
# 创建Draw对象:
draw = ImageDraw.Draw(image)
# 填充每个像素:
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服务框架
什么是框架:Web服务器会处理与浏览器客户端交互的HTTP协议具 体细节,但对具体内容的处理还需要自己编写代码 一个Web框架至少要具备处理浏览器客户端请求和服 务端响应的能力
框架的特性:
路由: 解析URL并找到对应的服务端文件或者Python服务器代码
模板: 把服务端数据合并成HTML页面。
认证和授权: 处理用户名、密码和权限
Session: 处理用户在多次请求之间需要存储的数据
Flask框架的小例子
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
在浏览器中访问:http://127.0.0.1:5000/ 看看成果
下面是照抄老师的ppt,一个运用表单插件的例子,然而运行失败,显示404错误,先放上代码再慢慢理解
from flask_wtf import Form
from wtforms import StringField
from wtforms.validators import DataRequired
class Myform(Form):
user = StringField('Username', validators=[DataRequired()])
from flask import Flask, render_template
app = 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、网络爬虫
安装requests和Beautiful Soup两个库,最简单的爬虫工具
爬虫的基本流程
1、分析网页结构
2、爬取页面
3、解析页面
56、数据可视化
请原谅数学底子不好,有兴趣的同学自动去琢磨。。
numpy矩阵处理库
matplotlib绘图库
57、上机练习:高级扩展模块应用
信息隐藏工具
轻微改变图片中像素的RGB值,肉眼无法 察觉
将8bit R/G/B中的最低1bit,用于隐藏一 个数据文件(如文本)
每3个像素可以隐藏1个字节
注意使用不失真图像格式
BMP/PNG格式
要求:
1)提供图片和数据文件,生成隐藏信息的图片
2)从隐藏信息的图片中提取数据文件
请转向:python实战XX
开发一个单用户的微博系统
可以浏览、发帖、删帖、回复
利用Flask编程/shelve持久存储
蒙特卡罗方法求圆周率
蒙特卡罗方法原理
通过大量随机样本,去了解一个系统,进而得到所要 计算的值
用蒙特卡罗方法计算圆周率π
正方形内部有一个相切的圆 在这个正方形内部,随机产生10000个点,计算它们 与中心点的距离,从而判断是否落在圆的内部
如果这些点均匀分布,那么圆内的点应该占到所有点 的 π/4
用matplotlib可视化
Python语言基础与应用 课程结束 |