存档

文章标签 ‘python’

浅谈程序语言中的鸭子类型(Duck Typing)

2015年4月13日 没有评论

引子


今天在看Underscore的API文档时遇到了一个术语”Duck Typing”,面向对象的编程思想学习了这么久,竟然不知道这个术语是什么意思,赶紧google了一把脑补一下。

 

起源


wiki的解释来看,这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述:

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

 

阐释


wiki上的定义如下:

在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。

wiki上的定义比较绕口,个人的理解就是你不需要去严格地继承自某个类,但是你可以实现该类所具有的一些特征,让这个类即使是鸟,看起来像鸭子就行。

 

例子


个人经常用的动态语言就是Python和Javascript。所以分别找了这两个语言的例子帮助大家进行理解。

 

Python

Python的例子满大街都是,网上抄了一个,如下所示:

#coding=utf-8  
class Duck:  
    def quack(self):  
        print "Quaaaaaack!"  
 
class Bird:  
    def quack(self):  
        print "bird imitate duck."  
 
class Doge:  
    def quack(self):  
        print "doge imitate duck."  
 
def in_the_forest(duck):  
    duck.quack()  
 
duck = Duck()  
bird = Bird()  
doge = Doge()  
for x in [duck, bird, doge]:  
    in_the_forest(x)

这个例子实在简单,我就不多解释了,大意就是Duck,Bird以及Doge虽然没有继承自同一个父类,但是都具有quack方法。

 

Javascript

Javascript的例子来源于Stackoverflow,问题的回答者写的十分风趣,用流行的话说,就是萌萌哒…

链接如下:http://stackoverflow.com/questions/12762550/example-of-javascript-duck-typing

 

回顾Underscore


在Underscore的文档中,有这么一段话涉及到了Duck Typing:

Note: Collection functions work on arrays, objects, and array-like objects such asargumentsNodeList and similar. But it works by duck-typing, so avoid passing objects with a numeric length property. It’s also good to note that an each loop cannot be broken out of — to break, use _.find instead.

意思就是说underscore的collection相关的函数是由Duck typing的方式来编写的,不能传入带有length属性的对象,否则就不正常工作了。

OK,那么我们再来看下Underscore的源代码,我们找个比较简单的each函数来看下,下面的函数依赖于传入参数obj的length,如果obj是个数组的话,那当然没什么问题,但是如果传入参数是一个{length: 100},那就只能呵呵了。

_.each = _.forEach = function(obj, iteratee, context) {
    if (obj == null) return obj;
    iteratee = createCallback(iteratee, context);
    var i, length = obj.length;
    if (length === +length) {
      for (i = 0; i < length; i++) {
        iteratee(obj[i], i, obj);
      }
    } else {
      var keys = _.keys(obj);
      for (i = 0, length = keys.length; i < length; i++) {
        iteratee(obj[keys[i]], keys[i], obj);
      }
    }
    return obj;
  };

 

Python 2013 精彩回顾:新闻、好文和资源

2014年3月2日 没有评论

本文由 伯乐在线 - brightconan 翻译自 PyPix.com。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。

没想到2013年这么快就过去了,但是2013留给我们的却是互联网上很多优秀的文章、教程、经验以及开源项目。现在,就让我们来回顾一下2013年有关于Python的精彩的开发文章吧。趁着这些文章还没有过时,Python开发者们赶紧看过来了。

下面是有关于Python新闻,好文以及资源的列表。

干货十足,希望你喜欢!

好了废话不多说了,让我们赶紧切入正题…


新闻公告

让我们首先来回顾一下Python社区在2013年的新闻公告。

1. Heroku now supports different Python runtimes.

Heroku现在支持不同版本的Python环境了。只需要在runtime.txt中加入你所需要的Python版本信息,就能实现这个功能了,非常简单。默认的Python版本是64bit CPython 2.7.4。

(译者注:Heroku是一个PaaS平台,现在率属于Salesforce,这货现在支持Ruby,Java,Node.js,Python,Clojure,Scala。译者之前稍微玩过,不过感觉没有Redhat的Openshift好用,功能也没有Openshift强大,与其类似的概念是Google的Google App Engine,Redhat的Openshfit,新浪的Sina App Engine,百度的Baidu App Engine)

2. Two Scoops of Django

这本书是由Django爱好者Daniel Greenfeld和Audrey Roy共同编写的。这本书对于中级的Django开发者来说十分有用,包含了许多Django 1.5的最佳实践。

(译者注:相信玩Python的人大都知道或者玩过Django,译者觉得Django对于Web开发者来说的确足够敏捷,许多网站应该具有的功能Django都已经默认自带了。目前基于Django搭建的有大名鼎鼎的Instagram还有云计算领域著名的OpenStack项目)

3. Codeq: Static Analysis for Python Projects

这是一个非常酷的工具,能够对Python工程进行静态代码分析。还等什么,赶紧登陆GitHub来看看吧。目测该工程现在是以PEP8检查作为标准。

(译者注:该网站现在貌似不能访问,好悲剧:-(。不过译者可以推荐另一个静态代码分析工具叫SonarQube,译者用下来感觉非常不错。静态代码分析能够帮助开发者找出项目里面十分弱智的错误,最好将静态代码分析引入项目构建的过程中去,持续地去分析项目中的代码)

4. PyCon US 2013 Talk Videos

是不是错过了PyCon US 2013?不要烦恼了,所有的演讲都被录了下来,现在都放到了网上,大家都可以看到。非常感谢视频音频组和PyCon US组织者的辛勤劳动。

5. PythonMonk

这是学习Python的一系列免费的交互式的教程。非常不错!

6. Asyncio (Tulip) Merge Into Python 3.4

(译者注:Asyncio是Python3.4引入的一个支持异步IO的模块,Tulip是它的开发代号,该模块几乎是纯python实现的。利用python3.3+的 yield from 特性,可以轻松实现同步语法的异步IO,不必使用回调,译者网上搜了下,该模块的性能似乎比node.js还要好。)


精彩文章

1. Will Scientists ever move to Python 3?

科学家们会开始转向支持Python 3了吗?这篇文章里面作者讨论了这个不可能的任务:将Python 3引入到整个科学届社区。

(译者注:Python 3已经发布了好几年了,但是现在的事实就是Python 3还不足够稳定,还有一坨package没有完全迁移到Python 3上来)

2.A guide to Python frameworks for Hadoop

Hadoop上的Python框架指南。现在每个人都在讨论大数据,而Hadoop就是处理大数据集的最常用的工具。这篇文章将会向你详细介绍Hadoop上的流行的Python框架。

(译者注:这篇文章是写在cloudera的blog上的,cloudera目前来讲应该是大数据领域做得比较成功的startup,值得一读)

3. An introduction to pytest

对pytest的介绍。目前Python的世界里面有许多测试框架,pytest就是其中比较出众的一个。本文是介绍pytest的比较精彩的文章,值得一读。

4. Realtime Django Using Node.js and Redis

使用Node.js和Redis构建实时的Django。本文将介绍如何使用Django,redis和node.js构建实时的应用。

5. Python shortcuts for the Python beginner

Python初学者快速入门。本文对于其他编程语言转到Python的初学者来说非常实用。

6. Of being lazy

本文讨论如何用Python去实现延迟载入,在实现的同时却并不复杂。

7. Better Typography for iPython Notebooks

非常实用的文章,教你怎样使用一点点CSS提高iPython Notebook的可读性和排版美观。

(译者注:译者表示自己玩了好几年Python竟然不知道这货的存在!看了一篇介绍以后觉得这货非常酷,如果能把iPython Notebook应用于计算机科学教学之中,应该会很受学生的欢迎)

8. Virtualenv’s bin/activate is Doing It Wrong

本文作者认为,尽管virtualenv是个不错的工具,但是它包含的bin/active脚本的设计思路却一点也不想unix风格,会导致许多问题。作者接着就给出了许多应该怎么做的建议。

9. Threading in Python

本文介绍了如何在多线程系统中使用Python线程和队列模块,但是本文中没有提到 GIL,在处理Python多线程时GIL这个模块是个重要的考虑因素。

10. Python Is Not Just a Language — It’s a Development Platform

这是一篇非常精彩的文章,每一个Python开发者都应该读一读。Doug Hellmann这本文中给出对Python的很好的回顾。

11. Deploying Django with Salt Stack

部署工具Salt Stack非常棒。大家可以来看看这篇文章学习Salt Stack的基本知识以及如何使用Salt Stack部署Django应用。

12. Getting started with Python for Data Scientists

数据社区DC给立志成为数据科学家的人做了个很好的Python介绍。该社区详细列出了入门以及数据分析所需要的所有的工具和资源。

13. Core Concepts of Django Forms

你是不是对Django表单还是有些不太清楚,或者你想更新一下你的Django表单核心概念的知识?本博客的作者能够帮助你回答这个问题。赶紧来看看吧。

14. Approach: Building a toy template engine in Python

如果你对模板引擎到底是怎样工作的感到困惑,那么就来看看这篇博文吧。本文的作者将引导你一步步建立起一个简单的模板引擎。

15. Python’s magical self

Python魔术一般的self,有些人恨它,有些人不了解它,也有些人不在乎它。在这篇博文里面,作者会用实际的例子来解释Python的self语句。

16. Python Descriptors Demystified

对于Python描述符不太了解,那么赶紧看过来吧!

17. Facts and Myths about Python names and values

Python的变量名和值机制到底是怎样实现的?就让Ned来解释一下吧,本文中包含了大量的例子,非常不错的文章。

18. setup.py vs. requirements.txt

对于setup.py和requirements.txt以及它们的角色总是有许多的误解。许多人会认为它们两个是重复的,并开发出了工具来处理这种“重复性”。

19. Functional linked lists in Python

本文将会告诉你怎么使用函数式编程风格在Python中实现一个链接表。

20. A Guide to Analyzing Python Performance

本文是一个很好的入门教程,教你在Python中如何去分析程序性能。

21. Of Solving the Rubik’s From Scratch

本文详细介绍了如何使用Python去解决魔方问题,文中包含大量代码实例,非常不错。

22. Introduction to Pandas and Vincent

本视频介绍了Pandas以及该项目中的Dataframe和Series对象。接着使用了Vincent这个工具生成了这些对象的可视化视图。

(译者注:Vincent这个项目非常不错,几行Python代码就可以画出很绚丽的图表,妈妈再也不用担心我不会画图了,值得mark)


项目分享

1.radon

你想知道你自己的代码的复杂度是多少吗?或者你想分析你的代码的圈复杂度吗?那么来看看这个项目吧,该项目能够对Python代码进行复杂度分析,赶紧来看看吧!运行一下该项目你就能看到结果了。

2. django-conch

这是一个非常简洁的项目。Django-conch把django shell暴露了出来,可以通过ssh进行访问。如果你想调试远程服务器上的Django应用,你就会觉得该项目非常实用了。

3. pudb

pudb是一个控制台上的Python调试器

(译者注:怀旧风格,感觉回到了最早的Pascal和C编辑器的年代)
4. python-social-auth

Python Social Auth的目标是成为认证所有社交服务的利器。该项目目前支持Django、Flask以及Web.py,并且支持许多服务。如果你在应用里面需要用到这个功能的话推荐你看下。

5. motor

该项目是专为 Tornado应用编写的MongoDB驱动,是以非阻塞方式实现的。

6. elephant

该项目是一个基于S3的key-value存储,并且提供Elastic search检索功能。

7. sublime-bower

非常酷的工具。现在使用Twitter的Bower工具的人可以通过包管理来安装Sublime Text 2了。

8. Pony ORM

Pony ORM这个项目挺好玩的,它会把Python的代码翻译成SQL。并且还有一个图形化的编辑器能够把对象模型转换成Python代码。对于非商业用户来说可以免费使用商业版。

(译者注:该项目确实非常不错,强烈推荐啊)
9. Falcon Framework

Falcon是个高性能的云API框架。Falcon号称与Web框架相比,它能够提供在相同的硬件上服务30倍的请求。有兴趣吗?试试看吧。

10. cherrymusic

该项目是一个用Python编写的音乐流服务器。赶紧把你自己的音乐唱片集推送到你的设备上吧!

11. smiley

Smiley包含了一些命令,能够运行Python程序并监控其执行的过程,能够记录运行过程并生成一个报告。

12. wssh

该项目是websockets桥接的ssh,能够在浏览器中运行ssh shell。非常不错。包含了一个Web界面以及一个服务器。

13. babel

Babel是个Python的国际化库,提供了许多国际化方面的实用工具。

14. regexpbuilder

该项目能够使得你的正则表达式可读性变强,同时易于维护,。写正则表达式时,该项目采用了链式方法以及变量。

15. flask-restful

该项目是一个简单的框架,能够在Flask项目中快速地搭建出REST API出来。

16. pulsar

如果你正在寻找一个Python的web框架,该框架能够很好地支持异步操作的话,恭喜你找到了答案,pulsar是一个并发事件驱动的Python框架。

(译者注:Tornado也是一个支持异步操作的非常著名的web框架,同样也是Python系的)

17. quokka

这是一个基于Flask的内容管理系统,该系统还使用了MongoDB。

18. dejavu

你还在好奇Shazam到底是怎么实现的么?那么就来看看这个用Python实现的声纹识别算法吧!

(译者注:Shazam是一个手机App)

分类: Python, 语言 标签: , , ,

Python的哲学

2010年5月4日 3 条评论

今天看了豆瓣洪强宁技术分享,又看到了pep上的这段话,觉得太经典了,于是就转了过来,细细品味,很有味道

The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one– and preferably only one –obvious way to do it.
Although that way may not be obvious at first unless you’re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it’s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea — let’s do more of those!

分类: Python, 语言 标签: ,

python脚本抓取学位照信息

2009年12月27日 1 条评论

前两天学校里拍了学位照,在档案馆网站上可以看到自己照片了,由于只要学号和姓名信息,所以就写了个脚本把照片给全部抓下来了,主要用到了urllib2,urllib,汗,以前一直用很底层的httplib做东西,还有这次写了一下代码对浏览器如何操作整个请求过程有了比较深入的了解,脚本执行时需要同目录下有个数据文件,其中包含学号和姓名信息,用逗号隔开,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import os
import urllib
import urllib2
import re
 
def save_image(dir,image_name,image):
    if not os.path.isdir(dir):
        os.makedirs(dir)
    try:
        image_file = open(dir + image_name,'wb')
    except IOError as (error, strerror):
        print "I/O error({0}):{1}".format(error,strerror)
    else:
        image_file.write(image)
        image_file.close()
 
def get_image(name,student_no,login_url,picture_url,pattern):
    #Parameter Information
    login_type = 'yes'
    #Configure opener to handle cookies
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
    urllib2.install_opener(opener)
    #Build Prameters
    params = urllib.urlencode({'xm':name,'xh':student_no,'login':login_type})
    #Open login html
    f = opener.open(login_url,params)
    login_html = f.read()
    f.close()
    #Search the image link
    m = re.search(pattern,login_html)
    if m is None:#The student hasn't taken picture
        return None
    else:
        #Get the image    
        match_part = m.group(1)
        f = opener.open(picture_url + match_part)
        image = f.read()
        return image
 
def grab_all():
    dir = r'D:\\temp\\'
    login_url = 'http://dawww.nju.edu.cn/xwz/login.asp'
    picture_url = 'http://dawww.nju.edu.cn/xwz/picture.asp'
    picture_pattern = 'src="picture.asp(\?i=\d+)"'
    try:
        software_student_file = open('software.txt','r')
    except IOError as (error, strerror):
        print "I/O error({0}):{1}".format(error,strerror)
    else:
        lines = software_student_file.readlines()
        for line in lines:
            line = line.rstrip('\n')
            name = line.split(',')[0]
            student_no = line.split(',')[1]
            image = get_image(name,student_no,login_url,picture_url,picture_pattern)
            if image is not None:
                save_image(dir,student_no + '_' + name + '.jpg',image)
                print student_no + '_' + name + '.jpg' + ' is saved'
        software_student_file.close()
 
if __name__ == "__main__":
    grab_all()
分类: 数据抓取 标签: , ,