目录
- 一、又见str
- 1.1 字符串定义
- 1.2 字符串常用操作
- 1.2.1 str.center(width[, fillchar])
- 1.2.2 str.count(sub, start= 0,end=len(string))
- 1.2.3 str.encode(encoding='UTF-8',errors='strict')
- 1.2.4 str.endswith(suffix[, start[, end]])
- 1.2.5 str.find(str, beg=0, end=len(string))
- 1.2.6 str.isdigit()
- 1.2.7 str.join(sequence)
- 1.2.8 str.replace(old, new , max)
- 1.2.9 str.split(str="", num=string.count(str))
- 1.2.10 str.startswith(substr, beg=0,end=len(string))
- 1.2.11 str.strip([chars])
- 二、又见list
- 2.1 增加
- 2.2 删除
- 2.2.1 del删除
- 2.2.2 pop删除
- 2.2.3 remove删除
- 2.2.4 clear 清空
- 2.3 修改
- 2.4 查看
- 2.5 切片
- 2.6 排序&反转
- 2.7 循环列表-打印索引
- 2.8 练习:班级分组⼩程序
- 三、又见dict
- 3.1 增加
- 3.2 删除
- 3.3 修改
- 3.4 查看
- 3.5 循环
- 3.6 求长度
- 3.7 练习
- 四、补充:集合(set)
- 4.1 添加操作
- 4.2 删除操作
- 4.3 运算符
- 四、二进制运算
- 4.1 二进制与十进制的转换
- 五、字符编码
- 5.1 ASCII编码
- 5.2 计算机容量单位
- 5.3 GBK&GB2312
- 5.4 Unicode
- 5.5 UTF-8
- 六、十六进制
- 七、快递分拣小程序
- 练习
- 股票查询
一、又见str
1.1 字符串定义
字符串是⼀个有序的字符的集合,⽤于在计算机⾥存储和表示⽂本信息
s = "Hello, my name is Alex,golden king."
可进⾏切⽚操作
>>> s
'Hello, my name is Alex,golden king.'
>>> s[3:6] # 顾头不顾尾
'lo,'
>>> s[1:5]
'ello'
>>> s[0:5]
'Hello'
>>>
>>> s[3:10]
'lo, my '
>>>
不可变,字符串是不可变的,不能像列表⼀样修改其中某个元素,所有对字符串的修改操作其实都是相当于⽣成了⼀份新数据。
1.2 字符串常用操作
1.2.1 str.center(width[, fillchar])
Python字符串center()方法以字符串宽度(width)为中心。使用指定的填充字符(fillchar)填充完成。默认填充字符(fillchar)是一个空格。
1.2.2 str.count(sub, start= 0,end=len(string))
count() 方法用于统计字符串里某个字符或子字符串出现的次数。可选参数为在字符串搜索的开始与结束位置。
- sub – 搜索的子字符串
- start – 字符串开始搜索的位置。默认为第一个字符,第一个字符索引值为0。
- end --字符串中结束搜索的位置。字符中第一个字符的索引为 0。默认为字符串的最后一个位置。
1.2.3 str.encode(encoding=‘UTF-8’,errors=‘strict’)
encode() 方法以 encoding 指定的编码格式编码字符串。errors参数可以指定不同的错误处理方案,默认为 ‘strict’,意为编码错误引起一个UnicodeError。 其他可能的值有 ‘ignore’, ‘replace’, ‘xmlcharrefreplace’, ‘backslashreplace’ 以及通过codecs.register_error() 注册的任何值。
1.2.4 str.endswith(suffix[, start[, end]])
endswith() 方法用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回 True,否则返回 False。可选参数 “start” 与 “end” 为检索字符串的开始与结束位置。suffix – 该参数可以是一个字符串或者是一个元素。
1.2.5 str.find(str, beg=0, end=len(string))
find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始,默认为0) 和 end(结束,默认字符串的长度) 范围,则检查是否包含在指定范围内,如果指定范围内如果包含指定索引值,返回的是索引值在字符串中的起始位置。如果不包含索引值,返回-1。
>>>info = 'abca'
>>> print(info.find('a')) # 从下标0开始,查找在字符串里第一个出现的子串,返回结果:0
0
>>> print(info.find('a', 1)) # 从下标1开始,查找在字符串里第一个出现的子串:返回结果3
3
>>> print(info.find('3')) # 查找不到返回-1
-1
>>>
1.2.6 str.isdigit()
isdigit() 方法检测字符串是否只由数字组成。如果字符串只包含数字则返回 True 否则返回 False。(即不接受其他一切非 [0-9] 元素)
>>> import sys
>>> sys.version
'3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)]'
>>> '777'.isdigit()
True
>>> '33d'.isdigit()
False
>>> '33在'.isdigit()
False
>>> '-23'.isdigit()
False
>>> '0.32'.isdigit()
False
>>> (2>3).isdigit() #入参类型不合法
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'bool' object has no attribute 'isdigit'
1.2.7 str.join(sequence)
join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
s1 = "-"
s2 = ""
seq = ("r", "u", "n", "o", "o", "b") # 字符串序列
print (s1.join( seq )) # r-u-n-o-o-b
print (s2.join( seq )) # runoob
1.2.8 str.replace(old, new , max)
replace()方法是把字符串中的old(旧子字符串)替换成new(新子字符串),如果指定第三个参数max,则替换次数不超过max次(将旧的字符串用新的字符串替换不超过max次),默认全部替换。
(1)当不将max参数传入时,默认将所有old字符或者字符串替换为new字符或者字符串;
(2)当我们将max参数传入后,则将旧字符串替换为新字符串不超过max次,多余的则不进行替换。
str = "www.linuxidc.com"print ("Linux公社:", str)print ("Linux公社:", str.replace("linuxidc.com", "linuxidc.net"))str = "www.linuxmi.com linuxmi linuxmi"print (str.replace("mi", "idc", 2))
1.2.9 str.split(str=“”, num=string.count(str))
- str – 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
- num – 分割次数。默认为 -1, 即分隔所有。
str = "this is string example....wow!!!"
print (str.split( )) # 以空格为分隔符 ['this', 'is', 'string', 'example....wow!!!']
print (str.split('i',1)) # 以 i 为分隔符 ['th', 's is string example....wow!!!']
print (str.split('i',2)) # 以 i 为分隔符 ['th', 's ', 's string example....wow!!!']
print (str.split('w')) # 以 w 为分隔符 ['this is string example....', 'o', '!!!']txt = "Google#Runoob#Taobao#Facebook"
# 第二个参数为 1,返回两个参数列表
x = txt.split("#", 1)
print(x) # ['Google', 'Runoob#Taobao#Facebook']
1.2.10 str.startswith(substr, beg=0,end=len(string))
startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。如果参数 beg 和 end 指定值,则在指定范围内检查。
- str – 检测的字符串。
- substr – 指定的子字符串。
- strbeg – 可选参数用于设置字符串检测的起始位置。
- strend – 可选参数用于设置字符串检测的结束位置。
str = "this is string example....wow!!!"
print (str.startswith( 'this' )) # 字符串是否以 this 开头 True
print (str.startswith( 'string', 8 )) # 从第九个字符开始的字符串是否以 string 开头 True
print (str.startswith( 'this', 2, 4 )) # 从第2个字符开始到第四个字符结束的字符串是否以 this 开头 False
1.2.11 str.strip([chars])
strip() 方法用于移除字符串头尾指定的字符(默认为空格)或字符序列。
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
str = "*****this is **string** example....wow!!!*****"
print (str.strip( '*' )) # 指定字符串 * 输出:this is **string** example....wow!!!str = "123abcrunoob321"
print (str.strip( '12' )) # 字符序列为 12 输出:3abcrunoob3
只要头尾包含有指定字符序列中的字符就删除
二、又见list
[]内以逗号分隔,按照索引,存放各种数据类型,每个位置代表⼀个元素,可修改指定索引位置对应的值,可变。
2.1 增加
追加,数据会追加到尾部
>>> names['alex', 'jack']
>>> names.append("rain")
>>> names.append("eva")
>>>
>>> names['alex', 'jack', 'rain', 'eva']
插⼊,可插⼊任何位置
>>> names.insert(2,"⿊姑娘")
>>> names['alex', 'jack', '⿊姑娘', 'rain', 'eva']
合并,可以把另⼀外列表的值合并进来
>>> n2 = ["狗蛋","绿⽑","鸡头"]
>>> names=['alex', 'jack', '⿊姑娘', 'rain', 'eva']
>>> names.extend(n2)
>>> names['alex', 'jack', '⿊姑娘', 'rain', 'eva', '狗蛋', '绿⽑', '鸡头']
列表嵌套
>>> names.insert(2,[1,2,3])
>>> names ['alex', 'jack', [1, 2, 3], '⿊姑娘', 'rain', 'eva', '狗蛋', '绿⽑', '鸡头']
>>> names[2][1]
>>> 2
2.2 删除
2.2.1 del删除
>>> names
['alex', 'jack', [1, 2, 3], '⿊姑娘', 'rain', 'eva', '狗蛋', '绿⽑', '鸡头']
>>> del names[2]
>>> names
['alex', 'jack', '⿊姑娘', 'rain', 'eva', '狗蛋', '绿⽑', '鸡头']
2.2.2 pop删除
>>> names
['alex', 'jack', '⿊姑娘', 'rain', 'eva', '狗蛋', '绿⽑', '鸡头']
>>> names.pop() #默认删除最后⼀个元素并返回被删除的值
'鸡头'
>>> names
['alex', 'jack', '⿊姑娘', 'rain', 'eva', '狗蛋', '绿⽑']
>>> help(names.pop)
>>> names.pop(1) #删除指定元素
'jack'
2.2.3 remove删除
>>> names
['alex', 'jack', '⿊姑娘', 'rain', 'eva', '狗蛋', '绿⽑', '鸡头', 'eva']
>>> names.remove("eva") # 删除第⼀个找到的eva值
>>> names
['alex', 'jack', '⿊姑娘', 'rain', '狗蛋', '绿⽑', '鸡头', 'eva']
2.2.4 clear 清空
>>> n2
['狗蛋', '绿⽑', '鸡头']
>>> n2.clear()
>>> n2
[]
2.3 修改
>>> names
['alex', '⿊姑娘', 'rain', 'eva', '狗蛋', '绿⽑']
>>> names[0] = "⾦⻆⼤王"
>>> names[-1] = "银⻆⼤王"
>>> names
['⾦⻆⼤王', '⿊姑娘', 'rain', 'eva', '狗蛋', '银⻆⼤王']
2.4 查看
>>> names
['⾦⻆⼤王', '⿊姑娘', 'rain', 'eva', '狗蛋', '银⻆⼤王', 'eva']
>>>
>>> names.index("eva") #返回从左开始匹配到的第⼀个eva的索引
3
>>> names.count("eva") #返回eva的个数
2
2.5 切片
注意:切⽚的特性是顾头不顾尾,即start的元素会被包含,end-1是实际取出来的值names[start : end]
>>> names
['⾦⻆⼤王', '⿊姑娘', 'rain', 'eva', '狗蛋', '银⻆⼤王', 'eva']
>>> names[1:4] #不包含下标4的元素
['⿊姑娘', 'rain', 'eva']
省略写:
>>> n[0:4] = n[:4] # 省略第⼀个索引
>>> n[4:] # 省略最后⼀个索引
倒着切:
>>> names
['⾦⻆⼤王', '⿊姑娘', 'rain', 'eva', '狗蛋', '银⻆⼤王', 'eva']
>>> names[-5:-1]
['rain', 'eva', '狗蛋', '银⻆⼤王']
但其实我想要的是后5个,只打印了4个,’eva’这个值没出来,为什么,因为上⾯提到的顾头不顾尾可是想把后5个全取出来如何做呢?
>>> names[-5:]
['rain', 'eva', '狗蛋', '银⻆⼤王', 'eva']
跳着切(设置步长):names[start:end:step]
step 默认是1
>>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[0:7:2] #设置步⻓为2
[0, 2, 4, 6]
>>> a[::3] #按步⻓3打印列表,第1个:是省略掉的start:end
[0, 3, 6, 9]
2.6 排序&反转
排序
>>> a = [83,4,2,4,6,19,33,21]
>>> a.sort()
>>> a
[2, 4, 4, 6, 19, 21, 33, 83]
反转
>>> names
['#', '4', '@', 'eva', 'rain', '狗蛋', '⾦⻆⼤王', '银⻆⼤王', '⿊姑娘']
>>> names.reverse()
>>> names
['⿊姑娘', '银⻆⼤王', '⾦⻆⼤王', '狗蛋', 'rain', 'eva', '@', '4', '#']
2.7 循环列表-打印索引
输出一组,自动换行
>>> for i in names:
... print(i)
...
⿊姑娘
银⻆⼤王
⾦⻆⼤王
狗蛋
rain
eva
@4#
names=['#', '4', '@', 'eva', 'rain', '狗蛋', '⾦⻆⼤王', '银⻆⼤王', '⿊姑娘']
for i in enumerate(names):print(i)for j in enumerate(names):print(j[0],j[1])
2.8 练习:班级分组⼩程序
你们班有55⼈,每个⼈的姓名&考试成绩存在⼀个⼤列表⾥,格式如下:
stu_list = [["Alex",100],["银⻆",79],["⿊姑娘",66],....
]
需求:现要求按考试成绩⾼低将学员们分成5组,全存在⼀个新的⼤列表⾥, 5组分别是90-100, 80-89, 70-79,60-69, 0-59
最终的数据格式如下:
new_stu_list = [[["Alex",100],["Rain",91],],[["银⻆",79],["Jack",78],], ........
]
数据:
stu_list = [['李渊', 82], ['李世⺠', 7], ['侯君集', 5], ['李靖', 58], ['魏征',
41], ['房⽞龄', 64], ['杜如晦', 65], ['柴绍', 94], ['程知节', 45], ['尉迟恭', 94],
['秦琼', 54], ['⻓孙⽆忌', 85], ['李存恭', 98], ['封德彝', 16], ['段志⽞', 44], ['刘
弘基', 18], ['徐世绩', 86], ['李治', 19], ['武则天', 39], ['太平公主', 57], ['⻙后',
76], ['李隆基', 95], ['杨⽟环', 33], ['王勃', 49], ['陈⼦昂', 91], ['卢照邻', 70],
['杨炯', 81], ['王之涣', 82], ['安禄⼭', 18], ['史思明', 9], ['张巡', 15], ['雷万
春', 72], ['李⽩', 61], ['⾼⼒⼠', 58], ['杜甫', 27], ['⽩居易', 5], ['王维', 14],
['孟浩然', 32], ['杜牧', 95], ['李商隐', 34], ['郭⼦仪', 53], ['张易之', 39], ['张昌
宗', 61], ['来俊⾂', 8], ['杨国忠', 84], ['李林甫', 95], ['⾼适', 100], ['王昌龄',
40], ['孙思邈', 46], ['⽞奘', 84], ['鉴真', 90], ['⾼骈', 85], ['狄仁杰', 62], ['⻩ 巢', 79], ['王仙芝', 16], ['⽂成公主', 13], ['松赞⼲布', 47], ['薛涛', 79], ['⻥⽞
机', 16], ['贺知章', 20], ['李泌', 17], ['韩愈', 100], ['柳宗元', 88], ['上官婉⼉ 五
代⼗国:朱温', 55], ['刘仁恭', 6], ['丁会', 26], ['李克⽤', 39], ['李存勖', 11],
['葛从周', 25], ['王建', 13], ['刘知远', 95], ['⽯敬瑭', 63], ['郭威', 28], ['柴 荣', 50], ['孟昶', 17], ['荆浩', 84], ['刘彟', 18], ['张及之', 45], ['杜宇', 73],
['⾼季兴', 39], ['喻皓', 50], ['历真', 70], ['李茂贞', 6], ['朱友珪', 7], ['朱友贞',
11], ['刘守光', 2]]
代码实现:
stu_list = [['李渊', 82], ['李世⺠', 7], ['侯君集', 5], ['李靖', 58], ['魏征',41],['房⽞龄', 64], ['杜如晦', 65], ['柴绍', 94], ['程知节', 45], ['尉迟恭', 94],['秦琼', 54], ['⻓孙⽆忌', 85], ['李存恭', 98], ['封德彝', 16], ['段志⽞', 44],['刘弘基', 18], ['徐世绩', 86], ['李治', 19], ['武则天', 39], ['太平公主', 57], ['⻙后',76],['李隆基', 95], ['杨⽟环', 33], ['王勃', 49], ['陈⼦昂', 91], ['卢照邻', 70],['杨炯', 81], ['王之涣', 82], ['安禄⼭', 18], ['史思明', 9], ['张巡', 15], ['雷万春', 72], ['李⽩', 61],['⾼⼒⼠', 58], ['杜甫', 27], ['⽩居易', 5], ['王维', 14],['孟浩然', 32], ['杜牧', 95], ['李商隐', 34], ['郭⼦仪', 53], ['张易之', 39], ['张昌宗', 61],['来俊⾂', 8], ['杨国忠', 84], ['李林甫', 95], ['⾼适', 100], ['王昌龄',40], ['孙思邈', 46], ['⽞奘', 84],['鉴真', 90], ['⾼骈', 85], ['狄仁杰', 62], ['⻩ 巢', 79], ['王仙芝', 16], ['⽂成公主', 13], ['松赞⼲布', 47], ['薛涛', 79],['⻥⽞机', 16], ['贺知章', 20], ['李泌', 17], ['韩愈', 100], ['柳宗元', 88], ['上官婉⼉ 五代⼗国:朱温', 55], ['刘仁恭', 6], ['丁会', 26],['李克⽤', 39], ['李存勖', 11],['葛从周', 25], ['王建', 13], ['刘知远', 95], ['⽯敬瑭', 63], ['郭威', 28],['柴 荣', 50], ['孟昶', 17], ['荆浩', 84], ['刘彟', 18], ['张及之', 45], ['杜宇', 73],['⾼季兴', 39], ['喻皓', 50],['历真', 70], ['李茂贞', 6], ['朱友珪', 7], ['朱友贞',11], ['刘守光', 2]]new_stu_list = [[],[],[],[],[]
]for i in stu_list:if i[1] >= 90:new_stu_list[0].append(i)elif i[1] >= 80:new_stu_list[1].append(i)elif i[1] >= 70:new_stu_list[2].append(i)elif i[1] >= 60:new_stu_list[3].append(i)else:new_stu_list[4].append(i)for j in new_stu_list:print(j)
三、又见dict
字典可以查询数据⼜快、操作⼜⽅便,是⽇后开发中必备神器。
{key1:value1, key2:value2}
冒号左边是key, 右边是value
- key-value结构
- key必须为不可变数据类型(字符串、数字)、必须唯⼀
- 可存放任意多个value、可修改、可以不唯⼀
- ⽆序, ordered_dict
- 查询速度快,且不受dict的⼤⼩影响,⾄于为何快?我们学完hash再解释。
3.1 增加
mes = {"alex": [23, "CEO", 66000],"⿊姑娘": [24, "⾏政", 4000],
}
print(mes)
# 新增k
mes["佩奇"] = [26, "讲师", 40000]print(mes)
3.2 删除
names.pop("alex") # 删除指定key
del names["oldboy"] # 删除指定key,同pop⽅法
names.clear() # 清空dict
3.3 修改
dic['key'] = 'new_value' # 如果key在字典中存在,'new_value'将会替代原来的value值;
3.4 查看
dic = {"alex": [23, "CEO", 66000],"⿊姑娘": [24, "⾏政", 4000],"佩奇": [26, "讲师", 40000],
}print(dic) # {'alex': [23, 'CEO', 66000], '⿊姑娘': [24, '⾏政', 4000], '佩奇': [26, '讲师', 40000]}
print(dic['佩奇']) # 返回字典中key对应的值,若key不存在字典中,则报错; [26, '讲师', 40000]
dict.get(key, default = None)
- key: 要设置默认值的Key
- default: 要返回key的值,可以是任何值,如整形、字符串、列表、字典等
- return: 如果字典中key本来有值,那么返回的是字典中Key所对应的值,如果没有,那么返回“default”中的值。
dic = {"alex": [23, "CEO", 66000],"⿊姑娘": [24, "⾏政", 4000],"佩奇": [26, "讲师", 40000],
}print(dic.get("alex")) # [23, 'CEO', 66000]print(dic.get("alex1")) # Noneprint(dic.get("alex1",0)) # 0
dic = {"alex": [23, "CEO", 66000],"⿊姑娘": [24, "⾏政", 4000],"佩奇": [26, "讲师", 40000],
}print("alex" in dic) # 若存在则返回True,没有则返回False
print(dic.keys()) # 返回⼀个包含字典所有KEY的列表;
print(dic.values()) # 返回⼀个包含字典所有values的列表;
print(dic.items()) # 返回⼀个包含字典所有(键,值)元组的列表;for k,v in dic.items():print(k,v)
3.5 循环
info = {"name":"路⻜学城","mission": "帮⼀千万极客⾼效学编程","website": "https://luffycity.com"
}
for k in info:print(k,info[k])
3.6 求长度
info = {"name":"路⻜学城","mission": "帮⼀千万极客⾼效学编程","website": "https://luffycity.com"
}
print(len(info)) # 3
3.7 练习
1、⽣成⼀个包含100个key的字典,每个value的值不能⼀样
dic={x:x*2 for x in range(100)
}
print(dic)
2、{‘k0’: 0, ‘k1’: 1, ‘k2’: 2, ‘k3’: 3, ‘k4’: 4, ‘k5’: 5, ‘k6’: 6, ‘k7’: 7, ‘k8’: 8, ‘k9’: 9} 请把这个dict中key⼤于5的 值value打印出来。
dic={'k0': 0, 'k1': 1, 'k2': 2, 'k4': 4, 'k5': 5,'k6': 6,'k7': 7,'k8': 8,'k9': 9}for k in dic:if dic[k] > 5:print(k,dic[k])
3、把题2中value是偶数的统一改成-1
dic={'k0': 0, 'k1': 1, 'k2': 2, 'k4': 4, 'k5': 5,'k6': 6,'k7': 7,'k8': 8,'k9': 9}for k in dic:if dic[k] % 2 == 0:dic[k] = -1
print(dic)
4、请设计⼀个dict, 存储你们公司每个⼈的信息, 信息包含⾄少姓名、年龄、电话、职位、⼯资,并提供⼀个简单的查找接⼝,⽤户按你的要求输⼊要查找的⼈,你的程序把查到的信息打印出来
info={'张三0':{'age':20,'电话':5879960,'职位':'员工0','工资':'5000'},'张三1':{'age':21,'电话':5879961,'职位':'员工1','工资':'5001'},'张三2':{'age':22,'电话':5879962,'职位':'员工2','工资':'5002'},'张三3':{'age':23,'电话':5879963,'职位':'员工3','工资':'5003'},'张三4':{'age':24,'电话':5879964,'职位':'员工4','工资':'5004'},'张三5':{'age':25,'电话':5879965,'职位':'员工5','工资':'5005'},'张三6':{'age':26,'电话':5879966,'职位':'员工6','工资':'5006'},'张三7':{'age':27,'电话':5879967,'职位':'员工7','工资':'5007'},'张三8':{'age':28,'电话':5879968,'职位':'员工8','工资':'5008'},'张三9':{'age':29,'电话':5879969,'职位':'员工9','工资':'5009'},
}
search_name = input('>>>请输入要查找人的姓名:')
if search_name in info:print(info[search_name])
else:print('查无此人!!!')
四、补充:集合(set)
集合(set)是一个无序的不重复元素序列。创建集合的语法是以大括号包住集合元素,或将集合元素以列表的形式传入内置函数set()。
Winners = {'Company A','Company B'}
print(type(Winners))
print(Winners)Losers = set(['Company C ' , ' Company D '])
print(type(Losers))
print(Losers)
- 集合没有顺序关系,因此不支持索引。
- 空集合只能使用set()函数创建,不能用大括号,因为没包含任何元素的大括号{}表 示的是一个空的字典。
- 如果要利用字符串中的个别字符或列表中的元素来创建集合,同样必须使用set()函 数而不能用大括号;若以大括号包住字符串,Python仍会创建一个集合,只不过整个字符串会被当成一个单独的元素。
a=set('Quant')
print(a) # {'n', 'u', 't', 'Q', 'a'}a={'Quant'}
print(a) # {'Quant'}
- 集合没有顺序关系,且不能重复.我们可以用比较运算符“==”来判断两个集合是否相等。
4.1 添加操作
add(x)可将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作。
thisSet = set(("Google", "Runoob", "Taobao"))
thisSet.add("Facebook")
update( x )可以添加元素,且参数可以是列表,元组,字典等。
thisSet = set(("Google", "Runoob", "Taobao"))
thisSet.update({1,3})
thisSet.update([1,4],[5,6])
4.2 删除操作
remove(x)将元素 x 从集合 s 中移除,如果元素不存在,则会发生错误。
thisSet = set(("Google", "Runoob", "Taobao"))
thisSet.remove("Taobao")
discard(x)移除集合中的元素,且如果元素不存在,不会发生错误。
thisSet = set(("Google", "Runoob", "Taobao"))
thisSet.discard("Google")
thisSet.discard("Facebook")
4.3 运算符
集合常用于计算两个组合的关系。
项目 | 标识 | 含义 |
---|---|---|
交集 | & 或 intersection | 两集合共有的部分 |
并集 | "竖杠"或 union | 两集合相加(重复内容只展示一次) |
差集 | - 或 difference | 属于A不属于B的部分 |
交叉补集 | ^ 或symmetric_difference | 返回两个集合中不重复的元素集合。 |
a = set('abracadabra')
b = set('alacazam')
c=a - b # 集合a中包含而集合b中不包含的元素
d=a | b # 集合a或b中包含的所有元素
e=a & b # 集合a和b中都包含了的元素
f=a ^ b # 不同时包含于a和b的元素
四、二进制运算
⼆进制只有0和1两个数,想表达更⼤的值 就往左补位,多个0101010就可以表达更⼤的值 啦。 ⼆进制是逢2进1, 跟我们⽤的⼗进制逢10进1⼀个原理。 于是科学家们,就⽤2进制做为计算机可识别的最底层语⾔啦。
4.1 二进制与十进制的转换
五、字符编码
5.1 ASCII编码
由于计算机是美国⼈发明的,因此,最早只有127个字⺟被编码到计算机⾥,也就是⼤⼩写英⽂字⺟、数字和⼀些符号,这个编码表被称为 ASCII 编码,⽐如⼤写字⺟ A 的编码是 65 ,⼩写字⺟ z 的编码是 122 。后128个称为扩展ASCII码。
⼀个空格对应的数字是0 翻译成⼆进制就是0(注意字符’0’和整数0是不同的)
⼀个对勾√对应的数字是251 翻译成⼆进制就是11111011
假如我们要打印两个空格⼀个对勾 写作⼆进制就应该是 0011111011
, 但是问题来了,我们怎么知道从哪⼉到哪⼉是⼀个字符呢?
正是由于这些字符串⻓的⻓,短的短,写在⼀起让我们难以分清每⼀个字符的起⽌位置,所以聪明的⼈类就想出了⼀个解决办法,既然⼀共就这255个字符,那最⻓的也不过是11111111⼋位,不如我们就把所有的⼆进制都转换成8位的,不⾜的⽤0来替换。
这样⼀来,刚刚的两个空格⼀个对勾就写作000000000000000011111011
,读取的时候只要每次读8个字符就能知道每个字符的⼆进制值啦。
5.2 计算机容量单位
在这⾥,每⼀位0或者1所占的空间单位为bit(⽐特),这是计算机中最⼩的表示;单位每8个bit组成⼀个bytes(字节),这是计算机中最⼩的存储单位。
5.3 GBK&GB2312
英⽂问题是解决了, 我们中⽂如何显示呢? 美国佬设计ASSCII码的时候应该是没考虑中国⼈有⼀天也能⽤上电脑, 所以根本没考虑中⽂的问题,上世界80年代,电脑进⼊中国,把砖家们难倒了,妈的你个⼀ASSCII只能存256个字符,我常⽤汉字就⼏千个,怎么玩???勒紧裤腰带还苏联贷款的时候我们都挺过来啦,这点⼩事难不到我们, 既然美帝的ASCII不⽀持中⽂,那我们⾃⼰搞张编码表不就⾏了,于是我们1980年设计出了GB2312编码表,⼀共存了6763个汉字。
但我们写字竟然会出现中英混杂的情况,⽐如“我是路⻜学城,我的英⽂名叫Luffycity.”,所以中国砖家们⼜通过神奇⼿段兼容了ASSCII, 即遇到中⽂⽤2个字节,遇到英⽂直接⽤ASCII的编码。
如果2个字节连在⼀起,且每个字节的第1位(也就是相当于128的那个2进制位)如果是1,就代表这是个中⽂,这个⾸位是128的字节被称为⾼字节。 也就是2个⾼字节连在⼀起,必然就是⼀个中⽂。 你怎么如此笃定?因为0-127已经表示了英⽂的绝⼤部分字符,128-255是ASCII的扩展表,表示的都是极特殊的字符,⼀般没什么⽤。
1995年, 砖家们⼜升级了gb2312, 加⼊更多字符,连什么藏语、维吾尔语、⽇语、韩语、蒙古语什么的统统都包含进去了,国家统⼀亚洲的ᰀ⼼从这些基础⼯作中就可⻅⼀斑哈。 这个编码叫GBK,⼀直到现在,我们的windows电脑中⽂版本的编码就是GBK。
5.4 Unicode
Unicode把所有语⾔(英文,中文,非英文等)都统⼀到⼀套编码⾥,这样就不会再有乱码问题了。Unicode 2-4字节 已经收录136690个字符,并还在⼀直不断扩张中…
- ⽀持全球所有语⾔
- 可以跟各种语⾔的编码⾃由转换,也就是说,即使你gbk编码的⽂字 ,想转成unicode很容易。
5.5 UTF-8
为了解决存储和⽹络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对unicode字符进⾏转换,以便于在存储和⽹络传输时可以节省空间。UTF 是为unicode编码 设计 的⼀种 在存储 和传输时节省空间的编码⽅案。
- UTF-8: 使⽤1、2、3、4个字节表示所有字符;优先使⽤1个字节、⽆法满⾜则使增加⼀个字节,最多4个字节。英⽂占1个字节、欧洲语系占2个、东亚占3个(中文包括在内),其它及特殊字符占4个
- UTF-16: 使⽤2、4个字节表示所有字符;优先使⽤2个字节,否则使⽤4个字节表示。
- UTF-32: 使⽤4个字节表示所有字符;
六、十六进制
16进制,英⽂名称Hexadecimal(简写Hex), 在数学中是⼀种逢16进1的进位制。⼀般⽤数字0到9和字⺟A到F(或a到f)表示,其中:A到F表示10~15,这些称作⼗六进制数字,⽐如⼗进制13⽤16进制表示是D, 28⽤16进制是1C。16+12=28
0 1 2 3 4 5 6 7 8 9 A B C D E F ⼗六进制
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ⼗进制
在C语⾔、C++、Shell、Python、Java语⾔及其他相近的语⾔使⽤字⾸“0x”来标示16进制,例如“0x5A3”代表十进制的1443。
十进制与十六进制转换
七、快递分拣小程序
将数据源⾥的快递信息进⾏分拣,最终⽣成的数据格式如下:
思路:
- 引入数据源
- 利用’省’ 和 '市’搜索(index)并利用字典分类
- 打印分类
思路一:手动罗列,遍历耗时
代码实现:省市关键字切割
Data_list = [['王*龙', '北京市海淀区苏州街大恒科技大厦南座4层'],['庞*飞', '北京市昌平区汇德商厦四楼403'],['顾*锐', '江苏省扬州市三垛镇工业集中区扬州市立华畜禽有限公司'],['李*连', '北京市昌平区立汤路北七家威尼斯花园2区2-3'],['籍*旭', '北京市房山区良乡鸿顺园西区20号楼3单元601'],['韩*嵩', '北京市昌平区立汤路威尼斯花园2区2-3'],['曹*', '北京市朝阳区东三环北路28号博瑞大厦B座'],['贺*', '上海市徐汇区古美路1515号19号楼1101室'],['谷*成', '浙江省杭州市城厢街道 下湘湖路1号'],['王*玉', '上海市嘉定区南翔镇'],['刘*海', '北京市海淀区玉渊潭南路3号水科院万方城科技楼'],['杨*娟', '安徽省合肥市清源路中铁国际城和畅园'],['谢*桥', '北京市海淀区丰秀中路3号院9号楼北京数码大方科技股份有限公司'],['王*杰', '河北省邯郸市后仓街39号'],['刘*明', '河北省唐山市卫国北路305张家口银行'],['王*凡', '天津市南开区卫津路92号天津大学鹏翔公寓'],['郭*军', '上海市浦东新区郭守敬路498号浦东软件园16号3楼'],['宋*东', '北京市丰台区万寿路南口288号华信大厦'],['江*', '安徽省阜阳市临海尚城B区2单元,19号楼'],['吴*', '河南省郑州市经三路与东风路交汇处金城国际广场6#东单元2403'],['祁*雄', '湖北省武汉市洪山区白沙洲大道武汉科技大学北苑'],['吕*', '上海市嘉定区上海市嘉定区嘉罗公路2019号'],['黄*', '湖北省武汉市国家光电实验室'],['常*旗', '山东省潍坊市林海生态博览园'],['陈*', '上海市虹口区吴淞路218号宝矿大厦2501A'],['郑*琳', '北京市丰台区西马金润家园2区10号楼11单元11-2-1'],['姚*峰', '江苏省无锡市江苏省无锡市滨湖区龙山龚巷213#'],['徐*', '浙江省杭州市余杭塘路515矩阵国际中心2号楼705'],['曹*翎', '江苏省苏州市科教新城太和丽都31-1604'],['齐*', '江苏省南京市天元东路228号莱茵量子国际'],['高*', '山西省太原市经济技术开发区龙盛街2号国药控股'],['刘*', '北京市海淀区中关村丹棱街中国电子大厦B座1608'],['陈*山', '安徽省六安市南港镇'],['赵*', '黑龙江省哈尔滨市锦山路5号,黑龙江省地质科学研究所'],['伍*', '安徽省芜湖市泉塘镇'],['白*潮', '上海市浦东新区康桥镇环桥路2585弄文怡苑一期27号楼301'],['苏*', '河南省郑州市登封路晨光社区14号院绿田野超市'],['王*', '陕西省西安市雁塔区雁翔路58号西安理工大学曲江校区'],['赵*龙', '河北省廊坊市燕郊经济开发区福成大酒店东福成行政中心三楼信息部'],['范*勇', '江苏省苏州市苏州市吴中区木渎镇胥口镇621号斯莱克精密设备股份有限公司'],['白*', '北京市东城区安定门外大街10号楼415'],['刘*', '北京市昌平区回龙观镇二拨子新村东区7号楼1单元402'],['钱*庭', '江苏省江苏省泰州市姜堰区南苑新村58号'],['刘*', '河南省洛阳市城关镇人民路21号'],['杨*凯', '湖北省武汉市中国地质大学北区1栋'],['王*', '上海市浦东新区环桥路1137弄秀怡苑31号楼302'],['夏*', '北京市朝阳区垂杨柳东里11号楼3单元402'],['张*宇', '北京市海淀区中关村南大街6号中电信息大厦1207'],['蔡*', '陕西省西安市凤城八路天朗御湖一号楼二单元(西门)'],['高*', '新疆乌鲁木齐市民主路99号建行大厦12楼审计室'],['孙*园', '陕西省西安市丈八沟街道科技五路8号数字大厦'],['王*亚', '北京市朝阳区华盛乐章b座1708'],['李*博', '山东省淄博市索镇花园小区5#2单元202室'],['侯*森', '北京市朝阳区北苑路潮驿178'],['胡*辉', '浙江省杭州市瑞立东方花城2-2-503'],['杨*平', '北京市昌平区沙河镇于辛庄村赋腾公寓'],['黄*', '浙江省杭州市衢江路耀江福村3单元602'],['李*', '上海市黄浦区黄浦区北京东路288弄66号甲,后门201室'],['邹*', '安徽省淮北市南坪镇黄沟村邹圩庄'],['刘*', '北京市昌平区沙河镇赋腾公寓E516'],['彭*', '北京市望京SOHOt3 40层'],['张*乾', '河南省周口市八一路人民路交叉口医药局家属楼'],['贺*梦', '北京市通州区永顺镇世纪星城92号楼二单元'],['冯*琴', '北京市海淀区金澳国际写字楼1115 中汇'],['邓*亮', '湖北省武汉市云林街台北一路58号'],['李*沙', '北京市昌平区城南街道北清路珠江摩尔国际大厦五号楼二单元906'],['徐*瑞', '上海市徐汇区古美路1595号宝石园27号楼2楼D区'],['梁*', '陕西省西安市电子二路18号(西安石油大学)'],['徐*', '浙江省衢州市西区广电大楼'],['雷*强', '河南省信阳市汪桥镇街道滨河花园A幢6208'],['张*亮', '天津市河西区郁江道17号陈塘科技328'],['陈*', '上海市浦东新区东方路1217号陆家嘴金融服务广场15楼'],['郭*', '北京市昌平区北七家镇东三旗365号'],['李*扬', '上海市浦东新区北蔡镇北艾路1500弄6号楼203'],['汝*明', '吉林省长春市长春光机所研究生部D栋'],['朱*懿', '上海市静安区陕西北路66号科恩国际中心1027室'],['刘*', '上海市浦东新区五莲路 锦河苑'],['任*荣', '陕西省西安市软件新城软件公寓'],['王*', '上海市闵行区莲花路2080弄50号C幢3楼'],['萌*', '北京市西城区金融街邮政集团公司'],['张*宾', '河南省郑州市文治路泰祥投资集团楼下新锐广告'],
]Data_dict = {}for i in Data_list:if "省" in i[1]:idx = i[1].index("省") + 1 # 获取xx省的下标识位置name_pro_city = i[1][0:idx] # 获取分类信息(省份名单)else:idx = i[1].index("市") + 1 # 获取xx省的下标识位置name_pro_city = i[1][0:idx] # 获取分类信息(省份名单)# 将分类信息添加到字典的key值,有的话直接添加values,没有新建keyif name_pro_city not in Data_dict:Data_dict[name_pro_city] = [] # 添加新key {'北京市': []}Data_dict[name_pro_city].append(i)else:Data_dict[name_pro_city].append(i) # 直接添加
print(Data_dict)# 按照格式打印结果
print("{")
for i in Data_dict:print("\t"+i+":[") # 四个空格+北京市:[for j in Data_dict[i]:print("\t\t"+str(j)+",")print('\t],')
print("}")
练习
股票查询
需求2修改:
需求3修改:
正则表达:
修复