1、=
理解变量在计算机内存中的表示也非常重要。当我们写:
a = 'ABC'
时,Python解释器干了两件事情:
-
在内存中创建了一个
'ABC'
的字符串; -
在内存中创建了一个名为
a
的变量,并把它指向'ABC'
。
2、除法
/除法计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数:
>>> 9 / 3
3.0
还有一种除法是//
,称为地板除,两个整数的除法仍然是整数:
>>> 10 // 3
3
你没有看错,整数的地板除//
永远是整数,即使除不尽。要做精确的除法,使用/
就可以。
因为//
除法只取结果的整数部分,所以Python还提供一个余数运算,可以得到两个整数相除的余数:
>>> 10 % 3
1
无论整数做//
除法还是取余数,结果永远是整数,所以,整数运算结果永远是精确的。
3、编码问题
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
所以你看到很多网页的源码上会有类似<meta charset="UTF-8" />
的信息,表示该网页正是用的UTF-8编码。
Python的字符串
搞清楚了令人头疼的字符编码问题后,我们再来研究Python的字符串。
在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言,例如:
>>> print('包含中文的str')
包含中文的str
对于单个字符的编码,Python提供了ord()
函数获取字符的整数表示,chr()
函数把编码转换为对应的字符:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
在Python中,采用的格式化方式和C语言是一致的,用%
实现,举例如下:
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
你可能猜到了,%
运算符就是用来格式化字符串的。在字符串内部,%s
表示用字符串替换,%d
表示用整数替换,有几个%?
占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?
,括号可以省略。
常见的占位符有:
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
list是一个有序的集合,可随时添加和删除其中的元素。和数组类似。
用索引访问list中的元素,0表示第一个;-1表示最后一个元素,同理-2表示倒数第2个;
可以往list追加元素到末尾。
classmates = [q,w,e,r]
classmates[0] :q
classmates[-1]: r
list的长度:len(classmates)
附加元素:classmates.append("a") :classmates = [q,w,e,r,a]
插入元素:classmates.insert(1,'f'): classmates = [q,f,w,e,r,a]
删除末尾元素:classmates.pop(): a classmates = [q,f,w,e,r]
删除指定位置的元素:classmates.pop(1): f classmates = [q,w,e,r]
某个元素替换:classmates[0]=Q: classmates = [Q,w,e,r]
list元素也可以是另外一个list
5、tuple
tuple也是有序列表,叫元组,但是一旦初始化就不能修改
t=(1,2,3)
6、dic (dictionary)
就是map 使用键-值(key-value)存储,有很快的查询速度
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
d['Michael]=95
判断key是否存在 :
1)"Thomas' in d: False
2)d.get("Thomas") key不存时返回none,命令行不显示结果。
删除一个key:d.pop('Bob'): 75
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而增加;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:
7、set set是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算
要创建集合,可使用set()函数并像下面这样提供一系列的项
s= set([3,5,9,10])
s: {3,9,10,5}
添加一项s.add('4'): s{3,4,10,5,9}
添加多项s.update([10,37]): s{3,4,10,5,9,37} 10并没有添加进去,因为重复了
删除一项s.remover('5')
set的长度:len(s)
x是否是s的成员:x in s
- 怎么去除海量列表里重复元素,用hash来解决也行,只不过感觉在性能上不是很高,用set解决还是很不错的,示例如下:
- >>> a = [11,22,33,44,11,22]
- >>> b = set(a)
- >>> b
- set([33, 11, 44, 22])