前言
闲来无事,复习一下python,记录一下。这篇主要是数据类型相关。
数字类型
整数类型
整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的(除法难道也是精确的?是的!)。整数类型有如下四种进制表示形式
- 十进制:1010, 99, -217
- 二进制,以0b或0B开头:0b010, -0B101
- 八进制,以0o或0O开头:0o123, -0O456
- 十六进制,以0x或0X开头:0x9a, -0X89
浮点类型
浮点数运算则可能会有四舍五入的误差。是因为浮点数间运算存在不确定尾数,不是bug。二进制表示小数,可以无限接近,但不完全相同。
- round(x, d):对x四舍五入,d是小数截取位数
- 浮点数间运算与比较用round()函数辅助
- 不确定尾数一般发生在10-16左右,round()十分有效
- 浮点数可以采用科学计数法表示:使用字母e或E作为幂的符号,以10为基数,
格式如下:<a>e<b> 表示a*10b
字符串类型
Python字符串的编码方式
- 统一字符编码,即覆盖几乎所有字符的编码方式
- 从0到1114111(0x10FFFF)空间,每个编码对应一个字符
- Python字符串中每个字符都是Unicode编码字符
Python字符串表示
字符串是字符的有序序列,可以对其中的字符进行索引。正向递增序号为从零开始;反向递减序号为-1开始。
字符串可以用双引号",也可以用单引号’括起来。使用[ ]获取字符串中一个或多个字符。
使用[M:N: K]根据步长对字符串切片
- <字符串>[M: N],M缺失表示至开头,N缺失表示至结尾
“〇一二三四五六七八九十”[:3]结果是"〇一二"
- <字符串>[M: N: K],根据步长K对字符串切片
"〇一二三四五六七八九十"[1:8:2] 结果是"一三五七" "〇一二三四五六七八九十"[::-1] 结果是"十九八七六五四三二一〇"
Python字符串格式化
字符串格式化使用.format()方法,用法如下:
<模板字符串>.format(<逗号分隔的参数>)
字符串处理函数
函数及使用 | 描述 |
---|---|
len(x) | 长度,返回字符串x的长度:len(“一二三456”) 结果为6 |
str(x) | 任意类型x所对应的字符串形式:str(1.23)结果为"1.23"str([1,2])结果为"[1,2]" |
hex(x)或oct(x) | 整数x的十六进制或八进制小写形式字符串:hex(425)结果为"0x1a9"oct(425)结果为"0o651" |
chr(u) | x为Unicode编码,返回其对应的字符 |
ord(x) | x为字符,返回其对应的Unicode编码 |
str.lower()或str.upper() | 返回字符串的副本,全部字符小写/大写:“AbCdEfGh”.lower()结果为"abcdefgh" |
str.split(sep=None) | 返回一个列表,由str根据sep被分隔的部分组成:“A,B,C”.split(“,”)结果为[‘A’,‘B’,‘C’] |
str.count(sub) | 返回子串sub在str中出现的次数:“an apple a day”.count(“a”)结果为4 |
str.replace(old, new) | 返回字符串str副本,所有old子串被替换为new:“python”.replace(“n”,“n123.io”)结果为"python123.io" |
str.center(width[,fillchar]) | 字符串str根据宽度width居中,fillchar可选:“python”.center(20,“=”)结果为’=python=’ |
str.strip(chars) | 从str中去掉在其左侧和右侧chars中列出的字符:“= python= “.strip(”=np”)结果为"ytho" |
str.join(iter) | 在iter变量除最后元素外每个元素后增加一个str:“,”.join(“12345”)结果为"1,2,3,4,5"#主要用于字符串分隔等 |
例子
- 三次方格式化
获得用户输入的一个数字,可能是整数或浮点数,a,计算a的三次方值,并打印输出。
输出结果采用宽度20个字符、居中输出、多余字符采用减号(-)填充。
如果结果超过20个字符,则以结果宽度为准。
a = eval(input())
print("{:-^20}".format(pow(a, 3)))
- 星号三角形
读入一个整数N,N是奇数,输出由星号字符组成的等边三角形,要求:
第1行1个星号,第2行3个星号,第3行5个星号,依次类推,最后一行共N的星号。
n = eval(input())
for i in range(1,n+1,2):
print("{0:^{1}}".format('*'*i, n))
在Python中,可以直接用True、False表示布尔值(请注意大小写)。
空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。
组合数据类型
序列类型
序列是具有先后关系的一组元素。元素类型可以不同。元素间由序号引导,通过下标进行访问。和字符串一样,有正向和反向序号。
扩展类型
- 字符串
- 元组 tuple
- 列表 list
操作符
操作符及应用 | 描述 |
---|---|
x in s | 如果x是序列s的元素,返回True,否则返回False |
x not in s | 如果x是序列s的元素,返回False,否则返回True |
s+ t | 连接两个序列s和t |
sn 或ns | 将序列s复制n次 |
s[i] | 索引,返回s中的第i个元素,i是序列的序号 |
s[i: j]或s[i: j: k] | 切片,返回序列s中第i到j以k为步长的元素子序列 |
函数和方法
函数和方法 | 描述 |
---|---|
len(s) | 返回序列s的长度,即元素个数 |
min(s) | 返回序列s的最小元素,s中元素需要可比较 |
max(s) | 返回序列s的最大元素,s中元素需要可比较 |
s.index(x) 或s.index(x, i,j) | 返回序列s从i开始到j位置中第一次出现元素x的位置 |
s.count(x) | 返回序列s中出现x的总次数 |
tuple使用圆括号()或tuple()创建,元素间用逗号分隔。一旦初始化不可改变。可以使用或不使用小括号。
list使用方括号[]或list()创建,元素可变;列表中各元素类型可以不同,无长度限制。
list函数和方法
函数和方法 | 描述 |
---|---|
ls[i] = x | 替换列表ls第i元素为x |
ls[i: j: k]= lt | 用列表lt替换ls切片后所对应元素子列表 |
del ls[i] | 删除列表ls中第i元素 |
del ls[i: j: k] | 删除列表ls中第i到第j以k为步长的元素 |
ls+= lt | 更新列表ls,将列表lt元素增加到列表ls中 |
ls*= n | 更新列表ls,其元素重复n次 |
ls.append(x) | 在列表ls最后增加一个元素x |
ls.clear() | 删除列表ls中所有元素 |
ls.copy() | 生成一个新列表,赋值ls中所有元素 |
ls.insert(i,x) | 在列表ls的第i位置增加元素x |
ls.pop(i) | 将列表ls中第i位置元素取出并删除该元素 |
ls.remove(x) | 将列表ls中出现的第一个元素x删除 |
ls.reverse() | 将列表ls中的元素反转 |
应用场景
- 元素遍历
- 数据保护,如果不希望数据被程序所改变,转换成元组类型
实例
#CalStatisticsV1.py
def getNum(): #获取用户不定长度的输入
nums = []
iNumStr = input("请输入数字(回车退出): ")
while iNumStr != "":
nums.append(eval(iNumStr))
iNumStr = input("请输入数字(回车退出): ")
return nums
def mean(numbers): #计算平均值
s = 0.0
for num in numbers:
s = s + num
return s / len(numbers)
def dev(numbers, mean): #计算方差
sdev = 0.0
for num in numbers:
sdev = sdev + (num - mean)**2
return pow(sdev / (len(numbers)-1), 0.5)
def median(numbers): #计算中位数
sorted(numbers)
size = len(numbers)
if size % 2 == 0:
med = (numbers[size//2-1] + numbers[size//2])/2
else:
med = numbers[size//2]
return med
n = getNum() #主体函数
m = mean(n)
print("平均值:{},方差:{:.2},中位数:{}.".format(m, dev(n,m),median(n)))
dict和set
dict
dict用花括号括起来,对应的是map,存放键值对。
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
查找和插入的速度极快,不会随着key的增加而变慢;
需要占用大量的内存,内存浪费多。
而list相反:
查找和插入的时间随着元素的增加而增加;
占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key.
dict函数和方法
函数和方法 | 描述 |
---|---|
deld[k] | 删除字典d中键k对应的数据值 |
k in d | 判断键k是否在字典d中,如果在返回True,否则False |
d.keys() | 返回字典d中所有的键信息 |
d.values() | 返回字典d中所有的值信息 |
d.items() | 返回字典d中所有的键值对信息 |
d.get(k, ) | 键k存在,则返回相应值,不在则返回值 |
d.pop(k, ) | 键k存在,则取出相应值,不在则返回值 |
d.popitem() | 随机从字典d中取出一个键值对,以元组形式返回 |
d.clear() | 删除所有的键值对 |
len(d) | 返回字典d中元素的个数 |
set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。要创建一个set,需要提供一个list作为输入集合。
- 集合用大括号{} 表示,元素间用逗号分隔
- 建立集合类型用{} 或set()
- 建立空集合类型,必须使用set()
操作符
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作。
操作符及应用 | 描述 |
---|---|
S | T |
S-T | 差,返回一个新集合,包括在集合S但不在T中的元素 |
S & T | 交,返回一个新集合,包括同时在集合S和T中的元素 |
S ^ T | 补,返回一个新集合,包括集合S和T中的非相同元素 |
S <= T 或S < T | 返回True/False,判断S和T的子集关系 |
S >= T 或S > T | 返回True/False,判断S和T的包含关系 |
set函数和方法
函数和方法 | 描述 |
---|---|
S.add(x) | 如果x不在集合S中,将x增加到S |
S.discard(x) | 移除S中元素x,如果x不在集合S中,不报错 |
S.remove(x) | 移除S中元素x,如果x不在集合S中,产生KeyError异常 |
S.clear() | 移除S中所有元素 |
S.pop() | 随机返回S的一个元素,更新S,若S为空产生KeyError异常 |
S.copy() | 返回集合S的一个副本 |
len(S) | 返回集合S的元素个数 |
xin S | 判断S中元素x,x在集合S中,返回True,否则返回False |
xnot in S | 判断S中元素x,x不在集合S中,返回True,否则返回False |
set(x) | 将其他类型变量x转变为集合类型 |
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。
主要用来进行数据去重处理。
实例
#CalHamletV1.py
def getText():
txt = open("hamlet.txt", "r").read()
txt = txt.lower()
for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
txt = txt.replace(ch, " ") #将文本中特殊字符替换为空格
return txt
hamletTxt = getText()
words = hamletTxt.split()
counts = {}
for word in words:
counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
for i in range(10):
word, count = items[i]
print ("{0:<10}{1:>5}".format(word, count))