【Python】数据类型

to be coninue

简单数据类型

特殊类型:空值为 None,如果要使一个变量为空值,得手动设置 var = None,未定义的变量不是空值,而是非法变量;空值可以使用,比如作为参数传给函数,而未定义变量则不能使用。

整数、浮点数、布尔值、字符串分别对应的数据类型是 int, float, bool, str

整数支持二进制、八进制、十进制、十六进制。

1
2
>>> print(0b111, 0o111, 111, 0x111)
(7, 73, 111, 273)

浮点数可以用科学计数法。

1
2
>> print(3.14, 3.14e2, -3.14e-2)
(3.14, 314.0, -0.0314)

布尔类型只有 True, False 两个取值,注意首字母大写。

字符串可以使用单引号、双引号括起来,\ 表示转义字符,使用单引号括起来的字符串可以直接用 “ 表示双引号不需要转义,同样的使用双引号括起来的字符串可以直接使用 ‘ 表示单引号不需要转义,即单引号和双引号是平等的,意义一样的。三引号同样表示字符串,一般用于表示多行字符串,使用三引号不需要使用 \n 来换行,而是在代码里直接换行,三引号可以是三对单引号,也可以是三对双引号,意义是一样的。

1
2
3
4
5
6
7
8
9
#!/user/bin/env python3
# -*- coding: utf-8 -*-

print('"string"\n\'str\'')
print("\"string\"\n'str'")
print('''"hello\tworld, 'ljx'"''')
print("""line1
line2
line3""")

运行结果:

1
2
3
4
5
6
7
8
9
$ python test.py
"string"
'str'
"string"
'str'
"hello world, 'ljx'"
line1
line2
line3

变量

变量必须先定义再使用,使用未定义的变量会报错,Python 没有显式定义变量的语句,给变量赋值就是定义变量的过程。Python 是动态语言,即一个变量可以保存任意类型的值,可以使用赋值传递给多个变量赋值,也可以使用逗号隔开同时为多个变量分别赋值。

1
2
3
4
5
6
7
#!/user/bin/env python3
# -*- coding: utf-8 -*-

a, b, c = 10, True, 3.14
d = e = a
a = 'str'
print(a, b, c, d, e) # ('str', True, 3.14, 10, 10)

Python 没有真正意义上的常量,全大写的变量名表示这是一个常量,但也只是一个约定而已,这个“常量”的值还是可以修改的。

高级数据类型

Python 的高级数据类型,也是 Python 最重要的特性,就是它的容器类,包括列表(List)、元组(Tuple)、字典(Dict)、集合(Set)。

List

列表,即数组,有序的集合,使用一对中括号 [] 来表示,下标从 0 开始,也可以使用负数来从后往前索引,这时下标从 -1 开始。List 可以随时增删查改,其常用接口如下:

  • list[inx] 拿到某个位置的元素;
  • list.append(val) 往列表最后插入元素;
  • list.insert(inx, val) 往指定位置插入元素;
  • list.pop() 删除末尾元素;
  • list.pop(i) 删除指定位置元素;
  • list.remove(val) 删除第一个值为 val 的元素;
  • list.clear() 清空列表,删除所有元素;
  • list.index(val[,start[,end]] 返回第一个值为 val 的下标,start, end 限制在特定子序列中查找;
  • list.count(val) 返回 val 在列表中出现的次数;
  • list.reverse() 反转列表;
  • list.copy() 浅拷贝,这里的浅拷贝指的是元素浅拷贝,拷贝之后的列表和源列表是两个独立的列表了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/user/bin/env python3
# -*- coding: utf-8 -*-

arr = [1, 2, True, "name", [3, 4], 3.14]
arr2 = arr.copy()
print(arr)
arr[0] = 0
print(arr[0], arr[-1])

arr.pop()
arr.pop(-2)
sub_list = arr[-1]
sub_list[0], sub_list[1] = sub_list[1], sub_list[0]
arr.insert(0, 666)
arr.append(777)
print(arr)
print(arr2)

运行结果如下,重点看一下最后两句的输出,列表可以嵌套子列表,arr[-2] 就是一个子列表,arr 只是保存着这个子列表的一个引用,而 list.copy 的浅拷贝就体现在这里,arr 和 arr2 是两个完全独立的列表,修改其中一个列表不会影响到另一个列表,从列表层面上来讲是“深拷贝”的;但拷贝的时候,每个元素的值是浅拷贝的,所以 arr[-2] 和 arr2[-2] 保存的是同一个引用,任何一个的元素改了另一个也会跟着改。

1
2
3
4
5
$ python test.py
[1, 2, True, 'name', [3, 4], 3.14]
0 3.14
[666, 0, 2, True, [4, 3], 777]
[1, 2, True, 'name', [4, 3], 3.14]

栈和队列

List 本身就可以当作栈使用,使用其 append 函数进栈,pop 函数出栈。

List 也可以当成队列使用,list.append() 进队列,list.pop(0) 出队列;反向队列则 list.append(0) 进队列,list.pop() 出队列。但无论是正向队列还是反向队列,总有一个操作效率特别低,正向队列出队的时候特别慢,反向队列进队的时候特别慢,所以使用列表来表示队列不是最佳选择。

Python 封装了一个双向队列对象 collections.deque,由列表生成,可从两端进队和出队。

左出右进:

1
2
3
4
5
6
7
8
#!/user/bin/env python3
# -*- coding:utf-8 -*-

from collections import deque

queue = deque([1,2,3,4,5])
queue.append(6)
queue.popleft()

右进左出:

1
2
3
4
5
6
7
8
#!/user/bin/env python3
# -*- coding:utf-8 -*-

from collections import deque

queue = deque([1,2,3,4,5])
queue.appendleft(0)
queue.pop()

del 语句

del 语句按照给定索引移除元素,也可以用来删除变量。


元组

字典

集合

类型判断

类型转换

类型判断有 typeisinstance 两个函数,
UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\xa5’ in position 0: illegal multibyte sequence
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-3: ordinal not in range(128)

1.将字符串全都转成byte string。
self.response.out.write(“你好”+self.request.get(“argu”).encode(“utf-8”))
2.将字符串全都转成unicode string。
self.response.out.write(u”你好”+self.request.get(“argu”))
byte string转换成unicode string可以这样转unicode(unicodestring, “utf-8”)