to be coninue
简单数据类型
特殊类型:空值为 None
,如果要使一个变量为空值,得手动设置 var = None
,未定义的变量不是空值,而是非法变量;空值可以使用,比如作为参数传给函数,而未定义变量则不能使用。
整数、浮点数、布尔值、字符串分别对应的数据类型是 int, float, bool, str
。
整数支持二进制、八进制、十进制、十六进制。
1 | >>> print(0b111, 0o111, 111, 0x111) |
浮点数可以用科学计数法。
1 | >> print(3.14, 3.14e2, -3.14e-2) |
布尔类型只有 True, False
两个取值,注意首字母大写。
字符串可以使用单引号、双引号括起来,\ 表示转义字符,使用单引号括起来的字符串可以直接用 “ 表示双引号不需要转义,同样的使用双引号括起来的字符串可以直接使用 ‘ 表示单引号不需要转义,即单引号和双引号是平等的,意义一样的。三引号同样表示字符串,一般用于表示多行字符串,使用三引号不需要使用 \n
来换行,而是在代码里直接换行,三引号可以是三对单引号,也可以是三对双引号,意义是一样的。
1 | #!/user/bin/env python3 |
运行结果:
1 | $ python test.py |
变量
变量必须先定义再使用,使用未定义的变量会报错,Python 没有显式定义变量的语句,给变量赋值就是定义变量的过程。Python 是动态语言,即一个变量可以保存任意类型的值,可以使用赋值传递给多个变量赋值,也可以使用逗号隔开同时为多个变量分别赋值。
1 | #!/user/bin/env python3 |
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 | #!/user/bin/env python3 |
运行结果如下,重点看一下最后两句的输出,列表可以嵌套子列表,arr[-2] 就是一个子列表,arr 只是保存着这个子列表的一个引用,而 list.copy
的浅拷贝就体现在这里,arr 和 arr2 是两个完全独立的列表,修改其中一个列表不会影响到另一个列表,从列表层面上来讲是“深拷贝”的;但拷贝的时候,每个元素的值是浅拷贝的,所以 arr[-2] 和 arr2[-2] 保存的是同一个引用,任何一个的元素改了另一个也会跟着改。
1 | $ python test.py |
栈和队列
List 本身就可以当作栈使用,使用其 append
函数进栈,pop
函数出栈。
List 也可以当成队列使用,list.append()
进队列,list.pop(0)
出队列;反向队列则 list.append(0)
进队列,list.pop()
出队列。但无论是正向队列还是反向队列,总有一个操作效率特别低,正向队列出队的时候特别慢,反向队列进队的时候特别慢,所以使用列表来表示队列不是最佳选择。
Python 封装了一个双向队列对象 collections.deque
,由列表生成,可从两端进队和出队。
左出右进:
1 | #!/user/bin/env python3 |
右进左出:
1 | #!/user/bin/env python3 |
del 语句
del
语句按照给定索引移除元素,也可以用来删除变量。
元组
字典
集合
类型判断
类型转换
类型判断有 type
和 isinstance
两个函数,
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”)