列举Python中吸引人的一些特性


Posted in Python onApril 09, 2015

这里我不讨论 python 的一些有用的库或者框架,只从语言本身,最小支持的情况下谈论这门语言本身。语言的发展都是越来越接近Lisp,这也是Lisp这门语言伟大的原因。

下面我罗列一下我学习 python 的原因:
多编程范式

python是一门多范式的编程语言,所谓的过程式,面向对象和函数式的结合。

大部分人接触编程语言都是从过程式开始的,原因是因为过程式的程序方式与计算机运行方式是统一的,指令序列与运行过程是统一的。如典型的C,我也是从C开始学习的,过程式的程序语言设计编写程序较为简单,但是符合人机交互思考方式。

python虽然是一门面向对象语言,就连“ ”(空格)也可以看做是一个对象,但是python胜任过程式是没有问题的。

如不需要使用类的静态方法:

def a_plus_b(a,b):
 return a+b

1. Duck typing

Python在设计的时候将其当做一门面向对象的方式编写,且不说面向对象给软件设计带来的一些革命等,在python这样的动态语言中面向对象有一个亮点就是Duck typing(鸭子类型)。

关于鸭子类型,就是说,如果我认为一个抽象的东西会游泳会“嘎嘎”叫,我就可以把它当做鸭子。

def use_duck( Duck ):
 Duck.swim()
 
Duck.gaga()
 class Duck:
 
def swim(self):
 

...
 
def gaga(self):
 

...

如果这样使用:
 little_duck = Duck()
 use_duck( little_duck )

关于Duck类,你可以给他取任何的名字,或者继承它取另一个名字,只需要实现 swim() gaga() 你就可以把它当做鸭子。

关于鸭子类型,很多人不理解为什么不需要提供一个接口来规定鸭子的行为,我既不支持也不反对,我的观点是这样的:

  •     对于参数的检查,不符合动态语言的特性
  •     提供了接口规范,那就不是鸭子类型了,直接叫多态得了

2. Python支持的函数式编程

首先是lambda 演算。

函数式编程的定义是将函数看做是变量一样的待遇,变量在程序中最简单的有什么待遇呢?

  •     可以赋值
  •     可以作为参数
  •     可以改变值(Erlang例外)
  •     且不说生命周期了和作用域了

λ演算背后蕴含着计算机可计算性的深厚知识,lambda也是图灵模型,是停机问题的一个否定答案,不仅仅是一个匿名函数那样简单。

关于 lambda 演算,看看这个程序做了什么:

map(lambda n:2*n,[1,2,3,4,5])

    lambda n:2*n 本身作为一个匿名函数
    lambda 本身作为一个参数传入 map()函数,这也就是说我的高阶函数,可以将函数变身看成是一个变量作为参数传递,这也是它作为函数受到的高等待遇

关于赋值和改变值,两种方式:

    f = fun() 不改变函数状态,只改变名称,但是说明函数是可以赋值的
    可以使用闭包作为改变函数的状态方式,或者使用装饰器来完成函数状态改变

函数式编程的使用也可以提高程序的可读性和减少代码,而且能够清晰的表达函数的功能,如MapReduce就是来自函数式编程的思想:

Map(func,List)

作用是将func 作用于List中的每一个元素。

以刚才的例子举例:

map(lambda n:2*n,[1,2,3,4,5])

此函数返回

[2,4,6,8,10]

重要的是在于知道这样的方式带给我们的清晰的设计方式。

当然函数式编程不是那么几句话就说完的,理解函数式编程的核心是理解 λ演算。
一些有意思的特性

1. 惰性计算:

看看完成一个斐波那契数列 python 可以怎么做:

>>> def fib():
   a , b = 0 ,1
   while 1:
     yield b
     a , b = b ,a+b
 
 >>> f = fib()

实际上由yield 生成了一个可迭代对象,每次调用f.next()就可以产生一个斐波那契值,而函数的内部状态是由迭代对象存储的。至于返回一个可迭代对象,如果需要确定迭代到多少位,可以使用 itertools.islice。

2. 协程

协程也是一个基于yield的概念,主要的模式是微线程的协作式工作模式:

def coroutine(func):
   def ret():
     f = func()
     f.next()
     return f
   return ret
 
 @coroutine
 def consumer():
   print "Wait to getting a task"
   while 1:
     n = (yield)
     print "Got %s",n
  
 import time
 def producer():
   c = consumer()
   while 1:
     time.sleep(1)
     print "Send a task to consumer"
     c.send("task")
  
 if __name__ == "__main__":
 producer()

协程带来的好处是可以直接调度你的线程,这也是它为什么叫做协程而不是线程的原因,线程属于抢占式并发,协程属于协作式并发。
动态语言带来的好处

从程序设计带来的快感(我相信只有热爱这方面的人才有的感觉)来说,动态语言,比如python,节约了更多的时间可以用来陪女朋友或者老婆,或者老公。

当然,作为互联网时代快速开发来说,赶鸭子上线,也是《黑客与画家》上面介绍的,快速开发很重要,当然需要符合这方面的需求。

动态语言的CPU密集型运算必然比不过C/C++。

总之:人生苦短,我用python。

Python 相关文章推荐
用python实现的去除win下文本文件头部BOM的代码
Feb 10 Python
基于Django模板中的数字自增(详解)
Sep 05 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
Apr 05 Python
Pycharm 操作Django Model的简单运用方法
May 23 Python
python实现画一颗树和一片森林
Jun 25 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
Python写一个基于MD5的文件监听程序
Mar 11 Python
python五子棋游戏的设计与实现
Jun 18 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
简单分析python的类变量、实例变量
Aug 23 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
Nov 02 Python
Python使用tkinter实现小时钟效果
Feb 22 Python
Python的Bottle框架的一些使用技巧介绍
Apr 08 #Python
在Python的框架中为MySQL实现restful接口的教程
Apr 08 #Python
简单介绍Python的轻便web框架Bottle
Apr 08 #Python
常见的在Python中实现单例模式的三种方法
Apr 08 #Python
分析Python的Django框架的运行方式及处理流程
Apr 08 #Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
Apr 08 #Python
在Python中使用NLTK库实现对词干的提取的教程
Apr 08 #Python
You might like
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
2014/10/30 PHP
PHP统一页面编码避免乱码问题
2015/04/09 PHP
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
js中Image对象以及对其预加载处理示例
2013/11/20 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
JavaScript中的条件判断语句使用详解
2015/06/03 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
2016/08/15 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
javascript中的with语句学习笔记及用法
2020/02/17 Javascript
python zip文件 压缩
2008/12/24 Python
python中ConfigParse模块的用法
2014/09/29 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
Python用K-means聚类算法进行客户分群的实现
2020/08/23 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
Lulu & Georgia官方网站:购买地毯、家具、抱枕、壁纸、床上用品等
2018/03/19 全球购物
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
美国精油公司:Plant Therapy
2019/05/17 全球购物
如何用JQuery进行表单验证
2013/05/29 面试题
实习医生自我评价
2013/09/22 职场文书
学校后勤人员职责
2013/12/27 职场文书
2014年健康教育实施方案
2014/02/17 职场文书
采购部长岗位职责
2014/06/13 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
2015年秋季校长开学典礼致辞
2015/07/29 职场文书
《植树问题》教学反思
2016/03/03 职场文书
美元符号 $
2022/02/17 杂记