集合 set
集合是可变的容器
集合内的数据对象都是唯一的(不能重复多次的)
集合是无序的存储结构,集合中的数据没有先后顺序关系
集合内的元素必须是不可变的对象
集合是可迭代对象
集合是相当于只有键没有值的字典(键则是集合的数据)
创建空的集合: set()
创建非空集合: s = {1, 2, 3}
集合的构造(创建)函数 set
set() 创建一个空的集合对象(不能用{}来创建空集合)
set(iterable) 用可迭代对象创建一个新的集合
示例:
s = set() # 空集合
s = {1,2,3,4}
s = set("ABC") # s = {'A', 'B', 'C'}
s = set("ABCCBA") # s = {'A', 'B', 'C'}
s = set({1:"一", 2:"二", 5:"五"}) # s={1,2,5}
s = set([1, 2, 3, 2]) # s = {1,2,3}
集合的运算:
交集, 并集, 补集, 子集,超集,对称补集
& | - < > ^
& 生成两个集合的交集
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = s1 & s2 # s3 = {2, 3}
| 生成两个集合的并集
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = s1 | s2 # s3 = {1, 2, 3, 4}
- 生成两个集合的补集
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = s1 - s2 # s3 = {1} 生成属性s1但不属性 s3的所有元素的集合
s4 = s2 - s1 # s4 = {4}
^ 对称补集
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = s1 ^ s2 # s3 = {1, 4}
> 判断一个集合是另一个集合的超集
< 判断一个集合是另一个集合的子集
s1 = {4, 5, 6}
s2 = {4, 5}
s1 > s2 # True s1是s2的超集
s2 < s1 # True s2是s1的子集
== != 判断集合是否相同
{1, 2, 3} == {2, 3, 1} # True
{1, 2} != {3, 4} # True
<= >= 判断包含,被包含关系
in / not in 运算符
in判断一个元素是否存在于集合中(同其它容器类型的in 相同)
not in 与 in相反
集合和字典的优点:in / not in运算符的查找速度快
集合的内建函数操作:len(x), max(x), min(x), sum(x), any(x), all(x)
练习:经理有: 曹操, 刘备, 孙权
技术员有: 曹操, 孙权, 张飞, 关羽
用集合求:
1. 即是经理也是技术员的人有谁?
2. 是经理, 但不是技术员人的有谁?
3. 是技术员, 不是经理的都有谁?
4. 张飞是经理吗?
5. 身兼一职的人都有谁?
6. 经理和技术员共有几个人?
python3 中常的集合方法:
方法 意义
S.add(e) 在集合中添加一个新的元素e;如果元素已经存在,则不添加
S.remove(e) 从集合中删除一个元素,如果元素不存在于集合中,则会产生一个KeyError错误
S.discard(e) 从集合S中移除一个元素e,在元素e不存在时什么都不做;
S.clear() 清空集合内的所有元素
S.copy() 将集合进行一次浅拷贝
S.pop() 从集合S中删除一个随机元素;如果此集合为空,则引发KeyError异常
S.update(s2) 用 S与s2得到的全集更新变量S
S.difference(s2) 用S - s2 运算,返回存在于在S中,但不在s2中的所有元素的集合
S.difference_update(s2) 等同于 S = S - s2
S.intersection(s2) 等同于 S & s2
S.intersection_update(s2) 等同于S = S & s2
S.isdisjoint(s2) 如果S与s2交集为空返回True,非空则返回False
S.issubset(s2) 如果S与s2交集为非空返回True,空则返回False
S.issuperset(...) 如果S为s2的子集返回True,否则返回False
S.symmetric_difference(s2) 返回对称补集,等同于 S ^ s2
S.symmetric_difference_update(s2) 用 S 与 s2 的对称补集更新 S
S.union(s2) 生成 S 与 s2的全集
集合是可迭代对象
用for语句可以得到集合中的全部数据元素
s = {1, "二", 3.14, "Four"}
for x in s:
print(x)
集合推导式:集合推导式是用可迭代对象生成集合的表达式
语法:
{表达式 for 变量 in 可迭代对象 [if 真值表达式]}
注:[] 括起的部分代表可省略
推导式内的 for 子句可以嵌套
练习:
写一个程序,任意输入一篇英文文章(可能有多行),当输入空行时结束输入
1. 判断出现英文单词的种类数
the world
the dream
(种类数是3)
固定集合 frozenset
固定集合是不可变的,无序的,含有唯一元素的集合
作用:固定集合可以作为字典的键,也可以作为集合的值
创建空的固定集合:fz = frozenset()
创建非空的固定集合:frozenset(iterable) 用可迭代对象创建集合
例: fz = frozenset([2, 3, 5, 7])
固定集合的运算:同set运算完全一致
& 交集, | 并集, - 补集, ^ 对称补集,
> >= < <= == !=
in , not in
固定集合的方法:相当于集合的全部方法去掉修改集合的方法
前8天的总结:
数据类型:
不可变的类型:bool, int, float, complex, str, tuple, frozenset, bytes(后面会讲)
可变的数据类型:list, dict, set, bytearray(后面会讲)
值:None, False, True
运算符:
+ - * / // % **
> >= < <= == !=
not and or
in, not in
& | ^
+(正号) -(负号)
表达式:
100
100 + 200
len([1,2,3]) + max([1,2,3]) # 函数调用是表达式
print("hello")
条件表达式: x if x > y else y
全部的推导式: [x for x in range(5)]
(列表,字典,集合推导式三种)
语句 statement
表达式语句:
print("hello world")
'hello'
赋值语句:
a = 100
a = b = c = 200
x, y, z = 100, 200, 300
if 语句
while 语句
for 语句
break 语句
continue 语句
pass 语句
del 语句
内建函数:
len(x)
max(x)
min(x)
sum(x)
any(x)
all(x)
构造函数:
bool(x)
int(x, base=10)
float(x)
complex(real=0, image=0)
str(x)
list(x)
tuple(x)
dict(x)
set(x)
frozenset(x)
数字处理函数:
abs(x)
round(x)
pow(x, y,z=0)
字符串相关函数:
bin(x)
oct(x)
hex(x)
chr(x)
ord(x)
迭代器相关:
range(start, stop, step)
reversed(x)
sorted(x)
输入输出相关:
input(x)
print(...)
函数 function
什么是函数:函数是可以重复执行的语句块, 可以重复调用
作用:用于封装语句,提高代码的重用性,用于定义(创建)用户级别的函数
语法:
def 函数名(形参列表):
语句块
说明:
1. 函数的名字就是语句块的名称
2. 函数名的命名规则与变量名相同(函数名必须是标识符)
3. 函数名是一个变量函数名是一个变量
4. 函数有自己名字空间,在函数外部不可以访问函数内部的变量,在函数内部可以访问函数外部的变量,要让函数处理外部数据需要用参数给函数传入一些数据
5. 参数列表可以为空
6. 语句部分不能为空,如果为空需要用pass语句填充
函数调用:
函数名(实际调用传递参数)
说明:
函数调用是一个表达式
如果没有return 语句,函数执行完毕后返回None对象
如果函数需要返回其它的对象需要用到return语句
示例见:
mymax.py
练习:用def语句定义一个函数myfun,此函数接收两个实参
1) 在函数内打印出两个实参的和
2) 在函数内打印两个实参的最小值
练习:
1. 已知全班学生的名单,存于集合中names写一个点名签到的程序。随机输出学生的姓名,让用户输入:"y"代表已到,输入"n"或其它代表未到。当点名结束后,打印未到者名单
2. 写一个函数print_even,传入一个参数n代表终止数.此函数调用将打印 2 4 6 8 ..... n 之间所有的偶数函数定义如下:
def print_even(n):
.... 此处自己完成
# 测试调用:
print(8)
# 2 4 6 8
print(15)
# 2 4 6 8 10 12 14