day08
集合 set
集合是可变的容器
集合内的数据对象都是唯一的(不能重复多次的)
集合是无序的存储结构,集合中的数据没有先后关系,与字典相似
集合内的元素必须是不可变对象
集合是可迭代对象
集合是相当于只有键没有值的字典(键则是集合的数据)
创建空的集合:
set()
创建非空的集合的字面值:
s = {1, 2, 3}
集合的构造函数:
set() 创建一个空的集合(不能用{} 来创建空集合)
set(iterable) 用可迭代对象创建一个新的集合
示例:
s = set() #创建空集合
s = {2,3,5,7}
s = set("ABC")
# s = {'A', 'B', 'C'}
s = set("ABCCBA")
# s = {'A', 'B', 'C'} (集合中的内容不可重复)
s = set({1:"1", 2:'2', 5:'5'})
# s = {1, 2, 5} (键)
s = set({1:"1", 2:'2', 5:'5'}.values())
# s = {1, 2, 5} (值)
s = set(('ABC', '123', True))
#s = {'ABC', '123', True}
s = {True, None, "ABC", (1, 2, 3)}
#s = {True, None, "ABC", (1, 2, 3)}
注:字典,列表,集合是不能放在集合当中的,因为其可变
python3 中不可变数据类型
bool, int, float, complex, str, tuple, frozenset,bytes 字节串(后面才学)
None (特殊的对象,忽略类型)
可变数据类型
list, dict, set, bytearray 字节数组(后面才学)
可变的数据类型不能作为字典的键,不能作为集合的值
集合的运算:
交集& 并集| 补集- 对称补集^ 子集< 超集>
& 用于生成两个集合的交集(共有的部分)
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的所元素的集合
s2 - s1 # {4} # 生成属于s2, 但属于 s1的所元素的集合
^ 生成两个集合的对称补集(并集-交集)
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s1 ^ s2 # {1, 4}
> 判断一个集合是另一个集合的超集
< 判断一个集合是别一个集合的子集
s1 = {1, 2, 3}
s2 = {2, 3}
s1 > s2 # True s1是s2的超集
s2 < s1 # True s2是s1的子集
集合中的比较只是比较有或没有
== != 集合相同/不同
s1 = {1, 2, 3}
s2 = {3, 2, 1}
s1 == s2 # True(集合中不分顺序)
in / not in 运算
in 同列表和字典的in运算符规则相同,如果存在于集合中返回 True,否则返回False
示例:
2 in {1, 2, 3} # True
用于集合的函数
len(x) 返回集合的长度
max(x) 返回集合的最大值元素
min(x) 返回集合的最小值元素
sum(x) 返回集合中所有元素的和 (x为int类型)
any(x) 真值测试,规则与列表相同
all(x) 真值测试,规则与列表相同
集合是可迭代对象,可以用于for语句中
练习一:
经理有: 曹操,刘备,孙权
技术员有: 曹操,孙权,张飞,关羽
用集合求:
1. 即是经理也是技术员的有谁?
2. 是经理,但不是技术人员的都有谁?
3. 是技术人员,但不是经理的都有谁?
4. 张飞是经理吗?
5. 身兼一职的人都有谁?
6. 经理和技术员共有几个人?
集合的方法:
详见:
>>> help(set)
文档参见:
python_base_docs_html/set.html
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|s2
s={1,2,3}
s2={2,3,4}
s.update(s2) #等同于 s|=s2 s=s|s2
# s={1,2,3,4}
集合不支持索引
集合推导式:
是用可迭代对象创建集合的表达式
语法:
{表达式 for 变量 in 可迭代对象 [if 真值表达式]}
[] 部分代表可省略
示例:
numbers = [1, 3, 5, 7, 9, 3, 4, 5, 6, 7]
s = {x ** 2 for x in numbers if x % 2 == 1}
print(s)
#{81,1,9,25,49} (去重)
固定集合 frozenset
固定集合是不可变的,无序的,含有唯一元素的集合
作用:
固定集合可以作为字典的键,也可以作为集合的值
固定集合的构造函数 frozenset
frozenset() 创建一个空的固定集合
frozenset(iterable) 用可迭代对象创建一个新的固定集合
示例:
fz = frozenset()
fz = frozenset("ABCAB")
#frozenset({'B', 'C', 'A'})
fz = frozenset([1, 2, 3, 4, 5])
#frozenset({1, 2, 3, 4, 5})
fz = frozenset((frozenset({1, 2}), 3, 4, 5))
固定集合的运算:
& 交集
| 并集
- 补集
^ 对称补集
in / not in运算
> >= < <= == !=
(以上运算等同于集合的运算)
固定集合的方法:
相当于集合的全部方法去掉修改集合的方法
阶段总结:
数据类型:
不可变数据类型:
bool, int, float, complex, str, tuple, frozenset,bytes(后面才学)
可变的数据类型:
list, dict, set, bytearray(后面才学)
值:
None, False, True, ....
运算符:
+ - * / // % **
< <= > >= == != (判断值是不是相等)
is , is not (判断是不是同一个对象,id)
in , not in
not and or
& | ^ ~ << >>
+(正号) -(负号)
表达式:
100
100 + 200
max(1,2,3) # 函数调用也是表达式
条件表达式 x if x > y else y
全部的推导式:
列表,字典,集合推导式(只有三种)
x = 表达式
if 表达式:
while 表达式:
print(表达式)
语句:
表达式 语句:
print("hello world!")
'''这是字符串'''
赋值语句:(创建变量和修改变量,只有赋值语句能创建变量)
a = 100
b = c = d = 200
x, y = 100, 200
列表[整数表达式] = 表达式
字典[键] = 表达式
if 语句
while语句
for 语句
break 语句
continue语句
pass 语句
del 语句
函数:
len(x),max(x), min(x), sum(x), any(x),all(x)
构造函数:
bool(x) int(x),float(x), complex(x),str(x)
list(x), tuple(x),dict(x),
set(x), frozenset(x)
abs(x) round(x), pow(x,y,z=None)
bin(x), oct(x), hex(x), chr(x), ord(x)
range(start, stop, step)
input(x), print(....)
函数 function
什么是函数
函数是可以重复执行的语句块,可以重复的调用
作用:
用于封装语句块,提高代码的重用性
定义用户级别的函数
def 语句
语法:
def 函数名(形参列表):
语句块(代码块)
作用:
用语句块创建一个函数,并用函数名变量绑定这个函数
语法说明:
1. 函数名是变量,它用于绑定语句块
2. 函数有自己的名字空间,在函数外部不可以访问函数内部的变量,在函数内部可以访问函数外部的变量
(要让函数处理外部的数据需要用参数给函数传入一些数据)
3. 函数不需要传入参数时,形参列表可以为空
4. 语句部分不能为空,如果为空需要填充pass语句
示例见:
def.py
def2.py
函数调用
函数名(实际调用传递参数)
注: 实际调用传递参数 以后称为实参
说明:
函数调用是一个表达式
如果函数内部没有return语句,则函数执行完毕后返回None对象
练习二:
写一个函数 myadd,此函数中的参数列表里有两个参数x,y
此函数的功能是打印x+y的和
def myadd(...):
....
myadd(100, 200) # 300
myadd("ABC", '123') # ABC123
2. 写一个函数 print_even, 传入一个参数n代表终止整数
打印 2 4 6 8 ... n之间的所有偶数
函数定义如下:
def print_even(n):
... 此处自己完成
测试调用:
print_even(8)
2
4
6
8
return 语句:
语法:
return [表达式]
注: []代表可以省略其中的内容
作用:
用于函数中结束当前函数的执行,返回到调用该函数的地方,同时返回一个对象的引用关系
return 语句说明:
1. return 语句后跟表达式可以省略,省略后相当于 return None
2. 如果函数内没有 return 语句,则函数执行完最后一条语句后返回None(相当于在最后加了一条return None语句)
示例见:
return.py
练习三:
写一个函数myadd2, 实现返回两个数的和:
如:
def myadd(a, b):
.... # 此处自己实现
#测试代码如下:
a = int(input("请输入第一个数: "))
b = int(input("请输入第二个数: "))
print("您输入的两个数之和是: ", myadd(a, b))
练习四:
1. 写一个函数mymax, 实现返回两个数的最大值:
如:
def mymax(a, b):
...
print(mymax(100, 200)) # 200
print(mymax("ABCD", "ABC")) # ABCD
2. 写一个函数 input_number:
def input_number():
...
此函数用来获取用户输入的整数,当输入负数时结束输入.
将用户输入的数字以列表的形式返回,再用内建函数max,min,sum求出用户输入的最大值,最小值及和
L = input_number()
print(L) # 打印列表中的数据
print("用户输入的最大数是:", max(L))
print("用户输入的最小数是:", min(L))
print("用户输入的这些数的和是:", sum(L))
练习五:
1. 编写函数fun,其功能是: 计算并返回下载多项式的值
Sn = 1 + 1/2 + 1/3 + 1/4 + .... + 1/n
函数如下:
def fun(n):
...
print(fun(3)) # 1.8333333333333
print(fun(10)) # ?????????????
2. 编写函数fun2,计算下列多项式的和
Sn = 1/(1*2) + 1/(2*3) + 1/(3*4) +
... + 1/(n*(n+1)) 的和
print(fun2(3)) # 0.75
print(fun2(1000))
课后练习:
1. 写一个函数 get_chinese_char_count,此函数实现的功能是从一个给定的字符串中返回中文字符的个数
def get_chinese_char_count(x):
...
s = input("请输入中英文混合的字符串:") # hello中国
print('您输入的中文的字符个数是:', get_chinese_char_count(s)) # 2
2. 写一个函数isprime(x) 判断x是否为素数,如果为素数,返回True,否则返回False
如:
print(isprime(5)) # True
print(isprime(6)) # False
3. 写一个函数prime_m2n(m, n) 返回从m开始,到n结束范围内的素数,返回这些素数的列表,并打印.
如:
L = prime_m2n(10, 20)
print(L) # [11, 13, 17, 19]
4. 写一个函数 primes(n) 返回指定范围内n(不包含n)的全部素数的列表,并打印这些列表
如:
L = primes(10)
print(L) # [2, 3, 5, 7]
1) 打印100以内全部素数的和
2) 打印200以内全部素数的和
5. 改写之前的学生信息管理程序,将其改为两个函数:
def input_student():
...
def output_student(L):
....
input_student用于从键盘读取学生数据,形成列表并返回列表
output_student(L) 用于将传和的列表L 打印成为表格
测试代码:
L = input_student()
print(L)
output_student(L) # 打印表格