注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。
冬易
不管你是否承认,人工智能已经爆发,你我早已是局中人。
不信?
当司机打开滴滴APP,靠说话输入目的地——这是语音识别;
当走进火车站,机器查验身份证——这是图像识别;
当你打开度秘APP,说想去一家不辣、好吃、人均消费100元左右的餐厅——这是自然语言处理。
人工智能火爆,人工智能第一语言Python疯长。
近日,Python官网静悄悄地发布了一条大消息:正式发布Python3.7.0!同时发布的还有Python3.6.6稳定版。
Python官网宣布,正式发布Python3.7.0。
全文如下:
1
Python3.7.0重大功能改进
那么,这次新发布的Python3.7.0有哪些重要的改进呢?总的来说,
新的syntax功能:
PEP563,推迟了类型注释(typeannotations)的评估
向后不兼容的syntax更改:
async和await现在是保留关键词
新的库模块:
contextvars:PEP567-上下文变量dataclasse:PEP557-数据类importlib.resources
新的内置功能:
PEP553,新的breakpoint()函数
Python数据模型改进:
PEP562,定制访问模块属性PEP560,核心支持typingmodule和generictypesdict对象的插入顺序保存性质被纳入Python官方语言规范
标准库的重大改进:
asyncio模块增加了新功能,提高了可用性和性能time模块新增纳秒级函数支持,新函数将纳秒数作为整数值返回
CPython部署改进:
避免使用ASCII作为默认文本编码PEP552,deterministic.pycs新的runtime模式PEP565,改进了DeprecationWarning处理
CAPI改进:
PEP539,用于线程本地存储的新CAPI
文档改进:
PEP545,Python文档翻译新增日语、法语和韩语文档
2
Python3.7.0新增特性
那么,接下来详细看看这些功能。
PEP563:推迟对注释语句的评估
Python的类型提示有两个明显的可用性问题:
PEP538:C语言环境强制
Python3系列中的一个持续的挑战是确定一种合理的默认策略,用于处理目前在非Windows平台上使用默认C或POSIX语言环境的“7-bitASCII”文本编码假设。
PEP538更新默认解释器命令行界面,自动将该语言环境强制转换为可用的基于UTF-8的语言环境。自动设置LC_CTYPE意味着核心解释器和C扩展(例如readline)将假设使用UTF-8作为默认文本编码,而不是ASCII。
PEP540:强制UTF-8Runtime模式
新的-Xutf8命令行选项和PYTHONUTF8环境变量可用于启用CPythonUTF-8模式。
PEP553:内置breakpoint()
Python3.7新增了内置函数breakpoint(),作为进入Python调试器的简单而一致的方式。
PEP539:新增用于线程本地存储的CAPI
虽然Python为线程本地存储支持提供了一个CAPI;但现有的线程本地存储(TLS)API使用int来表示所有平台上的TLS密钥,但这既不符合POSIX标准,也不具备任何实际意义上的便携性。
PEP539通过向CPython提供新的线程本地存储(TSS)API来改变这一点,该API取代了在CPython解释器中使用现有TLSAPI,同时弃用现有API。TSSAPI使用新类型Py_tss_t而不是int来表示TSS密钥,这将允许在本地TLS密钥定义的平台上构建CPython。
PEP562:定制对模块属性的访问
Python3.7支持在模块上定义__getattr__(),并且只要没有找到模块属性就会调用它。也允许在模块上定义__dir__()。
PEP564:time内置函数支持纳秒
为了避免精度损失,PEP564在timemodule添加了六个新“纳秒”(nanosecond)变量:
time.clock_gettime_ns()time.clock_settime_ns()time.monotonic_ns()time.perf_counter_ns()time.process_time_ns()time.time_ns()
PEP565:在__main__中默认显示DeprecationWarning
DeprecationWarning的默认处理已更改,以便默认情况下再次显示这些警告,但仅当触发它们的代码直接在__main__模块中运行时才会显示。
PEP560:新增支持类型模块和泛型
PEP引入了两种特殊方法__class_getitem__()和__mro_entries__,这些方法现在被大多数类和特殊构造用于输入。结果,不同类型的各种操作的速度提高了7倍,可以使用泛型而没有元类冲突,并且修改了类型模块中长期存在的一些bug。
PEP552:基于哈希的.pyc文件
PEP545:Python文档翻译
PEP545描述了创建和维护Python文档翻译的过程。添加了三种语言的翻译:
开发运行时模式:-Xdev
新的-Xdev命令行选项或newPYTHONDEVMODE环境变量可用于启用CPython的开发模式。在开发模式下,CPython执行额外的运行时检查,这些检查无法在默认情况下启用。
3
性能提升及文档下载
由于字节码更改,方法调用现在可以快20%。
等等优化,还有更多。
Python官网有非常全面的文档:
也列出了转换为新版本会遇到的问题和应对方法:
4
下载地址
易辰
前言
Linux是用Python进行机器学习,人工智能开发的极好环境。
在本教程中,您将了解如何创建和设置用于使用Python进行机器学习的Linux虚拟机。
完成本教程后,您将知道:
如何下载和安装VirtualBox来管理虚拟机。如何下载和安装FedoraLinux。如何在Python3中安装用于机器学习的SciPy环境。
如果您的基本操作系统是Windows,MacOSX和Linux,本教程适用于你,让我们开始吧。
Linux虚拟机的好处
有很多原因可能需要使用Linux虚拟机进行Python机器学习开发。
例如,下面列出了使用虚拟机的五大优点:
要使用系统上不可用的工具(如果您在Windows上)。在不影响本地环境的情况下安装和使用机器学习工具(例如使用Python3工具)。为不同项目(Python2和Python3)提供高度自定义的环境。要保存机器的状态并准确地拿起你离开的地方(从机器跳到机器)。与其他开发人员共享开发环境(设置一次并多次重复使用)。
也许最有利的一点是能够轻松使用您的环境不支持的机器学习工具。
我是OSX用户,尽管可以使用brew,pip和macports安装机器学习工具,但我仍然发现安装和使用Linux虚拟机进行机器学习开发更容易。
概要
本教程分为三部分:
下载并安装VirtualBox。在虚拟机中下载并安装FedoraLinux。安装Python机器学习环境
下载并安装VirtualBox
VirtualBox是用于创建和管理虚拟机的免费开源平台。
一旦安装完成,您可以创建所有您喜欢的虚拟机,只要您具有要从其安装的ISO映像或CD即可。
3.为您的工作站选择二进制文件。
4.为您的系统安装软件并按照安装说明进行操作。
下载并安装FedoraLinux
我选择了FedoraLinux,因为我认为它比一些Linux更友善,更温和。它是面向工作站和开发人员的RedHatLinux的领先优势。
下载FedoraISO映像
首先下载FedoraLinux的ISO文件。在这种情况下,Fedora25的64位版本。
4.在“其他下载”下点击“64位1.3GBLive镜像”
5.你现在应该有一个名字为ISO的文件:
“Fedora的工作站的Live-x86_64-25-1.3.iso”。
我们现在准备在VirtualBox中创建VM。
创建Fedora虚拟机
现在,让我们在VirtualBox中创建Fedora虚拟机。
1.打开VirtualBox软件。
2.点击“新建”按钮。
3.选择名称和操作系统。
名称:Fedora25
键入:Linux
版本:Fedora(64位)
点击“继续”
4.配置内存大小
2048
5.配置硬盘
现在创建一个虚拟硬盘
硬盘文件类型:VDI(VirtualBox磁盘映像)存储在物理硬盘上
动态分配文件位置和大小:10GB
我们现在准备从ISO映像安装Fedora。
安装FedoraLinux
现在,让我们在新的虚拟机上安装FedoraLinux。
1.选择新的虚拟机,然后单击“开始”按钮。
2.单击文件夹图标并选择FedoraISO文件:
3.点击“开始”按钮。
4.选择第一个选项“启动Fedora-Live-Workstation-Live25”并按Enter键。
5.按“Esc”键跳过检查。
6.选择“LiveSystemUser”。
7.选择“安装到硬盘驱动器”。
8.完成“语言选择”(英语)
9.完成“安装目的地”(“ATAVBOXHARDDISK”)。
您可能需要等待一分钟让VM创建硬盘。
10.单击“开始安装”。
11.设置root密码。
12.为自己创建一个用户。
记下用户名和密码(以便以后可以使用它)。
勾选“设置此用户管理员”(以便您可以安装软件)。
13.等待安装完成...(5分钟?)
14.点击“退出”,点击右上角的电源图标;选择关闭电源。
安装Python机器学习环境
Gnome3与之前的Gnome版本完全不同;您可以通过使用内置的帮助系统了解如何解决问题。
安装Python环境
首先安装所需的Python库进行机器学习开发。
1.打开终端。
点击“Activities”
键入“terminal”
点击图标或按回车
2.确认Python3已安装,键入:
python3--version
3.安装Python机器学习环境。特别是:
NumPySciPyPandasMatplotlibStatsmodelsScikit-Learn
键入:
sudodnfinstallpython3-numpypython3-scipypython3-scikit-learnpython3-pandaspython3-matplotlibpython3-statsmodels
出现提示时输入您的密码,按“y”和“enter”确认安装。
确认你的环境
执行下列Python脚本version.py:
#scipyimportscipyprint('scipy:%s'%scipy.__version__)#numpyimportnumpyprint('numpy:%s'%numpy.__version__)#matplotlibimportmatplotlibprint('matplotlib:%s'%matplotlib.__version__)#pandasimportpandasprint('pandas:%s'%pandas.__version__)#scikit-learnimportsklearnprint('sklearn:%s'%sklearn.__version__)#statsmodelsimportstatsmodelsprint('statsmodels:%s'%statsmodels.__version__)
python3versions.py
结果如下:scipy:1.0.0numpy:1.14.0matplotlib:2.1.2pandas:0.22.0statsmodels:0.8.0sklearn:0.19.1
如果得到上面的结果,恭喜你,你的Linux机器学习Python开发环境建立完毕。
机器学习入门参考
萧书桃
如果你苦于给Python安装各种包,安装过程中还各种出错。那么我墙裂推荐——Anaconda,它可以帮助你管理这些包,包括安装、卸载、更新。
Anaconda附带一大批常用数据科学包,如:conda,Python等150多个学科包以及依赖项,你可以立即开始处理数据。
还有一个好处就是:如果你的项目是Python2,新项目是Python3,你无需同时安装两个版本Python,Anaconda会帮助你为不同的项目建立不同的运行环境。
Anaconda的安装
版本选择
由于Python有2和3两个版本,因此Anaconda也在Python2和Python3的基础上推出了两个发行版,即Anaconda2和Anaconda3。Python3被越来越多的开发者所接受,但让人尴尬的是很多遗留老系统依旧运行在Python2环境中,因此你不得不同时在两个版本中进行开发、调试。
如何在系统中同时共存Python2和Python3是开发者不得不面对的问题,Anaconda能完美解决Python2和Python3的共存问题。
conda是Anaconda下用于包管理和环境管理的命令行工具,是pip和vitualenv的组合。安装成功后conda会默认加入到环境变量中,因此可直接在命令行窗口运行conda命令。
如果你熟悉virtualenv,那么上手conda非常容易,不熟悉virtulenv的也没关系,它提供的命令就几个,非常简单。我们可以利用conda的虚拟环境管理功能在Python2和Python3之间自由切换。
多版本切换
#基于python3.6创建一个名为test_py3的环境condacreate--nametest_py3python=3.6#基于python2.7创建一个名为test_py2的环境condacreate--nametest_py2python=2.7#激活test环境activatetest_py2#windowssourceactivatetest_py2#linux/mac#切换到python3activatetest_py3快速安装
Anaconda可用于多个平台(Windows、MacOSX和Linux)。
选择合适自己的版本下载,建议下载Python3。
下载好以后你只需要傻瓜式的安装即可。
第一个Python代码
启动Anaconda之后,你会看到这样的界面,我推荐使用jupyternotebook编写,点击launch。
jupyternotebook打开的是一个网址形式的界面,点击右上角的new创建第一个Python文件吧。
jupyter支持很多种文本格式,code、markdown、RawNBConvert、Heading。
常用的就是code和markdown了,你可以同时在一个Python文件中写code和md。你也可以直接用jupyter打开。
SpyderVSPyCharm
Spyder是Anaconda自带的一款编辑器。
相比较而言,Pycharm用起来更便捷,虽然Spyder中所有的变量也都能显示,方便调试,里边还有ipythonnotebook。但是很细节的一些代码还是Pycharm更便捷一些。
强烈推荐Anaconda+Pycharm组合。因为Anaconda安装的时候已经默认为你安装了一大堆做数据分析常用的包,所以,直接在Pycharm中把默认解释器改为Anaconda中的Python即可。
另外,只是针对数据分析与机器学习,Anaconda用起来更方便一些,对于Python的其他用途,比如爬虫、Web开发,Pycharm更好一些。针对大型的Web框架修改调试,还是需要个大型IDE。
詹妮弗
最近看了FlaskWeb开发:基于Python的Web应用开发实战,书中详细介绍了Web程序的开发、测试、部署过程,值得一读!我在书中例子的基础上做了些更改,实现了一个简单的个人博客:NiceBlog,仅作为个人学习,还有许多不足的地方待完善,这里做一些简单的记录,方便以后查阅
也希望看到积极留言
一、功能
1、对于普通用户,主要有如下功能:
2、对于管理员,除了有普通用户的功能,主要有如下功能:
二、项目结构
三、实现
1、工厂函数
一个简单的FlaskWeb程序可以写在单文件中,
test.py
:
app=Flask(__name__)#定义的路由@app.route('/')defindex():return'
HelloWorld!
'if__name__=='__main__':app.run()
但是执行程序时,由于在全局作用域创建导致无法动态修改配置,也导致了单元测试时无法在不同配置环境运行程序。所以可以把程序的创建转移到可显示调用的工厂函数中,也就是前边项目结构中的
__init__.py
,在工厂函数中导入需要的Flask扩展:
defcreate_app(config_name):app=Flask(__name__)#导致指定的配置对象app.config.from_object(config[config_name])#调用config.py的init_app()config[config_name].init_app(app)#初始化扩展bootstrap.init_app(app)mail.init_app(app)moment.init_app(app)db.init_app(app)login_manager.init_app(app)pagedown.init_app(app)returnapp
2、蓝本
新的问题来了,使用工厂函数后,程序在运行时创建,而不是在全局作用域,必须等到执行
create_app()
后才能使用
@app.route()
装饰器,这时就要使用蓝本了,在蓝本中也可以定义路由,但是定义的路由处于休眠状态直到蓝本注册到程序后在成为程序一部分,例如main蓝本的目录结构如下:|-NiceBlog|-app/主目录|-main/主体功能的蓝本|-__init__.py创建蓝本|-errors.py蓝本的错误处理|-forms.py蓝本的表单|-views.py蓝本的路由
首先看一下
#两个参数分别指定蓝本的名字、蓝本所在的包或模块(使用__name__即可)main=Blueprint('main',__name__)#导入路由模块、错误处理模块,将其和蓝本关联起来#在蓝本的末尾导入在两个模块里还要导入蓝本,防止循环导入依赖fromapp.mainimportviews,errors
2.1、表单
forms.py
是当前蓝本中的表单,项目中使用了
FlaskForm
2.2、路由
views.py
就是在蓝本中定义的路由,例如主页的路由:
注意装饰器为当前蓝本的名字
main
,而不是之前的
app
。
create_blog()
称为视图函数,一个路由保存了URL到视图函数的映射关系。
redirect(url_for('main.index'))
代表重定向到主页,
url_for()
的参数为要跳转到的URL对应的视图函数名,但需要加上视图函数所在的蓝本名,即
main.index
render_template()
是Flask提供的函数,把
Jinja2
模板引擎集成到了程序中,第一个参数是模板名称对应一个html文件,即执行该视图函数后最终要渲染的页面,后边的参数为传递给模板的参数。
2.3、错误处理
errors.py
是蓝本中的错误处理程序,例如:
@main.app_errorhandler(404)defpage_not_found(e):ifrequest.url.find('api')!=-1:returnjsonify({'error':'请求的资源不存在','code':'404','data':''})returnrender_template('error/404.html'),404
如果使用
@main.errorhandler
装饰器只有当前蓝本的错误才能触发,为了使其他错误也能触发所以使用了
@main.app_errorhandler
装饰器
2.4、注册蓝本
其它蓝本的定义也类似,最后需要在工厂函数中重注册蓝本,例如:
defcreate_app(config_name):#......#注册main蓝本fromapp.mainimportmainasmain_blueprintapp.register_blueprint(main_blueprint)#注册auth蓝本fromapp.authimportauthasauth_blueprint#使用url_prefix注册后,蓝本中定义的所有路由都会加上指定前缀,/login-->/auth/loginapp.register_blueprint(auth_blueprint,url_prefix='/auth')returnapp
3、前端
3.1、Jinja2
Flask使用
作为模板引擎,模板是一个包含响应文本的HTML文件,其中包含只有在请求的上下文才知道的动态占位变量。默认情况下,模板保存在
templates
目录。
在
模板中
{{变量名}}
代表一个变量(注意变量名两边有一个空格,可以识别任意类型的变量),从渲染模板时使用的数据中获取。如果变量的值是HTML,由于转义的原因导致浏览器不能正常显示HTML代码,所以需要使用
safe
{{变量名|过滤器名}}
中用
{%控制语句%}
代表控制结构来改变模板的渲染流程,例如:
#条件控制{%ifxxx%}
Android
{%else%}
iOS
{%endif%}
#for循环{%forxinxs%}
{{x}}
{%endfor%}
#导入{%import'xxx.html'%}
#包含{%include'xxx.html'%}
导入、包含的目的都是为了复用,还可以通过继承实现复用,类似于类的继承:
#继承{%extends"base.html"%}
通过继承,模板中重复的代码都可以写在父模板里,例如导航条和页面底部footer就可以放在父模板里。
3.2、Bootstrap
Flask-Bootstrap
扩展,直接在PyCharm安装,并在工厂函数中初始化,还要让项目的父模板继承Bootstrap的基类模板:
#common_base.html{%extends"bootstrap/base.html"%}
Bootstrap的基类模板
base.html
提供了一个网页框架,包含了Bootstrap中的所有CSS和JS文件。除此之外基类模板还定义了许多可在其子类模板中重定义的块,使用格式如下:
{%block块名称%}{%endblock%}
常用的块如下:
块名称
含义
head标签中的内容
title
标签中的内容
body标签中的内容
stylescss样式单的定义
navbar自定义的导航条
content自定义的页面内容
page_content定义content在内部
注意如在子模板在模板已有的块中添加新内容,需要使用
super()
函数:
{%blockscripts%}{{super()}}{%endblock%}
3.3、Flask-WTF
在2.1中我们已经看到了用
Flask-WTF
定义表单的方式,即自定义的表单类继承
类,并添加需要的类变量,
定义了许多标准字段可以被渲染成指定的表单类HTML标签,例如:
字段名
对应的H5标签
StringField文本框
TextAreaField多行文本框
PasswordField密码输入框
BooleanField复选框
SubmitField表单提交按钮
同时
还提供了许多常用的表单校验函数,例如:
Email()
、
EqualTo()
DataRequired()
Length()
等等,当点击提交按钮时,会自动校验表单是否满足预定义的条件。
在2.2中,我们通过参数把表单类的实例同步
form
参数传入模板:
render_template('markdown_editor.html',form=form,type='create')
在模板中可以通过如下方式生表单(只保留了部分核心代码):
{{form.hidden_tag()}}{{form.title(id="title",class="form-controleditor-blog-title",placeholder=form.title.label.text)}}{{form.labels(class="form-controleditor-blog-area",placeholder=form.labels.label.text)}}{{form.summary(class="form-controleditor-blog-area",placeholder=form.summary.label.text,rows=3)}}{{form.publish(class="btnbtn-info")}}{{form.save(class="btnbtn-success")}}
这样的好处是我们能自定义表单的样式等等,但是工作量蛮大的,如果对表单样式没有特殊的需求,Bootstrap中的表单样式可以满足需求,可以通过
提供的辅助函数快速的渲染表单,只需要如下两步:
{%import"bootstrap/wtf.html"aswtf%}{{wtf.quick_form(form)}}
form.hidden_tag()
模板参数将被替换为一个隐藏字段,用来实现在配置中激活的CSRF保护。如果你已经激活了CSRF,这个字段需要出现在你所有的表单中。
在2.2中,如果点击表单提交按钮,所有的表单都能成功通过校验,则
form.validate_on_submit()
的值为
True
data
属性为
则代表该按钮被点击,例如:
ifform.publish.data:#发布elifform.save.data:#保存草稿
3.4、jQuery
jQuery
强大的选择器功能可以方便的得到要操作的
DOM节点
,按钮的点击也是发起一个请求,
也集成了
ajax
,可以方便的处理请求,在请求完成后根据响应结果来更改
的样式。看下按钮的点击事件:
favourite=function(id){if($('.blog-favourite-btn').length>0){//取消喜欢$.get('/manage/blog/cancel_favourite',{id:id}).done(function(data){$('.blog-favourite-btnspan').removeClass('glyphicon-heart').addClass('glyphicon-heart-empty');$('.blog-favourite-btn').removeClass('blog-favourite-btn').addClass('blog-unfavourite-btn');})}elseif($('.blog-unfavourite-btn').length>0){//喜欢$.get('/manage/blog/favourite',{id:id}).done(function(data){if('200'===data){$('.blog-unfavourite-btnspan').removeClass('glyphicon-heart-empty').addClass('glyphicon-heart');$('.blog-unfavourite-btn').removeClass('blog-unfavourite-btn').addClass('blog-favourite-btn');}if('403'===data){alert('没有操作权限');}})}}
4、Markdown
书中使用的是
Flask-PageDown
Markdown
两个库来实现对Markdown功能的支持,但是不够理想,有些Markdown语法并不能很好的支持,例如
肯定难以实现理想的效果,这里使用了ace,它是一个用JavaScript编写的独立代码编辑器,下载