1、內置函數(二)
一、和數據結構相關(24)
列表和元祖(2)
list:將一個可迭代對象轉化成列表(若是是字典,默認將key做爲列表的元素)。
tuple:將一個可迭代對象轉化成元組(若是是字典,默認將key做爲元組的元素)python
二、相關內置函數(2)
reversed:將一個序列翻轉,並返回此翻轉序列的迭代器。 *****
slice:構造一個切片模板,用於列表的切片。***json
2-一、reversed()與列表的reverse()區分:
列表的reverse()只能列表使用:列表.reverse(),對原列表進行翻轉,結果返回的仍是列表。
內置函數reversed(),將一個序列翻轉,結果是返回一個迭代器。數組
列表的reverse()數據結構
l1 = [1,3,4,2,6] l1.reverse() #將列表進行翻轉 print(l1) #返回修改後的列表[6, 2, 4, 3, 1]
內置函數reversed()函數
reversed(l1) #生成一個迭代器 print(reversed(l1)) #一個地址 for i in reversed(l1): print(i) # 結果: # 用for循環輸出迭代器的值 # 6 2 4 3 1 # 字符串使用reversed() s1 = 'abcdefg' for i in reversed(s1): print(i) 結果: g f e d c b a # 字典使用reversed() 報錯 dic = {'name':'xiaoming','age':1000,'hobby':'oldwomen'} # 不行
2-二、slice:構造一個切片模板,用於列表的切片。 ***
l3 = [1,2,3,4,5,6,7,8,9,10]
sli_obj = slice(0,5,2) #製做切片模板,索引從0到4,間隔取值
print(l3[sli_obj]) # [1 3 5]post
l4 = ['a', 'b', 'c', 'd', 'e']
print(l4[sli_obj]) # ['a', 'c', 'e']性能
三、字符串相關(9)
3-一、str:將數據轉化成字符串。this
3-二、format:與具體數據相關,用於計算各類小數,精算等。 **
日常使用format狀況較少,下面這種形式已是最多的了,剩下的科學運算,須要用到的可自行研究。
字符串能夠提供的參數,指定對齊方式,<是左對齊, >是右對齊,^是居中對齊
print(format('test', '<20')) # 左對齊 (20是長度)
print(format('test', '>20')) # 右對齊
print(format('test', '^20')) # 居中對齊編碼
3-三、bytes:unicode ---> bytes類型(單向的編碼) ****spa
# 編碼encode(): s1 = '小明' b1 = s1.encode('utf-8') print(b1) # b'\xe5\xb0\x8f\xe6\x98\x8e' # 解碼decode(): s2 = b1.decode('utf-8') print(s2) # 小明 # 用bytes()方法編碼(單向) a1 = '小白' b1 = bytes(a1,encoding='utf-8') print(b1) # b'\xe5\xb0\x8f\xe7\x99\xbd' # 不能用bytes()方法解碼 a2 = bytes(b1,encoding='utf-8') print(a2) # 報錯 # 只能用decode()解碼 a2 = b1.decode('utf-8') print(a2) #小白
3-四、bytearry:返回一個字節數組。這個數組裏的元素是可變的,而且每一個元素的值範圍: 0 <= x < 256。
(bytearray其實也是一種編碼的方法,不過bytearray可對編碼後的字節進行修改,即對原數據進行修改)
例如:字符串 小明
b1 = bytearray('小明',encoding='utf-8') #對小明進行編碼,生成一串字節碼(utf-8一箇中文表明三個字節)
print(b1) # bytearray(b'\xe5\xb0\x8f\xe6\x98\x8e')
print(b1[0]) # 229
b1[0] = 65 #對前三個字節進行修改(即修改中文'小')
b1[1] = 97
b1[2] = 104
print(b1) # bytearray(b'Aah\xe6\x98\x8e')
print(b1.decode('utf-8')) # 解碼出來:Aah明
例如:字符串 hot
ret = bytearray('hot',encoding='utf-8')
print(id(ret)) # 2997820203056
print(ret) # bytearray(b'hot')
print(ret[0]) # h的ASCII:104
ret[0] = 65 # 把索引0的ASCII值改成65(A)
print(ret) # bytearray(b'Aot') hot索引0就改爲了A
print(id(ret)) # 2997820203056 內存地址不變
3-五、memoryview
ret = memoryview(bytes('你好',encoding='utf-8'))
print(len(ret)) # 6
print(ret) # <memory at 0x000001D3D6FCD048> # [\xe4,\xbd,\xa0,\xe5,\xa5,\xbd]
print(bytes(ret[:3]).decode('utf-8')) # 你
print(bytes(ret[3:]).decode('utf-8')) # 好
3-六、ord:輸入字符找該字符unicode編碼的位置 **
print(ord('a')) # 97
print(ord('中')) # 20013
3-七、chr:輸入位置數字找出其對應的unicode編碼的字符 **
print(chr(97)) # a
print(chr(20013)) # 中
3-八、ascii:在ascii碼中的就返回該值,不是則返回它在unicode的位置(16進制。) **
print(ascii('a')) # 'a'
print(ascii('中')) # '\u4e2d'
3-九、repr:返回一個對象的string形式(原形畢露) *****
print(repr('{"name":"xiaoming"}')) #'{"name":"xiaoming"}' print('{"name":"xiaoming"}') # {"name":"xiaoming"} 格式化輸出%r--->原封不動的寫出來(基礎數據類型均可接收) 字符串單雙引號都默認是單引號 msg = 'xiaoming是%r的人' % ('德高望重') print(msg) # xiaoming是'德高望重'的人 msg = 'xiaoming是%r的人' % ("德高望重") print(msg) # xiaoming是'德高望重'的人 msg = 'xiaoming是%r的人' %(18) print(msg) # xiaoming是18的人 msg = 'xiaoming是%r的人' %(True) print(msg) # xiaoming是True的人 msg = 'xiaoming是%r的人' %({'name':'xiaming','age':18}) print(msg) # xiaoming是{'name': 'xiaming', 'age': 18}的人 repr():可用於判斷json pickle序列化模塊 特殊字符串,python字符串的區別
四、數據集合(3)
4-一、dict:建立一個字典。
4-二、set:建立一個集合。
4-三、frozenset:返回一個凍結的集合,凍結後集合不能再添加或刪除任何元素。
五、相關內置函數(8)
5-一、len:返回一個對象中元素的個數。
5-二、sorted:對全部可迭代的對象進行排序操做。 *****
與列表的sort區分:
列表的sort方法是對原列表進行排序修改,並無生成新的列表
內置函數sorted方法會造成一個新列表
l1 = [2,3,5,3,1,9,8,6] l1.sort() print(l1) print(sorted(l1)) # 造成了一個新列表 print(l1) # 原列表不變 內置函數sorted還能夠與函數結合使用 l2 = [(1,1000),(2,18),(4,250),(3,500)] def func1(x): return x[1] print(sorted(l2,key=func1)) #按第二個元素升序排序 [(2, 18), (4, 250), (3, 500), (1, 1000)] print(sorted(l2,key=func1,reverse=True)) #按第二個元素降序排序 [(1, 1000), (3, 500), (4, 250), (2, 18)]
5-三、enumerate:枚舉,返回一個枚舉對象。****
一個值接收枚舉對象,返回的每一個元素是元組,元組第一個元素是索引(默認從0開始)
第二個元素是可迭代對象的每一個元素。
for i in enumerate([1,2,3]):
print(i)
結果:
(0, 1)
(1, 2)
(2, 3)
for i in enumerate([1,2,3],100):
print(i)
結果:
(100, 1)
(101, 2)
(102, 3)
for i,j in enumerate([1,2,3],100):
print(i,j)
結果:
100 1
101 2
102 3
5-四、all:可迭代對象中,全都是True纔是True *** 多作條件判斷
l1 = [1,'',[1,3],(2,4)]
print(all(l1)) #False 有一個元素是空
5-五、any:可迭代對象中,有一個True就是True *** 多作條件判斷
l2 = [1,0,'',()]
print(any(l2)) #True
5-六、拉鍊方法:zip() 將多個iter縱向組成元素爲元組的迭代器,以長度最小的iterable爲標準長度 *****
l1 = [1,2,3,4] tu1 = ('a','b','c') dic = {'name':'xiaoming','age':18,'hobby':'girl','hometown':'guangzhou'} zip(l1,tu1,dic) #迭代器(生成器對象) print(zip(l1,tu1,dic)) #迭代器地址:<zip object at 0x000002C878E6A6C8> for i in zip(l1,tu1,dic): print(i) #循環輸出迭代器的內容: (1, 'a', 'name') (2, 'b', 'age') (3, 'c', 'hobby')
5-七、filter:過濾,經過你的函數,過濾一個可迭代對象(相似於生成器表達式的篩選模式) 生成一個迭代器。 *****
l1 = [1,2,3,4,5,6] def fun(x): return x % 2 == 0 #篩選出偶數 g = filter(fun,l1) # filter(fun,l1)生成的是一個迭代器 print(g) for i in g: print(i) 結果: 2 4 6 l2 = [(2,1),(3,4),(4,5)] def fun2(x): return x[1] % 2 == 1 #篩選出第二個元素爲奇數的元組 g = filter(fun2,l2) for i in g: print(i) 結果: (2, 1) (4, 5)
5-八、map:會根據提供的函數對指定序列作映射。(循環修改並返回) 生成一個迭代器*****
l1 = [1,2,3,4,5,6] def fun(x): return x**2 #返回每一個元素的平方 g = map(fun,l1) for i in g: print(i) 結果:1 4 9 16 25 36
(min max filter返回的都是遍歷的參數,map返回的是return的值)
2、匿名函數:有且只有返回值的函數才能夠用匿名函數進行簡化,一行函數,多與內置函數結合使用。
一、匿名函數表達式:
函數名 = lambda 參數 :返回值
參數能夠有多個,用逗號隔開
匿名函數無論邏輯多複雜,只能寫一行,且邏輯執行結束後的內容就是返回值
返回值和正常的函數同樣能夠是任意數據類型
二、
def func2(x):
return x**2
上面函數就有且只有返回值,因此能夠寫成匿名函數:
func2 = lambda x: x*2 #func2是函數名,func2(參數)纔是調用
print(func2(6)) #調用並打印結果
三、匿名函數 不單獨使用,多與內置函數結合。
l2 = [(1,1000),(2,18),(4,250),(3,500)]
print(sorted(l2,key=lambda x:x[1]))
四、例子
1,利用內置函數匿名函數將dic按照值進行排序。 dic={'k1':10,'k2':100,'k3':30} print(sorted(dic.items(),key=lambda x:x[1])) 2,利用內置函數匿名函數 計算列表的每一個數的2倍。 l1 = [1,5,7,4,8] print(list(map(lambda x:x*2,l1))) 3,利用內置函數匿名函數,將值大於10的留下來 l2 = [5,8,11,9,15] print(list(filter(lambda x:x > 10,l2))) 4,匿名函數可與三元運算結合 func = lambda x:x if x > 2 else x * 2
3、遞歸函數(本身調用本身)
一、人理解函數,神理解遞歸。
def func():
print(666)
func()
func()
結果:輸出一段時間後會報錯,由於
默認遞歸深度爲998次,(官方給出的默認深度是1000,但實際上只有998次左右)
超過了就會報錯
二、引用模塊修改遞歸次數
import sys
sys.setrecursionlimit(100000)
n = 1
def func(x):
print(x)
x += 1
func(x)
func(n)
結果:3222
雖然設置了100000次,可是電腦跑不起呀,
通常電腦就跑3222次左右,這個會根據電腦性能而定。
三、
小明比小白大兩歲 n = 4
小白比小狗大兩歲 n= 3
小狗比小紅大兩歲 n = 2
小紅24歲 n = 1
小明多少歲?
def age(n):
if n == 1:
return 24
else:
return age(n-1) + 2
age(4) # 30
詳解:
age(4)傳進參數n=4:
def age(4):
if n == 1:
return 24
else:
return age(4-1) + 2
結果:age(3)+2
def age(3):
if n == 1:
return 24
else:
return age(3-1) + 2
結果:age(2)+2+2
def age(2):
if n == 1:
return 24
else:
return age(2-1) + 2
結果:age(1)+2+2+2
def age(1):
if n == 1:
return 24
else:
return age(n-1) + 2
結果:age(1)+2+2+2 ---> 24+2+2+2--->30