第二篇*一、Python基本數據類型

 數據類型:

變量能夠處理不一樣類型的值,基本的類型是數和字符串。使用變量時只須要給它們賦一個值。不須要聲明或定義數據類型。
Python3 中有六個標準的數據類型:
Number(數字),String(字符串),List(列表),Tuple(元組),Sets(集合),Dictionary(字典)html

1. 布爾值bool

布爾值類型: True,False
布爾運算類型: 與and、或or、非notjava

False: None,"",{},(),[], 0python

a = True print a and 'a=T' or 'a=F'  #計算結果不是布爾類型,而是字符串 'a=T'。由於Python的False只有幾種,其餘數值和非空字符串都當作 True,因此,計算結果是 'a=T',繼續計算 'a=T' or 'a=F' 計算結果仍是 'a=T',

2. 字符串

1)定義

是由零個或多個字符組成的有限串行。通常記爲s=a[1]a[2]...a[n]。(通常引號引發來)git

2) 基本操做

str.index()             # 索引字符
str[N]                  # 索引,可爲負值
str[n:m]                # 切片,可爲負值
len()                   # 求序列長度
str1 + str2             # 加法:「+」鏈接字符串鏈接2個序列 
str1 * n                # 乘法:「*」 重複序列元素,就是重複那個字符串的含義。
in                      # 判斷元素是否存在於序列中
max()                   # 返回最大值--ASCII編碼
min()                   #返回最小值--ASCII編碼
cmp(str1,str2)          #比較2個序列值是否相同,首先將字符串中的符號轉化爲對應編碼的數字,而後比較。若是返回的數值小於零,說明第一個小於第二個,等於0,則兩個相等,大於0,第一個大於第二個。

3)擴展操做

● 字符串的拆分和拼接github

str2 = str1.split("sep")     #將字符串根據某個sep(分割符)分割成多個字符串組成的列表,默認爲空格。
str2 = "sep".join(interable) #將序列中的元素以指定的字符sep鏈接生成一個新的字符串。列表、元組和字符串都是序列。

● 默認去掉字符串空格:原來的值沒有變化,而是新返回了一個結果。也能夠指定去除內容(序列或者字符),或者指定內容的子序列web

S.strip()   #去掉字符串的左右空格、\t、\n,也能夠指定去除內容(序列或者字符),或者指定內容的子序列
S.lstrip()  #去掉字符串的左邊空格、\t、\n, 也能夠指定去除內容(序列或者字符),或者指定內容的子序列
S.rstrip()  #去掉字符串的右邊空格、\t、\n,也能夠指定去除內容(序列或者字符),或者指定內容的子序列
str = '12a2b12c212'
print(str.strip('12'))  #a2b12c 刪除頭尾的1和2
print(str.lstrip('12'))  #a2b12c212 刪除開頭的1和2
print(str.rstrip('12'))  #12a2b12c 刪除結尾的1和2

● 字符大小寫的轉換:用來實現各類類型的大小寫轉化api

S.upper()     #將S中的字母轉換爲大寫
S.lower()     #將S中的字母轉換爲小寫
S.casefood    #將S中的字母轉換爲小寫,更強大
S.swapcase()  #將S中的字母的大小寫全轉換
S.title()     #將S中字符串中全部的單詞轉換成首字母都是大寫
S.capitalize()  #首字母大寫
S.isupper()  #S中的字母是否全是大寫
S.islower()  #S中的字母是否全是小寫
S.istitle()  #S中字符串中全部的單詞拼寫首字母是否爲大寫,且其餘字母爲小寫

● 字符串填充/寬度設置安全

S.center(width[, fillchar])  #設置S的寬度,字符串內容在中間,以第二個參數爲填充字符,填充字符只能指定一個,可不填,默認爲空格
S.ljust(width[, fillchar])   #指定寬度和填充字符,內容放左邊,右邊填充指定字符,默認填充字符爲空格
S.rjust(width[, fillchar])   #指定寬度和填充字符,內容放右邊,左邊填充指定字符,默認填充字符爲空格
S.zfill(width)               #指定寬度,不可指定字符,內容放右邊,左邊填充0

● 字符串分割app

S.partition(sep)                # 從左邊起,找到第一個指定的字符sep,將左右兩邊進行切割,分割爲3份。第二份爲指定字符sep
S.rpartition(sep)               # 從右邊起,找到第一個指定的字符sep,將左右兩邊進行切割,分割爲3份。第二份爲指定字符sep
S.split(sep=None, maxsplit=-1)  # 從左邊起,找到全部指定的字符sep,將左右兩邊抽離,分割爲n份。指定maxsplit=1則只找一個,左右兩邊分割一次,匹配的sep不會出現。
S.lstrip([chars])               # 從右邊起,找到全部指定的字符sep,將左右兩邊抽離,分割爲n份。指定maxsplit=1則只找一個,左右兩邊分割一次,匹配的sep不會出現。
S.splitlines([keepends])        #只能以\n符號分割,若是()內爲True,保留換行符,爲False爲不保留換行符。

● 字符串內容替換ide

S.maketrans(self, *args, **kwargs)  #給定替換規則(「m」,「n」)e.g. x=S.maketrans("abc","123")
S.translate(table)                  #按照給給定的替換規則進行替換,相似翻譯。e.g. y = S.translate(x) ,if S=abcda, print(y)爲123d1
S.replace(old, new[, count])        #字符串替換,把old 替換成new,默認全體替換,可指定替換個數,即替換前面n個數

● 字符串內容判斷

S.isalnum()      # 判斷字符串是否只包含數字和字母,是返回True,包含其餘的字符返回False
S.isalpha()      # 判斷字符串是否只包含字母,是返回True,包含其餘的字符返回False
S.isdecimal()    # 判斷是否爲數字
S.isdigit()      # 判斷是否爲數字,對特殊數字也適用。例如②
S.isnumeric()    # 判斷是否都是數字,對中文數字也適用。最牛
S.isidentifier() # 判斷是否爲標識符
S.isprintable()  # 判斷是否存在不可顯示的字符,如\t、\n
S.isspace()      # 判斷是否都是空格
S.endswith(suffix[, start[, end]])   #判斷字符串是否以指定字符爲結尾,可指定範圍 
S.startswith(prefix[, start[, end]]) #判斷字符串是否以指定字符爲開頭,可指定範圍

● 字符串其它魔法

S.count(sub[, start[, end]])  #計算指定子序列在字符串的個數,可指定計算範圍
S.expandtabs(tabsize=8)       #把字符串中的 tab 符號('\t')轉爲空格,tabsize用來斷句,默認8個字符,即以8個字符爲一個斷句標準,不足以空格補全。
S.find(sub [,start [,end]])   #查找給定子序列的第一個位置,返回索引值,可指定範圍,未找到時返回-1
S.format(*args, **kwargs)     #格式化,將字符串中的佔位符替換成指定值
S.format_map({*args: m, **kwargs: n})  #格式化,將字符串中的佔位符替換成指定值,必須提供鍵值對
S.index(sub [,start [,end]])             #查找給定子序列的第一個位置,返回索引值,可指定範圍,未找到時返回出錯

4) 格式化字符串

待續。。。

 3.  列表

1) 定義

       在python中,用方括號 [ ] 表示一個list。在方括號裏面,能夠是int,也能夠是str類型的數據,甚至也可以是True/False這種布爾值,或者嵌套一個列表。list中的元素是任意類型的。

2) 判斷

       bool()是一個布爾函數,做用就是來判斷一個對象是「真」仍是「空」(假)。若是list中什麼也沒有,就是空的,用bool()函數來判斷,獲得False,從而顯示它是空的。

3) 生成

生成list:range()函數和for循環的引用 # e.g. print [ x * y for x, y in zip(range(1,100,2),range(2,101,2))]

4) 修改

      這種修改,不是複製一個新的,而是在原地進行修改。內存地址不變。其存儲爲鏈式存儲。

5)切片和索引

       list和str兩種類型的數據,有共同的地方,它們都屬於序列(都是一些對象按照某個次序排列起來,這就是序列的最大特徵)。
       索引都是從左邊開始編。第一個是0,而後依次增長1。此外,還有一種編號方式,對於list,既然Python支持L[-1]取倒數第一個元素就是從右邊開始,右邊第一個能夠編號爲-1,而後向左依次是:-2,-3,...,依次類推下來。這對字符串、列表等各類序列類型都是用。
       序列的切片,左邊的數字必定要小於右邊的數字。不包括右邊的數據。切片結果爲新的list。 一樣支持倒數切片取倒數。切片操做還能夠指定第三個參數:第三個參數表示每N個取一個,上面的 L[::2] 會每兩個元素取出一個來,也就是隔一個取一個。把list換成tuple,切片操做徹底相同,只是切片的結果也變成了tuple。

list[:]            #複製出了一個新list。
list[::-1]         #反轉,不是在「原地」把原來的值倒過來,而是新生成了一個值,那個值跟原來的值相比,是倒過來了。等同於list(reversed(list0))
list[1:3] = [x, y] #切片賦值

6) 基本操做

len(L)          # 求列表長度 e.g. lst = [1,2,3] len(lst) = 3
L[i]=()         # 替換第i個元素 e.g. lst[2]=(4) = [1,2,4] 
L1+ L2          # 鏈接2個序列,鏈接列表 e.g. alst = [5, 6] lst + alst = [1, 2, 3, 4, 5, 6]
L*n             # 重複序列元 素「*」 字符串中的「乘法」,就是重複那個列表的含義。blst = st * 2 = [1,2,3,1,2,3] 
x in list             # 判斷元素是否存在於序列中 e.g. x in lst : False
L.append(object)      # 即將新的元素x追加到list的尾部,等效於:a[len(a):]=[x] e.g. lst.append("like") = [1,2,3,like]
cmp(L1,L2)            # 比較2個序列值 e.g.cmp(lst,alst) == False
L.extend(iterable)    # append是整建制地追加,extend是個體化擴編。
    # e.g. lst.append(["qiwsir","github"]) = [1, 2, 3, ['qiwsir', 'github']]; lst2.extend(["qiwsir","github"]) = [1, 2, 3, 'qiwsir', 'github']
L.count(value)        # 計算元素個數 e.g.deblst.count(2) = 2
L.index(value, [start, [stop]])     # 得到索引位置 e.g.lst.index(2) = 1 
L.insert(index, object)             # L.insert(i,x) 在i位置插入元素x e.g. lst.insert(2,"x") = [1,2,x,3] 
del L[n:m]            # 刪除元素
L.remove(value) # 移除元素 lst.remove(1) = [2,x,3] L.pop([index]) # 移除索引值位置的元素,L.pop([i]) e.g. list.pop([1]) = [1,x,3] L.reverse() # 列表反轉 e.g. lst.reverse () = [3,2,1] L.sort(key=None, reverse=False) # lst.sort(reverse=True) = [3,2,1] L.sort(cmp=None, key=None, reverse=False) -- stable sort IN PLACE; cmp(x, y) -> -1, 0, 1 # lst = ["python","java","c","pascal","basic"]; lst.sort(key=len) =['c', 'java', 'basic', 'python', 'pascal'] L.clear() # 清空列表,參數爲空:None 表示 remove all items from L L.copy() # 拷貝列表,淺拷貝

 7) list和str轉化

str.split() # S.split([sep [,maxsplit]]) -> list of strings 這個內置函數實現的是將str轉化爲list。其中str=""是分隔符。返回字符串S中的單詞列表,使用sep做爲分隔符字符串。 若是給出maxsplit,則最多能夠完成maxsplit拆分。 若是未指定sep或無,則空格字符串爲分隔符,並從結果中刪除空字符串。
"[sep]".join(list) or list(str)  # 字符串轉換成列表

4.  元組

1)特色

    用圓括號()括起來的,其中的元素之間用逗號隔開。(都是英文半角)元組只有一個元素的時候(特別是數或者字符串),記得添加「,」纔是元組

* 元組中的元素類型是任意的python數據。
* tuple是一種序列類型的數據,這點上跟list/str相似。它的特色就是其中的元素不能更改,這點上跟list不一樣,卻是跟str相似;它的元素又能夠是任何類型的數據,這點上跟list相同,但不一樣於str。元素不能被增長或刪除。tuple指向的list,list可變,因此tuple所謂的「不變」是說,tuple的每一個元素,指向永遠不變。即指向'a',就不能改爲指向'b',「可變」是指向一個list,就不能改爲指向其餘對象,但指向的這個list自己是可變的!要建立一個內容也不變的tuple,那就必須保證tuple的每個元素自己也不能變。即一級元素不可變。

* 若是一個元組中只有一個元素的時候,應該在該元素後面加一個半角的英文逗號:由於()既能夠表示tuple,又能夠做爲括號表示運算時的優先級,結果 (1) 被Python解釋器計算出結果 1,致使咱們獲得的不是tuple,而是整數 1。因此 Python 規定,單元素 tuple 要多加一個逗號「,」,這樣就避免了歧義。

 2) 索引和切片

 能夠正常使用 t[0],t[-1]等索引方式訪問元素,可是不能賦值成別的元素。

3) tuple使用的情景:

A.  Tuple 比 list 操做速度快。若是您定義了一個值的常量集,而且惟一要用它作的是不斷地遍歷它,請使用 tuple 代替 list。
B.  若是對不須要修改的數據進行 「寫保護」,可使代碼更安全。使用 tuple 而不是 list 如同擁有一個隱含的 assert 語句,說明這一數據是常量。若是必需要改變這些值,則須要執行 tuple 到 list 的轉換 (須要使用一個特殊的函數)。
C. Tuples 能夠在 dictionary(字典,後面要講述) 中被用作 key,可是 list 不行。Dictionary key 必須是不可變的。Tuple 自己是不可改變的,可是若是您有一個 list 的 tuple,那就認爲是可變的了,用作 dictionary key 就是不安全的。只有字符串、整數或其它對 dictionary 安全的 tuple 才能夠用做 dictionary key。
D. Tuples 能夠用在字符串格式化中。

4) 列表和元組:用list()和tuple()可以實現二者的轉化

5) 基本用法

T.count(value)                  #計算某個值的出現個數
T.index(value, [start, [stop]]) #返回索引位置

5. 字典

1) 特色

 *  查找速度快:不管dict有10個元素仍是10萬個元素,* 查找速度都同樣。而list的查找速度隨着元素增長而逐漸降低。不過dict的查找速度快不是沒有代價的,dict的缺點是佔用內存大,還會浪費不少內容,list正好相反,佔用內存小,可是查找速度慢。因爲dict是按 key 查找,因此,在一個dict中,key不能重複。

 * 存儲的key-value序對是沒有順序,無序 

 * 做爲 key 的元素必須不可變:Python的基本類型如字符串、整數、浮點數都是不可變的,均可以做爲 key。可是list是可變的,就不能做爲 key。

 * 可遍歷:for

2) 建立

 *  花括號 {} 表示, key: value,最後一個 key: value 的逗號能夠省略。

 * 在字典中的「鍵」,必須是不可變的數據類型;「值」能夠是任意數據類型。列表能夠修改,因此列表是可變的;字符串和元組都不行,因此它們是不可變的。字典能夠原地修改,即它是可變的。列表,字典不能做爲key。布爾值True=1, False=0,當與其餘key值重複的時候,會出現衝突,其能夠當成key的。

  * 直接建立:
 a. 建立一個空的dict,這個空dict,能夠在之後向裏面加東西用。

mydict = {}

 b. 建立有內容的dict。

person = {"name":"qiwsir","site":"qiwsir.github.io"}

"name":"qiwsir":鍵值對。前面的name叫作鍵(key),後面的qiwsir是前面的鍵所對應的值(value)。在一個dict中,鍵是惟一的,不能重複。值則是對應於鍵,值能夠重複。鍵值之間用(:)英文的冒號,每一對鍵值之間用英文的逗號(,)隔開。

 * 利用元組建構字典

name = (["first","Google"],["second","Yahoo"]) website = dict(name)                 #website = {'second': 'Yahoo', 'first': 'Google'}
ad = dict(name = "qiwsir", age = 42) #ad = {'age': 42, 'name': 'qiwsir'}

 * 使用fromkeys,這種方法是從新創建一個dict。

website = {}.fromkeys(("third","forth"),"facebook")  #website = {'forth': 'facebook', 'third': 'facebook'}

3) 訪問dict的值

dict數據類型是以鍵值對的形式存儲數據的,因此,只要知道鍵,就能獲得值。這本質上就是一種映射關係。經過字典的「鍵」找到相應的「值」。經過「鍵」可以增長dict中的「值」,經過「鍵」可以改變dict中的「值」,經過「鍵」也可以訪問dict中的「值」。字典沒有索引。

person = {'name2': 'qiwsir', 'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'} person['name']       #'qiwsir'
person['language']   #'python'

4)基本操做

len(d)          # 返回字典(d)中的鍵值對的數量
d[key]          # 返回字典(d)中的鍵(key)的值
d[key]=value    # 將值(value)賦給字典(d)中的鍵(key)
del d[key]      # 刪除字典(d)的鍵(key)項(將該鍵值對刪除)
key in d        # 檢查字典(d)中是否含有鍵爲key的項

5)要避免 KeyError 的兩個辦法:

key in d

先判斷一下 key 是否存在,用 in 操做符:

dict.get()

使用dict自己提供的一個 get 方法,在Key不存在的時候,返回None。

 6) 其餘操做

D.clear()                       #Remove all items from D
D.copy()                        #淺拷貝
D.get(k[,d])                    #-> D[k] 獲取key的value值,獲取不到返回None
D.items()                       #D.iteritems(...)
D.keys()                        #獲取字典的key集合
D.values()                      #D. itervalues()
D.pop(k[,d])                    #刪除指定鍵的鍵值對。
D.popitem()                     #隨機刪除字典的鍵值對。
D.setdefault(k[,d])             #設置鍵值對,若存在不設置,獲取當前的key對應得值,不存在的話,添加。
D.update([E, ]**F)              #更新鍵值對。存在的覆蓋,不存在的更新上去。e.g. dic.update({'k1':'111','k2':'123'}) or dic.update({k1=111,k2=123}) 
dict.fromkeys(*args, **kwargs)  #根據序列建立字典,指定的值統一。參數只能兩個,靜態方法 e.g. v=dict.fromkeys(["k1",123],123); v={"k1":123, 123:123}

6. 集合set

1)定義

 由不一樣元素組成的集合,集合中是一組無序排列的可hash值,能夠做爲字典的key。即列表,字典不能夠,數字,字符串,元組能夠。

2)特色

不一樣的集合間用來作關係運算,無需糾結於集合中單個值.list和dict的雜合。set擁有相似dict的特色:能夠用{}花括號來定義;其中的元素沒有序列,也就是是非序列類型的數據;並且,set中的元素不可重複,這就相似dict的鍵。

3)建立

用set()來建立集合,即建立的集合可變。

s2 = set([123,"google","face","book","facebook","book"])   #set(['facebook', 123, 'google', 'book', 'face'])

使用{}的方式建立集合,但沒法建立含有list/dict元素的set。這種方式不提倡使用,由於在某些狀況下,python搞不清楚是字典仍是集合。建立的集合可變。

>>> s3 = {"facebook",[1,2,'a'],{"name":"python","lang":"english"},123} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'dict'
>>> s3 = {"facebook",[1,2],123} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'

集合另外一個建立方法是用frozenset(),hashable類型,不能在原處修改。即建立的集合不可變。

f_set = frozenset("qiwsir")            # frozenset(['q', 'i', 's', 'r', 'w'])
f_set.add("python")                    #報錯,不能修改,則無此方法
Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'frozenset' object has no attribute 'add' a_set = set("github")                  #對比看一看,這是一個能夠原處修改的set, set(['b', 'g', 'i', 'h', 'u', 't'])
a_set.add("python")                    #set(['b', 'g', 'i', 'h', 'python', 'u', 't'])

4) 關係運算

in            #屬於 
not in        #不屬於
A==B          # A等於B,即兩個集合的元素徹底同樣或使用A!=B 
A<B           #A是B的子集,或者反過來,B是不是A的超集。即A的元素也都是B的元素,可是B的元素比A的元素數量多。判斷集合A是不是集合B的子集,可使用A<B,返回true則是子集,不然不是。另外,還可使用函數A.issubset(B)判斷。
A<=B A>B A>=B A|B.          #A、B的並集,即A、B全部元素。可使用的符號是「|」,是一個半角狀態寫的豎線,輸入方法是在英文狀態下,按下"shift"加上右方括號右邊的那個鍵。找找吧。表達式是A | B.也可以使用函數A.union(B),獲得的結果就是兩個集合並集,注意,這個結果是新生成的一個對象,不是將結合A擴充。
A|=B          #合集
A & B         #交集,A、B的交集,即A、B全部的元素:A & B 或A.intersection(B)
A&=B A - B        #A相對B的差(補),即A相對B不一樣的部分元素: A - B或A.difference(B)
^,^=          #對稱差分
(A-B)|(B-A)   # A、B的對稱差集:(A-B)| (B-A)或A.symmetric_difference(B) 

 5) 其餘操做

S.add(self, *args, **kwargs)              #添加元素
S.clear(self, *args, **kwargs):           #清空元素
S0=S.copy(self, *args, **kwargs):     #拷貝集合
S.pop(self, *args, **kwargs):             #隨機刪除一個元素
S.remove(self, *args, **kwargs):          #刪除某個指定元素,若是元素不存在,會報錯。 e.g. S.remove('sb')
S.discard(self, *args, **kwargs):         # 與remove功能相同,刪除元素不存在時不會拋出異常
S.union(self, *args, **kwargs):           # 求並集,至關於s1Us2
S.difference(self, *args, **kwargs):      #求差集,至關於s1-s2
S.difference_update(self, *args, **kwargs):     #求完交集求補集,至關於s1=s1-(s1&s2)
S.intersection(self, *args, **kwargs):          #求交集,至關於s1&s2 e.g. s1.intersection(s2)
S.intersection_update(self, *args, **kwargs):   # 求交集以後將結果賦值給S,至關於s1=s1&s2
S.symmetric_difference(self, *args, **kwargs):  # 求交叉集的補集,至關於s1^s2 ((s1-(s1&s2))U((s2-(s1&s2))
S.symmetric_difference_update(self, *args, **kwargs): #求交叉集的補集,並賦值給S。至關於:s1=((s1-(s1&s2))U((s2-(s1&s2))
S.update(self, *args, **kwargs):           #把新的可迭代的值更新到S
S.isdisjoint(self, *args, **kwargs):       # 判斷是否有交集
S.issubset(self, *args, **kwargs):         # 判斷s1是否包含於s2,即s1是否爲s2的子集,至關於s1<=s2
S.issuperset(self, *args, **kwargs):       #判斷s2是否包含於s1,即s2是否爲s1的子集,至關於s1>=s2

 

 

《參考文獻》

https://www.cnblogs.com/wupeiqi/articles/5433893.html

http://www.cnblogs.com/linhaifeng/articles/5935801.html

http://www.cnblogs.com/wupeiqi/articles/5444685.html

https://www.cnblogs.com/nulige/p/6102645.html

http://www.cnblogs.com/alexzp/p/3377921.html

相關文章
相關標籤/搜索