本节内容
- 列表、元祖操作
- 字符串操作
- 字典操作
- 集合操作
- 文件操作
- 字符编码与转码
- 三元运算&生成式&成员运算&解压法&队列堆栈&数据类型转换
1. 列表操作
列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作
语法
names = ['Alex',"Tenglan",'Eric']
通过下标访问列表中的元素,下标从0开始计数
>>> names[0] 'Alex' >>> names[2] 'Eric' >>> names[-1] 'Eric' >>> names[-2] #还可以倒着取 'Tenglan'
切片:取多个元素
>>> names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] >>> names[1:4] #取下标1至下标4之间的数字,包括1,不包括4 ['Tenglan', 'Eric', 'Rain'] >>> names[1:-1] #取下标1至-1的值,不包括-1 ['Tenglan', 'Eric', 'Rain', 'Tom'] >>> names[0:3] ['Alex', 'Tenglan', 'Eric'] >>> names[:3] #如果是从头开始取,0可以忽略,跟上句效果一样 ['Alex', 'Tenglan', 'Eric'] >>> names[3:] #如果想取最后一个,必须不能写-1,只能这么写 ['Rain', 'Tom', 'Amy'] >>> names[3:-1] #这样-1就不会被包含了 ['Rain', 'Tom'] >>> names[0::2] #后面的2是代表,每隔一个元素,就取一个 ['Alex', 'Eric', 'Tom'] >>> names[::2] #和上句效果一样 ['Alex', 'Eric', 'Tom']
追加
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy']
>>> names.append("我是新来的")
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
插入
>>> names ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的'] >>> names.insert(2,"强行从Eric前面插入") >>> names ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的'] >>> names.insert(5,"从eric后面插入试试新姿势") >>> names ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
修改
>>> names ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的'] >>> names[2] = "该换人了" >>> names ['Alex', 'Tenglan', '该换人了', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
删除
>>> del names[2]
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
>>> del names[4]
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
>>>
>>> names.remove("Eric") #删除指定元素
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', '我是新来的']
>>> names.pop() #删除列表最后一个值
'我是新来的'
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy']
扩展
>>> names ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy'] >>> b = [1,2,3] >>> names.extend(b) >>> names ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
拷贝
l = ['1','2','3',[1,2,3]] re = l.copy() print(l) # ['1', '2', '3', [1, 2, 3]] print(re) # ['1', '2', '3', [1, 2, 3]] l[3].append(4) print(l) # ['1', '2', '3', [1, 2, 3, 4]] print(re) # ['1', '2', '3', [1, 2, 3, 4]] import copy ret = copy.copy(l) # 同上的结果,我们称为浅拷贝 ret2 = copy.deepcopy(l) # 2份独立的空看,我们称为深拷贝 print(l) # ['1', '2', '3', [1, 2, 3, 4]] print(ret2) # ['1', '2', '3', [1, 2, 3, 4]] l[3].append(5) print(l) # ['1', '2', '3', [1, 2, 3, 4, 5]] print(ret2) # ['1', '2', '3', [1, 2, 3, 4]] # 浅拷贝是拷贝了一份内存指引,都指向一个地址,为什么这么做,因为PYTHON为了避免数据类型里面有无限大的子集,避免浪费
统计
>>> names
['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]
>>> names.count("Amy")
2
排序&翻转
>>> names ['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3] >>> names.sort() #排序 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unorderable types: int() < str() #3.0里不同数据类型不能放在一起排序了,擦 >>> names[-3] = '1' >>> names[-2] = '2' >>> names[-1] = '3' >>> names ['Alex', 'Amy', 'Amy', 'Tenglan', 'Tom', '1', '2', '3'] >>> names.sort() >>> names ['1', '2', '3', 'Alex', 'Amy', 'Amy', 'Tenglan', 'Tom'] >>> names.reverse() #反转 >>> names ['Tom', 'Tenglan', 'Amy', 'Amy', 'Alex', '3', '2', '1']
获取下标
>>> names
['Tom', 'Tenglan', 'Amy', 'Amy', 'Alex', '3', '2', '1']
>>> names.index("Amy")
2 #只返回找到的第一个下标
元祖
元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表
语法
names = ("alex","jack","eric")
元组本身是不可变的,但是内部的元素可以是可变类型
2个方法 一个 count 一个 index,可以切片,索引取值,成员操作
程序练习
请闭眼写出以下程序。
程序:购物车程序
需求:
- 启动程序后,让用户输入工资,然后打印商品列表
- 允许用户根据商品编号购买商品
- 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
- 可随时退出,退出时,打印已购买商品和余额
2. 字符串操作
特性:不可修改
#!/usr/bin/env python #_*_coding:utf-8_*_ #strip 方法用于移除字符串头尾指定的字符(默认为空格)。 #str.strip([chars]); # chars移除字符串头尾指定的字符。 这是一个包含的关系 name = "*joker**" print(name.strip("*")) print(name.lstrip("*")) #去除左边 print(name.rstrip("*")) #去除右边 #startswith,endswith name = "joker_li" print(name.endswith("li")) #是否以什么结尾 print(name.startswith("joker")) #是否以什么开头 #replace name = "joker is good joker boy!" print(name.replace('joker','li')) #所有joker替换li print(name.replace('joker','li',1)) #从左到右替换1次 #find,rfind,index,rindex,count name = 'jokerk say hi' print(name.find('s')) #字符串也是可以切片找不到则返回-1不会报错,找到了则显示索引 print(name.count('k')) #统计包含有多少个 #split name = 'root:x:0:0::/root/:bin/bash' print(name.split(':')) #默认分隔符为空格 name = 'c:/a/b/c/d.txt' #想拿到顶级目录 print(name.split('/',1)) #按多少次切片,从左边 name = 'a|b|c' print(name.rsplit('|',1)) #按多少次切片,从右边 #join tag = ' ' print(tag.join(['joker','li','good','boy'])) #可迭代对象必须都是字符串 #也就是说这个方法是将列表转换为字符串,如果tag有变量的话,就会循环加 #center,ljust,rjust,zfill name = 'joker' print(name.center(10,'_')) #不够10个字符,用_补齐 print(name.ljust(10,'*')) #左对齐 print(name.rjust(10,'*')) #右对齐,注意这个引号内只能是一个字符 print(name.zfill(10)) #右对齐,用0补齐就是 #expandtabs name = 'joker\thello' print(name) print(name.expandtabs(4)) #expand扩张的意思,就是将tab建转为多少个空格 #lower,upper name = 'joker' print(name.lower()) #大写变小写,如果本来就是小写,那就没变化 print(name.upper()) #小写变大写,如果本来就是大写,那就没变化 #capitalize,swapcase,title name = 'joker li' print(name.capitalize()) #首字母大写 print(name.swapcase()) #大小写对调 print(name.title()) #每个单词的首字母大写 #is数字系列 num1 = b'4' #bytes 类型 print(type(num1)) num2 = u'4' #unicode类型,在3里默认就是这个类型 print(type(num2)) num3 = '四' #中文数字 num4 = 'Ⅳ' #罗马数字 #isdigt,bytes,unicode print(num1.isdigit()) #是不是一个整数数字,如果是浮点数就会False print(num2.isdigit()) print(num3.isdigit()) #False print(num4.isdigit()) #罗马数字 False ,不是一个整数 #isdecimal,uncicode #bytes类型无isdecimal方法 print(num2.isdecimal()) #检查字符串是否只包含十进制字符。这种方法只存在于unicode对象 #注意:定义一个十进制字符串,只需要在字符串前添加 'u' 前缀即可 print(num3.isdecimal()) print(num4.isdecimal()) #isnumberic:unicode,中文数字,罗马数字 #bytes类型无isnumberic方法 print(num2.isnumeric()) #判断是不是数字,包括中文大写数字,罗马数字等 print(num3.isnumeric()) print(num4.isnumeric()) #三者不能判断浮点数 num5='4.3' #全是false print(num5.isdigit()) print(num5.isdecimal()) print(num5.isnumeric()) # 最常用的是isdigit,可以判断bytes和unicode类型,这也是最常见的数字应用场景 # 如果要判断中文数字或罗马数字,则需要用到isnumeric #is print('===>') name='joker123' print(name.isalnum()) #字符串由字母和数字组成 print(name.isalpha()) #字符串只由字母组成 print(name.isidentifier()) #判断是不是一个合法的表示符 print(name.islower()) #判断是不是小写 print(name.isupper()) #是不是大写 print(name.isspace()) #判断是不是空格 print(name.istitle()) #每个单词字母首字母大小