Python學習10:集合的用法與初識Python函數

筆者:風起怨江南 出處:https://blog.csdn.net/JackMengJin 筆者原創,文章歡迎轉載,如果喜歡請點贊+關注,感謝支持!

 

目錄

一、集合

1.1 集合的定義

1.2 有序無序的區別

1.3 集合的使用場景

 

二、初識函數

2.1 什麼是函數?

2.2 函數的使用

2.3 函數的調用

2.4 return和print區別


 

集合的用法和函數的定義

一、集合

在之前的學習中,涉及到了字符串,列表,元組,字典等等數據類型相關知識,這次給大家帶來的是集合相關的知識點。

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學習請繼續關注我的博客——風起怨江南(傳送門,不定期更新,原創不易,如果喜歡請點贊和關注,謝謝大家的支持!

想獲得免費的學習資料請添加微信公衆號——風起怨江南,非常感謝大家的關注和支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章