遇见sharon ’ 的文章存档

Python 与 Javascript 之比较

最近由于工作的需要开始开发一些Python的东西,由于之前一直在使用Javascript,所以会不自觉的使用一些Javascript的概念,语法什么的,经常掉到坑里。我觉得对于从Javascript转到Python,有必要总结一下它们之间的差异。

基本概念

PythonJavascript都是脚本语言,所以它们有很多共同的特性,都需要解释器来运行,都是动态类型,都支持自动内存管理,都可以调用eval()来执行脚本等等脚本语言所共有的特性。

然而它们也有很大的区别,Javascript这设计之初是一种客户端的脚本语言,主要应用于浏览器,它的语法主要借鉴了C,而Python由于其“优雅”,“明确”,“简单”的设计而广受欢迎,被应用于教育,科学计算,web开发等不同的场景中。

编程范式

Python和Javascript都支持多种不同的编程范式,在面向对象的编程上面,它们有很大的区别。Javascript的面向对象是基于原型(prototype)的, 对象的继承是由原型(也是对象)创建出来的,由原型对象创建出来的对象继承了原型链上的方法。而Python则是中规中矩的基于类(class)的继承,并天然的支持多态(polymophine)。

OO in Pyhton

01	class Employee:
02	   'Common base class for all employees'
03	   empCount = 0 ##类成员
04	 
05	   def __init__(self, name, salary):
06	      self.name = name
07	      self.salary = salary
08	      Employee.empCount += 1
09	    
10	   def displayCount(self):
11	     print "Total Employee %d" % Employee.empCount
12	 
13	   def displayEmployee(self):
14	      print "Name : ", self.name,  ", Salary: ", self.salary
15	## 创建实例
16	ea = Employee("a",1000)
17	eb = Employee("b",2000)

OO in Javascript

01	var empCount = 0;
02	//构造函数
03	function Employee(name, salary){
04	    this.name = name;
05	    this.salary = salary;   
06	    this.empCount += 1;
07	}
08	 
09	Employee.prototype.displayCount = function(){
10	    console.log("Total Employee " + empCount );
11	}
12	 
13	Employee.prototype.displayEmployee = function(){
14	    console.log("Name " + this.name + ", Salary " + this.salary );
15	}
16	//创建实例
17	var ea = new Employee("a",1000);
18	var eb = new Employee("b",2000);

 

因为是基于对象的继承,在Javascript中,我们没有办法使用类成员empCount,只好声明了一个全局变量,当然实际开发中我们会用更合适的scope。注意Javascript创建对象需要使用new关键字,而Python不需要。

除了原生的基于原型的继承,还有很多利用闭包或者原型来模拟类继承的Javascript OO工具,因为不是语言本身的属性,我们就不讨论了。

线程模型

在Javascript的世界中是没有多线程的概念的,并发使用过使用事件驱动的方式来进行的, 所有的JavaScript程序都运行在一个线程中。在HTML5中引入web worker可以并发的处理任务,但没有改变Javascript单线程的限制。

Python通过thread包支持多线程。

不可改变类型 (immutable type)

在Python中,有的数据类型是不可改变的,也就意味着这种类型的数据不能被修改,所有的修改都会返回新的对象。而在Javascript中所有的数据类型都是可以改变的。Python引入不可改变类型我认为是为了支持线程安全,而因为Javascript是单线程模型,所以没有必要引入不可改变类型。

当然在Javascript可以定义一个对象的属性为只读。

1	var obj = {};Object.defineProperty(obj, "prop", {
2	    value: "test",
3	    writable: false});

在ECMAScript5的支持中,也可以调用Object的freeze方法来是对象变得不可修改。

Object.freeze(obj)

 

数据类型

Javascript的数据类型比较简单,有object、string、boolean、number、null和undefined,总共六种

Python中一切均为对象,像module、function、class等等都是。

Python有五个内置的简单数据类型bool、int、long、float和complex,另外还有容器类型,代码类型,内部类型等等。

布尔

Javascript有true和false。Python有True和False。它们除了大小写没有什么区别。

字符串

Javascript采用UTF16编码。

Python使用ASCII码。需要调用encode、decode来进行编码转换。使用u作为前缀可以指定字符串使用Unicode编码。

数值

Javascript中所有的数值类型都是实现为64位浮点数。支持NaN(Not a number),正负无穷大(+/-Infiity)。

Python拥有诸多的数值类型,其中的复数类型非常方便,所以在Python在科研和教育领域很受欢迎。这应该也是其中一个原因吧。Python中没有定义NaN,除零操作会引发异常。

列表

Javascript内置了array类型(array也是object)

Python的列表(List)和Javascript的Array比较接近,而元组(Tuple)可以理解为不可改变的列表。

除了求长度在Python中是使用内置方法len外,基本上Javascript和Python都提供了类似的方法来操作列表。Python中对列表下标的操作非常灵活也非常方便,这是Javascript所没有的。例如l[5:-1],l[:6]等等。

字典、哈希表、对象

Javascript中大量的使用{}来创建对象,这些对象和字典没有什么区别,可以使用[]或者.来访问对象的成员。可以动态的添加,修改和删除成员。可以认为对象就是Javascript的字典或者哈希表。对象的key必须是字符串。

Python内置了哈希表(dictS),和Javascript不同的是,dictS可以有各种类型的key值。

空值

Javascript定义了两种空值。 undefined表示变量没有被初始化,null表示变量已经初始化但是值为空。

Python中不存在未初始化的值,如果一个变量值为空,Python使用None来表示。

Javascript中变量的声明和初始化

1	v1;
2	v2 = null;
3	var v3;
4	var v4 = null;
5	var v5 = 'something';

 

在如上的代码中v1是全局变量,未初始化,值为undefined;v2是全局变量,初始化为空值;v3为局部未初始化变量,v4是局部初始化为空值的变量;v5是局部已初始化为一个字符处的变量。

Python中变量的声明和初始化

1	v1 = None
2	v2 = 'someting'

 

Python中的变量声明和初始化就简单了许多。当在Python中访问一个不存在的变量时,会抛出NameError的异常。当访问对象或者字典的值不存在的时候,会抛出AttributeError或者KeyError。因此判断一个值是否存在在Javascript和Python中需要不一样的方式。

Javascript中检查某变量的存在性:

1	if (!v ) {
2	    // do something if v does not exist or is null or is false
3	}
4	 
5	if (v === undefined) {
6	    // do something if v does not initialized
7	}

 

注意使用!v来检查v是否初始化是有歧义的因为有许多种情况!v都会返回true

Python中检查某变量的存在性:

1	try:
2	    v
3	except NameError
4	    ## do something if v does not exist

 

在Python中也可以通过检查变量是不是存在于局部locals()或者全局globals()来判断是否存在该变量。

类型检查

Javascript可以通过typeof来获得某个变量的类型:

typeof in Javascript 的例子:

1	typeof 3 // "number"
2	typeof "abc" // "string"
3	typeof {} // "object"
4	typeof true // "boolean"
5	typeof undefined // "undefined"
6	typeof function(){} // "function"
7	typeof [] // "object"
8	typeof null // "object"

 

要非常小心的使用typeof,从上面的例子你可以看到,typeof null居然是object。因为javscript的弱类型特性,想要获得更实际的类型,还需要结合使用instanceof,constructor等概念。具体请参考这篇文章

Python提供内置方法type来获得数据的类型。

1	>>> type([]) is list
2	True
3	>>> type({}) is dict
4	True
5	>>> type('') is str
6	True
7	>>> type(0) is int
8	True

同时也可以通过isinstance()来判断类的类型

1	class A:
2	    pass
3	class B(A):
4	    pass
5	isinstance(A(), A)  # returns True
6	type(A()) == A      # returns True
7	isinstance(B(), A)    # returns True
8	type(B()) == A        # returns False

 

但是注意Python的class style发生过一次变化,不是每个版本的Python运行上述代码的行为都一样,在old style中,所有的实例的type都是‘instance’,所以用type方法来检查也不是一个好的方法。这一点和Javascript很类似。

自动类型转换

当操作不同类型一起进行运算的时候,Javascript总是尽可能的进行自动的类型转换,这很方便,当然也很容易出错。尤其是在进行数值和字符串操作的时候,一不小心就会出错。我以前经常会计算SVG中的各种数值属性,诸如x,y坐标之类的,当你一不小心把一个字符串加到数值上的时候,Javascript会自动转换出一个数值,往往是NaN,这样SVG就完全画不出来啦,因为自动转化是合法的,找到出错的地方也非常困难。

Python在这一点上就非常的谨慎,一般不会在不同的类型之间做自动的转换。

语法

风格

Python使用缩进来决定逻辑行的结束非常具有创造性,这也许是Python最独特的属性了,当然也有人对此颇具微词,尤其是需要修改重构代码的时候,修改缩进往往会引起不小的麻烦。

Javascript虽然名字里有Java,它的风格也有那么一点像Java,可是它和Java就好比雷峰塔和雷锋一样,真的没有半毛钱的关系。到时语法上和C比较类似。这里必须要提到的是coffeescript作为构建与Javascript之上的一种语言,采用了类似Python的语法风格,也是用缩进来决定逻辑行。

Python风格

1	def func(list):
2	    for i in range(0,len(list)):
3	        print list[i]

Javascript风格

1	function funcs(list) {
2	    for(var i=0, len = list.length(); i < len; i++) {
3	        console.log(list[i]);
4	    }
5	}

 

从以上的两个代码的例子可以看出,Python确实非常简洁。

作用范围和包管理

Javascript的作用域是由方法function来定义的,也就是说同一个方法内部拥有相同的作用域。这个严重区别与C语言使用{}来定义的作用域。Closure是Javascript最有用的一个特性。

Python的作用域是由module,function,class来定义的。

Python的import可以很好的管理依赖和作用域,而Javascript没有原生的包管理机制,需要借助AMD来异步的加载依赖的js文件,requirejs是一个常用的工具。

赋值逻辑操作符

Javascript使用=赋值,拥有判断相等(==)和全等(===)两种相等的判断。其它的逻辑运算符有&& 和||,和C语言类似。

Python中没有全等,或和与使用的时and 和 or,更接近自然语言。Python中没有三元运算符 A :B ?C,通常的写法是

(A and B) or C

因为这样写有一定的缺陷,也可以写作

 B if A else C

 

Python对赋值操作的一个重要的改进是不允许赋值操作返回赋值的结果,这样做的好处是避免出现在应该使用相等判断的时候错误的使用了赋值操作。因为这两个操作符实在太像了,而且从自然语言上来说它们也没有区别。

++运算符

Python不支持++运算符,没错你再也不需要根据++符号在变量的左右位置来思考到底是先加一再赋值呢还是先赋值再加一。

连续赋值

利用元组(tuple),Python可以一次性的给多个变量赋值

(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)

 

函数参数

Python的函数参数支持命名参数和可选参数(提供默认值),使用起来很方便,Javascript不支持可选参数和默认值(可以通过对arguments的解析来支持)

1	def info(object, spacing=10, collapse=1):
2	    ... ...

 

其它

立即调用函数表达式 (IIFE

Javascript的一个方便的特性是可以立即调用一个刚刚声明的匿名函数。也有人称之为自调用匿名函数。

下面的代码是一个module模式的例子,使用闭包来保存状态实现良好的封装。这样的代码可以用在无需重用的场合。

01	var counter = (function(){
02	    var i = 0;
03	    return {
04	        get: function(){
05	            return i;
06	            },
07	        set: function( val ){
08	            i = val;
09	            },
10	        increment: function() {
11	            return ++i;
12	            }
13	        };
14	    }());

 

Python没有相应的支持。

生成器和迭代器(Generators & Iterator)

在我接触到的Python代码中,大量的使用这样的生成器的模式。

Python生成器的例子

1	# a generator that yields items instead of returning a list
2	def firstn(n):
3	    num = 0
4	    while num < n:
5	        yield num
6	        num += 1
7	   
8	sum_of_first_n = sum(firstn(1000000))

 

Javascript1.7中引入了一些列的新特性,其中就包括生成器和迭代器。然而大部分的浏览器除了Mozilla(Mozilla基本上是在自己玩,下一代的Javascript标准应该是ECMAScript5)都不支持这些特性

Javascript1.7 迭代器和生成器的例子。

01	function fib() {
02	  var i = 0, j = 1;
03	  while (true) {
04	    yield i;
05	    var t = i;
06	    i = j;
07	    j += t;
08	  }
09	};
10	 
11	var g = fib();
12	for (var i = 0; i < 10; i++) {
13	  console.log(g.next());
14	}

 

列表(字典、集合)映射表达式 (List、Dict、Set Comprehension)

Python的映射表达式可以非常方便的帮助用户构造列表、字典、集合等内置数据类型。

下面是列表映射表达式使用的例子:

1	>>> [x + 3 for x in range(4)]
2	[3, 4, 5, 6]
3	>>> {x + 3 for x in range(4)}
4	{3, 4, 5, 6}
5	>>> {x: x + 3 for x in range(4)}
6	{0: 3, 1: 4, 2: 5, 3: 6}

Javascript1.7开始也引入了Array Comprehension

1	var numbers = [1, 2, 3, 4];
2	var doubled = [i * 2 for (i of numbers)];

 

Lamda表达式 (Lamda Expression )

Lamda表达式是一种匿名函数,基于著名的λ演算。许多语言诸如C#,Java都提供了对lamda的支持。Pyhton就是其中之一。Javascript没有提供原生的Lamda支持。但是有第三方的Lamda包。

1g = lambda x : x*3

 

装饰器(Decorators)

Decorator是一种设计模式,大部分语言都可以支持这样的模式,Python提供了原生的对该模式的支持,算是一种对程序员的便利把。

Decorator的用法如下。

1	@classmethod
2	def foo (arg1, arg2):
3	    ....

 

更多decorator的内容,请参考https://wiki.python.org/moin/PythonDecorators

本人对Javascript和Python的认识有限,欢迎大家提出宝贵意见。

 

文章来自:http://my.oschina.net/taogang/blog/264351

别站着编程:站着工作未必对你的健康有好处

我曾对站立式办公的好处深信不疑。

听说这个工作方式很好,也看了不少相关的研究,我一直想要一个站立式办公桌。

美国癌症协会对12.3万人作了长达18年的跟踪调查后得出结论:每天坐超过6个小时的人的死亡率比较高

在一项超过20万人参与的调查中,研究人员发现,即便是热爱运动的人群(每周至少锻炼身体5小时),久坐也会提高他们的死亡风险。
阅读全文

JVM日志和参数的理解

写这篇wiki的目的:最近在调整Hbase的JVM,翻了些文档和wiki,想写点东西,给自己和想了解jvm日志和参数的同 学提供些帮助.


 一:理解GC日志格式,读GC日志的方法

1:开启日志

-verbose:gc

-XX:+PrintGCDetails

-XX:+PrintGCDateStamps

-Xloggc:/path/gc.log

-XX:+PrintGC包含-verbose:gc

-XX:+PrintGCDetails //包含-XX:+PrintGC

只要设置-XX:+PrintGCDetails 就会自动带上-verbose:gc和-XX:+PrintGC

-XX:+PrintGCDateStamps/-XX:+PrintGCTimeStamps 输出gc的触发时间

提示:gc日志文件不会分割需要手动处理.

 2:新生代(Young GC)gc日志分析

2014-02-28T11:59:00.638+0800: 766.537:[GC2014-02-28T11:59:00.638+0800: 766.537:
[ParNew: 1770882K->212916K(1835008K), 0.0834220 secs]
5240418K->3814487K(24903680K), 0.0837310 secs] [Times: user=1.12 sys=0.02, real=0.08 secs]

阅读全文

关于Spring的69个面试问答——终极列表

这篇文章总结了一些关于Spring框架的重要问题,这些问题都是你在面试或笔试过程中可能会被问到的。下次你再也不用担心你的面试了,Java Code Geeks这就帮你解答。

大多数你可能被问到的问题都列举在下面的列表中了。所有的核心模块,从基础的Spring功能(如Spring Beans)到上层的Spring MVC框架,文章中都会进行简短的讲解。看完这些面试问题,你应该看看我们的Spring教程

我们开始吧!
阅读全文

高效程序员的特征:聪明,懒惰

这里我使用了聪明懒惰程序员这几个词。我说的这几个词的意思是:

  • 程序员:有积极活力的,专注于用代码解决真实世界里的问题
    • 不是指那些梦想家,那些永远只想不做的人
  • 聪明:能够周全的思考问题(不是那些耍小聪明的人)
  • 懒惰:就像是程序中的lazy-loading,是指延后写代码的时间(而不是无所事事的人)。

正确的软件开发应该是懒惰式开发,也被称作忍耐式开发;这种开发方式的表现是,在真正动手写代码前,程序员要花大量的时间通盘考虑所有可能的解决方案和途径。这可以看作是延缓写代码,在没有完全理解问题前绝不动手写代码。先把问题理解清楚,确保将要写的代码能真正的解决问题,这将会避免之后写出大量无用的代码。
阅读全文

为什么程序员的开发项目总是半途而废?

很多程序员的项目常常半途而废。他们有那么多的好点子,但是很多都流于空想。几乎每一个软件开发者都有一个这样的文件夹,里面很多都是些还没完工的项目,而这些程序里有不少在它诞生初期真心是个超棒的点子。和这些人一样,我也有很多好主意,有的甚至就是现在有些企业在用的。比如正决定着在eBay上还是在Amazon上做电子商务获利、做一个以业务为基础的社交网络(水管业、电子行业、软件开发等)、比特币搜索引擎、开发一个CSS框架来取代Bootstrap、从Instagram上找出最有魅力的那些人、开发一个实时访问统计引擎,这样的例子举不胜举。几乎每一个项目我都着手去做了,但是没见到一个是完工了的。当我和我的同事朋友聊起这个话题的时候,他们也普遍反映,他们也是如此。很多很多的好点子都夭折在他们的文件夹里。为什么会这样?

因为成功所以缺乏动力

首先要谈谈我们的职业,拥有着让人眼红的高就业率。用事实说话,全国的失业率约为6.7%,而WEB开发员的失业率还不到1%。而且我们的工资水平也比平均值高。2012年软件开发员的平均年收入就已经超过9万美元。当然现在你要是足够优秀,完全可以远远超过这个数。看着跟着我学习的新手菜鸟成为入门级程序员,心中有一种莫大的个人成就感。而这个职业的薪酬也让他们很满意:起薪4万5千美元到7万美元。

所以,和其他大多数人相比,特别是那些在工作岗位上碌碌无为做一天和尚撞一天钟的,因为岗位薪资不高而不断跳槽的,软件开发员还是比较成功的。这里请允许我冒昧的做一个概括,如有雷同纯属巧合。可以说,半路出家的程序员相对于这些人是比较成功的了。也就是这种成功的优越感麻痹了我们的神经,使得我们缺少了完成目标的动力。
阅读全文

统治世界的十大算法

a2

软件正在统治世界。而软件的核心则是算法。算法千千万万,又有哪些算法属于“皇冠上的珍珠”呢?Marcos Otero 给出了他的看法

什么是算法?

通俗而言,算法是一个定义明确的计算过程,可以一些值或一组值作为输入并产生一些值或一组值作为输出。因此算法就是将输入转为输出的一系列计算步骤。

—Thomas H. Cormen,Chales E. Leiserson,算法入门第三版
阅读全文

DNA的三维可视化:通过OpenGL实现一个DNA链

我最近在Coursera上开始了一门课程(数据库和算法,顺便提一句,这是普林斯顿大学开设的一门很牛的课程)。现在上了几次课,我发现这些编程课都相当困难,我的(自我缓解编程困难的)方法则是在OpenGL上编一些小东西来减压。

做三维模型编程最棒的一点就是你可以看到你代码的成果(这也是编程的一个动机)。3D编程是一个很强大的可视化工具,通过编码实现DNA的结构是一个有趣并且富有挑战性的任务。其具有挑战性主要是因为OpenGl代码所带来的局限性。我相信DNA结构在数学方面的实现是很简单的。
阅读全文

推荐几本 Unix/Linux 经典书

几天前答应过一位新 VPS 客户,推荐一点 Linux 书,今天静下来写文才发现推荐书其实不是这么容易,至少应该知道一点读书人的背景,是入门、进阶还是高级,阅读习惯啊、方式啊;有人喜欢看例子书,边看边操作学得快;有的人喜欢先读原理,后操作。

现在每年增加的信息量比过去几百年还要多,不过好书还是那么少,经过历史考验的经典书就更少了,每个领域的经典书就那么几本,作为初学者应该首先看完该领域的经典书,然后再看其他的流行好书。

选择经典书是因为,这个拇指就能陌陌的年代我们实在没有时间花在烂书上,好书能更快更好的帮助我们理解内容,好书是一种享受,你不会觉得读书是一种辛苦。选择英文书是因为,这些经典书的英文都写得朴实、简单,不超过大学四级的阅读水平,长时间阅读英文书可以为自己以后学习和工作打好基础。在工作中,最新最好最权威的资料都是英文的,翻译过来的二手资料不放心,做技术这行迟早要用英语混日子,老板想派你出国培训、开会你不能腼腆的把机会让给别人吧~
阅读全文

超赞!设计师完全自学指南

designer-self-study-banner

 

本文译自国外高质量问答社区Quora,原文作者Karen X. Cheng,原是微软Excel的项目经理,后通过自学转型成为设计师。她讲述的自学过程详实细致且条理有序,读完会发现与想象中的大不一样,对于想自学设计但迷茫不知道从何入手的童鞋来说,可以遵循她的步骤去学习,除了规划得当,还能对设计有一个全局的了解 : )

阅读之前来看看国内的18岁天才少年如何自学成才建立他的个人网站

设计师完全自学指南:

我不是毕业于设计学系,但我得到了一份设计师的工作。
阅读全文