一、String字符串
1.分割和合并
1.1 str1.split(str2, num)
功能:以str2为分割截取字符串,num默认为str1.count()
若给定num 后,则截取num个字符串,剩余的不再进行截取。
str1 = "how are you , i am fine thank you"
#使用空格进行分割
list1 = str1.split(" ")
print(list1)
#结果
['how', 'are', 'you', ',', 'i', 'am', 'fine', 'thank', 'you']
1.2 str1.splitlines([keepends])
功能:字符串会按照行(’\r’,’\r\n’,’\n’)进行分割,返回一个包含各行作为元素的列表,如果参数keepends的值为False,不包含换行符,如果为True,则保留换行符。
str2 = '''how are
you ?
i am
fine
!
'''
list2 = str2.splitlines()
print(list2)
#结果
['how are', 'you ?', 'i am', 'fine', '!']
str2 = '''how are
you ?
i am
fine
!
'''
list2 = str2.splitlines(keepends=True)
print(list2)
#结果
['how are\n', 'you ?\n', 'i am\n', 'fine\n', '!\n']
1.3 str1.join(seq)
功能:以指定字符串作为分隔符,将seq中的所有元素合并成为一个新的字符串
list2 = ['you', 'are', 'very', 'great', '!']
str3 = ' '.join(list2)
print(str3)
#结果
you are very great !
str1 = "how are you , i am fine thank you"
str3 = "*".join(str1)
print(str3)
#结果
h*o*w* *a*r*e* *y*o*u* *,* *i* *a*m* *f*i*n*e* *t*h*a*n*k* *y*o*u
注意:如果连接的是字符串,则它会把字符串中的每个字符使用指定字符连接。
2.获取最大最小字符
2.1 max(str)
功能: 返回字符串str中最大的字母
str1 = "how are you , i am fine thank you"
print(max(str1))
#结果
y
2.2 min(str)
功能:返回字符串str中最小字母
str1 = "how are you , i am fine thank you"
print(min(str1))
#结果
‘ ’
注意:比较的是ASCII码值
3.字符串的替换
3.1 replace(old , new [, count])
功能:将字符串中的old替换成new,若不指定count,则默认全部替换,若指定count,则替换前count个
str1 = "how are you , i am fine thank you"
str2 = str1.replace("you" ,'me')
print(str2)
#结果
how are me , i am fine thank me
3.2 字符串映射替换
参数一:要转换的字符 参数二:目标字符
dic = str.maketrans(oldstr, newstr)
str2.translate(dic)
str5 = "aaa bbb ccc deee"
dic = str5.maketrans("ac", "21")
# a--2 c--1
str7 = "how are you ,u ewe "
print(str7.translate(dic))
#结果
how 2re you ,u ewe
#注意:很少用
4.判断字符串的开头结尾
str.startswith(str1, start=0, end=len(str))
功能:在给定的范围内判断字符串是否以给定的字符串开头,如果没有指定范围,默认整个字符串
str1 = "aaa bbb ccc deee"
print(str1.startswith("aa"))
#结果
True
str1 = "aaa bbb ccc deee"
print(str1.startswith("aa", 3, 9))
#结果
False
str.endswith(str, start=0, end=len(str))
功能:在给定的范围内判断字符串是否以指定的字符串结尾,若没有指定范围,默认为整个字符串
str1 = "aaa bbb ccc deee"
print(str1.endswith("e"))
#结果
True
str1 = "aaa bbb ccc deee"
print(str1.endswith("e", 3 ,9))
#结果
False
5.编码与解码
str.encode(encoding=“utf-8”, errors=“scrict”)
功能:字符串的编码,若不指定encoding则默认选择utf-8
str1 = "你好吗?"
data = str1.encode()
print(data)
print(type(data))
#结果
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97\xef\xbc\x9f'
<class 'bytes'>
str.decode(encoding=“utf-8”)
"hello".encode(“utf-8”).decode()
功能:对字符进行解码,若不指定编码格式,则默认选择utf-8
str1 = "你好吗?"
data = str1.encode()
print(data)
print(type(data))
data2 = data.decode()
print(data2)
print(type(data2))
#结果
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97\xef\xbc\x9f'
<class 'bytes'>
你好吗?
<class 'str'>
注意:解码时的编码格式要与编码时的保持一致
拓展:errors = ignore 的时候,忽略错误
6.判断是否为字母或数字
str.isalpha()
功能:判断字符串至少有一个字符,并且所有的字符都是字母,若为真则返回True,否则返回False
str8 = "hello ni hao "
print(str8.isalpha())
#结果
False
str9 = "hellonahao"
print(str9.isalpha())
#结果
True
str.isalnum()
功能:判断一个字符串至少有一个字符,并且所有的字符都是字母或数字则返回True否则返回False
str10 = "sc22xdcd"
print(str9.isalnum())
print(str10.isalpha())
#结果
True
False
7.判断大小写
str.isupper()
功能:若字符串中包含至少一个字母的字符,并且这些字母都是大写,则返回True,否则返回False
str10 = "AA2221 111"
print(str10.isupper())
#结果
True
str10 = "AAaaa"
print(str10.isupper())
#结果
False
str.islower()
功能:若字符串中包含至少一个字母的字符,并且这所有的字母都是小写,则返回True,否则返回False
str10 = "aa2221 111"
print(str10.islower())
#结果
True
8.判断是否包含特殊字符
8.1 str.istitle()
功能:如果一个字符串是标题化的则返回True,否则返回False
【标题化】每个首字母大写
str1 = "Hello World"
print(str1.istitle())
8.2 str.isdigit()
isdigit() True: Unicode数字,byte数字(单字节),全角数字(双字节) False: 汉字数字, ,罗马数字 Error: 无
print("123".isdigit())
print("123a".isdigit())
#结果
True
False
同上
str.isnumeric()
功能:若字符串中只包含数字字符,则返回True,否则返回False
isnumeric() True: Unicode数字,全角数字(双字节),汉字数字 False: 罗马数字, Error: byte数字(单字节)
8.3 str.isdecimal()
功能:检查字符串是否只包含十进制字符【0,9】,如果是返回True,否则返回False
isdecimal() True: Unicode数字,,全角数字(双字节), False: 罗马数字,汉字数字 Error: byte数字(单字节)
print("123".isdecimal())
print("123z".isdecimal())
#结果
True
False
8.4 str.isspace()
功能:如果字符串只包含空格,则返回True,否则返回False
print(" ".isspace())
print("\t".isspace())
print("\n".isspace())
print("\r".isspace())
print(" qq".isspace())
#结果
True
True
True
True
False
9.ASCII码转换
9.1 ord(str)
功能:获取字符表示 ASCII码值
print(ord("A"))
print(ord("你"))
#结果
65
20320
9.2 chr(str)
把编码转成对应的字符
print(chr(68))
print(chr(20190))
#结果
D
仞
二、dict字典
1.概述
dict也是一种存储方式,类似于list和tuple,但是,字典采用键—值(key—value)的形式存储
优点:具有极快的查找速度
2.key的特性
1.字典中的key必须唯一
2.key必须是不可变对象
例如:字符串、整数等都是不可变的,可以作为key
list是可变的,不能作为key
思考:保存一个班级中的童鞋的成绩
思路1:使用list或者tuple,但是容易发生错乱对不上号
思路2:使用二维list或者tuple,但是会比较慢
思路3:可以采用字典,将学生的学号或者名字作为key,成绩为value进行存储,方便查找
3.字典的创建
语法:
字典名 = {键1:值1,键2:值2,…}
dist1 = {'tom':90,'lili':78, 'lele':92}
print(dist1)
4.字典操作
4.1访问元素
语法:元素 = 字典名[key]
dist1 = {'tom':90,'lili':78, 'lele':92}
print(dist1['tom'])
注意:在key不存在的情况下,会报错
语法: 元素 = 字典.get(key)
功能:使用get的方法获取值,若key存在,则返回value的值,若key不存在则返回None
dist1 = {'tom':90,'lili':78, 'lele':92}
value = dist1.get('tom')
print(value)
4.2 添加元素
语法:字典名[key] = value
dist1 = {'tom':90,'lili':78, 'lele':92}
dist1['lisi'] = 89
print(dist1)
注意:一个key只能对应一个value,多次对一个key的value赋值,后面的值会把前面的值覆盖掉。
4.3 删除元素
语法:字典名.pop(key)
dist1 = {'tom':90,'lili':78, 'lele':92}
dist1.pop('tom')
print(dist1)
5.字典的遍历
5.1 使用for循环遍历
语法:
获取键
for key in dist:
print(key)
获取值
for value in dist.values() :
print(value)
同时获取键和值
for k, v in dist.items() :
print(k, v)
注意:字典是无序的,在内存中存储是无序的,因此无法通过下标来获取值
dist1 = {'tom':90,'lili':78, 'lele':92}
#获取字典的key
for key in dist1:
print(key)
#获取字典中的value
for value in dist1.values():
print(value)
#同时获取字典中的key与value
for k, v in dist1.items():
print(k, v)
6.与list的区别
1.dict的查找和插入的速度极快,不会随着key-value的增加而变慢,但是list在查找的时候需要从头向后挨个遍历元素,并且当数据量增大的时候,速度也会随着变慢
2.dict需要占用大量的内存,内存浪费多,而list只相当于存储了字典的key或者value部分,并且数据时紧密排列的。
三、set集合
1.概述
set与dict类似,也是一组key的集合,但与dict的区别在于set不存储value
本质:无序且无重复元素的集合
2.set的创建
语法:
set1 = set([1, 2, 3, 4, 5])
注意:创建set需要一个list或者tuple或者dict作为输入集合,重复的元素在set中会被自动的过滤
s1 = set([1, 2, 3, 4, 5])
print(s1)
3.set操作
3.1 set.add()
注意:
1.可以添加重复的元素,但是不会有效果
2.add 的元素不能是列表或者字典,因为他们是可变的
s1 = set([1, 2, 3, 4, 5])
s1.add(6)
s1.add((2, 3, 4))
print(s1)
#结果
{1, 2, 3, 4, 5, 6, (2, 3, 4)}
3.2 set.update()
功能:插入整个list、tuple、字符串打碎插入
注意:不能直接插入数字
s1 = set([1, 2, 3, 4, 5])
s1.update([4,"anam","hha"])
s1.update("hello")
print(s1)
#结果
{1, 2, 3, 4, 5, 'anam', 'l', 'o', 'h', 'e', 'hha'}
3.3 set.remove(元素)
功能:删除元素
s1 = set([1, 2, 3, 4, 5])
s1.remove(3)
print(s1)
3.4 遍历元素
语法:
for i in set :
print(i)
注意:set是无序的,因此不能通过下标获取元素
for index, data in enumerate(set):
print(index, data)
可以通过这种方式,来强行添加下标
s1 = set([1, 2, 3, 4, 5])
for i in s1:
print(i)
for index,data in enumerate(s1):
print(index, data)
3.5 交集与并集
语法:
交集 newest = set1 & set2
并集 newest = set1 | set2
s1 = set([1, 2, 3, 4, 5])
s2 = set([4, 5, 6, 7])
s3 = s1 & s2
s4 = s1 | s2
print(s3)
print(s4)
#结果
{4, 5}
{1, 2, 3, 4, 5, 6, 7}
四、类型转换
主要针对几种存储工具:list、tuple、dict、set
特殊之处:dict是用来存储键值对的
4.1 list 转换为set
l1 = [1, 2, 4, 5]
s1 = set(l1)
print(type(s1))
print(s1)
4.2 tuple 转换为set
t1 = (1, 2, 3, 4)
s1 = set(t1)
print(type(s1))
print(s1)
4.3 set转换为list
s1 = set([1, 2, 3, 4])
l1 = list(s1)
print(type(l1))
print(l1)
4.4 set转换为tuple
s1 = set([1, 2, 3, 4])
t1 = tuple(s1)
print(type(t1))
print(t1)
五、迭代器
列表生成式
语法:
list = [result for x in range(m, n)]
需求:创建一个[1, 2, …100]的列表
>>> range(1, 101)
[1, 2, 3, 4, 5,...,100]
需求2 :生成一个[1x1, 2x2, 3x3,….100x100]的列表
>>> list1 = []
>>> for x in range(1, 101)
list1.append(x*x)
>>> list1
[1, 4, 9,....10000]
#使用列表生成式,可以这么来写
>>> list2 = [x*x for x in range(1, 101)]
5.1 可迭代对象
1.可以直接作用于for循环的对象统称为可迭代对象,我们称之为:Iterator
2.我们可以使用isintance()判断一个对象是否是Iterator对象
3.可以直接作用于for循环的数据类型有以下几种
a.集合数据类型:如list、tuple、dict、set和string
b.生成器(generator):就是一个能返回迭代器的函数,其实就是定义一个迭代算法,可以理解为一个特殊的迭代器。
生成器:
通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,如果我们仅仅需要访问前面几个元素,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)
#要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator
>>> g = (x for x in range(1, 101))
>>> g
<generator object <genexpr> at 0x10124df68>
>>> g.__next__()
1
>>> [x for x in g]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
注意:使用Iterator判断的时候需要导入Iterable的包
from collections import Iterable
print(isinstance([],Iterable))
print(isinstance((),Iterable))
print(isinstance({},Iterable))
print(isinstance("",Iterable))
print(isinstance((x for x in range(10)),Iterable))
print(isinstance(1,Iterable))
#结果
True
True
True
True
True
False
#####5.2 迭代器
迭代器:不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后出现StopIteration错误,表示无法返回下一个值
可以被next()函数调用并不断返回下一个值得对象成为迭代器(Iterator对象)
可以使用isinstance()函数判断一个对象是否是Iterator对象
print(isinstance([],Iterator))
print(isinstance((),Iterator))
print(isinstance({},Iterator))
print(isinstance("",Iterator))
# 只有这个是迭代器
print(isinstance((x for x in range(10)),Iterator))
#结果
False
False
False
False
True
5.3 Iterator转换
可以通过Iter()函数将list、tuple、dict、string转换为Iterator对象
>>> a = iter([1, 2, 3, 4, 5])
>>> print(next(a))
1
print(isinstance(iter([]), Iterator))
print(isinstance(iter(()), Iterator))
print(isinstance(iter({}), Iterator))
print(isinstance(iter(''), Iterator))
#结果
True
True
True
True
六、练习
1.从控制台输入一个正数n,则打印n行*
'''
*
* *
* * *
'''
2.冒泡排序,从控制台输入一个数值列表,对列表进行冒泡排序
例如:[1, 3, 2, 6, 8, 5]
结果:[8, 6, 5, 3, 2, 1]
3.输入一个时间,获取这个时间的下一秒
#从控制台输入一个时间【06:34:52】,打印出这个时间的下一秒【06:34:53】 【时:分:秒】
4.歌词解析器
1.把歌词进行解析切片处理,把时间转成对应的浮点数
2.使用字典将时间与歌词进行存储{时间:歌词}
3.循环自动打印歌词【结束循环的条件,key为None的时候】
musicLrc = '''[00:03.50]传奇 [00:19.10]作词:刘兵 作曲:李健 [00:20.60]演唱:王菲 [00:26.60] [04:40.75][02:39.90][00:36.25]只是因为在人群中多看了你一眼 [04:49.00] [02:47.44][00:43.69]再也没能忘掉你容颜 [02:54.83][00:51.24]梦想着偶然能有一天再相见 [03:02.32][00:58.75]从此我开始孤单思念 [03:08.15][01:04.30] [03:09.35][01:05.50]想你时你在天边 [03:16.90][01:13.13]想你时你在眼前 [03:24.42][01:20.92]想你时你在脑海 [03:31.85][01:28.44]想你时你在心田 [03:38.67][01:35.05] [04:09.96][03:39.87][01:36.25]宁愿相信我们前世有约 [04:16.37][03:46.38][01:42.47]今生的爱情故事 不会再改变 [04:24.82][03:54.83][01:51.18]宁愿用这一生等你发现 [04:31.38][04:01.40][01:57.43]我一直在你身旁 从未走远 [04:39.55][04:09.00][02:07.85] '''