python以內置函數(二)與匿名函數、遞歸函數初識

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

相關文章
相關標籤/搜索