本文目錄一覽:
- 1、python中空集合是怎麼表示的?也請詳細的說下集合的用法!謝謝
- 2、redis什麼時候要用事務
- 3、Python的集合介紹
- 4、python裝飾器使用
- 5、python數據類型(集合)
- 6、python中集合的特點和注意點?
python中空集合是怎麼表示的?也請詳細的說下集合的用法!謝謝
集合就是s=set(),s是隨意的字母,下面是集合的用法
len(s)
set 的長度
x in s
測試 x 是否是 s 的成員
x not in s
測試 x 是否不是 s 的成員
s.issubset(t)
s = t
測試是否 s 中的每一個元素都在 t 中
s.issuperset(t)
s = t
測試是否 t 中的每一個元素都在 s 中
s.union(t)
s | t
返回一個新的 set 包含 s 和 t 中的每一個元素
s.intersection(t)
s t
返回一個新的 set 包含 s 和 t 中的公共元素
s.difference(t)
s – t
返回一個新的 set 包含 s 中有但是 t 中沒有的元素
s.symmetric_difference(t)
s ^ t
返回一個新的 set 包含 s 和 t 中不重複的元素
s.update(t)
s |= t
返回增加了 set 「t」中元素後的 set 「s」
s.intersection_update(t)
s = t
返回只保留含有 set 「t」中元素的 set 「s」
s.difference_update(t)
s -= t
返回刪除了 set 「t」中含有的元素後的 set 「s」
s.symmetric_difference_update(t)
s ^= t
返回含有 set 「t」或者 set 「s」中有而不是兩者都有的元素的 set 「s」
s.add(x)
向 set 「s」中增加元素 x
s.remove(x)
從 set 「s」中刪除元素 x, 如果不存在則引發 KeyError
s.discard(x)
如果在 set 「s」中存在元素 x, 則刪除
s.pop()
刪除並且返回 set 「s」中的一個不確定的元素, 如果為空則引發 KeyError
s.clear()
刪除 set 「s」中的所有元素
redis什麼時候要用事務
Redis事務使用總結:
Redis的事務機制允許同時執行多條指令,它是原子性操作,事務中的命令要麼全部執行,要麼全部不執行,另外,事務中的所有指令都會被序列化,而且其開始執行過程中,不回被即時過來的指令所打斷,其需要經歷三個過程,分別為開始事務、命令入隊以及執行事務。
· 相關命令
· 如何使用
· 腳本事務
· 遇到問題
· 例子演示
一、相關命令
1、MULTI
該命令用來開啟事務,它總是返回ok結果,當其執行之後,客戶端可以繼續發送任意條數量的指令,這些指令不會立即被執行,而是被放到了隊列中,直到EXEC被調用之後,所有命令才會被序列化執行。
2、EXEC
該命令負責觸發並執行隊列中所有的命令。
NOTE:
如果MULTI開啟之後,因為某些原因沒有成功執行EXEC,那麼事務中所有的命令都不會被執行的。
3、DISCARD
該命令用來刷新事務中所有排隊等待執行的指令,它總是返回ok結果,並且將服務連接狀態恢復到正常。如果已經使用WATCH,那麼其會將釋放所有被WATCH的key。
4、WATCH
標記所有指定的key被監控起來,使其在事務中有條件的執行(樂觀鎖)。
NOTE:
A、WATCH使得EXEC命令需要有條件的執行,也就是事務只能在所有被監視的鍵沒有被修改的前提下才能執行。另外,在EXEC被執行之後,所有的WATCH都會被取消。
B、UNWATCH手動取消對所有鍵的WATCH,如果執行了EXEC或者DISCARD,則不需要手動執行UNWATCH命令。
二、如何使用
Redis原生使用(Redis-cli):
127.0.0.1:6379 multi // 事務開始的動作標誌下面即為入隊
OK
127.0.0.1:6379 set book-name “Thinking in Java”
QUEUED
127.0.0.1:6379 get book-name
QUEUED
127.0.0.1:6379 sadd tag “java” “Programming””Thinking”
QUEUED
127.0.0.1:6379 smembers tag
QUEUED
127.0.0.1:6379 exec // 執行事務
1) OK
2) “Thinking in Java”
3) (integer) 3
4) 1) “Thinking”
2) “Programming”
3) “java”
127.0.0.1:6379 discard // 事務已執行完畢 已經自動取消
(error) ERR DISCARD without MULTI
127.0.0.1:6379 multi
OK
127.0.0.1:6379 set book-name “Patterns in Java”
QUEUED
127.0.0.1:6379 get book-name
QUEUED
127.0.0.1:6379 sadd tag “Java” “Thinking””Programming”
QUEUED
127.0.0.1:6379 smembers tag
QUEUED
127.0.0.1:6379 discard // 事務未執行 可以刷新隊列指令狀態 取消執行
OK
127.0.0.1:6379 exec // 事務已經被取消不能再執行
(error) ERR EXEC without MULTI
三、腳本事務
Redis 2.6開始支持了腳本,而該腳本本身就是一種事務機制,所以任何在事務里可以完成的事,在腳本裡面也能完成,並且使用腳本更簡單些,並且速度也更快。不過因為事務提供了一種即使不使用腳本,也可以避免競爭條件的方法,並且事務本身的實現並不複雜,所以現在的使用也比較多,但不排除日後可能被替代或是佔據主要地位的可能。
NOTE:
Redis為什麼引入兩種處理事務的方式?腳本功能是 Redis 2.6 才引入的,而事務功能則在更早之前就存在,所以 Redis 才會同時存在兩種處理事務的方法。另外,事務腳本會在後續文章中總結介紹。
四、遇到問題
1、樂觀鎖實現
舉個例子,假設我們需要原子性為某個鍵加1操作(假設INCR不存在),那麼應該是這樣的執行語句:
SET mykey 1
val = GET mykey
val = val + 1
SET mykey ${val}
單個客戶端訪問操作沒有任何問題,如果是多個客戶端同時訪問mykey,就會產生資源共享訪問問題,比如:現在有個兩個客戶端訪問同一個鍵mykey,那麼mykey的可能是2,但是我們期望的值應該是3才對,這個類似於高並發下的sync鎖機制,所以我們需要使用WATCH來監控被共享的鍵mykey,如下:
WATCH mykey(可監控多個鍵)
val = GET mykey
val = val + 1
MULTI
SET mykey ${val}
EXEC
NOTE:
雖然大多情況下,多個客戶端訪問操作同一個鍵的情況很少或沒有,但是不能排除這個特殊情況,所以建議在有可能產生鍵共享的指令中使用WATCH在EXEC執行前對其監管。
2、Redis不支持回滾(Roll Back)
Redis的事務不支持回滾,這點不同於關係資料庫中的事務,所以它的內部保持了簡單且快速的特點。另外,Redis不支持回滾是這樣考慮的:Redis事務中命令之所以會失敗,是由於錯誤的編程所造成,通過事務回滾是不能迴避這個根本問題。
NOTE:
Redis事務中命令執行失敗,仍會繼續執行後面的執行,在沒有特殊干預前提下,直到執行完隊列中所有指令為止。
3、使用事務可能遇到的問題
A、事務在執行 EXEC 之前,入隊的命令可能會出錯,舉個例子:命令可能會產生語法錯誤(參數數量錯誤,參數名錯誤等),或者其他更嚴重的錯誤,比如內存不足(如果伺服器使用maxmemory 設置了最大內存限制的話)。
B、事務在執行 EXEC 之前,舉個例子:事務中的命令可能處理了錯誤類型的鍵,比如將列表命令用在了字元串鍵上面等。
對於發生在 EXEC 執行之前的錯誤,客戶端以前的做法是檢查命令入隊所得的返回值:如果命令入隊時返回QUEUED ,那麼入隊成功;否則,就是入隊失敗。如果有命令在入隊時失敗,那麼大部分客戶端都會停止並取消這個事務。
從 Redis 2.6.5 開始,伺服器會對命令入隊失敗的情況進行記錄,並在客戶端調用 EXEC 命令時,拒絕執行並自動放棄這個事務。
在 Redis 2.6.5 以前, Redis 只執行事務中那些入隊成功的命令,而忽略那些入隊失敗的命令。而新的處理方式則使得在管道技術中包含事務變得簡單,因為發送事務和讀取事務的回復都只需要和伺服器進行一次通訊即可。
至於那些在 EXEC 命令執行之後所產生的錯誤,並沒有對它們進行特別處理: 即使事務中有某個/某些命令在執行時產生了錯誤, 事務中的其他命令仍然會繼續執行。
五、例子演示
?php
$redis = new \Redis();
$redis-connect(‘127.0.0.1’,6379);
$result = array();
// 開啟事務
$redis-multi();
// 添加指令到隊列
$redis-set(‘book-name’,’Thinking in PHP!’);
$redis-sAdd(‘tags’,’PHP’,’Programming’,’Thinking’);
$bookname = $redis-get(‘book-name’);
$tags = $redis-sMembers(‘tags’);
// 執行事務
$redis-exec();
// 顯示結果
echo ‘書名:’.$bookname.’ 標籤:’.$tags;
?
結果:
Python的集合介紹
和列表類似,集合也是一個數據集合,其也不要求元素的類型一致。但是集合有下面兩個特點:
•集合內元素唯一。如不可以用1、2、1、1組成集合,因為其包含重複的1。
•集合是無序的,添加元素時不能指定位置,刪除元素時也不能通過指定位置,只能通過指定值。當然也不能通過位置來定位某個元素。
1、創建集合
我們可以從列表創建集合,將列表中的元素都加入到集合中,如果有重複的元素就僅保留一個。
a = set([1, 1, 3])
print(a)#輸出結果:set([1, 3])
也可以從元組、字典和其他集合構建集合。比如:
a = set((0, 1, 2, 3, 3, 2))
使用的是字典的鍵來構建集合,字典的值沒有被使用到,比如:
a = set({1:10, 2:20, 3:30})
從字元串構建集合,其每個字元都成為集合的一個元素,比如:
a = set(“abcdefabc”)
輸出結果:a={‘c’, ‘e’, ‘f’, ‘b’, ‘d’, ‘a’}
另外一個集合構建集合,比如:
a = set([1, 2, 3])
b = set(a) 輸出結果:b={1, 2, 3}
當然也可以構造一個空的集合,使用的方法是set()。空集合沒有任何元素,比如:
a = set()
1.添加元——add(值)
該函數只能添加一個元素。
如果添加的元素已經在集合中存在,那麼不會發生任何變化。
2.扔掉元素——discard(值)
該函數刪除集合中指定的值對應的元素。
如果指定值在集合中不存在,則不做任何操作。
3.刪除指定值——remove(值)
該函數和discard()的不同之處在於,如果指定的值在集合中不存在,會拋出異常。
4.清空所有元素——clear()
該函數扔掉所有的元素。執行完該函數後,該集合將變成一個空的集合。
a.clear()
5.刪除第一個元素——pop()
如果集合中有元素,則返回值為刪除掉的元素的值。
如果集合為空,則拋出異常。
6.得到差集——difference(集合對象)
該函數返回一個新的集合,該集合包含所有屬於a而不屬於b的元素,如圖所示。該操作不會改變原始集合a或者b的內容。
7.差集操作符(-)
該操作符和difference()類似,返回一個新的集合,該集合包含所有屬於a而不屬於b的元素。該操作不會改變原始輸入集合a或者b的內容。
8.從集合中刪除另一個集合中存在的元素——difference_update(集合對象)
該函數和difference()的不同是操作數a會被修改,而且沒有返回值。
9.得到兩個集合的交集——intersection(集合)
該函數返回所有的同時屬於集合a和集合b的元素組成的集合,即返回的是一個集合,該集合的所有元素都同時屬於集合a和b,如圖所示。輸入集合a和b在該過程中沒有發生任何改變。
10.交集操作符()
該操作符和intersection()的效果是一樣的。
11.刪除集合a中所有不屬於集合b的元素——intersection_update(集合)
該函數也是求交集,與intersection()不同的是其修改原始輸入集合,並且沒有返回值。這也是為何該介面函數後面帶有update字樣,因為其更新了原來的輸入集合。
12.是否存在交集——isdisjoint()
該函數判斷是否存在這樣的元素,其同時屬於集合a和集合b。如果存在這樣的元素,返回False;否則返回True。
13.並集——union(集合a,集合b)
該函數返回一個新的集合,該集合的元素要麼屬於輸入集合a要麼屬於集合b。該操作不修改作為輸入的兩個集合a和b。如圖表示該函數返回的集合的內容。
14.並集操作符(|)
該操作符和union()的效果是一樣的。其返回一個並集,並且不修改輸入集合的內容。
15.添加屬於b而不屬於a的元素——update()
該函數在集合a中添加屬於b而不屬於a的所有元素。該操作和union()不同的是,其修改了輸入集合a,並且沒有返回值。
16.外集——symmetric_difference()
外集就是由只屬於集合a或者只屬於集合b的元素組成的集合,如圖所示。該操作返回一個新的集合,並且不修改原來的輸入集合a和b。
17.外集操作符(^)
該操作符和symmetric_difference()的效果是一樣的,也是返回一個新的集合,並且不會修改輸入的集合a或者b。
18.a和b的並集減去a和b的交集——symmetric_difference_update()
該函數和symmetric_difference()的區別是,其修改了集合a的值,並且沒有返回值。
19.是指定集合的子集嗎——issubset()
a是b的子集就是說集合a的所有元素都屬於集合b。
如果a等於b,那麼a和b互為子集。
20.是指定集合的超集嗎——issuperset()
a是b的超集合就是說集合b中的所有元素都屬於集合a。
如果a是b的超集,那麼b就是a的子集。
如果a等於b,那麼它們互為子集,同時也互為超集。
python裝飾器使用
裝飾器是從英文decorator翻譯過來的,從字面上來看就是對某個東西進行修飾,增強被修飾物的功能,下面我們對裝飾器做下簡單介紹。
一、怎麼編寫裝飾器
裝飾器的實現很簡單,本質是一個可調用對象,可以是函數、方法、對象等,它既可以裝飾函數也可以裝飾類和方法,為了簡單說明問題,我們實現一個函數裝飾器,如下代碼:
有了這個裝飾器,我們就可以列印出什麼時候開始和結束調用函數,對於排查函數的調用鏈非常方便。
二、帶參數的裝飾器
上面的例子無論什麼時候調用sum都會輸出信息,如果我們需要按需輸出信息怎麼實現呢,這時就要用到帶參數的裝飾器了,如下代碼:
對sum使用裝飾器時沒有參數,這時debug為0,所以調用sum時不會輸出函數調用相關信息。
對multi使用裝飾器時有參數,這時debug為1,所以調用multi時會輸出函數調用相關信息。
三、函數名字問題
當我們列印被裝飾後的函數名字時,不知道大家有沒發現輸出的不是函數本身的名字,如下代碼會輸出『wrap』而不是『sum』:
有時這種表現並不是我們想要的,我們希望被裝飾後的函數名字還是函數本身,那要怎麼實現呢?很簡單,只需要引入functools.wraps即可,如下代碼就會輸出『sum』了:
看完後是不是覺得python裝飾器很簡單,只要了解它的本質,怎麼寫都行,有好多種玩法呢。
python數據類型(集合)
1.集合(set)是一個無序不重複元素的序列(意思是有重複的會自動刪除,每次列印元素的位置不一定)
2.基本功能是進行成員關係測試和刪除重複元素
3.可以使用大括弧 { } 或者 set() 函數創建集合,注意:創建一個空集合必須用 set() 而不是 { },因為 { } 是用來創建一個空字典
4.因為set存儲的是無序集合,所以我們沒法通過索引來訪問。訪問 set中的某個元素實際上就是判斷一個元素是否在set中。
1.創建集合
s=set()#創建一個空集合
s1={1,2,3,’a’,’python’}
2.刪除重複的元素
集合是一個無序不重複元素的序列(意思是有重複的會自動刪除,每次列印元素的位置不一定)
3.成員關係測試(檢測某個成員是否在集合中)
案例:從終端輸入5位數,以空格隔開,把這5位數存入列表中,剔除重複的數據,列印出來
#提示,列錶轉集合,集合轉列表
a=input(“請輸入5位數字:”)
mylist=a.split()
print(mylist)
b=set(mylist)
c=list(b)
print(c)
4.集合常用操作
1.添加元素
2.刪除元素
3.刪除整個集合
4.獲取集合的長度
5.不支持改元素
集合操作-添加元素
格式:
集合.add(元素)
格式:
集合.update(元素)
區別:
add不能添加列表,update可以
update是將字元串中的拆分成字元進行追加
add,是當做整體追加在集合中
#案例:從終端輸入一個數字就加入集合中,然後列印,又輸入一個數字,然後列印,直到輸入-1,退出輸入
#然後列印最終的集合
ms=set()
while 1:
a=int(input(“請輸入一個數字:”))
if a==-1:
break
ms.add(a)
print(ms)
print(ms)
#案例:從終端輸入一個字元串就加入集合中,然後列印,又輸入一個字元串,然後列印,直到輸入q,退出輸入
#然後列印最終的集合,字元串要分開存儲,如輸入hello,存儲的列表是{‘h’,’e’,’l’,’0′}
ms=set()
while 1:
a=input(“請輸入一個字元串:”)
if a==’q’:
break
ms.update(a)
print(ms)
print(ms)
集合操作-刪除元素及刪除整個集合
格式:
集合.remove(元素) # 元素如果不存在會引發KeyError
集合.discard(元素) # 元素如果不存在不發生任何事
集合.pop() # 集合元素是字元串類型時刪除隨機元素。 集合元素是其他數據類型時,刪除左邊第一個元素
del 集合名 #刪除整個集合
#案例:有集合{1,2,3,’hello’,’world’},刪除全部字元串,然後最左邊第一個元素
a={1,2,3,’hello’,’world’}
a.discard(“hello”)
a.discard(“world”)
a.pop()
print(a)
集合操作-獲取集合的長度
格式:
len(集合名)
#案例:有集合{1,2,3,4,’hello’,’a’},保留1個元素,其他的刪除,假如元素個數不確定
s={1,2,3,4,’hello’,’a’}
for i in range(len(s)-1):
s.pop()
print(s)
集合的集運算
集合的交集,並集,差集,對稱差集的運算
{1,2,3,4}交集{4,5,6,7} –4 交集()
{1,2,3,4}並集{4,5,6,7} -1,2,3,4,5,6,7 並集(|)
{1,2,3,4}差集{4,5,6,7} -1,2,3 差集(-)
{1,2,3,4}對稱差集{4,5,6,7}-1,2,3,5,6,7 4同時出現在兩個集合中,不選它 對稱差集(^)
#案例:使用花括弧和set創建各一個集合,然後對集合進行交、並、差、對稱差運算
s={1,2,3,4,5,6}
s1=set([6,7,8,9,10])
print(ss1)
print(s|s1)
print(s-s1)
print(s^s1)
python中集合的特點和注意點?
1、集合概念
Python中的集合,是一個無序的、沒有重複項的集。它支持數學概念上的集合操作,如交集、並集、補集和差集。集合是可變的,可以在其中添加或刪除項。集合用花括弧「{}」括起來,並用逗號「,」來分隔其中的項。
2、創建集合
可以使用花括弧「{}」創建集合,集合會自動去除重複的項。下面的集合包含了幾種用字元串表示的水果:
# 創建fruits集合時,’apple’出現了兩次
fruits = {‘apple’, ‘banana’, ‘watermelon’, ‘strawberry’, ‘apple’}
fruits # 查看fruits集合,’apple’只有保留了一個
{‘apple’, ‘strawberry’, ‘banana’, ‘watermelon’}
與列表、元組、字典一樣,集合也可以用工廠函數set()來創建。set()函數的參數要麼為空,要麼為可迭代對象(如列表、元組和字元串):
fruits = set([‘apple’, ‘banana’, ‘watermelon’, ‘strawberry’, ‘apple’]) # 以列表為參數創建集合
fruits
{‘apple’, ‘strawberry’, ‘banana’, ‘watermelon’}
numbers = set((1, 2, 3, 3, 2, 4)) # 以元組為參數創建集合
numbers
{1, 2, 3, 4}
letters = set(‘banana’) # 以字元串為參數創建集合
letters
{‘b’, ‘a’, ‘n’}
如果想要創建一個空集合,那麼使用空的花括弧「{}」是行不通的,因為這樣創建的是一個空字典:
empty = {}
empty
{}
type(empty)
class ‘dict’
創建空集合的唯一方式就是使用不包含任何參數的set()函數:
empty = set()
empty # 空集合表示為set()
set()
type(empty)
class ‘set’
3、集合添加項
集合是可變的數據類型,在創建集合之後,可以使用集合的add()方法向其添加項:
numbers = {1, 2, 3}
numbers.add(4) # 向numbers集合中添加整數4
numbers
{1, 2, 3, 4}
numbers.add(‘five’) # 向numbers集合中添加字元串’five’
numbers
{1, 2, 3, 4, ‘five’}
numbers.add((5, 6, 7)) # 向numbers集合中添加元組(5, 6, 7)
numbers
{1, 2, 3, 4, (5, 6, 7), ‘five’}
如果向某個集合中添加已經存在的項,那麼什麼也不會發生:
fruits = {‘apple’, ‘strawberry’, ‘banana’, ‘watermelon’}
fruits
{‘banana’, ‘apple’, ‘watermelon’, ‘strawberry’}
fruits.add(‘apple’) # 添加已經存在的項’apple’
fruits # fruits集合併沒有改變
{‘banana’, ‘apple’, ‘watermelon’, ‘strawberry’}
也可以使用集合的update()方法向集合中添加項,參數必須是可迭代對象,如列表、字元串或另一個集合。類似於列表的append()方法和extend()方法,但區別是集合的update()方法總是會將可迭代對象「展開」:
numbers = {1}
numbers
{1}
numbers.update((5, 6, 7))
numbers # 可以看出update()方法和add()方法的區別
{1, 5, 6, 7}
numbers.update({4, 5}, {6, 7, 8}) # 參數為兩個集合
numbers
{1, 4, 5, 6, 7, 8}
4、集合刪除項
可以使用集合的remove()方法刪除某個集合中的指定項:
numbers = {1, 2, 3, 5, 7}
numbers.remove(1)
numbers
{2, 3, 5, 7}
numbers.remove(3)
numbers
{2, 5, 7}
如果試圖刪除集合中不存在的項,那麼Python解釋器會報錯:
numbers = {1, 2, 3, 5, 7}
numbers.remove(4)
Traceback (most recent call last):
File “stdin”, line 1, in module
KeyError: 4
還可以使用集合的discard()方法來刪除項,它和remove()方法唯一的區別是,當試圖刪除不存在的項時,discard()方法並不會報錯,而是什麼也不會發生:
numbers = {1, 2, 3, 5, 7}
numbers.discard(1)
numbers
{2, 3, 5, 7}
numbers.discard(3)
numbers
{2, 5, 7}
numbers.discard(4)
numbers # 什麼也沒發生
{2, 5, 7}
5、檢查某個項是否在集合中
集合的in操作符用於檢查指定項是否在集合中,not in操作符用於檢查指定項是否不在集合中:
numbers = {1, 2, 3, 5, 7}
1 in numbers # 1在numbers集合中,返回True
True
3 in numbers # 3在numbers集合中,返回True
True
4 in numbers # 4不在numbers集合中,返回False
False
4 not in numbers # not in是in的反向操作
True
6、查看集合的長度
集合的內建函數len()用於查看集合的長度,即集合中項的個數:
empty = set()
len(empty)
numbers = {1, 2, 3, 5, 7}
len(numbers)
5
原創文章,作者:PZQH,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/141893.html