天天看點

Python之路【1】:簡介與入門

Python之路【1】:簡介與入門

一,什麼是python

Python(英國發音:/ pa θ n/ 美國發音:/ pa θɑ n/),是一種面向對象、直譯式的計算機程式語言;創始人Guido van Rossum

二,Python能做什麼

Python是一門綜合性的語言,幾乎能在計算機上通過python做任何事情,一下是python應該最廣泛的幾個方面:

1,網絡應用:web網站,伺服器背景服務等

2,科學計算:科學運算:随着NumPy、SciPy、matplotlib、ETS等衆多程式庫的開發,Python越來 越适合于做科學計算。

3,GUI程式:python 供了多個圖形開發界面的庫,包括PyQt,WxPython,自帶的有Tkinter, 這些庫允許 Python 程式員很友善的建立完整的、功能健全的 GUI 使用者界面。

4,系統管理工具:Python可以是做運維人員最喜歡用的語言了,可以用它來輕松的開發 自動化管理工具、監控程式等,事實上現在很多開源軟體也都是用 Python 開發的,如 用于 IT 配置管理的 SaltStack\Ansible, 做虛拟化的 OpenStack,做備份用的 Bacula 等。

5,其他程式:python寫爬蟲,做小遊戲等。

三,Python的優缺點

優點:

1,Python 的定位是“優雅”、“明确”、“簡單”。

2,開發效率非常高,Python有強大的第三方庫。

3,進階語言--無需考慮記憶體一類的底層細節。

4,可移植性--由于開源本質,python已被移植到許多平台。

5,可擴充性。

6,可嵌入性。

缺點:

1,速度慢,Python的運作速度比c語言确實慢很多,跟Java比也要慢些,但這裡所指的運作速度慢在大多數情況下使用者是無法直接感覺到的,必須借助測試工具才能展現出來,比如你用 C 運一個程式花了 0.1s,用 Python 是 0.01s,這樣 C 語言直接比 Python 快了 10s,算是非 常誇張了,但是你是無法直接通過肉眼感覺的,因為一個正常人所能感覺的時間最小單 位是 0.15-0.4s 左右。

2,代碼不能加密,因為python是解釋性語言,它的源碼都是以明文形式存放的。

3,線程不能利用多CPU問題,這是Python被人诟病最多的一個缺點,GIL即全局解釋器 鎖(Global Interpreter Lock),是計算機程式設計語言解釋器用于同步線程的工具,使 得任何時刻僅有一個線程在執行,Python 的線程是作業系統的原生線程。

四,Python安裝

安裝過程略,僅提供官方網址:http://www.python.org

五,Python解釋器

當我們編寫 Python 代碼時,我們得到的是一個包含 Python 代碼的以 .py 為擴充名的文本

檔案。要運作代碼,就需要 Python 解釋器去執行 .py 檔案。

由于整個 Python 語言從規範到解釋器都是開源的,是以理論上,隻要水準夠高,任何人都 可以編寫 Python 解釋器來執行 Python 代碼(當然難度很大)。事實上,确實存在多種 Python 解釋器。

CPython:這個解釋器是用C語言開發的,是以叫CPython

IPython:IPython 是基于 CPython 之上的一個互動式解釋器,也就是說,IPython 隻是在互動方式上 有所增強,但是執行 Python 代碼的功能和 CPython 是完全一樣的。CPython 用 >>> 作為 示符,而 IPython 用 In [序号]: 作為 示符。

PyPy:PyPy 是另一個 Python 解釋器,它的目标是執行速度。PyPy 采用 JIT 技術,對 Python 代 碼進行動态編譯(注意不是解釋),是以可以顯著 高 Python 代碼的執行速度。

Jython:Jython 是運作在 Java 平台上的 Python 解釋器,可以直接把 Python 代碼編譯成 Java 位元組 碼執行。

IronPython:ronPython 和 Jython 類似,隻不過 IronPython 是運作在微軟.Net 平台上的 Python 解釋器, 可以直接把 Python 代碼編譯成.Net 的位元組碼。

總結:

Python 的解釋器很多,但使用最廣泛的還是 CPython。如果要和 Java 或.Net 平台互動, 最好的辦法不是用 Jython 或 IronPython,而是通過網絡調用來互動,確定各程式之間的獨 立性。

好了,正式開始代碼之路

第一個Python程式

檢視一下自己的python版本,如果太老的話就趕緊更新吧,建議用Python2.x最高版,官方已經說了Python2.7為終結版會支援到2020年

$ python -V

Python 2.7.10

接下來建立一個檔案名為:myfirstpy.py

$ cat myfirstpy.py #命名規範,以.py結尾

#!/usr/bin/env python #在程式的第一行聲明要使用的解釋器類型,這句話等于是告訴作業系統要用 什麼解釋器來解釋這個程式。

print "Hello,World!" #用 print 文法将後面的字元串列印到螢幕上,和 shell 腳本的 echo、java 和

c 的 printf 是一個意思噢。

print "Goodbye,World!"

執行,有兩種方式

1,#這種執行方式就算沒有在程式第一行聲明解釋器類型也會執行成功,因為在運作程式的時候使用的是python myfirstpy.py ,開始就聲明了解釋器

$ python myfirstpy.py

Hello,World!

Goodbye,World!

2,#這種執行方式首先需要對該檔案賦予執行權限然後直接./myfirstpy.py就可以執行,如果沒有在第一行聲明解釋器那麼執行就會失敗

$ chmod +x myfirstpy.py

$ ./myfirstpy.py

Hello,World!

Goodbye,World!

六,Python變量及字元串

資料類型

計算機顧名思義就是可以做數學計算的機器,是以,計算機程式理所當然地可以處理各種數值。但是,計算機能處理的遠不止數值,還可以處理文本、圖形、音頻、視訊、網頁等各種各樣的資料,不同的資料,需要定義不同的資料類型。在Python中,能夠直接處理的資料類型有以下幾種:

1、整數

Python可以處理任意大小的整數,當然包括負整數,在Python程式中,整數的表示方法和數學上的寫法一模一樣,例如:1,100,-8080,0,等等。

計算機由于使用二進制,是以,有時候用十六進制表示整數比較友善,十六進制用0x字首和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等。

2、浮點數

浮點數也就是小數,之是以稱為浮點數,是因為按照科學記數法表示時,一個浮點數的小數點位置是可變的,比如,1.23x10^9和12.3x10^8是相等的。浮點數可以用數學寫法,如1.23,3.14,-9.01,等等。但是對于很大或很小的浮點數,就必須用科學計數法表示,把10用e替代,1.23x10^9就是1.23e9,或者12.3e8,0.000012可以寫成1.2e-5,等等。

整數和浮點數在計算機内部存儲的方式是不同的,整數運算永遠是精确的(除法難道也是精确的?是的!),而浮點數運算則可能會有四舍五入的誤差。

3、字元串

字元串是以''或""括起來的任意文本,比如'abc',"xyz"等等。請注意,''或""本身隻是一種表示方式,不是字元串的一部分,是以,字元串'abc'隻有a,b,c這3個字元。

4、布爾值

布爾值和布爾代數的表示完全一緻,一個布爾值隻有True、False兩種值,要麼是True,要麼是False,在Python中,可以直接用True、False表示布爾值(請注意大小寫),也可以通過布爾運算計算出來。

布爾值可以用and、or和not運算。

and運算是與運算,隻有所有都為 True,and運算結果才是 True。

or運算是或運算,隻要其中有一個為 True,or 運算結果就是 True。

not運算是非運算,它是一個單目運算符,把 True 變成 False,False 變成 True。

5、空值

空值是Python裡一個特殊的值,用None表示。None不能了解為0,因為0是有意義的,而None是一個特殊的空值。

此外,Python還提供了清單、字典等多種資料類型,還允許建立自定義資料類型,我們後面會繼續講到

例子1(字元串常用功能)

*移除空白

$ python3

Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44)

[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> name = input("name:") #未做操作前字元串前面的空格會顯示出來

name: Adair Jie

>>> name

' Adair Jie'

>>> name = input("name:").strip() #加了操作後字元串前面的空格沒了

name: Adair Jie

>>> name

'Adair Jie'

>>> name = input("name:").strip("A") #還可以指定清除内容

name:Adair Jie

>>> name

'dair Jie'

*分割

*長度

*索引

*切片

七,條件判斷與縮進

IF...ELSE和縮進

if 判斷條件:

執行語句……

else:

執行語句……

例子1,性别判斷:

#!/usr/bin/env python

#-*- coding:utf-8 -*-

sex = input("請輸入您的性别(boy or girl)")

if sex == "girl":

print ("OK,you are a girl")

elif sex == "boy":

print ("Oh,you are a boy")

else:

print ("Are you pervert!")

例子2,猜lucky number,定義lunky number為6 (if...elfi...else)

#/usr/bin/env python

# -*- coding:utf-8 -*-

lucky_num = 6

input_num = int(input("請輸入你的Lucky number:")) #将使用者輸入轉成字元串

if input_num == lucky_num:

print ("恭喜您猜中了")

elif input_num > lucky_num:

print ("你猜的數字大了些!")

else:

print ("你猜的數字小了些!")

例子3,猜lucky number(while True:+break實作)

#/usr/bin/env python

# -*- coding:utf-8 -*-

lucky_num = 6

while True:

input_num = int(input("請輸入你的Lucky number:")) #将使用者輸入轉成字元串

if input_num == lucky_num:

print ("恭喜您猜中了")

break #此處break表示正确就會結束程式,而不會陷入死循環

elif input_num > lucky_num:

print ("你猜的數字大了些!")

else:

print ("你猜的數字小了些!")

例子4,猜lucky number(whiel 優化(精簡代碼))

# -*- coding:utf-8 -*-

lucky_num = 6

input_num = -1

while input_num != lucky_num:

input_num = int(input("請輸入你的Lucky number:")) #将使用者輸入轉成字元串

if input_num > lucky_num:

print ("你猜的數字大了些!")

elif input_num < lucky_num:

print ("你猜的數字小了些!")

print ("恭喜您猜中了")

例子5,循環次數限制

#!/usr/bin/env python

# -*- coding:utf-8 -*-

lucky_num = 6

input_num = -1

#計數器

guess_count = 0

while lucky_num != input_num and guess_count < 3:

print ("guess count:",guess_count)

input_num = int(raw_input("Please input your lucky numbers:"))

if input_num < lucky_num:

print ("The real num is smaller!")

elif input_num > lucky_num:

print ("The real num is bigger!")

else:

print ("Bingo!")

例子6,for循環+次數限制

#!/usr/bin/env python

# -*- coding:utf-8 -*-

lucky_num = 19

input_num = -1

#計數器

guess_count = 0

for i in range(3):

input_num = int(raw_input("Please input your lucky numbers:"))

if input_num < lucky_num:

print ("The real num is smaller!")

elif input_num > lucky_num:

print ("The real num is bigger!")

else:

print ("Bingo!")

break

#當上面的條件不滿足,條件不滿足就走下面的語句

else:

print ("Too many retrys..")

清單:可以在一個變量裡存多個資訊,且可以單獨取出需要的值

$ python3

Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44)

[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> name_list = ["adair","python","hugo"]

>>> name_list

['adair', 'python', 'hugo']

檢視清單可用的方法

>>> dir(name_list)

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

>>>

例子,清單基本操作

*索引(每一個元素都會對應一個标記,群從0開始)以上面的清單為例

>>> name_list[1]

'python'

>>> name_list[2]

'hugo'

>>> name_list[0]

'adair'

>>>

*切片

*追加(預設放到最後,)

>>> name_list.append("Java")

>>> name_list

['adair', 'python', 'hugo', 'Java']

>>> name_list.append("python")

>>> name_list

['adair', 'python', 'hugo', 'Java', 'python']

>>> name_list.index("python") #通過index方法找到python的索引

1

>>> name_list.count("python") #通過cout方法确定有多少個python

2

>>> name_list.insert(2,"cpython") #通過insert在第二個位置插入cpython

>>> name_list

['adair', 'python', 'cpython', 'hugo', 'Java', 'python']

>>> name_list.pop() #通過pop來删除一個,明确的是每次都删除最後一個

'python'

>>> name_list.pop()

'Java'

>>> name_list.remove("cpython") #指定删除

>>> name_list

['adair', 'python', 'hugo']

>>>

>>> name_list #通過reverse來反轉

['adair', 'python', 'hugo']

>>> name_list.reverse()

>>> name_list

['hugo', 'python', 'adair']

>>> name_list #通過sort進行排序,特殊字元排在前面,然後是數字,然後是_,然後再是字母

['adair', 'hugo', 'python', '!', '*', '_', '99', '55']

>>> name_list.sort()

>>> name_list

['!', '*', '55', '99', '_', 'adair', 'hugo', 'python']

>>>

>>> name_list.insert(5,"cpython") #多增加兩個cpython

>>> name_list.insert(2,"cpython")

>>> name_list

['!', '*', 'cpython', '55', '99', '_', 'cpython', 'adair', 'hugo', 'python']

>>> for i in range(name_list.count('cpython')): #通過for循環删除多個值

... name_list.remove("cpython")

...

>>> name_list

['!', '*', '55', '99', '_', 'adair', 'hugo', 'python']

>>>

變量與指派:

Python中的變量不需要聲明,變量的指派操作既是變量聲明和定義的過程。

每個變量在記憶體中建立,都包括變量的辨別,名稱和資料這些資訊。

每個變量在使用前都必須指派,變量指派以後該變量才會被建立。

等号(=)用來給變量指派。

等号(=)運算符左邊是一個變量名,等号(=)運算符右邊是存儲在變量中的值。例如:

$ python3

Python 3.4.3 (default, Mar 26 2015, 22:03:40)

[GCC 4.9.2] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> name = "Adair Jie" #此處加了引号,因為引号裡的内容是字元串

>>> age = 21 #數字不用引号,如果用了引号就會變成字元串

>>> print(name,age)

Adair Jie 21

>>> a = 3 #定義變量a等于3,即a指向3,且3為a而存在

>>> b = a #定義變量b等于a,此處等于把a的參數傳給了b,即b等于3,b指向3

>>> print (a,b) #此時列印結果為3 3

3 3

>>> a = 5 #再次定義變量a等于5,即a指向5,此時a等于5,原來3為a存在的意義就沒有了,根據python的回收機制,會将3從記憶體中拿走,但b依舊沒變,就是說b指向的是a的值還是指向3,此時3變成為b而存在了

>>> print (a,b) #此時列印結果為5 3

5 3

>>>

通過記憶體位址來看變量的變化關系:

記憶體位址=>>變量存放在記憶體中的位址

id内置函數,可以看變量存放在記憶體中的位址

例子:

$ python3

Python 3.4.3 (default, Mar 26 2015, 22:03:40)

[GCC 4.9.2] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> a = 3

>>> b = a

>>> id(a),id(b)

(10408128, 10408128)

>>> a = 5

>>> id(a),id(b)

(10408192, 10408128)

>>>

變量定義的規則:

變量名隻能是 字母、數字或下劃線的任意組合

變量名的第一個字元不能是數字

不能有特殊字元,不能有空格

以下關鍵字不能聲明為變量名

['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']

使用者互動

Python3.x

$ python3

Python 3.4.3 (default, Mar 26 2015, 22:03:40)

[GCC 4.9.2] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> name = input("Please input your name:") #使用者輸入的值會存放在name這個變量中

Please input your name:Adair Jie

>>> print (name)

Adair Jie

>>>

Python2.x

$ python2

Python 2.7.9 (default, Apr 2 2015, 15:33:21)

[GCC 4.9.2] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> name = raw_input("Please input your name:") #在2.x中使用raw_input

Please input your name:Adair Jie

>>> name

'Adair Jie'

>>> input #2.x中也有input函數

<built-in function input>

>>> name2 = input("PLease input you name:")

PLease input you name:Jack

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "<string>", line 1, in <module>

NameError: name 'Jack' is not defined

#此處報錯說沒有定義Jack

>>> name2 = input("PLease input you name:")

PLease input you name:"Jack" #在次測試在輸入值的時候加入引号,發現可以正常執行

>>> name2 #變量值可以正常輸出

'Jack'

差別比較

python2 python3

input() ===> eval(input)

raw_input ===> input()

例子:

$ python2

Python 2.7.9 (default, Apr 2 2015, 15:33:21)

[GCC 4.9.2] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> n = "rain" #定義變量a=“rain"

>>> name2 = input("Please input your name:")

Please input your name:n

>>> print name2 #最終也可以正常執行

rain

>>>

$ python3

Python 3.4.3 (default, Mar 26 2015, 22:03:40)

[GCC 4.9.2] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> n = "rain"

>>> eval('n') #此處的eval其實就等于這個eval函數去周遊了一遍記憶體,看看記憶體裡面是否有這個值,如果有就會輸出,沒有則報錯

'rain'

【小結】

在Python2.x中input對你輸入的是什麼格式它就把它當成什麼格式來處理,例如你輸入的是,你輸入的是不加引号的,那就是變量,它就會按照變量去找變量值,你輸入的是數字那就是數字,你輸入的是帶引号的那就是字元串,他就會按字元串的方式去處理

清單後續操作

>>> a = [1,2,3,'a','b']

>>> a.sort()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: unorderable types: str() < int() #字元串與整數不能排序

>>> a #通過切片,将123單獨排序

[1, 2, 3, 'a', 'b']

>>> a[0:2]

[1, 2]

>>> a[0:3]

[1, 2, 3]

>>> a[1:4] #去1-4顧頭不顧尾(包含索引的開頭,不包含結尾)

[2, 3, 'a']

>>> a[-2:] #取後兩個

['a', 'b']

>>>

>>> a[:3] #取前三個

[1, 2, 3]

>>>

extend (擴充操作)

>>> a = [1,2,3,4,5]

>>> b = ["a","b","c","d"]

>>> a + b

[1, 2, 3, 4, 5, 'a', 'b', 'c', 'd']

>>> a.extend(b)

>>> a

[1, 2, 3, 4, 5, 'a', 'b', 'c', 'd']

>>>

包含

>>> a = [1,2,3,4,5,"a","b""v"]

>>> a

[1, 2, 3, 4, 5, 'a', 'bv']

>>> 4 in a #4在a這個清單裡嗎?傳回true表示在

True

>>> 7 in a #7在a這個清單裡嗎?傳回false表示不在

False

>>>

元組

>>> t = (1,2,3,4,)

>>> type(t)

<class 'tuple'> #類型為元組

>>> dir(t) #可用的方法

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']

>>> list(t) #轉為清單

[1, 2, 3, 4]

>>> tuple(t) #轉為元組

(1, 2, 3, 4,)

>>>

字典

#!/usr/bin/env python

# -*- coding:utf-8 -*-

'''

#dic = {'k1':'v1','k2':'v2'}

#字典的寫法,寫法一樣的

#dic = dict(k1='v1',k2='v2')

例子1: fromkeys的用法,values與鍵值

#new_dict = dic.fromkeys(['k1','k2'],'v1')

#print(new_dict)

輸出結果

{'k1': 'v1', 'k2': 'v1'}

#new_dict = dic.fromkeys(['k1','k2','k3'],'v1')

#print(new_dict)

輸出結果

{'k1': 'v1', 'k2': 'v1', 'k3': 'v1'}

例子2:get的用法

#dic = dict(k1='v1',k2='v2')

print (dic['k1'])

print (dic['k2'])

print (dic['k3']) #鍵值k3不存在則會運作報錯

print (dic['k3'])

KeyError: 'k3'

#print (dic.get('k1')) #dic.get這種方法就不會,如果不存在會預設一個NONE

#print (dic.get('k2'))

#print (dic.get('k3'))

#輸出結果如下

#v1

#v2

#None

#也可以自己指定

#print (dic.get('k3','adair')) #指定的值不在就用adair表示

#直接會輸出

#adair

例子3.keys,values.items的用法

#dic = {'k1':'v1','k2':'v2'}

print (dic.keys())

print (dic.values())

print (dic.items())

#輸入結果如下

['k1', 'k1']

['v2', 'v2']

[('k2', 'v2'), ('k1', 'v1')]

#使用for循環列印

for k in dic.keys():

print(k)

for v in dic.values():

print(v)

for k,v in dic.items():

print(k,v)

#輸出結果

k2

k1

v2

v2

('k2', 'v2')

('k1', 'v1')

例子4,pop方法,拿走一個,字典是無序的是以需要指定拿走什麼

#dic = {'k1':'v1','k2':'v2'}

#dic.pop('k1')

#print(dic)

#輸入結果為

#{'k2': 'v2'}

例子5,popitem方法 ,在python2中會删除最後一個鍵值對,在python3中删除無法确定

#dic = {'k1':'v1','k2':'v2'}

#dic.popitem()

#print (dic)

例子6,setdefault的用法,設定預設值,不設定預設為NONE

#dic = {'k1':'v1','k2':'v2'}

#dic.setdefault('k3')

#print(dic)

#update的用法,更新字典

#dic.update({'k3':123})

#print(dic)

'''

'''

練習:

有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值儲存至字典的第一個key中,将小于 66 的值儲存至第二個key的值中。

即: {'k1': 大于66 , 'k2': 小于等于66}

條件

上述集合的值需要放到

dic = {}

'''

'''

#實作方法1

all_list = [11,22,33,44,55,66,77,88,99,90]

dic = {}

l1 = []

l2 = []

for i in all_list:

if i >66:

l1.append(i)

else:

l2.append(i)

dic['k1'] = l1

dic['k2'] = l2

print (dic)

#輸出結果

{'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]}

'''

'''

#實作方法2

#期望得到的結果{'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]}

dic = {}

all_list = [11,22,33,44,55,66,77,88,99,90]

for i in all_list:

if i>66:

if "k1" in dic.keys():

dic['k1'].append(i)

else:

dic['k1']=[i,]

else:

if "k2" in dic.keys():

dic['k2'].append(i)

else:

dic['k2']=[i,]

print(dic)

#輸出内容

{'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]}

'''

集合

python的set和其他語言類似, 是一個無序不重複元素集, 基本功能包括關系測試和消除重複元素. 集合對象還支援union(聯合), intersection(交), difference(差)和sysmmetric difference(對稱差集)等數學運算.

sets 支援 x in set, len(set),和 for x in set。作為一個無序的集合,sets不記錄元素位置或者插入點。是以,sets不支援 indexing, slicing, 或其它類序列(sequence-like)的操作。

下面來點簡單的小例子說明把。

>>> x = set('spam')

>>> y = set(['h','a','m'])

>>> x, y

(set(['a', 'p', 's', 'm']), set(['a', 'h', 'm']))

再來些小應用。

>>> x & y #交集

set(['a', 'm'])

>>> x | y #并集

set(['a', 'p', 's', 'h', 'm'])

>>> x - y #差集

set(['p', 's'])

記得以前個網友提問怎麼去除海量清單裡重複元素,用hash來解決也行,隻不過感覺在性能上不是很高,用set解決還是很不錯的,示例如下:

>>> a = [11,22,33,44,11,22]

>>> b = set(a)

>>> b

set([33, 11, 44, 22])

>>> c = [i for i in b]

>>> c

[33, 11, 44, 22]

很酷把,幾行就可以搞定。

1.8 集合

集合用于包含一組無序的對象。要建立集合,可使用set()函數并像下面這樣提供一系列的項:

s = set([3,5,9,10]) #建立一個數值集合

t = set("Hello") #建立一個唯一字元的集合

與清單和元組不同,集合是無序的,也無法通過數字進行索引。此外,集合中的元素不能重複。例如,如果檢查前面代碼中t集合的值,結果會是:

>>> t

set(['H', 'e', 'l', 'o'])

注意隻出現了一個'l'。

集合支援一系列标準操作,包括并集、交集、差集和對稱差集,例如:

a = t | s # t 和 s的并集

b = t & s # t 和 s的交集

c = t – s # 求差集(項在t中,但不在s中)

d = t ^ s # 對稱差集(項在t或s中,但不會同時出現在二者中)

基本操作:

t.add('x') # 添加一項

s.update([10,37,42]) # 在s中添加多項

使用remove()可以删除一項:

t.remove('H')

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.copy()

傳回 set “s”的一個淺複制

請注意:union(), intersection(), difference() 和 symmetric_difference() 的非運算符(non-operator,就是形如 s.union()這樣的)版本将會接受任何 iterable 作為參數。相反,它們的運算符版本(operator based counterparts)要求參數必須是 sets。這樣可以避免潛在的錯誤,如:為了更可讀而使用 set('abc') & 'cbs' 來替代 set('abc').intersection('cbs')。從 2.3.1 版本中做的更改:以前所有參數都必須是 sets。

另外,Set 和 ImmutableSet 兩者都支援 set 與 set 之間的比較。兩個 sets 在也隻有在這種情況下是相等的:每一個 set 中的元素都是另一個中的元素(二者互為subset)。一個 set 比另一個 set 小,隻有在第一個 set 是第二個 set 的 subset 時(是一個 subset,但是并不相等)。一個 set 比另一個 set 打,隻有在第一個 set 是第二個 set 的 superset 時(是一個 superset,但是并不相等)。

子 set 和相等比較并不産生完整的排序功能。例如:任意兩個 sets 都不相等也不互為子 set,是以以下的運算都會傳回 False:a<b, a==b, 或者a>b。是以,sets 不提供 __cmp__ 方法。

因為 sets 隻定義了部分排序功能(subset 關系),list.sort() 方法的輸出對于 sets 的清單沒有定義。

運算符

運算結果

hash(s)

傳回 s 的 hash 值

下面這個表列出了對于 Set 可用二對于 ImmutableSet 不可用的運算:

運算符(voperator)

等價于

運算結果

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”中的所有元素

請注意:非運算符版本的 update(), intersection_update(), difference_update()和symmetric_difference_update()将會接受任意 iterable 作為參數。從 2.3.1 版本做的更改:以前所有參數都必須是 sets。

還請注意:這個子產品還包含一個 union_update() 方法,它是 update() 方法的一個别名。包含這個方法是為了向後相容。程式員們應該多使用 update() 方法,因為這個方法也被内置的 set() 和 frozenset() 類型支援。

collections系列

Counter是對字典類型的補充,用于追蹤值的出現次數。

ps:具備字典的所有功能 + 自己的功能

轉載于:https://www.cnblogs.com/adair-jie/p/5236622.html