1. 列表(list)、元组(tuple)
1.1 基本操作
列表和matlab中的向量很类似。小心2点即可:
- 取值:顾头不顾尾,前闭后开
- 下标:位置从0开始,最后开始为-1
names = ["Zhu Yijun", "Xiao Ming", "Xiao Ming", "Da Bing", "Xi Ha"] #取(切片法) print(names[1:3]) #取1和2;区间:[),顾头不顾尾 print(names[-1]) #直接取最后一个 print(names[-3:]) #取最后3个 print(names[::2]) #步长为2(0、-1可以省略) #增 names.append("Lei Haidong")#默认放最后 names.insert(1,"Lei Haidong")#插在第2个 #改 #names[2] = "Xie Di" #删 names.remove("Lei Haidong") del names[2] #查 print(names.index("Da Bing")) #统计个数 print(names.count("Xiao Ming")) #排序 names.sort() print(names) #合并 names2 = [1, 2, 3, 4] names.extend(names2) print(names) #循环 for i in names: print(i)
1.2 列表copy
3种copy的方式,从内存地址理解可以明白
- 直接赋值:内存完全一样,很少用
#直接赋值 p1 = person
- 浅copy:由于引用的关系,仅第一层元素的内存不一样
#浅copy的定义 #法1 p1 = person[:] #法2 import copy p2 = copy.copy(person) #需要导入copy模块
#理解浅copy的应用,共用财产,统一变 import copy person = ['name', ['work', 100]] p1 = person[:] p2 = copy.copy(person) p1[0] = 'Zhu Yijun' p2[0] = 'Amy' p1[1][1] = 50 #会发现,p2也变了 print(p1) print(p2)
- 深copy:所有元素的内存都不一样,完全独立
import copy names3 = copy.deepcopy(names)
1.3 购物车程序收获
把在购物车程序中的一些小收获总结如下:
#列表很多时,别写一行,这样多清晰 list_product = [ ('Ipad Mini', 4000), #这样写看起来多舒服 ('Coffee', 30), ('Car', 12000), ('Book', 80), ('Tea', 30), ]
#输入的字符经判断后再强转,用.isdigit salary = input('Please input your money:') if salary.isdigit(): #如果字符串salary只包含数字则返回 True 否则返回 False。 salary = int(salary)
#打印带序号的列表 for item in list_product: print(list_product.index(item),item) #列表.index:查找位置 for index,item in enumerate(list_product): #enumerate多用于在for循环中得到计数,利用它可以同时获得索引和值,即需要index和value值 print(index,item)
#在中间输出时,变量前加%号 print("把%s加入购物车,您还剩%s元" %(p_item, salary)) print("余额不足,还剩%s元" %salary) #彩色输出 #格式:前后加“\033[41;1m \033[0m”即可 31红,32绿,41背景红,42背景绿 print("\033[41;1m余额不足,还剩%s元\033[0m" %salary)
#购物车程序逻辑 while True: 打印列表 if 输入为序号: 判断序号,判断余额,加入购物车,打印提示信息 elif 输入为q: 打印清单并退出 else: 输入错误
1.4 元组(tuple)
- 元组和列表几乎一模一样,只不过不能【增删改】而已,只能【查】。又被称为“只读列表”
- 元组不用[],而用()
- 它只有2个方法,一个是count,一个是index
- 什么时候用:创建一组不被改的数据
names = ("alex", "jack")
2. 字符串操作(string)
字符串不能【增删改】,修改的话是生成一个新的数据。而列表是在原来的内存基础上就修改了。
#字符串常用操作 name = "my \tname is {name} and I am {year} old" #统计字符个数 print(name.count("m")) #打印50个字符,不够-补上。(很美观) print(name.center(50,"-")) #查找 print(name.find("y")) #字符串也能切片 print(name[name.find("name"):]) #字符串格式化 print(name.format(name = 'alex', year = 23)) #字典-字符串格式化 print(name.format_map({'name':'alex','year':12})) #连接 print('+'.join(['1','2','3'])) #去掉两头空格、回车 print(' Zhu Yijun\n'.strip()) #提取出数字 print('1+2+3+4'.split('+'))
3. 字典操作(dict)
3.1 字典常用操作
列表的索引是位置,字典的索引是key
- 字典是无序的,没有下标,也不需要下标,有key
- key必须唯一,尽量别写中文
#字典常用操作 #字典循环打印 for i in info: print(i,info[i]) #通过索引循环 #字典定义 info = { 'stu1101': "TengLan Wu", #是冒号! 'stu1102': "LongZe Luola", 'stu1103': "XiaoZe Maliya", } #增 info["stu1104"] = "Alex" #删 info.pop("stu1103") #标准删 del info["stu1102"] #改 info["stu1101"] = "武藤兰" #查 print(info.get("stu1104")) #判 print('stu1104' in info)
#字典中一些别的操作 info = { 'stu1101': "TengLan Wu", 'stu1102': "LongZe Luola", 'stu1103': "XiaoZe Maliya", } b = { 'stu1101':"Alex", 1:3, 2:5 } #合并字典,交叉的覆盖,没有交叉的创建 info.update(b) print(info) # 字典转为列表 print(info.items()) #能取到就返回,取不到就创一个新的 info.setdefault("stu1106","Alex") print(info)
3.2 三级菜单程序收获
太复杂了,以后改用函数写,嵌套循环太多。或者好好理解文艺版。
#判断元素是否在字典里 if choice1 in data if choice2 in data[choice1]
4. 集合(set)
集合操作主要有2个用途:去重、关系测试(交叉并集)
#集合定义 s1 = set([3,5,9,10]) t = set("Hello")
#集合操作(关系测试) list_1 = set([1,4,5,7,3,6,7,9]) list_2 = set([2,6,0,66,22,8,4]) #返回共有值(交集) print(list_1.intersection(list_2)) #法1:常规 print(list_1 & list_2) #法2:更简洁
5. 文件操作