Python的前世今生

采菊篱下 发表了文章 • 0 个评论 • 452 次浏览 • 2016-07-08 01:44 • 来自相关话题

一、Python是什么

Python是一种计算机程序设计语言。你可能在之前听说过很多编程语言,比如难学的C语言(语法和实现难度),非常流行的JAVA语言(尤其是现在分布式存储和服务),非常有争议的PHP(常见 WordPress 大多网站),前端HTML、JavaScripts、Node.JS、还有最近随着容器风行的Golang等等。那Python是What?

Python是由吉多·范罗苏姆(Guido van Rossum)在1989年的圣诞期间为了打发在阿姆斯特丹无聊的时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。

TIOBE 2016年6月编程语言排行榜,Python赶超PHP占据第四位!




前 10 名编程语言长期走势图:




由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到编程人员的喜爱和认可!!
 
Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。互联网公司广泛使用Python来做的事一般有:自动化运维、自动化测试、大数据分析、爬虫、Web 等。

二、Python的分类

Cpython:Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。
 Jyhton:Python的Java实现,Jython会将Python代码动态编译成Java字节码,然后在JVM上运行。


 IronPython:Python的C#实现,IronPython将Python代码编译成C#字节码,然后在CLR上运行。(与Jython类似)
 PyPy:Python实现的Python,将Python的字节码字节码再编译成机器码。RubyPython、Brython ...等等
 
以上除PyPy之外,其他的Python的对应关系和执行流程如下:
 




PyPy,在Python的基础上对Python的字节码进一步处理,从而提升执行速度!





三、为什么要学Python

Python实用简单、高效、易入门(其实想深入还是挺难的)。不同的语言做相同的事情,编程的效率和代码数也不一样。比如完成同一个任务C语言可能需要写100行,Jave语言50行,但是Python可能 10行就能做到。
 
C 和 Python、Java、C#相比:C语言: 代码编译得到 机器码 ,机器码在处理器上直接执行,每一条指令控制CPU工作

其他语言: 代码编译得到 字节码 ,虚拟机执行字节码并转换成机器码再后在处理器上执行
 Python 和 C相比:(Python这门语言是由C开发而来)对于使用:Python的类库齐全并且使用简洁,如果要实现同样的功能,Python 10行代码可以解决,C可能就需要100行甚至更多.

对于速度:Python的运行速度相较与C,绝逼是慢了。
Python 和 Java、C#相比:对于使用:Linux原装Python,其他语言没有;以上几门语言都有非常丰富的类库支持

对于速度:Python在速度上可能稍显逊色
Python和PHP相比:Python提供了丰富的数据结构,非常容易和c集成。相比较而言,php集中专注在web上。 php大多只提供了系统api的简单封装,但是python标准包却直接提供了很多实用的工具。python的适用性更为广泛,php在web更加专业,php的简单数据类型,完全是为web量身定做。 所以,Python和其他语言没有什么本质区别,其他区别在于:擅长某领域、人才丰富、先入为主。还是那句话,不在于你用哪种语言,而在于用的人。
 
时间匆匆,选择一门你喜欢的语言就赶快学习吧,别等你老了!
参考银角大王:http://www.cnblogs.com/wupeiqi/articles/4906230.html
  查看全部


一、Python是什么


Python是一种计算机程序设计语言。你可能在之前听说过很多编程语言,比如难学的C语言(语法和实现难度),非常流行的JAVA语言(尤其是现在分布式存储和服务),非常有争议的PHP(常见 WordPress 大多网站),前端HTML、JavaScripts、Node.JS、还有最近随着容器风行的Golang等等。那Python是What?

Python是由吉多·范罗苏姆(Guido van Rossum)在1989年的圣诞期间为了打发在阿姆斯特丹无聊的时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。

TIOBE 2016年6月编程语言排行榜,Python赶超PHP占据第四位
langtop.png

前 10 名编程语言长期走势图:
langstatus.png

由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到编程人员的喜爱和认可!!
 
Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。互联网公司广泛使用Python来做的事一般有:自动化运维、自动化测试、大数据分析、爬虫、Web 等。


二、Python的分类


Cpython:
Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。

 Jyhton:
Python的Java实现,Jython会将Python代码动态编译成Java字节码,然后在JVM上运行。


 IronPython:
Python的C#实现,IronPython将Python代码编译成C#字节码,然后在CLR上运行。(与Jython类似)

 PyPy:
Python实现的Python,将Python的字节码字节码再编译成机器码。
RubyPython、Brython ...等等
 
以上除PyPy之外,其他的Python的对应关系和执行流程如下:
 
PySet.png

PyPy,在Python的基础上对Python的字节码进一步处理,从而提升执行速度!
PyPy.png


三、为什么要学Python


Python实用简单、高效、易入门(其实想深入还是挺难的)。不同的语言做相同的事情,编程的效率和代码数也不一样。比如完成同一个任务C语言可能需要写100行,Jave语言50行,但是Python可能 10行就能做到。
 
C 和 Python、Java、C#相比:
C语言: 代码编译得到 机器码 ,机器码在处理器上直接执行,每一条指令控制CPU工作

其他语言: 代码编译得到 字节码 ,虚拟机执行字节码并转换成机器码再后在处理器上执行

 Python 和 C相比:(Python这门语言是由C开发而来)
对于使用:Python的类库齐全并且使用简洁,如果要实现同样的功能,Python 10行代码可以解决,C可能就需要100行甚至更多.

对于速度:Python的运行速度相较与C,绝逼是慢了。

Python 和 Java、C#相比:
对于使用:Linux原装Python,其他语言没有;以上几门语言都有非常丰富的类库支持

对于速度:Python在速度上可能稍显逊色

Python和PHP相比:
Python提供了丰富的数据结构,非常容易和c集成。相比较而言,php集中专注在web上。 php大多只提供了系统api的简单封装,但是python标准包却直接提供了很多实用的工具。python的适用性更为广泛,php在web更加专业,php的简单数据类型,完全是为web量身定做。 
所以,Python和其他语言没有什么本质区别,其他区别在于:擅长某领域、人才丰富、先入为主。还是那句话,不在于你用哪种语言,而在于用的人。
 
时间匆匆,选择一门你喜欢的语言就赶快学习吧,别等你老了!
参考银角大王:http://www.cnblogs.com/wupeiqi/articles/4906230.html
 

去掉Wecenter标题多余的br

回复

OpenSkill 发起了问题 • 1 人关注 • 0 个回复 • 519 次浏览 • 2016-07-07 22:11 • 来自相关话题

你应该了解的Python大法武功秘籍

采菊篱下 发表了文章 • 0 个评论 • 452 次浏览 • 2016-07-06 00:33 • 来自相关话题

一、Python基础学习秘籍

技术从何学,一切以基础开始,只有你基础学得越好,后面的学习才会越来越轻松,否则后面高级的学习,你还在回想基础的知识,心猿意马,狗熊掰苞米,得不偿失,所以打好基础是很重要,会让你后面的学习事半功倍,开篇Python大法的基础知识秘籍如下:





二、Python自动化开发秘籍

马步抓稳了,我们可以深入的学习武功心法,要想打通你的Python大法学习筋脉,首先你得有深厚的Python大法的基础的底子,你还得有懒人的思想。其实要想让自己变懒,而且还把钱给挣了,那就是工具自动化,提高你的工作效率,同时降低你的工作重复度,简化你的工作,解放你的生活,周末就可以去撩妹,不用去加班了!下面就把Python大法的自动化秘籍献给大家。





三、Python全栈开发秘籍

全栈是What?Full Stack?全栈可能是每个开发者的最终目标,作为Python大法的爱好者,我想深入学习做为一个Python开发全栈工程师,你怎么着也得会点算法,怎么着也得会点数据结构,你还得会。。。。。。,怎么着,全栈你就得会打得了打BOSS,也得做得了Close Bug,你还得会独立思考,想登峰造极做太极中的张三丰,还得不断学习啊,下面全栈的秘籍也给大家,学到学不到,靠自己。




 
最后我再来张图,娱乐一下大众,学并快乐着!




其实用什么语言不是最重要的,重要的是用的人和他做事的思路和大局观。 查看全部


一、Python基础学习秘籍


技术从何学,一切以基础开始,只有你基础学得越好,后面的学习才会越来越轻松,否则后面高级的学习,你还在回想基础的知识,心猿意马,狗熊掰苞米,得不偿失,所以打好基础是很重要,会让你后面的学习事半功倍,开篇Python大法的基础知识秘籍如下:
Python_基础学习路线图.png


二、Python自动化开发秘籍


马步抓稳了,我们可以深入的学习武功心法,要想打通你的Python大法学习筋脉,首先你得有深厚的Python大法的基础的底子,你还得有懒人的思想。其实要想让自己变懒,而且还把钱给挣了,那就是工具自动化,提高你的工作效率,同时降低你的工作重复度,简化你的工作,解放你的生活,周末就可以去撩妹,不用去加班了!下面就把Python大法的自动化秘籍献给大家。
Python_自动化开发路线图.png


三、Python全栈开发秘籍


全栈是What?Full Stack?全栈可能是每个开发者的最终目标,作为Python大法的爱好者,我想深入学习做为一个Python开发全栈工程师,你怎么着也得会点算法,怎么着也得会点数据结构,你还得会。。。。。。,怎么着,全栈你就得会打得了打BOSS,也得做得了Close Bug,你还得会独立思考,想登峰造极做太极中的张三丰,还得不断学习啊,下面全栈的秘籍也给大家,学到学不到,靠自己。
Python_全栈开发路线图.png

 
最后我再来张图,娱乐一下大众,学并快乐着!
GoodPython.png

其实用什么语言不是最重要的,重要的是用的人和他做事的思路和大局观。

14流行的基于JavaScript的数据可视化工具

push 发表了文章 • 0 个评论 • 512 次浏览 • 2016-05-11 21:58 • 来自相关话题

俗话说,一图胜千言。图形化的信息可以让人们对数据有更加直观清晰的理解,让信息发布者更加高效地展示自己的核心内容。在前端开发中,如果缺少合适工具,制作数据可视化图表会十分复杂。然而随着数据可视化概念逐年火热,有较多优秀的图表开源库和制作工具脱颖而出。下面,我们就拿其中比较有名的 14个产品进行简要介绍。
 
AnyChart(http://www.anychart.com/ )
AnyChart 是基于 Flash/JavaScript(HTML5) 的图表解决方案,它可以轻松地跨浏览器、跨平台工作。除了基础的图表功能外,它还有收费的交互式图表和仪表功能。它可以通过 XML 格式获取数据,该方式让开发人员非常灵活地控制图表上的每一个数据点,而当图表数据点数量偏大时,则可以采用 CSV 数据输入,减小数据文件大小和图表加载时间。
 
AmCharts(http://www.amcharts.com/ )
AmCharts 是一款高级图表库,致力于对 Web 上的数据可视化提供支持。它所支持的图表包括柱状图、条状图、线图、蜡烛图、饼图、雷达、极坐标图、散点图、燃烧图和金字塔图等等。amCharts 库是一款完全独立的类库,在应用中不依赖任何其他第三方类库,就可直接编译运行。除了提供最基本的规范要素外,amCharts 还提供了交互特性。用户在浏览基于 amCharts 制作的图表时,用鼠标 hover 图表内容,可以与其进行交互,使图表展示细节信息,其中呈现信息的容器被叫做 Balloon(气球)。除此之外图表可以动态动画的形式被绘制出来,带来了了非常好的展示效果。
 
Cesium(http://cesiumjs.org/ )
Cesium 同样专注于地理数据可视化,它是一个 Javascript 库,可以在 Web 浏览器中绘制 3D/2D 地球。无需任何插件即可基于 WebGL 来进行硬件加速。除此之外,它还有跨平台、跨浏览器的特性。Cesium 本身基于 Apache 开源协议,支持商业及非商业项目。
 
Chart.js(https://gionkunz.github.io/chartist-js/ )
Chartist.js 是一个非常简单而且实用的 JavaScript 图表生成工具,它支持 SVG 格式,图表数据转换灵活,同时也支持多种图表展现形式。在工程中,Chartist.js 的 CSS 和 JavaScript 分离,因此代码比较简洁,在应用时配置流程十分简单。它生成的是响应式图表,可以自动支持不同的浏览器尺寸和分辨率,更多的是,它也支持自定义 SASS 架构。
 
D3.js(http://vis.stanford.edu/papers/d3 )
2011年,Mike Bostock、Vadim Ogievetsky 和 Jeff Heer 发布了 D3,它是目前 Web 端评价最高的 Javascript 可视化工具库。D3 能够向用户提供大量线性图和条形图之外的复杂图表样式,例如 Voronoi 图、树形图、圆形集群和单词云等等。它的优点是实例丰富,易于实现调试数据同时能够通过扩展实现任何想到的数据可视化效果,缺点是学习门槛比较高。与 jQuery 类似,D3 直接对 DOM 进行操作,这是它与其它可视化工具的主要区别所在:它会设置单独的对象以及功能集,并通过标准 API 进行 DOM 调用。
 
echarts(http://echarts.baidu.com/ )
一款免费开源的数据可视化产品,给用户提供直观、生动、可交互和可个性化定制的数据可视化图表。Echarts 上手简单。其具有的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,帮助用户在对数据挖掘、整合时大幅提高效率。同时,Echarts 提供了丰富的图表类型,除了常见的折柱饼,还支持地图、力导向图、treemap、热力图、树图等等。更惊艳的是,它还支持任意维度的堆积和多图表混合展现。总而言之,这是一款让我们非常惊喜的可视化产品,非常强大,不过他图表不是很美观,对移动端的支持也还有些欠缺,不过这些问题在官方最新发布的3.0 beta中得到了很大改善。
 
Flot(http://www.flotcharts.org/ )
Flot 是一个纯 Javascript 绘图库,作为 jQuery 的插件使用。它可以较为轻松地跨浏览器工作,甚至包括 IE6。因为 jQuery 的特性,开发者可以全面地控制图表的动画、交互,把数据的呈现过程优化得更加完美。
 
FusionCharts(http://www.fusioncharts.com/ )
FusionCharts Free 是可跨平台、跨浏览器的 Flash 图表解决方案,它能够被 ASP、.NET、PHP、JSP、ColdFusion、Ruby on Rails、简单 HTML 页面甚至 PPT 调用。在使用过程中,用户原则上并不需要知道任何 Flash 的知识,只需要了解你所用的编程语言,并进行简单的调用即可以实现应用。
 
Google Charts (https://developers.google.com/chart/)
有没有必要过多的介绍这里谷歌图表。 我相信大多数读者都熟悉这个工具,它是功能强大,易于使用,而且免费。
 
HighCharts( http://www.highcharts.com )
HighCharts是一个流行的JavaScript图表库。 它提供了一个简单易用的方式,以互动的图表(S)添加到您的网站或Web应用程序。 输出在现代浏览器和VML在Internet Explorer中使用SVG渲染。 图表精美动画眼帘自动,该框架还支持实时数据流。 更重要的是,它是免费下载和使用非商业(以及可授权用于商业用途)。 目前,它支持线,样条曲线,面积,areaspline,柱形图,条形图,饼图,散点图,角规,arearange,areasplinerange,columnrange,气泡,箱形图,误差线,漏斗,瀑布和极地图表类型。
 
Leaflet (http://leafletjs.com/ )
Leaflet是一个开源的JavaScript库,在所有主要的桌面和移动平台的作品。 单张使得它易于使用OpenStreetMap的数据,并在HTML5 / CSS3包装完全集成交互式数据可视化。 这是非常轻(仅为33KB),并有很多的功能作出任何种类的地图。 因此,常常被用于需要展示地理位置的项目。
 
MetricsGraphics( http://metricsgraphicsjs.org/ )
MetricsGraphics.js 是一个基于 D3,为可视化和时间序列化的数据而优化的库。它提供了一种便捷的方法,用一致且响应式方式来产生相同类型的图形。它现在支持折线图、散点图、直方图、地毯图和基本的线性回归图。同时,它体积非常小巧,通常可以控制在 60kb 之内。
 
Sigma.js( http://sigmajs.org )
Sigma.js是一个JavaScript库,这是专门为使用HTML5 canvas元素绘制图表。 这使得轻松地发布在网页上网络,并允许开发人员在富Web应用程序的网络整合的探索。 西格玛提供了很多不同的设置来轻松地自定义绘图的方式。 此外,公共的API,开发人员可以扩大如何与网络交互的可能性越大(如修改数据,移动相机,刷新渲染,监听事件)。
原文链接:
https://www.reddit.com/r/visualization/comments/3wat64/are_you_ready_for_the_era_of_big_data_14_popular 查看全部
俗话说,一图胜千言。图形化的信息可以让人们对数据有更加直观清晰的理解,让信息发布者更加高效地展示自己的核心内容。在前端开发中,如果缺少合适工具,制作数据可视化图表会十分复杂。然而随着数据可视化概念逐年火热,有较多优秀的图表开源库和制作工具脱颖而出。下面,我们就拿其中比较有名的 14个产品进行简要介绍。
 
AnyChart(http://www.anychart.com/ )
AnyChart 是基于 Flash/JavaScript(HTML5) 的图表解决方案,它可以轻松地跨浏览器、跨平台工作。除了基础的图表功能外,它还有收费的交互式图表和仪表功能。它可以通过 XML 格式获取数据,该方式让开发人员非常灵活地控制图表上的每一个数据点,而当图表数据点数量偏大时,则可以采用 CSV 数据输入,减小数据文件大小和图表加载时间。
 
AmCharts(http://www.amcharts.com/ )
AmCharts 是一款高级图表库,致力于对 Web 上的数据可视化提供支持。它所支持的图表包括柱状图、条状图、线图、蜡烛图、饼图、雷达、极坐标图、散点图、燃烧图和金字塔图等等。amCharts 库是一款完全独立的类库,在应用中不依赖任何其他第三方类库,就可直接编译运行。除了提供最基本的规范要素外,amCharts 还提供了交互特性。用户在浏览基于 amCharts 制作的图表时,用鼠标 hover 图表内容,可以与其进行交互,使图表展示细节信息,其中呈现信息的容器被叫做 Balloon(气球)。除此之外图表可以动态动画的形式被绘制出来,带来了了非常好的展示效果。
 
Cesium(http://cesiumjs.org/ )
Cesium 同样专注于地理数据可视化,它是一个 Javascript 库,可以在 Web 浏览器中绘制 3D/2D 地球。无需任何插件即可基于 WebGL 来进行硬件加速。除此之外,它还有跨平台、跨浏览器的特性。Cesium 本身基于 Apache 开源协议,支持商业及非商业项目。
 
Chart.js(https://gionkunz.github.io/chartist-js/ )
Chartist.js 是一个非常简单而且实用的 JavaScript 图表生成工具,它支持 SVG 格式,图表数据转换灵活,同时也支持多种图表展现形式。在工程中,Chartist.js 的 CSS 和 JavaScript 分离,因此代码比较简洁,在应用时配置流程十分简单。它生成的是响应式图表,可以自动支持不同的浏览器尺寸和分辨率,更多的是,它也支持自定义 SASS 架构。
 
D3.js(http://vis.stanford.edu/papers/d3 )
2011年,Mike Bostock、Vadim Ogievetsky 和 Jeff Heer 发布了 D3,它是目前 Web 端评价最高的 Javascript 可视化工具库。D3 能够向用户提供大量线性图和条形图之外的复杂图表样式,例如 Voronoi 图、树形图、圆形集群和单词云等等。它的优点是实例丰富,易于实现调试数据同时能够通过扩展实现任何想到的数据可视化效果,缺点是学习门槛比较高。与 jQuery 类似,D3 直接对 DOM 进行操作,这是它与其它可视化工具的主要区别所在:它会设置单独的对象以及功能集,并通过标准 API 进行 DOM 调用。
 
echarts(http://echarts.baidu.com/ )
一款免费开源的数据可视化产品,给用户提供直观、生动、可交互和可个性化定制的数据可视化图表。Echarts 上手简单。其具有的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,帮助用户在对数据挖掘、整合时大幅提高效率。同时,Echarts 提供了丰富的图表类型,除了常见的折柱饼,还支持地图、力导向图、treemap、热力图、树图等等。更惊艳的是,它还支持任意维度的堆积和多图表混合展现。总而言之,这是一款让我们非常惊喜的可视化产品,非常强大,不过他图表不是很美观,对移动端的支持也还有些欠缺,不过这些问题在官方最新发布的3.0 beta中得到了很大改善。
 
Flot(http://www.flotcharts.org/ )
Flot 是一个纯 Javascript 绘图库,作为 jQuery 的插件使用。它可以较为轻松地跨浏览器工作,甚至包括 IE6。因为 jQuery 的特性,开发者可以全面地控制图表的动画、交互,把数据的呈现过程优化得更加完美。
 
FusionCharts(http://www.fusioncharts.com/ )
FusionCharts Free 是可跨平台、跨浏览器的 Flash 图表解决方案,它能够被 ASP、.NET、PHP、JSP、ColdFusion、Ruby on Rails、简单 HTML 页面甚至 PPT 调用。在使用过程中,用户原则上并不需要知道任何 Flash 的知识,只需要了解你所用的编程语言,并进行简单的调用即可以实现应用。
 
Google Charts (https://developers.google.com/chart/)
有没有必要过多的介绍这里谷歌图表。 我相信大多数读者都熟悉这个工具,它是功能强大,易于使用,而且免费。
 
HighCharts( http://www.highcharts.com )
HighCharts是一个流行的JavaScript图表库。 它提供了一个简单易用的方式,以互动的图表(S)添加到您的网站或Web应用程序。 输出在现代浏览器和VML在Internet Explorer中使用SVG渲染。 图表精美动画眼帘自动,该框架还支持实时数据流。 更重要的是,它是免费下载和使用非商业(以及可授权用于商业用途)。 目前,它支持线,样条曲线,面积,areaspline,柱形图,条形图,饼图,散点图,角规,arearange,areasplinerange,columnrange,气泡,箱形图,误差线,漏斗,瀑布和极地图表类型。
 
Leaflet (http://leafletjs.com/ )
Leaflet是一个开源的JavaScript库,在所有主要的桌面和移动平台的作品。 单张使得它易于使用OpenStreetMap的数据,并在HTML5 / CSS3包装完全集成交互式数据可视化。 这是非常轻(仅为33KB),并有很多的功能作出任何种类的地图。 因此,常常被用于需要展示地理位置的项目。
 
MetricsGraphics( http://metricsgraphicsjs.org/ )
MetricsGraphics.js 是一个基于 D3,为可视化和时间序列化的数据而优化的库。它提供了一种便捷的方法,用一致且响应式方式来产生相同类型的图形。它现在支持折线图、散点图、直方图、地毯图和基本的线性回归图。同时,它体积非常小巧,通常可以控制在 60kb 之内。
 
Sigma.js( http://sigmajs.org )
Sigma.js是一个JavaScript库,这是专门为使用HTML5 canvas元素绘制图表。 这使得轻松地发布在网页上网络,并允许开发人员在富Web应用程序的网络整合的探索。 西格玛提供了很多不同的设置来轻松地自定义绘图的方式。 此外,公共的API,开发人员可以扩大如何与网络交互的可能性越大(如修改数据,移动相机,刷新渲染,监听事件)。
原文链接:
https://www.reddit.com/r/visualization/comments/3wat64/are_you_ready_for_the_era_of_big_data_14_popular

libmysqlclient.so.16: cannot open shared object file: No such file or directory

koyo 发表了文章 • 0 个评论 • 631 次浏览 • 2016-04-18 12:56 • 来自相关话题

PHP加载模块,报如下错误:libmysqlclient.so.16: cannot open shared object file: No such file or directory这是因为缺少MySQL-shared-compat 的包,系统找不到这个共享文件。
解决如下:
查看有没有装libmysqlclient.so.16:find / -name libmysqlclient.so.16,如果装了就:ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib/libmysqlclient.so.16注:/usr/local/mysql/lib/mysql/为libmysqlclient.so.16的路径。在/usr/lib/下建立个软链接。
 
如果没有安装则下载安装:
下载地址:http://rpm.pbone.net/index.php3/stat/3/limit/1/srodzaj/1/dl/40/search/mysql-shared/field/1/field/2
 
方法一:
下载libmysqlclient.so.16,放在/usr/lib下,如果是64位,则放在/usr/lib64下
 
方法二:
采用: MySQL-shared-compat 的rpm包。
运行命令:wget [url=http://ftp://mirror.switch.ch/pool/4/mirror/mysql/Downloads/MySQL-5.4/MySQL-shared-compat-5.4.3-0.rhel5.x86_64.rpm"]ftp://mirror.switch.ch/pool/4/mirror/mysql/Downloads/MySQL-5.4/MySQL-shared-compat-5.4.3-0.rhel5.x86_64.rpm[/url]rpm -ivh MySQL-shared-compat-5.4.3-0.rhel5.x86_64.rpm 查看全部
PHP加载模块,报如下错误:
libmysqlclient.so.16: cannot open shared object file: No such file or directory
这是因为缺少MySQL-shared-compat 的包,系统找不到这个共享文件。
解决如下:
查看有没有装libmysqlclient.so.16:find / -name libmysqlclient.so.16,如果装了就:
ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib/libmysqlclient.so.16
注:/usr/local/mysql/lib/mysql/为libmysqlclient.so.16的路径。在/usr/lib/下建立个软链接。
 
如果没有安装则下载安装:
下载地址:http://rpm.pbone.net/index.php3/stat/3/limit/1/srodzaj/1/dl/40/search/mysql-shared/field/1/field/2
 
方法一:
下载libmysqlclient.so.16,放在/usr/lib下,如果是64位,则放在/usr/lib64下
 
方法二:
采用: MySQL-shared-compat 的rpm包。
运行命令:
wget [url=http://ftp://mirror.switch.ch/pool/4/mirror/mysql/Downloads/MySQL-5.4/MySQL-shared-compat-5.4.3-0.rhel5.x86_64.rpm"]ftp://mirror.switch.ch/pool/4/mirror/mysql/Downloads/MySQL-5.4/MySQL-shared-compat-5.4.3-0.rhel5.x86_64.rpm[/url]
rpm -ivh MySQL-shared-compat-5.4.3-0.rhel5.x86_64.rpm 

PHPIZE CAN’T FIND PHP HEADERS IN /USR/INCLUDE/PHP

回复

chris 发起了问题 • 1 人关注 • 0 个回复 • 703 次浏览 • 2016-04-18 12:20 • 来自相关话题

php错误/usr/bin/ld:cannot find -lltdl

回复

Ansible 发起了问题 • 1 人关注 • 0 个回复 • 656 次浏览 • 2016-04-17 16:32 • 来自相关话题

Python关键字yield的解释

Rock 发表了文章 • 0 个评论 • 418 次浏览 • 2016-03-28 22:34 • 来自相关话题

提问者的问题​

Python关键字yield的作用是什么?用来干什么的?
比如,我正在试图理解下面的代码:def node._get_child_candidates(self, distance, min_dist, max_dist):
if self._leftchild and distance - max_dist < self._median:
yield self._leftchild
if self._rightchild and distance + max_dist >= self._median:
yield self._rightchild下面的是调用:result, candidates = list(), [self]
while candidates:
node = candidates.pop()
distance = node._get_dist(obj)
if distance <= max_dist and distance >= min_dist:
result.extend(node._values)
candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result当调用 _get_child_candidates 的时候发生了什么?返回了一个链表?返回了一个元素?被重复调用了么? 什么时候这个调用结束呢?

回答部分

为了理解什么是 yield,你必须理解什么是生成器。在理解生成器之前,让我们先走近迭代。

可迭代对象

当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象:>>> mylist = [1, 2, 3]
[quote]>> for i in mylist :
... print(i)
1
2
3mylist 是一个可迭代的对象。当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代的对象:>>> mylist = [x*x for x in range(3)]
>>> for i in mylist :
... print(i)
0
1
4所有你可以使用 for .. in .. 语法的叫做一个迭代器:链表,字符串,文件……你经常使用它们是因为你可以如你所愿的读取其中的元素,但是你把所有的值都存储到了内存中,如果你有大量数据的话这个方式并不是你想要的。

生成器

生成器是可以迭代的,但是你 只可以读取它一次 ,因为它并不把所有的值放在内存中,它是实时地生成数据:>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator :
... print(i)
0
1
4看起来除了把  换成 () 外没什么不同。但是,你不可以再次使用 for i inmygenerator , 因为生成器只能被迭代一次:先计算出0,然后继续计算1,然后计算4,一个跟一个的…

yield关键字

yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器。>>> def createGenerator() :
... mylist = range(3)
... for i in mylist :
... yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
... print(i)
0
1
4这个例子没什么用途,但是它让你知道,这个函数会返回一大批你只需要读一次的值.
 
为了精通 yield ,你必须要理解:当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象,这有点蹊跷不是吗。
 
那么,函数内的代码什么时候执行呢?当你使用for进行迭代的时候.
 
现在到了关键点了!
 
第一次迭代中你的函数会执行,从开始到达 yield 关键字,然后返回 yield 后的值作为第一次迭代的返回值. 然后,每次执行这个函数都会继续执行你在函数内部定义的那个循环的下一次,再返回那个值,直到没有可以返回的。
 
如果生成器内部没有定义 yield 关键字,那么这个生成器被认为成空的。这种情况可能因为是循环进行没了,或者是没有满足 if/else 条件。

回到你的代码

(译者注:这是回答者对问题的具体解释)
生成器:# Here you create the method of the node object that will return the generator
def node._get_child_candidates(self, distance, min_dist, max_dist):[/quote]

# Here is the code that will be called each time you use the generator object :

# If there is still a child of the node object on its left
# AND if distance is ok, return the next child
if self._leftchild and distance - max_dist < self._median:
yield self._leftchild

# If there is still a child of the node object on its right
# AND if distance is ok, return the next child
if self._rightchild and distance + max_dist >= self._median:
yield self._rightchild

# If the function arrives here, the generator will be considered empty
# there is no more than two values : the left and the right children调用者:# Create an empty list and a list with the current object reference
result, candidates = list(), [self]

# Loop on candidates (they contain only one element at the beginning)
while candidates:

# Get the last candidate and remove it from the list
node = candidates.pop()

# Get the distance between obj and the candidate
distance = node._get_dist(obj)

# If distance is ok, then you can fill the result
if distance <= max_dist and distance >= min_dist:
result.extend(node._values)

# Add the children of the candidate in the candidates list
# so the loop will keep running until it will have looked
# at all the children of the children of the children, etc. of the candidate
candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))

return result这个代码包含了几个小部分:
[]我们对一个链表进行迭代,但是迭代中链表还在不断的扩展。它是一个迭代这些嵌套的数据的简洁方式,即使这样有点危险,因为可能导致无限迭代。candidates.extend(node._get_child_candidates(distance, min_dist,max_dist)) 穷尽了生成器的所有值,但 while 不断地在产生新的生成器,它们会产生和上一次不一样的值,既然没有作用到同一个节点上.[/][]extend() 是一个迭代器方法,作用于迭代器,并把参数追加到迭代器的后面。[/]
通常我们传给它一个链表参数:>>> a = [1, 2]
[quote]>> b = [3, 4]
>>> a.extend(b)
>>> print(a)
[1, 2, 3, 4]但是在你的代码中的是一个生成器,这是不错的,因为:
[]你不必读两次所有的值[/][]你可以有很多子对象,但不必叫他们都存储在内存里面。[/]
并且这很奏效,因为Python不关心一个方法的参数是不是个链表。Python只希望它是个可以迭代的,所以这个参数可以是链表,元组,字符串,生成器... 这叫做 ducktyping,这也是为何Python如此棒的原因之一,但这已经是另外一个问题了...
 
你可以在这里停下,来看看生成器的一些高级用法

控制生成器的穷尽

>>> class Bank(): # let's create a bank, building ATMs
... crisis = False
... def create_atm(self) :
... while not self.crisis :
... yield "$100"
>>> hsbc = Bank() # when everything's ok the ATM gives you as much as you want
>>> corner_street_atm = hsbc.create_atm()
>>> print(corner_street_atm.next())
$100
>>> print(corner_street_atm.next())
$100
>>> print([corner_street_atm.next() for cash in range(5)])
['$100', '$100', '$100', '$100', '$100']
>>> hsbc.crisis = True # crisis is coming, no more money!
>>> print(corner_street_atm.next())
<type 'exceptions.StopIteration'>
>>> wall_street_atm = hsbc.create_atm() # it's even true for new ATMs
>>> print(wall_street_atm.next())
<type 'exceptions.StopIteration'>
>>> hsbc.crisis = False # trouble is, even post-crisis the ATM remains empty
>>> print(corner_street_atm.next())
<type 'exceptions.StopIteration'>
>>> brand_new_atm = hsbc.create_atm() # build a new one to get back in business
>>> for cash in brand_new_atm :
... print cash
$100
$100
$100
$100
$100
$100
$100
$100
$100
...对于控制一些资源的访问来说这很有用。

Itertools,你最好的朋友

itertools包含了很多特殊的迭代方法。是不是曾想过复制一个迭代器?串联两个迭代器?把嵌套的链表分组?不用创造一个新的链表的 zip/map?[/quote]

只要 import itertools

需要个例子?让我们看看比赛中4匹马可能到达终点的先后顺序的可能情况:>>> horses = [1, 2, 3, 4]
[quote]>> races = itertools.permutations(horses)
>>> print(races)
<itertools.permutations object at 0xb754f1dc>
>>> print(list(itertools.permutations(horses)))
[(1, 2, 3, 4),
(1, 2, 4, 3),
(1, 3, 2, 4),
(1, 3, 4, 2),
(1, 4, 2, 3),
(1, 4, 3, 2),
(2, 1, 3, 4),
(2, 1, 4, 3),
(2, 3, 1, 4),
(2, 3, 4, 1),
(2, 4, 1, 3),
(2, 4, 3, 1),
(3, 1, 2, 4),
(3, 1, 4, 2),
(3, 2, 1, 4),
(3, 2, 4, 1),
(3, 4, 1, 2),
(3, 4, 2, 1),
(4, 1, 2, 3),
(4, 1, 3, 2),
(4, 2, 1, 3),
(4, 2, 3, 1),
(4, 3, 1, 2),
(4, 3, 2, 1)]

了解迭代器的内部机理

迭代是一个实现可迭代对象(实现的是 __iter__() 方法)和迭代器(实现的是__next__() 方法)的过程。可迭代对象是你可以从其获取到一个迭代器的任一对象。迭代器是那些允许你迭代可迭代对象的对象。
更多见这个文章: http://effbot.org/zone/python-for-statement.htm
翻译编辑原文:http://pyzh.readthedocs.org/en/latest/the-python-yield-keyword-explained.html[/quote] 查看全部


提问者的问题​


Python关键字yield的作用是什么?用来干什么的?
比如,我正在试图理解下面的代码:
def node._get_child_candidates(self, distance, min_dist, max_dist):
if self._leftchild and distance - max_dist < self._median:
yield self._leftchild
if self._rightchild and distance + max_dist >= self._median:
yield self._rightchild
下面的是调用:
result, candidates = list(), [self]
while candidates:
node = candidates.pop()
distance = node._get_dist(obj)
if distance <= max_dist and distance >= min_dist:
result.extend(node._values)
candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result
当调用 _get_child_candidates 的时候发生了什么?返回了一个链表?返回了一个元素?被重复调用了么? 什么时候这个调用结束呢?


回答部分


为了理解什么是 yield,你必须理解什么是生成器。在理解生成器之前,让我们先走近迭代。


可迭代对象


当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象:
>>> mylist = [1, 2, 3]
[quote]>> for i in mylist :
... print(i)
1
2
3
mylist 是一个可迭代的对象。当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代的对象:
>>> mylist = [x*x for x in range(3)]
>>> for i in mylist :
... print(i)
0
1
4
所有你可以使用 for .. in .. 语法的叫做一个迭代器:链表,字符串,文件……你经常使用它们是因为你可以如你所愿的读取其中的元素,但是你把所有的值都存储到了内存中,如果你有大量数据的话这个方式并不是你想要的。


生成器


生成器是可以迭代的,但是你 只可以读取它一次 ,因为它并不把所有的值放在内存中,它是实时地生成数据:
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator :
... print(i)
0
1
4
看起来除了把  换成 () 外没什么不同。但是,你不可以再次使用 for i inmygenerator , 因为生成器只能被迭代一次:先计算出0,然后继续计算1,然后计算4,一个跟一个的…


yield关键字


yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器。
>>> def createGenerator() :
... mylist = range(3)
... for i in mylist :
... yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
... print(i)
0
1
4
这个例子没什么用途,但是它让你知道,这个函数会返回一大批你只需要读一次的值.
 
为了精通 yield ,你必须要理解:当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象,这有点蹊跷不是吗。
 
那么,函数内的代码什么时候执行呢?当你使用for进行迭代的时候.
 
现在到了关键点了!
 
第一次迭代中你的函数会执行,从开始到达 yield 关键字,然后返回 yield 后的值作为第一次迭代的返回值. 然后,每次执行这个函数都会继续执行你在函数内部定义的那个循环的下一次,再返回那个值,直到没有可以返回的。
 
如果生成器内部没有定义 yield 关键字,那么这个生成器被认为成空的。这种情况可能因为是循环进行没了,或者是没有满足 if/else 条件。


回到你的代码


(译者注:这是回答者对问题的具体解释)
生成器:
# Here you create the method of the node object that will return the generator
def node._get_child_candidates(self, distance, min_dist, max_dist):[/quote]

# Here is the code that will be called each time you use the generator object :

# If there is still a child of the node object on its left
# AND if distance is ok, return the next child
if self._leftchild and distance - max_dist < self._median:
yield self._leftchild

# If there is still a child of the node object on its right
# AND if distance is ok, return the next child
if self._rightchild and distance + max_dist >= self._median:
yield self._rightchild

# If the function arrives here, the generator will be considered empty
# there is no more than two values : the left and the right children
调用者:
# Create an empty list and a list with the current object reference
result, candidates = list(), [self]

# Loop on candidates (they contain only one element at the beginning)
while candidates:

# Get the last candidate and remove it from the list
node = candidates.pop()

# Get the distance between obj and the candidate
distance = node._get_dist(obj)

# If distance is ok, then you can fill the result
if distance <= max_dist and distance >= min_dist:
result.extend(node._values)

# Add the children of the candidate in the candidates list
# so the loop will keep running until it will have looked
# at all the children of the children of the children, etc. of the candidate
candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))

return result
这个代码包含了几个小部分:
    []我们对一个链表进行迭代,但是迭代中链表还在不断的扩展。它是一个迭代这些嵌套的数据的简洁方式,即使这样有点危险,因为可能导致无限迭代。candidates.extend(node._get_child_candidates(distance, min_dist,max_dist)) 穷尽了生成器的所有值,但 while 不断地在产生新的生成器,它们会产生和上一次不一样的值,既然没有作用到同一个节点上.[/][]extend() 是一个迭代器方法,作用于迭代器,并把参数追加到迭代器的后面。[/]

通常我们传给它一个链表参数:
>>> a = [1, 2]
[quote]>> b = [3, 4]
>>> a.extend(b)
>>> print(a)
[1, 2, 3, 4]
但是在你的代码中的是一个生成器,这是不错的,因为:
    []你不必读两次所有的值[/][]你可以有很多子对象,但不必叫他们都存储在内存里面。[/]

并且这很奏效,因为Python不关心一个方法的参数是不是个链表。Python只希望它是个可以迭代的,所以这个参数可以是链表,元组,字符串,生成器... 这叫做 ducktyping,这也是为何Python如此棒的原因之一,但这已经是另外一个问题了...
 
你可以在这里停下,来看看生成器的一些高级用法


控制生成器的穷尽


>>> class Bank(): # let's create a bank, building ATMs
... crisis = False
... def create_atm(self) :
... while not self.crisis :
... yield "$100"
>>> hsbc = Bank() # when everything's ok the ATM gives you as much as you want
>>> corner_street_atm = hsbc.create_atm()
>>> print(corner_street_atm.next())
$100
>>> print(corner_street_atm.next())
$100
>>> print([corner_street_atm.next() for cash in range(5)])
['$100', '$100', '$100', '$100', '$100']
>>> hsbc.crisis = True # crisis is coming, no more money!
>>> print(corner_street_atm.next())
<type 'exceptions.StopIteration'>
>>> wall_street_atm = hsbc.create_atm() # it's even true for new ATMs
>>> print(wall_street_atm.next())
<type 'exceptions.StopIteration'>
>>> hsbc.crisis = False # trouble is, even post-crisis the ATM remains empty
>>> print(corner_street_atm.next())
<type 'exceptions.StopIteration'>
>>> brand_new_atm = hsbc.create_atm() # build a new one to get back in business
>>> for cash in brand_new_atm :
... print cash
$100
$100
$100
$100
$100
$100
$100
$100
$100
...
对于控制一些资源的访问来说这很有用。


Itertools,你最好的朋友


itertools包含了很多特殊的迭代方法。是不是曾想过复制一个迭代器?串联两个迭代器?把嵌套的链表分组?不用创造一个新的链表的 zip/map?[/quote]

只要 import itertools

需要个例子?让我们看看比赛中4匹马可能到达终点的先后顺序的可能情况:
>>> horses = [1, 2, 3, 4]
[quote]>> races = itertools.permutations(horses)
>>> print(races)
<itertools.permutations object at 0xb754f1dc>
>>> print(list(itertools.permutations(horses)))
[(1, 2, 3, 4),
(1, 2, 4, 3),
(1, 3, 2, 4),
(1, 3, 4, 2),
(1, 4, 2, 3),
(1, 4, 3, 2),
(2, 1, 3, 4),
(2, 1, 4, 3),
(2, 3, 1, 4),
(2, 3, 4, 1),
(2, 4, 1, 3),
(2, 4, 3, 1),
(3, 1, 2, 4),
(3, 1, 4, 2),
(3, 2, 1, 4),
(3, 2, 4, 1),
(3, 4, 1, 2),
(3, 4, 2, 1),
(4, 1, 2, 3),
(4, 1, 3, 2),
(4, 2, 1, 3),
(4, 2, 3, 1),
(4, 3, 1, 2),
(4, 3, 2, 1)]


了解迭代器的内部机理


迭代是一个实现可迭代对象(实现的是 __iter__() 方法)和迭代器(实现的是__next__() 方法)的过程。可迭代对象是你可以从其获取到一个迭代器的任一对象。迭代器是那些允许你迭代可迭代对象的对象。
更多见这个文章: http://effbot.org/zone/python-for-statement.htm
翻译编辑原文:http://pyzh.readthedocs.org/en/latest/the-python-yield-keyword-explained.html[/quote]

mac 终端python tab键自动补全(亲测可以)

chris 发表了文章 • 0 个评论 • 535 次浏览 • 2016-03-22 18:12 • 来自相关话题

#!/usr/bin/env python
# encoding: utf-8

import readline,rlcompleter

[size=16]# Indenting
[/size]
class TabCompleter(rlcompleter.Completer):
"""Completer that supports indenting"""
def complete(self, text, state):
if not text:
return (' ', None)[state]
else:
return rlcompleter.Completer.complete(self, text, state)

readline.set_completer(TabCompleter().complete)

[size=16]# Add autocompletion
[/size]
if 'libedit' in readline.__doc__:
readline.parse_and_bind("bind -e")
readline.parse_and_bind("bind '\t' rl_complete")
else:
readline.parse_and_bind("tab: complete")

[size=16]# Add history
[/size]
import os
histfile = os.path.join(os.environ["HOME"], ".pyhist")
try:
readline.read_history_file(histfile)
except IOError:
pass
import atexit
atexit.register(readline.write_history_file, histfile)
del histfile 查看全部
#!/usr/bin/env python
# encoding: utf-8

import readline,rlcompleter

[size=16]# Indenting
[/size]
class TabCompleter(rlcompleter.Completer):
"""Completer that supports indenting"""
def complete(self, text, state):
if not text:
return (' ', None)[state]
else:
return rlcompleter.Completer.complete(self, text, state)

readline.set_completer(TabCompleter().complete)

[size=16]# Add autocompletion
[/size]
if 'libedit' in readline.__doc__:
readline.parse_and_bind("bind -e")
readline.parse_and_bind("bind '\t' rl_complete")
else:
readline.parse_and_bind("tab: complete")

[size=16]# Add history
[/size]
import os
histfile = os.path.join(os.environ["HOME"], ".pyhist")
try:
readline.read_history_file(histfile)
except IOError:
pass
import atexit
atexit.register(readline.write_history_file, histfile)
del histfile
pythontab.png

学习python的几个好习惯

being 发表了文章 • 0 个评论 • 559 次浏览 • 2016-03-15 23:33 • 来自相关话题

随着Python在国内的发展,特别是在自动化运维领域,运维开发者99%使用python开发自动化运维平台;在软件行业里面使用python编程语言的公司会越来越多,那么在学习Python的过程中需要养成几个好习惯。下面我给大家分享几条:

缩进

由于跟其他编程语言的区别性,缩进在python编程中显得十分重要;在Python的代码块中必须使用相同数目的行首缩进空格数,否则会造成脚本运行错误,提示你格式不正确之类的信息。因此,在使用python语言写脚本的时候,保证缩进的一致性相当重要。




空格

虽然在python编程过程中,空行并不是Python语法的必需部分,但是,保持函数之间或类的方法之间用空行分隔,可以使得代码看起来更加清晰明了,也有利于后期的代码维护或重构。





注释

注释相对经常使用编程语言的人来说应该不是很陌生吧,主要因为注释不仅使得阅读代码的人容易理解,也让代码作者更好地定位代码函数等。python跟其它语言一样,注释在一些该注释的地方,可以让效率事半功倍。




源代码

python作为完全开源的语言,代码对于任何人都可以随意浏览。这种方式可以更好地帮助人们发现有利精简扼要的代码,在很多方面可以省去不必要的时间,因为觉得合适可以直接拿过来使用或者简单修改。经常看一下好的源代码,不仅会让你学习别人的编程方式,还在另一方面大大的帮助你更好地学习。

编程思想

使用任何一门编程语言,都需要保持很好的编程思想,对python来说也是一样的。学会创造使用适合自己的编程思想是至关重要的,因此,去多读一些讲解编程思想之类的书籍来充实自己吧。




多实践

学习任何一门编程语言都需要多做多写多看,通过不同的项目,来让自己得到更好的锻炼,相信是一件很棒的事情。在业余时间,经常的去敲写一些代码,也是很有意思的。




兴趣

兴趣是成功的一半,兴趣促使你更好地去使用学习编程语言,而不单单为了忙碌的工作。很多创造出编程语言的人来说,正时因为兴趣的使然,才成就了如此好的一些编程语言。 查看全部
随着Python在国内的发展,特别是在自动化运维领域,运维开发者99%使用python开发自动化运维平台;在软件行业里面使用python编程语言的公司会越来越多,那么在学习Python的过程中需要养成几个好习惯。
下面我给大家分享几条:


缩进


由于跟其他编程语言的区别性,缩进在python编程中显得十分重要;在Python的代码块中必须使用相同数目的行首缩进空格数,否则会造成脚本运行错误,提示你格式不正确之类的信息。因此,在使用python语言写脚本的时候,保证缩进的一致性相当重要。
sj.jpg


空格


虽然在python编程过程中,空行并不是Python语法的必需部分,但是,保持函数之间或类的方法之间用空行分隔,可以使得代码看起来更加清晰明了,也有利于后期的代码维护或重构。

kge.jpg


注释


注释相对经常使用编程语言的人来说应该不是很陌生吧,主要因为注释不仅使得阅读代码的人容易理解,也让代码作者更好地定位代码函数等。python跟其它语言一样,注释在一些该注释的地方,可以让效率事半功倍。
zs.jpg


源代码


python作为完全开源的语言,代码对于任何人都可以随意浏览。这种方式可以更好地帮助人们发现有利精简扼要的代码,在很多方面可以省去不必要的时间,因为觉得合适可以直接拿过来使用或者简单修改。经常看一下好的源代码,不仅会让你学习别人的编程方式,还在另一方面大大的帮助你更好地学习。


编程思想


使用任何一门编程语言,都需要保持很好的编程思想,对python来说也是一样的。学会创造使用适合自己的编程思想是至关重要的,因此,去多读一些讲解编程思想之类的书籍来充实自己吧。
bcsx.png


多实践


学习任何一门编程语言都需要多做多写多看,通过不同的项目,来让自己得到更好的锻炼,相信是一件很棒的事情。在业余时间,经常的去敲写一些代码,也是很有意思的。
jdit.png


兴趣


兴趣是成功的一半,兴趣促使你更好地去使用学习编程语言,而不单单为了忙碌的工作。很多创造出编程语言的人来说,正时因为兴趣的使然,才成就了如此好的一些编程语言。
xq.png