筆者:風起怨江南 出處:https://blog.csdn.net/JackMengJin 筆者原創,文章歡迎轉載,如果喜歡請點贊+關注,感謝支持!
目錄
集合的用法和函數的定義
一、集合
在之前的學習中,涉及到了字符串,列表,元組,字典等等數據類型相關知識,這次給大家帶來的是集合相關的知識點。
1.1 集合的定義
集合是什麼?
集合(set)在Python裏是一個無序的不重複元素的集合。無序的概念稍後會講到,不重複就是集合裏的元素不能重複,而序列在之前的列表中講到過,序列是以某種方式(比如編號)組合起來的數據元素的集合。
通過上面可以發現集合特點:無序,不重複,多元素的集合。
集合的表示方法,花括號:
{}
#set
set = {1,2,3,4,5}
print(type(set))
print(set)
<class 'set'>
{1, 2, 3, 4, 5}
集合的表示方法是不是跟字典很像?
那麼一個空的{}是字典還是集合呢?舉例:set = {}
#set
set = {}
print(type(set))
print(set)
<class 'dict'>
{}
咦?花括號{}不是表示集合麼?爲什麼打印出數據類型卻是字典數據類型呢?
這是因爲Python規定:創建一個空集合必須用 set() 而不是 { },因爲 { } 是用來創建一個空字典。
所以集合的創建格式爲:
parame = {value01,value02,...}
或者
set(value)
也就是單獨的set ={}代表的是字典而不是集合,想創建空的集合需要用到set = set()。
#set
set = set()
print(type(set))
print(set)
<class 'set'>
set()
1.2 有序無序的區別
Python 中的字符串、列表以及元組在很多方面上比較相似,很大程度是因爲它們的數據存儲是有序的,也就是我們統稱的序列。而集合是無序的,有序無序到底區別在哪?
- 索引
所有有序的數據結構都可以用到索引。
比如列表:
list = ['aaa','bbb','ccc','ddd']
print(list[1])
<class 'list'>
bbb
比如元組:
tuple = ('aaa','bbb','ccc','ddd')
print(type(tuple))
print(tuple[1])
<class 'tuple'>
bbb
再比如字符串:
str= 'aaabbbcccddd'
print(type(str))
print(str[1])
<class 'str'>
a
可以看到有序的數據類型(比如列表,元組,字符串等等)都是可以進行索引去值的,而無序的數據類型是不能進行索引的。
比如字典:
dict1 = {'1':'aaa','4':'ddd'}
print(type(dict1))
print(dict1[1])
<class 'dict'>
Traceback (most recent call last):
File "E:/set.py", line 16, in <module>
print(dict1[1])
KeyError: 1
直接報錯,打印KeyError: 1,也就是字典dict裏沒有1這個key。
那麼對集合進行索引會有什麼效果麼?
set1 = {1,2,3,4,5,6,7}
print(type(set1))
print(set1[1])
Traceback (most recent call last):
File "E:/set.py", line 19, in <module>
print(set[1])
TypeError: 'set' object is not subscriptable
<class 'set'>
這裏也是直接報錯:TypeError: 'set' object is not subscriptable,翻譯過來就是類型錯誤:'set'對象不能進行下標訪問。
sub是下標的意思,scriptable可編寫腳本的
這也就證明有序的數據類型是可以進行索引的,而無序的數據類型是不允許進行索引。
- 切片
那麼切片呢?其實和索引一樣,有序的數據類型可以切片操作,而無序的數據類型不支持切片。
字符串、列表、元組的切片:
str1 = 'aaabbbcccddd'
print(type(str1))
print(str1[1:5])
list1 = ['aaa','bbb','ccc','ddd','eee']
print(type(list1))
print(list1[1:3])
tuple1 = ('aaa','bbb','ccc','ddd','eee')
print(type(tuple1))
print(tuple1[1:3])
<class 'str'>
aabb
<class 'list'>
['bbb', 'ccc']
<class 'tuple'>
('bbb', 'ccc')
字典和集合明顯不支持切片:
dict = {'1':'aaa','4':'ddd','x':'red','r':'look'}
print(type(dict))
print(dict[1:2])
Traceback (most recent call last):
File "E:/set.py", line 27, in <module>
print(dict[1:2])
TypeError: unhashable type: 'slice'
對字典切片會出現報錯:TypeError: unhashable type: 'slice'
set1 = {1,2,3,4,5,6,7}
print(type(set1))
print(set1[1:4])
Traceback (most recent call last):
File "E:/set.py", line 29, in <module>
print(set1[1:4])
TypeError: 'set' object is not subscriptable
對集合切片會出現報錯:TypeError: 'set' object is not subscriptable
同樣的,也是有序數據類型才能進行步長操作,而無序的數據類型是不支持沒有步長的概念的。
總結:有序的數據類型有字符串、元組、列表等,可以用索引、分片、步長等對其進行操作;而無序的數據類型比如字典、集合等,不可以利用索引、分片、步長等對其進行操作。
1.3 集合的使用場景
說了那麼多,集合這不能用,那不能用,那集合的應用場景是什麼?什麼時候用集合?
之前說了,集合是不重複的集合,所以集合的最主要的應用場景,就是去重!
假如說現在有一個列表:a = [1,2,1,2,1,1,1,1,1,2,3,4,5,6,7,7,7,7,8,9,0,1,1,1,2,2,1,],現在要求去除列表中重複的元素,如果通過set集合的方法如何去重?
#set去重
a = [1,2,1,2,1,1,1,1,1,2,3,4,5,6,7,7,7,7,8,9,0,1,1,1,2,2,1,]
print(a)
print(list(set(a)))
[1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 8, 9, 0, 1, 1, 1, 2, 2, 1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
先將列表轉換爲集合,再將集合轉換爲列表,即可完成去重。
同樣,我們可以對字符串進行去重操作:
#set去重
a = '1,2,1,2,1,1,1,1,1,2,3,4,5,6,7,7,7,7,8,9,0,1,1,1,2,2,1,'
print(a)
print(str(set(a)))
得到的結果是:
1,2,1,2,1,1,1,1,1,2,3,4,5,6,7,7,7,7,8,9,0,1,1,1,2,2,1,
{'7', '9', ',', '2', '1', '4', '6', '0', '3', '5', '8'}
這裏會發現得出的結果順序和之前不太一樣了,在運行一下試試:
1,2,1,2,1,1,1,1,1,2,3,4,5,6,7,7,7,7,8,9,0,1,1,1,2,2,1,
{'4', '8', '7', '5', '0', '6', '9', '3', '2', '1', ','}
1,2,1,2,1,1,1,1,1,2,3,4,5,6,7,7,7,7,8,9,0,1,1,1,2,2,1,
{',', '9', '2', '1', '4', '6', '0', '7', '5', '3', '8'}
1,2,1,2,1,1,1,1,1,2,3,4,5,6,7,7,7,7,8,9,0,1,1,1,2,2,1,
{'2', '7', '6', '8', '0', ',', '4', '1', '9', '5', '3'}
通過這麼多嘗試後,發現每一次的順序都和之前的不一樣。
這也就印證了集合另一個特定:無序。
總結:
目前來講,集合最大的作用就是去重,同時集合是無序的,所以不能使用索引、分片、步長等操作。
如果需要去重,先轉換成集合,再進行轉換成其他的數據類型即可完成去重操作,但需要注意的是此時的元素是無序的。
更多集合知識點後續根據具體場景再詳細講解。
二、初識函數
函數是Python非常重要的內容,我會用3篇文章來詳細講解Python函數的所有內容。
2.1 什麼是函數?
函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段。更直白的話說就是:函數是當輸入一定的數據以後,
能根據裏面的執行步驟,可以算出另一些數據的值。同時可以得到數據,獲取輸出值。
比如 x = 1 + y,這就是函數。
舉個例子更直白點,洗衣機就是函數:
洗衣服==>輸入值(洗衣粉,髒衣服,水) ==> 得到乾淨的衣服
我不用關係洗衣機是怎樣運轉的,我只關心將衣服放入洗衣機,加入水和洗衣粉後,經過洗衣機的運轉,得到乾淨的衣服。
2.2 函數的使用
你可以定義一個由自己想要功能的函數,以下是簡單的規則:
- 函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號()
- 任何傳入參數和自變量必須放在圓括號中間。圓括號之間可以用於定義參數
- 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明
- 函數內容以冒號起始,並且縮進
- return [表達式] 結束函數,選擇性地返回一個值給調用方,不帶表達式的return相當於返回 None
def () 函數的名稱(函數的參數1,參數2,參數3):
'''文檔字符串 docstring
函數的註釋,這個函數是幹嘛用的
參數:
返回值:
'''
(縮進)函數體,函數具體執行的邏輯
return 函數的返回值(輸出)
#除了def()其他都要縮進
舉一個簡單的函數例子,比如加法運算:
#函數
def addition(a,b):
'''加法運算'''
c = a + b
return c
這就是一個簡單的自定義函數。
2.3 函數的調用
我們現在學會了定義一個函數了,那麼如何調用函數呢?
#函數
def addition(a,b):
'''加法運算'''
c = a + b
return c
print(addition(1,2))
直接用print打印出來:
3
這裏可以看到,在定義的函數裏將想要運算的數字填寫進去,再通過print打印即可顯示出運算的結果,這就是函數的調用。
同樣,可以把調用的結果賦值:給一個變量,再去對這個變量打印也是可以得到結果:
#函數
def addition(a,b):
'''加法運算'''
c = a + b
return c
num = addition(1,2)
print(num)
3
這裏就能更清楚的去理解函數:可以不關係函數裏具體怎麼實現的,只需要將想要計算的值輸入進去,再通過直接打印或賦值等手段,即可拿到這個函數運算出的結果。
這裏以一個複雜的函數舉例,定義一個冒泡排序的函數:
定義函數——冒泡排序
def bubbleSort(arr):
'''
函數名稱:冒泡排序函數
函數作用:從小到大排序
函數用法:直接在bubbleSort(arr = [數字1,數字2,數字3....]),從小到大排序
'''
for i in range(1, len(arr)):
for x in range(0, len(arr) - i):
if arr[x] > arr[x + 1]:
arr[x + 1], arr[x] = arr[x], arr[x + 1]
return arr
#打印結果
print(bubbleSort(arr = [22,7,6,89,12,8,1,100,123,2,15]))
[1, 2, 6, 7, 8, 12, 15, 22, 89, 100, 123]
可以看到在arr = [輸入數字]後,運行可以打印出從小到大的排序。
2.4 return和print區別
return的定義:return語句[表達式]退出函數,選擇性地向調用方返回一個表達式。不帶參數值的return語句返回None。
而print就是顯示在屏幕上,打印出來。return是函數運行的結果,獲取結果以後不一定會打印出來。
其實這裏還是用通俗的例子來舉例更容易去理解:
把衣服放進洗衣機裏洗,洗衣機就是函數;
衣服洗好後,乾淨的衣服就是return返回的表達式;
而你想把衣服穿上,這個操作就是print打印,把結果打印到屏幕上。
第二節便是初識函數相關內容,初級階段先知道如何去定義函數,並如何調用函數就可以了,更多函數知識在下一講再詳細講解。
以上便是《Python學習10:集合的用法與初識Python函數》的所有內容,更多python學習請繼續關注我的博客——風起怨江南(傳送門),不定期更新,原創不易,如果喜歡請點贊和關注,謝謝大家的支持!
想獲得免費的學習資料請添加微信公衆號——風起怨江南,非常感謝大家的關注和支持!