python學習筆記:集合set,函式基礎
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++啊