编程语言常识

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

任何一种编程语言都有自己的一套语法,编译器或者解释器就是负责把符合语法的程序代码转换成CPU能够执行的机器码,然后执行。

如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。return None可以简写为return

安装好Python,在命令行输入python,如果错误配置path环境变量,将path.exe的地址加入环境变量
退出命令行:exit()
命令行中,在hello.py文件目录下可直接执行python hello.py文件

Python程序是大小写敏感的,如果写错了大小写,程序会报错
Python使用缩进来组织代码块,请务必遵守约定俗成的习惯,坚持使用4个空格的缩进

如果想定义一个什么事也不做的空函数,可以用pass语句:

def nop():
pass

数据类型检查可以用内置函数isinstance()实现:
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError(‘bad operand type’)
if x >= 0:
return x
else:
return -x

from abstest import my_abs 从abstest.py文件中导入my_abs函数

多个变量可以同时接收一个tuple,按位置赋给对应的值,返回一个tuple可以省略括号,所以,Python的函数返回多值其实就是返回一个tuple

定义函数时,需要确定函数名和参数个数;

如果有必要,可以先对参数的数据类型做检查;

函数体内部可以用return随时返回函数结果;

函数执行完毕也没有return语句时,自动return None。

函数可以同时返回多个值,但其实就是一个tuple

1.静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言
2.在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,所以Python是动态语言
3.变量在计算机内存中的表示:
a = ‘ABC’
b = a
a = ‘XYZ’
print b
1.执行a = ‘ABC’,解释器创建了字符串’ABC’和变量a,并把a指向’ABC’:
2.执行b = a,解释器创建了变量b,并把b指向a指向的字符串’ABC’:
3.执行a = ‘XYZ’,解释器创建了字符串’XYZ’,并把a的指向改为’XYZ’,但b并没有更改:
4.所以,最后打印变量b的结果自然是’ABC’了。
4.所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量:
PI = 3.14159265359
5. >>> 10 / 3
3
你没有看错,整数除法永远是整数,即使除不尽。要做精确的除法,只需把其中一个整数换成浮点数做除法就可以:

10.0 / 3
3.3333333333333335
因为整数除法只取结果的整数部分,所以Python还提供一个余数运算,可以得到两个整数相除的余数:

10 % 3
1
无论整数做除法还是取余数,结果永远是整数,所以,整数运算结果永远是精确的。

6.Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来
7.Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。
ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节。
8.本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间
9.字符 ASCII Unicode UTF-8
A 01000001 00000000 01000001 01000001
中 x 01001110 00101101 11100100 10111000 10101101
10.在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件

11.因为Python的诞生比Unicode标准发布的时间还要早,所以最早的Python只支持ASCII编码,普通的字符串’ABC’在Python内部都是ASCII编码的。Python提供了ord()和chr()函数,可以把字母和对应的数字相互转换:

ord(‘A’)
65

chr(65)
‘A’
12.字符串’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’
13.英文字符转换后表示的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
14.把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’)
中文
15.由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

#!/usr/bin/env python

-- coding: utf-8 --

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;

第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

如果你使用Notepad++进行编辑,除了要加上# -- coding: utf-8 --外,中文字符串必须是Unicode字符串:
16.在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下:

‘Hello, %s’ % ‘world’
‘Hello, world’

‘Hi, %s, you have $%d.’ % (‘Michael’, 1000000)
‘Hi, Michael, you have $1000000.’
17.常见的占位符有:

%d 整数
%f 浮点数
%s 字符串
%x 十六进制整数
其中,格式化整数和浮点数还可以指定是否补0和整数与小数的位数:

‘%2d-%02d’ % (3, 1)
’ 3-01’

‘%.2f’ % 3.1415926
‘3.14’
如果你不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串:

‘Age: %s. Gender: %s’ % (25, True)
‘Age: 25. Gender: True’
18.对于Unicode字符串,用法完全一样,但最好确保替换的字符串也是Unicode字符串:

u’Hi, %s’ % u’Michael’
u’Hi, Michael’
有些时候,字符串里面的%是一个普通字符怎么办?这个时候就需要转义,用%%来表示一个%:

‘growth rate: %d %%’ % 7
‘growth rate: 7 %’
19.在Python 3.x版本中,把’xxx’和u’xxx’统一成Unicode编码,即写不写前缀u都是一样的,而以字节形式表示的字符串则必须加上b前缀:b’xxx’。

格式化字符串的时候,可以用Python的交互式命令行测试,方便快捷
20.break是提前使整个循环程序退出,退出的所有循环体内容
continue只是本次循环程序退出,继续执行下一次循环,跳出的是本次循环的所有循环体内容
这两个语句通常都必须配合if语句使用。if后面的循环体内容不执行
注意:大多数循环并不需要用到break和continue语句,通过改写循环条件或者修改循环逻辑,去掉break和continue语句。
21.Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度

d = {‘Michael’: 95, ‘Bob’: 75, ‘Tracy’: 85}
d[‘Michael’]
95
一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值覆盖掉
避免key不存在的错误,有两种办法:
一是通过in判断key是否存在

‘Thomas’ in d
False
二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value

d.get(‘Thomas’)
d.get(‘Thomas’, -1)
-1
22.和list比较,dict有以下几个特点:

查找和插入的速度极快,不会随着key的增加而变慢;
需要占用大量的内存,内存浪费多。
而list相反:

查找和插入的时间随着元素的增加而增加;
占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法
23.需要牢记的第一条就是dict的key必须是不可变对象
这个通过key计算位置的算法称为哈希算法(Hash)。
在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key
24.set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合
重复元素在set中自动被过滤:

s = set([1, 1, 2, 2, 3, 3])
s
{1, 2, 3}
通过add()可以重复添加,但不会有效果
dict可以用在需要高速查找的很多地方
25.set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
s1 & s2
{2, 3}

s1 | s2
{1, 2, 3, 4}
26.对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的

a = ‘abc’
b = a.replace(‘a’, ‘A’)
b
‘Abc’

a
‘abc’
可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如对list执行排序或者删除、增加等操作
27.使用key-value存储结构的dict在Python中非常有用,选择不可变对象作为key很重要,最常用的key是字符串