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. 文件操作
5.1 文件基本操作
#文件基本操作 #给打开的内存对象赋一个变量 #windows默认编码格式:gbk;而python是utf-8,因此得指定一个编码集 f = open("yesterday", 'r', encoding="utf-8",) #文件句柄(文件名、字符集、内存位置) #单行读:仅读一行 first_line = f.readline() #全部读:读取文本剩余所有内容 data = f.read() #文件大时不要用!!! #写文本 f.write("\n我爱北京天安门。。。。。\n") #关闭文本 f.close() #打印分割线 print('我是分割线'.center(50,'-'))
#通过循环,打印除10行以外的内容(高效循环法) count = 0 #计数器 for line in f: #不用readlines变列表(占内存),而是读一行,删一行,内存里面只存一行 if count == 9: print('我是分割线'.center(50, '-')) count += 1 continue else: print(line.strip()) #.strip:去掉空格、回车 count += 1
5.2 其他一些操作
#其他一些小操作 #记录光标位置(前面字符个数,而不是行数) print(f.tell()) #光标回到最开始位置 f.seek(0) #查看文件编码形式 print(f.encoding) #实时写入硬盘 import sys,time for i in range(20): sys.stdout.write("#") sys.stdout.flush( ) #f.flush() #实时写入硬盘,而不是临时存在缓存,防止停电等 time.sleep(0.1)
#读写(r+):打开,读取,追加 f = open("yesterday1", 'r+', encoding="utf-8") #二进制读:用于——1网络传输(fgp);2二进制文件(视频) f = open("yesterday1", 'rb')
5.3 文件修改
修改只能在原来基础上覆盖,因此只有两个办法:(硬盘上不能往后挤)
- 把文件加到内存里,在内存里修改,再写回硬盘(类似VIM)(2个G的话没法玩儿)
- 打开,修改完以后,写到一个新文件里面
#文件内容修改(替换) find_str = "肆意的快乐等我享受" replace_str = "肆意的快乐等Zhu享受" f = open("yesterday", "r", encoding="utf-8") f_new = open("yesterday1", "w", encoding="utf-8") for line in f: if find_str in line: line = line.replace(find_str,replace_str) f_new.write(line) f.close() f_new.close()
6. 字符编码与转码
- ASCII码:1字节,只能英文、特殊字符。不能存中文(python2.0)
- GBK:2字节,专门用来汉字(txt文件)
- unicode:2字节,统一了中文、英文(python3.0)
- utf-8:万国吗,在unicode基础上,可变长度(默认:英文ascii—1个字节,中文—3 个字节)
在日本电脑上正常显示中文:gbk→unicode
在中国电脑上正常显示日文:日文→unicode→gbk
会发现,unicode是转换的桥梁
python2.0和python3.0有区别,一个是ascii,一个是unicode