1、第一个缺点就是运行速度慢,和C程序相比非常慢,因为Python是解释型语言你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。

2、第二个缺点就是代码不能加密。如果要发布你的Python程序,实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows上常见的xxx.exe文件)发布出去。要从机器码反推出C代码是不可能的,所以,凡是编译型的语言(C语言),都没有这个问题,而解释型的语言(python语言),则必须把源码发布出去。

3、输入 name=raw_input() ​​raw_input​​和​​print​​是在命令行下面最基本的输入和输出。4、浮点表示。对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是​​1.23e9​​,或者​​12.3e8​​,0.000012可以写成​​1.2e-5​​5、空值是Python里一个特殊的值,用​​None​​表示。​​None​​不能理解为​​0​​,因为​​0​​是有意义的,而​​None​​是一个特殊的空值。

6、Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

现在,捋一捋ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节

字母​​A​​用ASCII编码是十进制的​​65​​,二进制的​​01000001​​;字符​​0​​用ASCII编码是十进制的​​48​​,二进制的​​00110000​​,注意字符​​'0'​​和整数​​0​​是不同的;汉字​​中​​已经超出了ASCII编码的范围,用Unicode编码是十进制的​​20013​​,二进制的​​01001110 00101101​​。写​​u'中'​​和​​u'\u4e2d'​​是一样的,​​\u​​后面是十六进制的Unicode码。因此,​​u'A'​​和​​u'\u0041'​​也是一样的。两种字符串如何相互转换?字符串​​'xxx'​​虽然是ASCII编码,但也可以看成是UTF-8编码,​u'xxx'​则只能是Unicode编码。把​​u'xxx'​​转换为UTF-8编码的​​'xxx'​​用​​encode('utf-8')​​方法:

>>> u'ABC'.encode('utf-8')
'ABC'
>>> u'中文'.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87'

英文字符转换后表示的UTF-8的值和Unicode值相等(但占用的存储空间不同),而中文字符转换后1个Unicode字符将变为3个UTF-8字符,你看到的​​\xe4​​就是其中一个字节,因为它的值是​​228​​,没有对应的字母可以显示,所以以十六进制显示字节的数值。​​len()​​函数可以返回字符串的长度:

>>> len(u'ABC')
3
>>> len('ABC')
3
>>> len(u'中文')
2
>>> len('\xe4\xb8\xad\xe6\x96\x87')
6

反过来,把UTF-8编码表示的字符串​​'xxx'​​转换为Unicode字符串​​u'xxx'​​用​​decode('utf-8')​​方法:

>>> 'abc'.decode('utf-8')
u'abc'
>>> '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
u'\u4e2d\u6587'
>>> print '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
中文

7、格式化问题

在Python中,采用的格式化方式和C语言是一致的,用​​%​​实现,举例如下:

>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'

常见的占位符有:

%d

整数

%f

浮点数

%s

字符串

%x

十六进制整数

如果你不太确定应该用什么,​​%s​​永远起作用,它会把任何数据类型转换为字符串

8、list的基本概念

>>> s = ['python', 'java', ['asp', 'php'], 'scheme']>>> print s[2][1]>>> php>>> print s[2][1][0]>>> a

9、定义tuple

定义 t=(1) 和容易和定义t=1混淆,因为()即可表示tuple,又可以表示数学公式中的小括号,所以python规定, t=(1) 这种情况下,按小括号进行计算,计算结果自然是1。所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义。

10、一个“可变的”tuple:

>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

这个tuple定义的时候有3个元素,分别是​​'a'​​,​​'b'​​和一个list。不是说tuple一旦定义后就不可变了吗?怎么后来又变了?

别急,我们先看看定义的时候tuple包含的3个元素:

当我们把list的元素​​'A'​​和​​'B'​​修改为​​'X'​​和​​'Y'​​后,tuple变为:

表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向​​'a'​​,就不能改成指向​​'b'​​,指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。11、很多同学会用​​raw_input()​​读取用户的输入,​​raw_input()​​读取的内容永远以字符串的形式返回。

12、set集合

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
set([2, 3])
>>> s1 | s2
set([1, 2, 3, 4])

set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。

13、再议不可变对象

上面我们讲了,str是不变对象,而list是可变对象。

对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如:

>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']

而对于不可变对象,比如str,对str进行操作呢:

>>> a = 'abc'
>>> a.replace('a', 'A')
'Abc'
>>> a
'abc'

虽然字符串有个​​replace()​​方法,也确实变出了​​'Abc'​​,但变量​​a​​最后仍是​​'abc'​​,应该怎么理解呢?

我们先把代码改成下面这样:

>>> a = 'abc'
>>> b = a.replace('a', 'A')
>>> b
'Abc'
>>> a
'abc'

要始终牢记的是,​​a​​是变量,而​​'abc'​​才是字符串对象!有些时候,我们经常说,对象​​a​​的内容是​​'abc'​​,但其实是指,​​a​​本身是一个变量,它指向的对象的内容才是​​'abc'​​:

当我们调用​​a.replace('a', 'A')​​时,实际上调用方法​​replace​​是作用在字符串对象​​'abc'​​上的,而这个方法虽然名字叫​​replace​​,但却没有改变字符串​​'abc'​​的内容。相反,​​replace​​方法创建了一个新字符串​​'Abc'​​并返回,如果我们用变量​​b​​指向该新字符串,就容易理解了,变量​​a​​仍指向原有的字符串​​'abc'​​,但变量​​b​​却指向新字符串​​'Abc'​​了:

所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。

使用key-value存储结构的dict在Python中非常有用,选择不可变对象作为key很重要,最常用的key是字符串。