目录
- 集合
- 集合的运算、常用方法
- 集合的方法
- 集合推导式
- 固定集合
- 阶段总结
- 函数
- 函数的调用
1. 集合
集合 set :
集合是可变的容器
集合内的对象是唯一的(不能重复多次的)
集合是无序的储存结构,集合中的数据没有先后关系
集合内的元素必须是不可变对象
集合是可迭代的
集合是相当于只有键没有值的字典(键则是集合的数据)
创建空的集合 :
s = set() #set() 创建一个空的集合
创建非空集合 :
s = {1,2,3} #集合中的三个整数 1,2,3
集合的构造函数 set :
set() 创建空集合
set(iterable) 用可迭代对象创建一个新的集合对象
eg :
s = set('ABCDABCABA') #s = {'B', 'C', 'A', 'D'} 去除重复对象
s = set({1:'一',2:'二',5:'五'}) #只获取字典的'键'
s = set((2,3,5,7))
s = set([1,2,[3.1,3.2],4])#错误,[3.1,3.2]是可变对象
2. 集合的运算、常用方法
集合的运算 : 交集,并集,补集,子集,超集
'&' 生成两个集合的交集:
s1 = {1,2,3}
s2 = {2,3,4}
s1 & s2 #>>>{2, 3}
'|' 生成两个集合的并集 :
s1 = {1,2,3}
s2 = {2,3,4}
s1 | s2 #>>>{1, 2, 3, 4}
'-' 生成两个集合的补集 :
s1 = {1,2,3}
s2 = {2,3,4}
s1 - s2 #>>>{1}
#生成属于s1但不属于s2的所有元素的集合
'^' 生成两个集合的对称补集 :
s1 = {1,2,3}
s2 = {2,3,4}
s1 ^ s2 #>>>{1,4}
#等同于:(s1 - s2) | (s2 - s1)
'<' 判断一个集合是否为另一集合的子集 :
'<=' 判断一个集合是否为另一集合的真子集 :
'>' 判断一个集合是否为另一集合的超集 :
s1 = {1,2,3}
s2 = {2,3} #s2是s1的子集,s2是s1的超集
s2 < s1 #True
s1 > s2 #True
s1 <= s1 #True
'==' '!=' 集合相同/不同 :
s1 = {1,2,3}
s2 = {2,3,1}
s1 == s2 #True
s1 != s2 #False 集合数据没有先后顺序
in / not in 运算 :
当某个元素存在于集合中,in 返回真,否则为假
eg :
s = {1,'Two',3.14}
1 in s #True
2 not in s #True
python3中可用于集合的函数:
len(x); max(x); min(x); sum(x);
any(x); all(x)
集合是可迭代对象 :
s = {1,2,3}
for x in s :
print(x)
3. 集合的方法
方法 | 作用 |
---|---|
s.add(e) | 在集合中添加一个新元素e;如果元素已存在,则不添加 |
s.remove(e) | 在集合中删除一个元素,如果元素不存在于集合中,则会产生一个KeyError错误 |
s.discard(e) | 从集合中移除一个元素e,若e不存在无操作 |
s.clear() | 清空集合内的所有元素 |
s.copy() | 将集合进行一次浅拷贝 |
s.pop() | 从集合中删除一个随机元素;如果此集合为空,则提示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(s2) | 如果s为s2的子集则返回True, 否则返回False |
s.symmetric_difference(s2) | 返回对称补集,同 s^s2 |
s.symmetric_difference_update(s2) | 用s^s2更新s |
s.union | 生成s与s2的全集,同 s |
4. 集合推导式
集合推导式 :用可迭代对象来创建(生成)集合的表达式
语法 :
{表达式 for 变量 in 可迭代对象 [if 真值表达式]}
eg : s = {x**2 for x in range(10) if x % 2 == 0}
#s>>>{0, 64, 4, 36, 16}
集合推导式的嵌套规则与列表推导式相同
练习 :
''' 模拟一个点名系统,已知全班学生名单,
随机打印学生的姓名进行点名,
并得到此学生是否已到信息,
输入'y'代表已到,其他输入代表未到
点名结束后打印未到者名单 '''
L = ['A','B','C','D','E','F','G']
s = set(L)
L2= []
for i in s :
info = i + '已到? y/是'
a = input(info)
if a != 'y' :
L2.append(i)
print('未到学生有: ',L2)
5. 固定集合
问题: 能否用集合做字典的键?
>>>集合是可变对象,不能作为字典的键
固定集合 : frozenset
固定集合是不可变,无序的,唯一元素的集合
作用:固定集合可以作为字典的键,也可以作为集合的值
创建空的固定集合:
fs = frozenset()
创建非空的固定集合 :
fs = frozenset([1,2,3,4,5])
构造函数 :
frozenset()
frozenset(iterable) #同set函数一致,返回固定集合
作用:作为字典的键和集合的值
eg :
s = frozenset([1,2,3])
s2 = {s, 4, 5, 6}
d = {s,'ABC'}
# s2 = {frozenset({1, 2, 3}), 4, 5, 6}
# d = {frozenset({1, 2, 3}), 'ABC'}
固定集合的运算 :同集合运算方法一致
& 交集: | 并集; - 补集; ^ 对称补集
>; >=; <; <=; ==; !=
in / not in
固定集合的方法: s.方法名
相当于集合的全部方法去掉修改集合(添加/删除)的方法
6. 阶段总结
6.1 数据类型 :
不可变数据类型 :
数值类(int,float,complex,bool),字符串(str)
元组(tuple),固定集合(frozenset),字符串(bytes)
可变数据类型 :
列表(list),字典(dict),集合(set),字节数据(bytearray)
特殊值 : None , True , False ...
6.2 运算符 :
+ ; - ; * ; / ; // ; % ; **
> ; >= ; < ; <= ; == ; !=
is ; is not
in / not in
not ; and ; or
& ; | ; ^
+(正号) -(负号)
6.3 表达式 : 返回一个值或对象
1
1+2
len()/min()/max()/any()/all()
条件表达式 : x if x>y else y
全部的推导式: 列表,字典,集合推导式(三种)
6.4 语句
表达式语句 : 返回对象
print('abc') ; 'hello'
赋值语句 : 创建或修改变量,不能改变对象
a = b = c =200
x, y = 100, 200
if 语句 ;
while 语句 ; for 语句 :
break 语句 ; continue 语句 ; pass 语句 :
del 语句
6.5 内建函数 :
len() ; max() ; min() ; sum() ; any() ; all()
-----------------------------------------------------
bool() ; int() ; float() ; complex() ; str() ;tuple() ;
frozenset() ; list() ; dic() ; set() ;
-----------------------------------------------------
abs(x) ; round(x) ; pow(x,y,z)
-----------------------------------------------------
bin(x) ; oct(x) ; hex(x) ; chr(x) ; ord(x)
-----------------------------------------------------
range([start,]stop[,step])
-----------------------------------------------------
input() ; print()
7. 函数
函数 function :
函数是可以重复执行的语句块,可以重复使用
作用 :
1.用于封装语句块,提高代码的重用性
2.定义用户级别的函数
函数定义(创建)语句 def 语句的语法 :
def 函数名(形参列表) :
语句块
说明 :
1.函数的名字就是语句块的名称
2.函数名的命名规则与变量名相同(函数名必须为标识符)
3.函数有自己的名字空间,在函数外部不可以访问函数内部的变量,
在函数内部可以访问函数外部的变量,
通常让函数处理外部数据需要用参数给函数传入一些数据
4.函数的参数列表可以为空
5.语句部分不能为空,如果为空需要填充pass语句
eg :
#定义函数
def say_hello() :
print('hello world')
print('hello python')
print('hello everyone')
#调用say_hello函数
say_hello()
8. 函数的调用
函数名(实际调用传递参数列表)
注:实际调用传递参数 即 实参
说明 :
1.函数调用是一个表达式
2.如果没有return语句,此函数执行完毕后返回None对象
如果函数需要返回其他的对象需要用到return语句
eg:
def mymax(a,b) :
print('a = ',a)
print('b = ',b)
if a > b :
print(a,'大于',b)
else :
print(a,'小于等于',b)
#调用该函数
mymax(1,2)
练习 :
'''
1)写一个isprime(x)函数,判断x是否为素数,如果是返回True,否则返回False
2)写一个函数prime_m2n(m,n),返回m开始到n结束(不包含n)的范围内的素数列表
3)写一个函数primes(n),返回制定范围内素数(不包含n)全部素数的列表,并打印这些素数
1.打印100以内的全部素数
2.打印100以内全部素数和
'''
def isprime(x):
if x <= 1 :
return False
for j in range(2,x):
if x % j == 0 :
return False
return True
def prime_m2n(m,n):
L=[]
for i in range(m,n):
if isprime(i) :
L.append(i)
return L
#直接使用列表推导式:
#def prime_m2n(m,n):
#return [x for x in range(m,n) if isprime(x)]
def primes(n):
return prime_m2n(0,n)
print(primes(100))
print('100一以内素数的和为:',sum(primes(100)))
练习:
'''
写一个函数mysum(),要求给出一个数n,
求1+2+3+...+n 的和
print(mysum(100)) #5050
print(mysum(10)) #55
'''
def mysum(n) :
s = 0
for x in range(1,n+1):
s += x
return s
print(mysum(100))
'''
写一个myfac(n)来计算n!(n的阶乘)
n!=1*2*3*...*n
print(myfac(5)) #120
'''
def myfac(n):
fac_n = 1
for i in range(1,n+1):
fac_n *= i
return fac_n
print(myfac(5))
'''
写一个函数,求1+2**2+3**3+...+n**n的和
'''
def sq_sum(n):
sq_sum = 0
for i in range(1,n+1):
sq_sum += i**i
return sq_sum
print(sq_sum(3))