Python3 從零單排5_內置函數

  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)
相關文章
相關標籤/搜索