1、遍历字典
for k,v in d:
则k,v分别是字典中键值对的键和值
2、字典的推导式
比如d = {x:x**2 for x in range(10)}
# d = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
3、例题:生成{'A1':'A_1','A2':'A_2',’A3':'A_3','B1':'B_1',...}字典,直到C3结束
代码:d = {chr(a) + chr(b) : chr(a) + '_' + chr(b) for a in range(ord('A'),ord('C')+1) for b in range(ord('1'),ord('3')+1)}
4、字典vs列表
都是可变对象
索引方式不同,列表用于整数索引,字典用任意类型不可变对象做索引
字典的查找速度要快于列表
列表的存储是有序的,字典的存储是无序的
5、集合set
集合是可变对象
集合内的数据对象都是唯一的,不能有重复
集合是无序的存储结构,集合中的数值没有先后关系
集合内的元素必须是不可变对象(元组、字符串、单个数据)
集合是可迭代对象
集合相当于只有键没有值的字典,键就是集合的数据
6、创建空集合
s = set()
注意:不能使用s = {} 创建集合,那样创建的对象的字典
7、创建非空集合
集合内部变量必须都是不可变对象
s = {1,2,3}
s = {'a','b','c'}
s = {1,'A'}
s = {'a',[1,2,3]} #这样是错误的,列表不能加入集合
a = 1234
s = {a,1,2,3}这里a的不是引用,而是代表一个实际的数值
8、集合set的构造函数
s = set()
s = set(iterable)用可迭代对象生成一个对象
#s = set("hello") = {'h','e','l','o'}且并不保证其顺序,重复的元素算一次
9、集合的运算
交集、并集、补集、子集、超集
& | ^ -
&:生成两个集合的交集
|:生成两个集合的并集
-:生成两个集合的补集,s1-s2代表从s1中减去存在于s2中的数据元素
^:生成两个集合的对称补集,s1^s2代表从s1和s2的并集中减去交集中的元素
s1 = {1,2,3}
s2 = {2,3,4}
s1 & s2 = {2,3}
s1 | s2 = {1,2,3,4}
s1 - s2 = {1}
s1^s2 = {1,4}
10、集合的比较
> >= < <= == !=
s1 > s2 True if s1是s2的超集
s1 < s2 True if s1是s2的子集
<= 和 >= 比上述多了一个等于,即集合是否相同
== != 判断集合是否相等
11、in 和 not in 运算符
优点:运算速度快于列表和字符串
12、集合常用方法
S.add(e) 向集合中添加元素e
S.remove(e) 从集合中删除元素e,若不存在,产生错误
S.discard(e) 删除元素,不存在不产生错误
S.clear() 清空集合
S.copy() 浅拷贝一个集合
S.pop() 从集合中删除一个随机元素,返回被删除的值,若集合为空则产生错误
S.update(S2) 将S2并如S中,更新变量S
其他常用方法均可用上述算术运算代替
13、集合的推导式
例子:
l = {"Jenny","Tony","Animal","Oliga","Jim"}
s = {x for x in l if len(x)>=4}
#从list中筛选长度大于4的字符串加入集合
if 语句可以省略
14、固定集合frozenset
是不可变的,无序的,含有唯一元素的容器
可以作为字典和集合的键
发现:python中有一个可变的可迭代对象,就会有一个对应的不可变对象,比如
list -> tuple
set -> frozenset
在通信(传输)过程中能够避免错误
15、创建固定集合
frozenset()
frozenset(iterable)
16、运算符和集合完全一样
方法相当于去掉集合的全部方法中修改集合的方法
17、函数
函数的作用:封装语句块,提高代码重用性;允许用户定义用户级别的函数
18、定义一个函数
def 函数名(参数列表):
语句块(代码块)
说明:函数的名字就是语句块的名称
函数名的命名规则和变量相同
函数名是一个变量,不要对其轻易赋值
函数的参数列表可以为空
语句部分不能为空,如果为空需要空pass填充
例子:
def say_hello():
print("hello world!")
19、调用函数
函数名(实际传入参数(实参))
说明:
如果函数内部没有return语句,汗珠执行完毕后返回None对象
如果函数需要返回其他对象,需要用到return语句
函数的传参是引用传参
20、return语句
return [表达式]
[]代表可以省略
如果没有return,函数最后自动加上return None,函数调用返回一个对象的引用
21、练习:常用的筛素数函数
#筛出0-a之间的素数,并返回列表
def ShaiSushu(a):
if a < 2:
return None
l = list()
l.append(2)
for i in range(3,a+1):
flag = 1
for j in range(0,len(l)):
if i % l[j] == 0:
flag = 0
if flag == 1:
l.append(i)
return l
运行ShaiSushu(100000)时感觉很慢,测了一下时间,运行了56.26162052154541s!!!!!!(不打印)
What?
有点汗颜,写了份c++代码,只用了2.005s(不打印)
是谁在网上分析一大堆,说pypy解释器一直在优化性能,有些时候性能能够接近C速度??!
性能差了30倍!
看来还是的学好C和C++啊