MOOC —— Python语言基础与应用 by 北京大学 第九章 高级扩展模块

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)}
[x
x 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语言基础与应用 课程结束
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值