上一篇文章大概说了一下python
和js
的一些关键字。
这次来说说数据类型的异同。
我一向是主张工程师多了解几门语言,了解了之后,你就会发现,数据类型这个东西,在高级语言中,基本都是大同小异,只不过有的语言牛逼,提供的数据类型更丰富,有的不那么牛逼,提供的数据类型比较基本而已。
####字符串
在大多数语言中,字符串都是最基本的一种数据类型。同样,大多数的脚本语言,实际上也都是在处理字符串。提到字符串,就不得不提字符编码这个概念。不同的地区的文字应用不同的字符编码,但是在计算机的世界里,绝大多数时候,我们都是用unicode
的子集utf-8
这个字符串集。
在js
中,我们可以通过str.charCodeAt(index)
的方式,获取字符串中某个字符的unicode
编码。
在python
中,我们可以通过ord
和chr
这两个方法将字符串和unicode编码互相转换。
####Array & list & tuple & set
在js
中,我们很熟悉Array
的概念,定义一个数组,我们通常使用
var arr = [1,2,3,4]
这样的方法,数组的长度和内容随时可变。还可以对数组使用pop
,push
这样的方法添加和删除元素。
在python
中,相对应js
,数组这个概念被细分为两种list
和tuple
。其中list
的概念和定义方法基本跟js
中的Array
没有区别。但是list
没有push
方法,取而代之的是append
方法,另外,list
还有个insert
方法,可以在list
的任意位置上插入元素。
但是,tuple
表示的可以理解为静态数组,即一旦声明,就不可改变了。
另外,python
中list
的定义方式为
list = [1,2,3,4]
tuple
的定义方式为
tuple = (1,2,3,4)
再另外,在python
中还有另一种数据类型,称为set
。set
可以理解为一种特殊的list
,它只存储不重复的元素,如果有相同元素被添加到set
中,会覆盖之前相同的元素;
set的定义方式为
set = set([1,2,3,4])
另外,虽然set
看起来很像list
,但是却不具有list
的下标属性,也就是说你没办法通过set[0]
这样的方式取出set
中的某个元素。
从另一个方面来思考,你也可以把set
当初另一种类型的dict
,只不过它只存储了key
,而每一存储value
。对于set
来说,可以使用set.add(key)
和set.remove(key)
来添加或者删除元素。
####Objec & dict
在js
里,object
是一个非常非常非常常用的数据类型,一般用来存储任何key-value
类型的数据,通常我们可以为一个object
定义任意的属性和方法。例如
var obj = {name:"a",age:"20"}
在python
中,与object
相对应的数据类型称为dict
,也是用于存储key-value
类型的数据,定义方法也跟js
一致,例如:
dict = {name:"a",age:"20"}
另外,在js
中,我们可以很方便的对object
的值做操作,可以通过:
obj.name = 'a';
或
obj['name'] = 'a';
来添加或者改变value。
也可以通过
delete obj.name;
或
delete obj['name'];
的方式删除某对key-value
值。
但是在python
中,我们无法通过.
来对dict
元素进行赋值和取值,所有对dict
元素的操作都必须使用
dict[key]=value
的方式进行,不能使用.
。
除了使用[key]
来取值,我们还可以使用get
方法,例如:
dict.get(key)
另外,与js
中的delete
相对应的,我们可以使用pop
方法来删除某个key-value
键值对。
####方法及高级特性
######切片
在js
中,对于数组我们有slice
和splice
方法,可以对数组进行切片。不同的在于slice
方法不会对原数组产生影响,而splice
方法是在原数组进行操作,如下所示:
var arr = [1,2,3,4,5];
var b = arr.slice(0,1);
console.log(arr); // [1,2,3,4,5]
console.log(b); // 1
var arr = [1,2,3,4,5];
var b = arr.splice(0,1);
console.log(arr); // [2,3,4,5]
console.log(b); // 1
在python
中,与之对应的方法非常简洁,如下所示:
var list = [1,2,3,4,5]
var b = list[0:1]
b // [1]
list // [1,2,3,4,5]
看起来只用[x:y]
就可以完成list
的切片,但是更牛逼的地方在于[x:y]
不光可以完成这种简单的操作,还可以完成更复杂的操作,假设我们想在一个list
中,间隔一个元素进行取值,在js
中,我们只能通过for
循环来搞定这件事,但是在python
中,直接通过:
list = [1,2,3,4,5]
b = list[::2]
b // [1,3,5]
list // [1,2,3,4,5]
就可以搞定了!
除了list
之外,这种[x:y:z]
的切片方式,还可以应用在tuple
和string
中,对应的返回值也是tuple
和string
。
######生成
在js
中,假设我们要生成一个从1到1000的数组,那么肯定是使用for
循环的方式,循环个1000次,代码如下:
var arr = [];
for (var i = 1,len = 1000;i <= len;i++) {
arr.push(i);
};
但是在python
中,可以直接通过一句话就完成了列表的生成:
list = range(1,1001);
与上面所说的切片一样,python
中还提供了更牛逼的方法生成不同需求的list
,假设现在我们要生成一个1000以内所以偶数平方的数组,使用for
循环的话,应该这么做:
list = [];
for i in range(1,1001):
if i % 2 == 0:
list.append(i)
但是使用range
,只用一行就可以轻松搞定:
list = [x*x for x in range(1,1001) if x%2 == 0]