目录
集合set
tuple算是list和str的杂合(杂交的都有自己的优势,上一节的末后已经显示了),那么set则可以堪称是list和dict的杂合.
set拥有类似dict的特点:可以用{}花括号来定义;其中的元素没有序列,也就是是非序列类型的数据;而且,set中的元素不可重复,这就类似dict的键.
set也有继承了一点list的特点:如可以原处修改
创建set
>>> s1 = set("qiwsir") #把str中的字符拆解开,形成set.特别注意观察:qiwsir中有两个i
>>> s1 #但是在s1中,只有一个i,也就是不能重复
set(['q', 'i', 's', 'r', 'w'])
>>> s2 = set([123,"google","face","book","facebook","book"]) #通过list创建set.不能有重复,元素可以是int/str
>>> s2
set(['facebook', 123, 'google', 'book', 'face']) #元素顺序排列不是按照指定顺序
>>> s3 = {"facebook",123} #通过{}直接创建
>>> s3
set([123, 'facebook'])
更改set
增加元素 set.add()
>>> a_set = {'a','i'}
>>> type(a_set)
<class 'set'>
>>> a_set.add("qiwsir")
>>> a_set
{'i', 'qiwsir', 'a'}
>>> b_set = set("python")
>>> b_set
{'n', 'p', 'h', 'y', 't', 'o'}
>>> b_set.add("qiwsir")
>>> b_set
{'qiwsir', 'n', 'p', 'h', 'y', 't', 'o'}
>>> b_set.add("[1,2,3]")
>>> b_set
{'qiwsir', 'n', 'p', 'h', 'y', 't', '[1,2,3]', 'o'}
从另外一个set中合并过来元素,set.update(s2)
>>> s1
{'r', 'q', 's', 'w', 'i'}
>>> s2
{'face', 'facebook', 123, 'book', 'google'}
>>> s1.update(s2)
>>> s1
{'r', 'q', 'face', 's', 'w', 'facebook', 'google', 'book', 'i', 123}
>>> s2
{'face', 'facebook', 123, 'book', 'google'}
删除
set.pop()是从set中任意选一个元素,删除并将这个值返回.但是,不能指定删除某个元素.
set.remove(obj)中的obj,必须是set中的元素
set.discard(obj)中的obj如果是set中的元素,就删除,如果不是,就什么也不做
set.clear(),它的功能是:Remove all elements from this set
集合的关系
冻结的集合
不能在原处修改的集合
>>> f_set = frozenset("qiwsir") #看这个名字就知道了frozen,冻结的set
>>> f_set
frozenset(['q', 'i', 's', 'r', 'w'])
>>> f_set.add("python") #报错
集合运算
元素与集合的关系
元素是否属于某个集合。
>>> aset
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> "a" in aset
False
>>> "h" in aset
True
集合与集合的纠结
假设两个集合A、B
A是否等于B,即两个集合的元素完全一样
>>> a
(['q', 'i', 's', 'r', 'w'])
>>> b
(['a', 'q', 'i', 'l', 'o'])
>>> a == b
False
>>> a != b
True
A是否是B的子集,或者反过来,B是否是A的超集。即A的元素也都是B的元素,但是B的元素比A的元素数量多。
>>> a
set(['q', 'i', 's', 'r', 'w'])
>>> c
set(['q', 'i'])
>>> c<a #c是a的子集
True
>>> c.issubset(a) #或者用这种方法,判断c是否是a的子集
True
>>> a.issuperset(c) #判断a是否是c的超集
True
>>> b
set(['a', 'q', 'i', 'l', 'o'])
>>> a<b #a不是b的子集
False
>>> a.issubset(b) #或者这样做
False
A、B的并集,即A、B所有元素,
>>> a = set("qirsiw")
>>> a
{'r', 'q', 's', 'w', 'i'}
>>> b = set("qialo")
>>> b
{'q', 'l', 'i', 'a', 'o'}
>>> a | b
{'r', 'q', 's', 'w', 'l', 'i', 'a', 'o'}
>>> a.union(b)
{'r', 'q', 's', 'w', 'l', 'i', 'a', 'o'}
A、B的交集,即A、B所公有的元素
>>> a & b
{'i', 'q'}
>>> a.intersection(b)
{'i', 'q'}
A相对B的差(补),即A相对B不同的部分元素
>>> a - b
{'r', 's', 'w'}
>>> a.difference(b)
{'r', 's', 'w'}
A、B的对称差集
>>> a
set(['q', 'i', 's', 'r', 'w'])
>>> b
set(['a', 'q', 'i', 'l', 'o'])
>>> a.symmetric_difference(b)
set(['a', 'l', 'o', 's', 'r', 'w'])
条件语句
if语句
>>> a = 8
>>> if a==8:
... print a
...
8
if…elif…else
if 条件1:
语句块1
elif 条件2:
语句块2
elif 条件3:
语句块3
else:
语句块4
三元操作符
A=Y if X else Z
如果X为真,那么就执行A=Y。 如果X为假,就执行A=Z。
>>> x = 2
>>> y = 8
>>> a = "python" if x > y else "qiwsir"
>>> a 'qiwsir'
>>> b = "python" if x < y else "qiwsir"
>>> b 'python'
for循环
for 循环规则:
操作语句
简单的for循环
>>> hello = "world"
>>> for i in hello:
print i
w
o
r
l
d
使用索引(偏移量)得到序列对象的某个元素
>>> for i in range(len(hello)): ...
print hello[i]
...
w
o
r
l
d
range(start,stop[,step])
start:开始数值,默认为0,即如果不写这项,就是认为start=0。 stop:结束的数值,必须要写。 step:变化的步长,默认是1,即若不写则认为步长为1,坚决不能 为0。
>>> range(9) #stop=9,别的都没有写,含义就是range(0, 9, 1) [0, 1, 2, 3, 4, 5, 6, 7, 8] #从0开始,步长为1,直到小于9的那个数 >>> range(0, 9) [0, 1, 2, 3, 4, 5, 6, 7, 8] >>> range(0, 9, 1) [0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> range(1, 9) #start=1 [1, 2, 3, 4, 5, 6, 7, 8]
>>> range(0, 9, 2) #step=2,每个元素等于start+i*step [0, 2, 4, 6, 8]
for的对象
所有的序列类型对象都能够用for来循环
zip()
>>> a = "qiwsir"
>>> b = "github"
>>> zip(a,b)
[('q', 'g'), ('i', 'i'), ('w', 't'), ('s', 'h'), ('i', 'u'), ('r', 'b')]
列表解析
>>> squares = [x**2 for x in range(1,10)]
>>> squares
[1, 4, 9, 16, 25, 36, 49, 64, 81]
while循环
break和continue
break的含义就是要在这个地方中断循环,跳出循环体。
而continue则是要从当前位置(即continue所在的位置)跳到循环体 的最后一行的后面(不执行最后一行),对一个循环体来讲,就如同首 尾衔接一样,最后一行的后面是哪里呢?当然是开始了。
while…else
count = 0
while count < 5:
print count, " is less than 5" count = count + 1
else:
print count, " is not less than 5"
文件
打开文件
>>> f = open("130.txt") #打开已经存在的文件
>>> for line in f: ...
print line ...
learn python
http://qiwsir.github.io
qiwsir@gmail.com
创建文件
>>> nf = open("131.txt", "w")
>>> nf.write("This is a file")
r 以读方式打开文件,可读取文件信息。
w 以写方式打开文件,可向文件写入信息。如文件存在,则清空该文件,再写入新内容
a 以追加模式打开文件(即一打开文件,文件指针自动移到文件末尾),如果文件不存在则创建
r+ 以读写方式打开文件,可对文件进行读和写操作。
w+ 消除文件内容,然后以读写方式打开文件。a+ 以读写方式打开文件,并把文件指针移到文件尾。
b 以二进制模式打开文件,而不是以文本模式。该模式只对 Windows 或 Dos 有效,类 Unix 的文件是用二进制模式进行操作的。
用close()来关闭文件,这是很重要 的一步,一定要养成一个习惯,写完内容之后就关闭。
使用with 安全关闭文件
>>> with open("130.txt","a") as f:
... f.write("\nThis is about 'with...as...'") ...
>>> with open("130.txt","r") as f:
... print f.read()
..
learn python http://qiwsir.github.io qiwsir@gmail.com
hello
This is about 'with...as...'
文件的状态
>>> import os
>>> file_stat = os.stat("131.txt") #查看这个文件的状态
>>> file_stat
os.stat_result(st_mode=33206, st_ino=1125899906842733, st_dev=1780801764, st_nlink=1, st_uid=0, st_gid=0, st_size=14, st_atime=1583153606, st_mtime=1583154035, st_ctime=1583153606)
>>> file_stat.st_ctime
1583153606.2835338
查看时间
>> import time
>>> time.localtime(file_stat.st_ctime)
time.struct_time(tm_year=2020, tm_mon=3, tm_mday=2, tm_hour=20, tm_min=53, tm_sec=26, tm_wday=0, tm_yday=62, tm_isdst=0)
read/readline/readlines
read 读取全塞到一个字符串里
readline 一行一行读取 每执行一次读取一行
readlines 行读取 返回一个列表
读很大的文件 fileinput模块
>>> import fileinput
>>> for line in fileinput.input("you.md"):
>>> print line
seek()让指针移动
>>> f.seek(0)
回到文件的最开头