本文共 4358 字,大约阅读时间需要 14 分钟。
集合
创建集合可以用set(),或者直接用{}
1 2 3 4 5 | set_a = set ([ 1 , 2 , 3 , 4 , 5 ]) set_b = { 1 , 3 , 5 , 7 , 9 } print (set_a) print (set_b) print ( type (set_a), type (set_b)) |
集合同样也有各种操作,就记几个符号的。别的到用的时候再去查吧
1 2 3 4 5 6 7 | set_a = set ([ 1 , 2 , 3 , 4 , 5 ]) set_b = { 1 , 3 , 5 , 7 , 9 } print (set_a | set_b) # 并集 print (set_a & set_b) # 交集 print (set_a ^ set_b) # 对称差集 print (set_a - set_b) # 差集 print (set_b - set_a) # 还是差集 |
并没有"+"号,并集已经有"|"号可以获得了。
集合删除的3中方法:
1 2 3 4 5 6 7 8 9 10 11 | set_a = set ([ 1 , 2 , 3 , 4 , 5 ]) set_b = { 1 , 3 , 5 , 7 , 9 } c = set_a.pop() # 随机删除一个,返回值为删除的元素 print (c,set_a) set_b.remove( 3 ) # 指定删除一个元素 print (set_b) set_b.discard( 7 ) # 也是指定删除一个元素 print (set_b) set_b.discard( 2 ) # discard允许尝试删除不存在的元素,但是remove会报错 #setb.discard(2) print (set_b) |
文件的操作
open()打开文件。windows系统默认的是gbk编码,如果不指定字符编码,就会使用系统默认的字符编码打开文件。比如这时python就会使用gbk编码去读utf-8文件,运行后会报错或者读到乱码。
现在推荐我们的方法是全部文件都使用utf-8的编码格式。open的时候就不要省略这个参数了,直接指定utf-8的字符编码。
文件的基本操作:
1 2 3 4 | file = open ( 'test.txt' ,encoding = 'utf-8' ) # 打开文件,这里指定了utf-8 data = file .read() # 读取文件的全部内容 print (data) # 打印读取的内容 file .close() # 关闭文件 |
读取文件内容逐行打印:
1 2 3 4 | file = open ( 'test.txt' ,encoding = 'utf-8' ) # 打开文件,这里指定了utf-8 for line in file : print (line.rstrip()) # 加了rstrip可以去掉每一行右边的空格(包括换行符) file .close() |
推荐上面的方法实现。这个方法是一次读一行,让后操作,然后再处理下一行。这是一个高效的方法。
如果是使用一次读取整个文件到内存,然后再进行处理的实现方法(比如readlines()),在处理大文件的时候效率会低很多。虽然那也得文件足够大(大到现在内存容量的级别几个G)。
不过这个方法处理的时候数据就不是列表了,要获取行号,只能在for循环开始的时候加一个计数器,然后每一次都自增1,这样来记录行号
1 2 3 4 5 6 | file = open ( 'test.txt' ,encoding = 'utf-8' ) # 打开文件,这里指定了utf-8 count = 0 for line in file : count + = 1 print (count,line.rstrip()) # 加了rstrip可以去掉每一行右边的空格(包括换行符) file .close() |
flush():强制刷新。默认写文件的时候,是先写入缓存,等缓存到一定数量后再一次全部写入硬盘。如果对数据的实时性要求高的话,又不想关闭文件的话,就需要这个方法来手动强制执行一次写如到硬盘的操作。
1 2 3 4 5 6 7 8 9 10 | file = open ( 'test.txt' , 'a' ,encoding = 'utf-8' ) # 打开文件,追加模式 file .write( "先回将我存入缓存\n" ) input ( "去打开文件看看文件有没有更新" ) file .flush() print ( "现在再打开文件看看有没有更新" ) input ( "文件关闭前也会写入,我没再试一次" ) file .write( "再来一次,先回将我存入缓存\n" ) input ( "打开文件看看文件有没有更新" ) print ( "现在再打开文件看看有没有更新" ) file .close() |
验证了硬盘中的文件不是实时更新的。但是在flush()或者是close()之后,再去确认文件的时候都是最新的内容了。
文件的修改
文件的修改比较麻烦,没有办法做直接的修改。想要实现,只能重新全部写一遍。
方法一:一次读取文件的全部内容,然后修改后,再写回去。不适合大文件
1 2 3 4 5 6 7 8 9 10 | file = open ( 'test.txt' ,encoding = 'utf-8' ) lines = file .readlines() # 读取源文件 file .close() file_w = open ( 'test2.txt' , 'w' ,encoding = 'utf-8' ) # 重新打开一个文件,这里方便比较,使用了新的文件名 #file_w = open('test.txt','w',encoding='utf-8') # 使用原来的文件名直接打开写入就实现了文件的修改 for count,line_w in enumerate (lines): if count + 1 = = 3 : line_w = "这是被替换的第三行\n" # 这里修改替换掉第三行的内容,别忘了\n换行 file_w.write(line_w) # 将内容朱行写入到新文件 file_w.close() |
方法二:也可以采取读一行,写一行的方式。避免一次读取过多的内容,更适合使用在大文件的场景。推荐:
1 2 3 4 5 6 7 8 9 10 | file = open ( 'test.txt' ,encoding = 'utf-8' ) # 打开源文件 file_w = open ( 'test2.txt' , 'w' ,encoding = 'utf-8' ) # 新建一个临时的新文件 count = 0 # 这种情况只能用计数器来计算行数了 for line in file : count + = 1 if count = = 3 : line = '这是被替换的第三行\n' # 这里修改替换掉第三行的内容,别忘了\n换行 file_w.write(line) # 将内容朱行写入到新文件 file .close() file_w.close() |
并没有完成文件的修改,到此只是将源文件修改后生成了一个新文件。还需要将源文件删除,然后将新文件改名。对文件的操作(非文件内容),还需要调用os模块,不过并不难。而且也不是这节课的重点,就略过了。
文件关闭的问题
文件用完后,可以用close()将文件关闭,释放文件句柄。如果不关,问题也不大(不过肯定不是好习惯)。另外,程序运行完之后,所有打开的文件都会被关闭。
总之,打开文件,如果不操作了,就应该关闭它。
使用with来了打开文件,可以自动关闭文件(通过缩进,在代码块执行完毕后,自动关闭文件)。所以条件允许的情况下,尽量用with来打开文件。将上面2段用with来改写一下
1 2 3 4 5 6 7 8 | # 注意一下缩进,通过这个判断文件是否操作完毕,从而自动关闭 with open ( 'test.txt' ,encoding = 'utf-8' ) as file : lines = file .readlines() # 读取源文件 with open ( 'test.txt' , 'w' ,encoding = 'utf-8' ) as file_w: for count,line_w in enumerate (lines): if count + 1 = = 3 : line_w = "这是被替换的第三行\n" # 这里修改替换掉第三行的内容,别忘了\n换行 file_w.write(line_w) # 将内容朱行写入到新文件 |
1 2 3 4 5 6 7 8 9 10 11 | # 可以同时对多个文件的上下文进行管理 # 另外,一行代码不建议超过80个字符,这里超了,所以用了\来分行 # 并且换行后可以对齐open,清晰的显示了打开的文件数量 with open ( 'test.txt' ,encoding = 'utf-8' ) as file ,\ open ( 'test2.txt' , 'w' ,encoding = 'utf-8' ) as file_w: count = 0 # 这种情况只能用计数器来计算行数了 for line in file : count + = 1 if count = = 3 : line = '这是被替换的第三行\n' # 这里修改替换掉第三行的内容,别忘了\n换行 file_w.write(line) # 将内容朱行写入到新文件 |
作业
购物车程序:
1、启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表
2、允许用户根据商品编号购买商品
3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4、可随时退出,退出时,打印已购买商品和余额
5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示
6、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买
7、允许查询之前的消费记录
上面是买家的模块,另外再做一个卖家的模块。账号登录后可以维护商品列表,新增、修改商品和价格。