python一些經常使用的內置函數及做用請見如下代碼:python
lis=[1,4,3,8,2,9,10,0] print(all(lis))#判斷可迭代對象裏頭是否存在不爲真的元素,若是存在不爲真的元素則返回False,不然True print(any(lis))#判斷可迭代對象裏頭是否存在爲真的元素,若是存在爲真的元素則返回True,不然False print(bin(10).replace('0b',''))#10進制轉換爲二進制 print(bool({}))#把一個對象轉換成布爾類型,非空即真,非0即真 from hashlib import md5 m=md5() print(dir(m))#dir列出m的方法 eval('print("haha")') exec('print("haha")') b=exec('[1,2,3]')#exec執行代碼時,不返回值,這裏b是none 能夠執行多行代碼,且無返回值 c=eval('[1,2,3]')#eval執行代碼時,返回值,多用於表達式,這裏賦值成功 只能夠執行一行代碼,有返回值 print(b)#會輸出None print(c)#會輸出[1,2,3] exec("def hs():print(123)")#可執行復雜代碼,這裏正常餘興 eval("def hs():print(123)")#不能夠執行復雜代碼,會報錯 print(round(66.66666,3))#round(float,int)保留float小數的int位 print(sum([1,6,9]))#求和 print(min([1,6,9]))#取最小值 print(max([1,6,9]))#取最大值 print(hex(34523).replace('0x',''))#10進制轉16進制 print(hash('asd'))#將一個字符串hash成數字 print(globals())#返回程序內全部的變量,返回的是一個字典 print(locals())#返回局部變量
1.eval和exec的區別: git
最大的一個區別是eval會返回代碼運行的值,相似於函數自帶了一個return功能,可是exec不會,它只管執行代碼,等因而函數沒有return值,默認返回了None;還有一個區別是exec能夠執行復雜的代碼,相似於命名函數,定義對象等,但eval不行,eval只能執行單行代碼。數組
2.enumerate:app
將索引和元素一塊兒輸出,可用於一些和用戶交互的地方,或者用於格式打印輸出到控制檯。函數
lis = ["a","b","c"] for index,value in enumerate(lis): print(index,value) 0 a 1 b 2 c
3.filter和map的區別優化
map這個函數會改變原來的list的元素,這裏只的改變有:修改、刪除,而filter這個函數只能刪除、不能修改元素,還有一點須要注意,這兩個函數執行後都是可迭代對象,須要用lsit強制轉換才能夠獲得list數據:spa
lis=['123',456,{"age":18},0,[],(1,2,3),(),{},'False'] def my_char(var): return var res=filter(my_char,lis)#filter(fun,list),list只要是可迭代類型便可,循環list裏的值,調用fun函數,當fun函數返回爲真時,保留list的元素,不然,刪掉 print(list(res))#res獲得的是一個對象,須要list方法接收值 def maps(var): return str(var)+'值都變咯' res1=map(maps,lis)#map(fun,list),list只要是可迭代類型便可,循環list裏的值,調用fun函數,fun函數返回值做爲新值保存到rese1對象裏 print(list(res1))
4.sort內置函數詳解設計
題:給定一個字符串,找出包含數字和字母的最長字段,並輸出該字段及其長度,如:abc123!#abc*^123%$xyz789!~12as@!~1a,那麼最長的字段就是:abc123和xyz789,長度爲6。code
解題思路:對象
1.找出文件中的特殊字符 -> 2.將特殊文字都替換成同一個字符,好比',' -> 3.將字符串按該文字分割成一個數組 -> 4.找出列表中既包含數字又包含字母最長的字符 -> 5.輸出打印
分割字符串有兩種方式,咱們先按剛纔的解題思路來作一下,找最長字符串方法爲設計兩個list,一個存字符串,一個存其長度,求出最長長度,循環打印字符,條件爲字符長度等於最長長度,代碼以下:
import string str='#g5$@sdfg45$%dgf&sdfg46&hs[][,.564~kj!k23h~jk!nj1' t=string.punctuation for i in t: str=str.replace(i,',') lis=str.split(',') new_lis=[] lens=[] for i in lis: if not i.isdigit() and not i.isalpha() and len(i)!=0: new_lis.append(i) lens.append(len(i)) for i in new_lis: lens.sort() if len(i)==lens[-1]: print('符合題意的字段有:%s,長度爲:%s'%(i,len(i)))
下面對其進行優化兩點:1.字符串切割用正則 2.找最長字符的方式
這裏須要介紹下sort、sorted函數:
python3 sorted取消了對cmp的支持,格式:sorted(iterable,key=None,reverse=False),key接受一個函數,這個函數只接受一個元素,默認爲None;reverse是一個布爾值。若是設置爲True,列表元素將被倒序排列,默認爲False。
key的做用原理:key指定一個接收一個參數的函數,這個函數用於從每一個元素中提取一個用於比較的關鍵字。默認值爲None ,下面看幾個例題:
#1.按照年齡來排序 students = [('牛牛', 'A', 15), ('道長', 'B', 12), ('大師兄','B', 10)] students=sorted(students,key=lambda s:s[2]) print(students) #結果:[('大師兄', 'B', 10), ('道長', 'B', 12), ('牛牛', 'A', 15)] #2.一個字符串排序,排序規則:小寫<大寫<奇數<偶數, # 原理:先比較元組的第一個值,FALSE<TRUE,若是相等就比較元組的下一個值,以此類推。 # 先看一下Boolean value 的排序: # print(sorted([True,Flase]))===>結果[False,True] # Boolean 的排序會將 False 排在前,True排在後 . s='9a13C85c7B24A6b' #正確的順序應該爲:abcABC135792468 lis=sorted(s,key=lambda x:(x.isdigit(),x.isdigit() and int(x)%2==0,x.isalpha() and x.isupper(),x.isalpha() and x.lower())) print(''.join(lis)) # 1.x.isdigit()的做用是把數字放在前邊,字母放在後邊. # 2.x.isdigit() and int(x) % 2 == 0的做用是保證奇數在前,偶數在後。 # 3.x.isupper()的做用是在前面基礎上,保證字母小寫在前大寫在後. # 4.最後的x表示在前面基礎上,對全部類別數字或字母排序。
根據上面的sort函數的排序原理,優化代碼以下:
import string,re str='#sdfg45$@sdfg45$%dgf&sdfg46&hs[][,.564~kj!k122h~j`k!n1j' lis=re.split(r'\W',str) dic={} for i in lis: if not i.isdigit() and not i.isalpha() and len(i) != 0: dic[i]=len(i) new_lis=sorted(dic,key=lambda s:s[1],reverse=True) print(new_lis) for i in new_lis: if len(i)==len(new_lis[0]): print('最長的字符串有:%s'%i)