Python 3 学习笔记(三)----数据运算、集合操作和文件操作

python学习网 2017-08-09 06:33:06

一、数据运算

算数运算:

赋值运算:

比较运算:

身份运算:

成员运算:

逻辑运算:

位运算:

运算符优先级:

二、集合操作

 集合是一个无序的、不重复的数据组合,它的主要作用如下:

  • 去重,把一个列表变成集合的时候就已经自动去重了
  • 关系测试,测试两组数据之前的交集、差集、并集的关系
 1 print("-----------关系测试-------------")
 2 list_A = [1,3,5,7,7,8,9]
 3 list_A = set(list_A) #将列表转化为集合
 4 list_B = set([0,2,4,5,6,8,9])
 5 print(list_A,type(list_A))  #集合会自动的去重
 6 
 7 print(list_A,list_B)
 8 
 9 #交集
10 print(list_A.intersection(list_B))
11 print(list_A & list_B)
12 
13 #并集
14 print(list_B.union(list_A))
15 print(list_B | list_A)
16 
17 #差集
18 print(list_A.difference(list_B))  #在list_A中有,但是list_B中没有
19 print(list_A - list_B)
20 
21 #子集
22 print(list_A.issubset(list_B)) #判断list_B是否为list_A的子集
23 print(list_A.issuperset(list_B))  #判断list_A是否为list_B的父集
24 
25 #对称差集
26 print(list_A.symmetric_difference(list_B)) #取两个集合中互相都没有的
27 print(list_B ^ list_A)
28 
29 list_C = set([22,33,44])
30 print(list_B.isdisjoint(list_C)) #判断两个集合是否不相交,如果不相交返回为True
 1 print("---------集合操作-----------")
 2 list_A.add(444)  #添加数值
 3 list_B.add("hahaha")   #添加字符串
 4 print(list_B,list_A)
 5 list_C.update(([66,77,88]))  #批量添加
 6 print(list_C)
 7 
 8 list_A.remove(444) #删除指定的项
 9 list_A.pop()  #随机删除list_A中的一个项
10 list_A.discard(999)  #用discard删除一个不存在的项不会报错,用remove删除不存在的项会报错
11 print(list_A)
12 
13 3 in list_A  #测试3是否为list_A的成员。列表、元组、字典、集合都是这种操作

三、文件操作

文件的读与写:

 1 f = open("地狱少女","r",encoding="UTF-8")   #r代表read表示读取、w代表write表示写入(新建、覆盖)、a代表append表示追加
 2 data = f.read()
 3 data2 = f.read()
 4 
 5 print(data)
 6 print("--------------",data2)   #此处data2打印为空是因为第一次打印data的时候已经重头度到尾,data2打印从尾开始所以没有数据
 7 
 8 f.close()  #关闭文件
 9 
10 
11 f1 = open("地狱少女1","w",encoding="UTF-8")   #write是创建一个新文件,如果打开的文件名没有的话就新建一个,如果已有的话就覆盖
12 f1.write("因为要消除怨恨,\n所以要流放别人到地狱")
13 print(f1)
14 
15 f1.close()
16 
17 
18 f2 = open("地狱少女","a",encoding="UTF-8")   #append只能追加不能read
19 f2.write("因为要消除怨恨,\n所以要流放别人到地狱")
20 print(f2)
21 
22 f2.close()

文件的常用操作:

 1 #f = open("地狱少女","r",encoding="UTF-8") #文件句柄
 2 #print(f.readline())    #readline为按行读取
 3 #print(f.readline())
 4 
 5 
 6 #读取前五行的数据
 7 #for i in range(5):
 8 #    print(f.readline())
 9 
10 
11 #print(f.readlines()) #将文件转换为一个列表
12 
13 
14 f = open("地狱少女","r",encoding="UTF-8") #文件句柄
15 print(f.tell())  #查找当前指针所在位子,这个位子是字符所在的位子
16 print(f.read(5)) #读取5个字符,一般不用,因为不知道结束时语句是否完整
17 f.seek(0)  #使指针回到起始位置
18 print(f.isatty())  #判断是否为一个终端设备
19 print(f.seekable())  #判断指针是否能够返回原位
20 print(f.readable())   #判断文件是否可读
21 print(f.writable())   #判断文件是否可写
22 
23 print(f.flush())   #强制刷新(在一些对于时效性很强的情况下使用,例如取款程序)
24 
25 #print(f.truncate(10)) 是截断,如果不写相当于清空,输入数字代表从头开始第10个字符开始截断。truncate只适用于"append"

文件修改:

 1 f = open("地狱少女","r+",encoding="UTF-8")   #r+为读写,先读后写,常用
 2 
 3 print(f.readline())
 4 print(f.readline())
 5 print(f.readline())
 6 print(f.tell())
 7 f.write("------------------------------")
 8 print(f.readline())
 9 
10 
11 f = open("地狱少女1","w+",encoding="UTF-8")    #w+为写读,先写后读,先创建一个文件再读,不常用
12 
13 f.write("----------------------------1\n")
14 f.write("----------------------------1\n")
15 f.write("----------------------------1\n")
16 print(f.tell())
17 f.seek(10)
18 print(f.readline())
19 f.write("I am Irlo.")    #这里的写入也是添加到最后一行
20 f.close()
21 
22 f = open("地狱少女1","a+",encoding="UTF-8")    #a+为追加读,不常用
23 '''
24 
25 #f = open("地狱少女","rb")    #二进制文件读,网络传输只能用二进制模式
26 f = open("地狱少女2","wb")   #二进制文件写
27 f.write("Hello Irlo\n".encode())

例1.循环打印直到第10行停止,修改第十行数据后继续打印

老方法(不推荐):

1 f = open("地狱少女","r",encoding="UTF-8") #文件句柄
2 
3 
4 for index,line in enumerate(f.readlines()):  #f.readlines 需要先转换成列表,效率低有局限性,只有在小文件的情况下使用
5     if index == 9:
6         print("-------------------")
7         continue
8     print(line.strip())   #strip会去掉空格和换行

不占内存的方法:

 1 f = open("地狱少女","r",encoding="UTF-8") #文件句柄
 2 
 3 count = 0
 4 for line in f:          #迭代器,内存中只保存一行的数据
 5     if count == 9:
 6         print("-----------------")        #"-------"代替了第十行的数据
 7         count +=1
 8         continue
 9     print(line)
10     count +=1

例2. 进度条

1 import sys,time
2 
3 for i in range(15):
4     sys.stdout.write("#")   #stdout是标准输出,一般指输出到显示器上
5     sys.stdout.flush()
6     time.sleep(0.1)

附件.地狱少女

 1 怨恨:
 2 在地狱少女(第一季)第八集,柴田一尝试登入“地狱通信”而失败,可见“地狱通信”的登入是有条件的。而从不同集数中大部分成功登入的人,都有着一个比较相似的共通点,在故事中称为“怨恨”。怨恨程度如何往往是影响着故事发展的关键因素之一,但是动画中“怨恨”定义不明。以下是分类整理。
 3 因陷害而致的怨恨:
 4 有一些人因为被人陷害,例如地狱少女(第一季)第三集的受诅人花笠守将委托人岩下大辅之好友杀死,却把杀人的责任推到岩下大辅,[14]于是岩下大辅有所怨恨,要流放受诅人。
 5 因为重要他人被伤害引致的怨恨:
 6 于地狱少女(第一季)第四集中,就有委托人心爱之狗被医生延误诊治、间接害死。之后一集,就是因为委托人父亲被杀,才有流放地狱一事。在动画中,委托人心伤时有时也展示出其与重要的人事感情深厚的表现,以说明其重要性。
 7 因为满足个人欲望而引发怨恨:
 8 例如第一季第七集,委托人红彩花(同时是受诅人)为了得到遗产,就要流放养母到地狱。二笼二十四集委托人甚至清楚说明流放别人就是为满足欲望。
 9 因为“背叛”而引致的怨恨:
10 受诅人的怨恨也是影响着故事的发展。在地狱少女(第一季)第九集中,受诅人因为委托人姐姐“背叛”了自己,于是便陷害委托人姐姐和委托者,引发委托人的“怨恨”。不过“背叛”未必容易理解。似乎在故事中的说法是,一方不接受另一方的感情,导致对方怨恨。另见第一季第二集的受诅人,情况类似。
11 为了他人利益而导致怨恨:
12 为了不让其他人损失权益,如财产、生命,而把受诅人送进地狱,这种怨恨完全取自于委托人的个人良心和感同身受。如二笼第十六集,委托人为了不让其他人像她一样,被受诅人欺骗、陷害致死,再临死前解开红线,将受诅人送入地狱,但随后死亡,蜡烛熄灭。
13 因为不明原因而引致的怨恨:
14 有时候故事中未必展示出一些被认为是招人怨恨之事,例如在地狱少女第一季第二十三集中,受诅人(一名女护士)所展示的就只有好的一面,但是从受诅人流放到地狱、及“地狱通信”所言“我们将为你消除怨恨”中,可以看到,在故事中而言“怨恨”被消除了。这种“怨恨”虽然依故事所言是存在着,却缺乏有力的前因去理解它为何存在。
15 与一般理解可能不同的怨恨:
16 一般对怨恨的概念是包含憎恶情绪的,在故事中却未必时时认同此概念,有时甚至是相反。如第一季第十二集中,委托人和受诅人互相原谅和体谅对方,照一般理解就应该无所怨恨,委托人却流放对方到地狱;二笼第二十集中,受诅人主动帮助委托人解开红线,就是为了陪伴对方进入地狱。
17 因多管闲事而被怨恨:
18 当一个人担心对方想帮他解决事情,但对方要求不要多管闲事,但对方却硬要帮忙而导致被对方怨恨。如三鼎第七集中,受诅人看不惯委托人母亲不负责任的行为。以同学身份劝委托人说出来并打算告诉老师,委托人要求对方不要多管闲事,但受诅人还是坚持要管。然而委托人为了保护这个“看似不幸的幸福”而选择流放受诅人。
19 为了封口而怨恨:
20 为了要保护自己的名声或利益,理应会对伤害自己的人而怨恨才对,但有时是为了封口,甚至连曾对自己好的人而怨恨。三鼎第14集中,委托人因为别人恶意流放自己和受诅人并行的亲蜜谣言,但委托人只是受到对方的好心帮助而成为朋友。起初委托人是要流放恶意散拨照片的人,但却不知该对象的名子。之后发现受诅人因犯罪而被逮捕,为了不让谣言扩大而选择流放曾帮助过自己的受诅人。
21 须要说明的是,故事中的怨恨未必只是上述一种意义而已,有时可能是多种的混合。

 

阅读(818) 评论(0)