python学习——day08

本文参与「少数派读书笔记征文活动」https://sspai.com/post/45653

参考文章:https://blog.csdn.net/972301/article/details/59537712
https://www.cnblogs.com/DswCnblog/p/6126588.html

今天遇到的问题:

1.pycharm关闭以python console运行python script:
今天安装了ipython,然后打开pycharm运行程序时,居然直接运行python console,而没有运行代码;解决方法:Run->EditConfigurations->Execution->去掉Run with Python console前面的框
备注:如果想使用ipython console运行,可以输入 %run xxx.py 指令
2.不同版本的python安装第三方库的版本可能也会不同,比如Python-goose:pip3 install goose3
3.with as:
有一些任务,可能事先需要设置,事后做清理工作。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。通常我们利用try...catch处理,计时文件读取数据发生异常,也可及时关闭文件,如下:

file = open("/tmp/foo.txt")
try:
    data = file.read()
finally:
    file.close()

虽然这段代码运行良好,但是太冗长了,这时就可以用with...as...了;其基本思想是:with所求值的对象必须具备__enter()方法和__exit__()方法,紧跟with后面的语句被求值后,返回对象的__enter()__方法被调用,这个方法的返回值将被赋给as后面的变量;当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法(代码块报错后,仍会执行)。如下:

class Sample:
    def __enter__(self):
        print("In __enter__()")
        return "Foo"
 
    def __exit__(self, type, value, trace):
        print("In __exit__()")
 
def get_sample():
    return Sample()
 
with get_sample() as sample:
    print("sample:", sample)

输出:
In __enter__()
sample: Foo
In __exit__()

执行步骤:
1.调用get_sample(),返回Sample对象
2.调用Sample对象的__enter__(),返回字符串“Foo”给sample
3.执行代码块
4.调用Sample对象的__exit__()

class Sample:
	def __enter__(self):
		return self

	def __exit__(self, type, value, trace):
		print("type:", type)
		print("value:", value)
		print("trace:", trace)

	def do_something(self):
		bar = 1 / 0
		return bar + 10


with Sample() as sample:
	sample.do_something()

输出:
type: <class 'ZeroDivisionError'>
value: division by zero
trace: <traceback object at 0x083CE7D8>
Traceback (most recent call last):
  File "F:/PycharmProjects/project1/week2/test.py", line 16, in <module>
    sample.do_something()
  File "F:/PycharmProjects/project1/week2/test.py", line 11, in do_something
    bar = 1 / 0
ZeroDivisionError: division by zero

正如输出所示,异常抛出时,与之关联的type,value和stack trace都传给了__exit__()

4.@函数修饰符:
@修饰函数其实就是引用、调用它修饰的函数;下面的一段代码,里面两个函数,没有被调用也会有输出结果:

def test(f):
    print("before ...")
    f()
    print("after ...")
 
@test
def func():
    print("func was called")

输出:
before ...
func was called
after ...

扫描二维码关注公众号,回复: 2740130 查看本文章

执行步骤:
1.将func()作为参数调用test函数
2.test函数被执行

另一个例子:

def main():
	@test
	def fun():
		print("call fun")

		@test1
		def fun1():
			print("call fun1")

def test(func):
	func()
	print("call test")


def test1(f):
	f()
	print("call test1")


main()

输出:
call fun
call fun1
call test1
call test

备注:
1.虽然可以先修饰函数,再定义函数,但还是建议先定义函数,再修饰(pycharm IDE)
2.每个函数只能有一个修饰符

接上一篇:

二、从Web解析到网络空间

Python库之网络爬虫

Requests:最友好的网络爬虫功能库 http://www.python-requests.org/en/master/
-提供了简单易用的类HTTP协议网络爬虫功能
-支持连接池、SSL、Cookies、HTTP(S)代理等

Scrapy:优秀的网络爬虫框架 https://scrapy.org/
-提供了构建网络爬虫系统的框架功能,功能半成品
-支持批量和定时网页爬去、提供数据处流程等

pyspider:强大的Web页面爬取系统 http://docs.pyspider.org/en/latest/
-提供了完整的网页爬取系统构建功能
-支持数据库后端、消息队列、优先级、分布式架构等

Python库之Web信息提取

Beautiful Soup:HTML和XML的解析库(以树形结构进行组织通过遍历操作解析其中的内容)https://www.crummy.com/software/BeautifulSoup/
-提供了解析HTML和XML等Web信息的功能
-可以加载多种解析引擎

Re:正则表达式解析和处理功能库(python标准库) https://www.crummy.com/software/BeautifulSoup/
-提供了定义和解析正则表达式的一批通用功能
-可用于各类场景,包括定点的Web信息提取

Python-Goose:提取文章类型Web页面的功能库 https://github.com/goose3/goose3
-提供了对Web页面中文章信息/视频等元数据的提取功能

Python库之Web网站开发

Django:最流行的Web应用框架 https://www.djangoproject.com/
-提供了构建Web系统的基本应用框架
-MTV模式:模型(model)、模版(Template)、视图(Views)

Pyramid:规模适中的Web应用框架 https://trypyramid.com/
-提供了简单方便构建Web系统的应用框架
-Python产品级Web应用框架,起步简单可扩展性好

Flask:Web应用开发微框架 http://flask.pocoo.org/
-提供了最简单构建Web系统的应用框架

Python库之网络应用开发

WeRoBot:微信公众号开发框架 https://github.com/offu/WeRoBot
-提供了解析微信服务器消息及反馈消息的功能
-建立微信机器人的重要技术手段

aip:百度AI开放平台接口 https://ai.baidu.com/
-提供了访问百度AI服务的Python功能接口
-语音、人脸、OCR、NLP、知识图谱、图像搜索等领域

MyQR:二维码生成第三方库 https://github.com/sylnsfar/qrcode/blob/master/README-cn.md
-提供了生成二维码的系列功能
-基本二维码、艺术二维码和动态二维码

三、从人机交互到艺术设计

Python库之图形用户界面

PyQt5:Qt开发框架的Python接口 https://www.riverbankcomputing.com/software/pyqt/intro
-提供了创建Qt5程序的Python API接口
-Qt是非常成熟的跨平台桌面应用开发系统,完备GUI

wxPython:跨平台GUI开发框架 https://www.wxpython.org/
-提供了专用于Python的跨平台GUI开发框架
-理解数据类型与索引的关系,操作索引即操作数据

PyGObject:使用GTK+开发GUI的功能库 http://pygobject.readthedocs.io/en/latest/
-提供了整合GTK+、WebKitGTK+等库的功能
-GTK+:跨平台的一种用户图形界面GUI框架

Python库之游戏开发

PyGame:简单的游戏开发功能库  https://www.pygame.org/news
-提供了基于SDL的简单游戏开发功能及实现引擎
-理解游戏对外部输入的响应机制及角色构建和交互机制

Panda3D:开源、跨平台的3D渲染和游戏开发库 http://www.panda3d.org/
-一个3D游戏引擎,提供Python和C++两种接口
-支持很多先进特性:法线贴图、光泽贴图、卡通渲染等

cocos2d:构建2D游戏和图形界面交互式应用的框架 http://python.cocos2d.org/
-提供了基于OpenGL的游戏开发图形渲染功能
-支持CPU加速,采用树形结构分层管理游戏对象类型

Python库之虚拟现实

VR Zero:在树莓派对上开发VR应用的Python库 https://github.com/WayneKeenan/python-vrzero
-提供大量与VR开发相关的功能
-支持设备小型化,配置简单化
备注:Raspberry Pi(中文名为“树莓派”),只有信用卡大小的微型电脑,其系统基于Linux。随着Windows 10 IoT的发布,我们也将可以用上运行Windows的树莓派

pyovr:Oculus Rift的Python开发接口 https://github.com/cmbruns/pyovr
-针对Oculus VR设备的Python开发库
-基础成熟的VR设备,提供全套文档,工业级应用设备

Vizard:基础Python的通用VR开发引擎 http://www.worldviz.com/vizard-virtual-reality-software
-专业的企业级虚拟现实开发引擎
-支持多种主流的VR硬件设备,具有一定通用性

Python库之图形艺术

Quads:迭代的艺术 https://github.com/fogleman/Quads
-对图片进行四分迭代,形成像素风格
-可以生成动图或静图图像

ascii_art:ASCII艺术库 https://github.com/jontonsoup4/ascii_art
-将普通图片转为ASCII艺术风格
-输出可以是纯文本或彩色文本
-可采用图片格式输出

turtle:海龟绘图体系 https://docs.python.org/3/library/turtle.html

#Requests

import requests
from goose3 import Goose
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
from flask import Flask
import werobot
import wx
import gi

r=requests.get('https://api.github.com/user',\
               auth=('user','pass'))    #访问链接
r.status_code  #获取访问网络的状态效果
r.headers['content-type']   #获取相应头部分内容
r.encoding  #获取编码
r.text      #获取文本信息


#Python-Goose
url='http://www.qdaily.com/articles/55536.html'
g=Goose({'use_meta_language':False,'target_language':'es'})
article=g.extract(url=url)
article.title
article.meta_description
article.cleaned_text[:150]

#Pyramid
def hello_world(request):
	return Response("Hello World!")
if __name__=='__main__':
	with Configurator() as config:
		config.add_route("hello",'/')
		config.add_view(hello_world,route_name="hello")
		app=config.make_wsgi_app()
	server=make_server("0.0.0.0",6543,app)
	server.serve_forever()

#Flask

app=Flask(__name__)
@app.route('/')
def hello_world():
	return 'Hello,World!'

#WeRoBot

robot=werobot.WeRoBot(token="tokenhere")
@robot.handler
def hello(message):
	return "Hello World!"

#wxPython

app=wx.App(False)
frame=wx.Frame(None,wx.ID_ANY,"Hello World")
frame.Show(True)
app.MainLoop()

#PYGObject

gi.require_version("Gtk","3.0")
from gi.reponsitory import Gtk
window=Gtk.Window(title="Hello World")
window.show()
window.connect("destroy",Gtk.main_quit)
Gtk.main()

实例:玫瑰花绘制

输入:你的想象力
输出:玫瑰花

#RoseDraw.py

import turtle as t

#定义一个曲线绘制函数

def DegreeCurve(n,r,d=1):
	for i in range(n):
		t.left(d)
		t.circle(r,abs(d))

#初始位置设定
s=0.2#  #size
t.setup(450*5*s,750*5*s)
t.pencolor("black")
t.fillcolor("red")
t.speed(100)
t.penup()
t.goto(0,900*s)
#绘制花朵形状
t.begin_fill()
t.circle(200*s,30)
DegreeCurve(60,50*s)
t.circle(200*s,30)
DegreeCurve(4,100*s)
t.circle(200*s,50)
DegreeCurve(50,50*s)
t.circle(350*s,65)
DegreeCurve(40,70*s)
t.circle(150*s,50)
DegreeCurve(20,50*s,-1)
t.circle(400*s,60)
DegreeCurve(18,50*s)
t.fd(250*s)
t.right(150)
t.circle(-500*s,12)
t.left(140)
t.circle(550*s,110)
t.left(27)
t.circle(650*s,100)
t.left(130)
t.circle(-300*s,20)
t.left(123)
t.circle(220*s,57)
t.end_fill()
#绘制花枝形状
t.left(120)
t.fd(280*s)
t.left(115)
t.circle(300*s,33)
t.left(180)
t.circle(-300*s,33)
DegreeCurve(70,225*s,-1)
t.circle(350*s,104)
t.left(90)
t.circle(200*s,105)
t.circle(-500*s,63)
t.penup()
t.goto(170*s,-30*s)
t.pendown()
t.left(160)
DegreeCurve(20,2500*s)
DegreeCurve(220,250*s,-1)
#绘制一个绿色叶子
t.fillcolor("green")
t.penup()
t.goto(670*s,-180*s)
t.pendown()
t.right(140)
t.begin_fill()
t.circle(300*s,120)
t.left(60)
t.circle(300*s,120)
t.end_fill()
t.penup()
t.goto(180*s,-550*s)
t.pendown()
t.right(85)
t.circle(600*s,40)
#绘制另一个叶子
t.penup()
t.goto(-150*s,-1000*s)
t.pendown()
t.begin_fill()
t.rt(120)
t.circle(300*s,115)
t.left(75)
t.circle(300*s,100)
t.end_fill()
t.penup()
t.goto(430*s,-1070*s)
t.pendown()
t.right(30)
t.circle(-600*s,35)
t.done()
t.hideturtle()

注意:上面这段代码的运行结果不能得出完整的玫瑰花形,本来我想自己把他补齐全,但是我发现玫瑰花真的是太难搞了,放弃了,还是有时间画个多来A梦比较实在。
我的想法:利用ps软件做出图形,可以得到像素坐标、颜色、两点之间距离等信息,然后用turtle实现。PS(CS6)具体操作如下:
1.调出标尺:视图->标尺
2.建立参考线:视图->新建参考线,水平垂直各一条,右键标尺,选择单位为像素
3.用移动工具拖动水平/垂直参考线到图片中心(拖到中心的时候,会有一个停顿)
4.用移动工具拖动标尺左上角到参考线交叉点,即完成了坐标系的建立
5.窗口->信息(F8)即可随时查看鼠标所在点的信息

最后附上用MyQR制作的动图二维码:

from MyQR import myqr
import os

version,level,qr_name=myqr.run(
	words="https://github.com/AnRanbel/PsychologicalAssessmentSystem",  #网址
	version=1,  #边长(1-40,数字越大边长越大)
	level='H',  #纠错水平(L、M、Q、H,从左到右依次升高)
	picture="../data/McDull.gif",   #将QR二维码图像与另一张图片相结合,产生一张黑白图文
	colorized=True,    #使产生的图片由黑白变为彩色
	contrast=1.4,   #调节图片的对比度,1.0表示原始图片,值越大表示对比度越大
	brightness=1.0, #调节图片的亮度,用法和取值与contrast相同
	save_name="wangying.gif", #控制文件名(.jpg,.png,.bmp,.gif)
	save_dir=os.getcwd()    #控制存储位置(获取当前路径)
)

不怕中病毒的,欢迎扫码(狗头)

艺术:思想优先,编程是手段

设计:想法和编程同等重要

工程:编程优先,思想次之

编程不重要,思想才重要(编程只是手段)

 

致所有看到这段话的人,也致自己,最好的状态是“设计”,而我现在处于“工程”,加油加油!!

猜你喜欢

转载自blog.csdn.net/lovedbaobao/article/details/81274708