巨蟒python全棧開發-第13天 內置函數 匿名函數lambda

一.今日內容總覽python

1.內置函數(1):並非每個內置函數都是那麼經常使用算法

上菜:內置函數部分//思惟導圖:https://www.processon.com/view/link/5b4ee15be4b0edb750de96acshell

2.匿名函數編程

3.map\filter\sorted\zipflask

4.eval\exec\compile安全

二.今日內容大綱app

1.內置函數(1)框架

2.匿名函數函數

3.map\filter\sorted\ziptornado

4.eval\exec\compile

三.今日內容詳解

 

1.內置函數(1)

(1)

lst=['今天星期三','明天星期四','立刻星期五']
# 法一
it=lst.__iter__()
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(dir(it))
#法二     #等價寫法
it=iter(lst)          # it = lst.__iter__()
print(next(it))       # it.__next__()
print(next(it))
print(next(it))
print(dir(it))

(2)

#print
print('你好,我叫娃哈哈',end='  ')    #去掉換行
print('你好,我叫周潤發')
#
print('寶浪','女神','日天','MJJ','太白')#這是打印的效果

#寶浪 女神 日天 MJJ 太白
#注意:python裏的self都不用管

print('寶浪','女神','日天','MJJ','太白',sep='_')
# sep=' '默認是空格,咱們能夠進行修改

'''
結果:
你好,我叫娃哈哈  你好,我叫周潤發
寶浪 女神 日天 MJJ 太白
寶浪_女神_日天_MJJ_太白
'''

(3)

hash  #四大不可變數據類型:數字&bool&元組&字符串

數字算出來就是數字自己,其餘的數據算完是一坨很長的數字
print(hash(12344543)) #hash算法,最後算出來的必定是一個數字

len(),出來的是數字就認爲是哈希算法,之後用到哈希,能夠用len()

print(id('呵呵')) #id計算的是內存地址,深淺拷貝中講過,
is 比較的是內存地址
== 比較的是值

(4)
這個直接用import吧,之後碰到再說
# __import__() 動態導入模塊//很容易出錯,很危險
re=__import__(input('請輸入你要導入的模塊:'))
re.search()
(5)
#在黑窗口中看源代碼

#help查看幫助.....高級框架

# print(help(str))
# #尤爲是高級框架的源代碼,好比flask &tornado(1000行)的源代碼
(6)
callable() 能調用
iterable 可迭代
hashable 可哈希

例子:func是不是可調用的,也就是能不能加括號
def func():
    pass
an=18
print(callable(func()))     #不可調用的

print(callable(func))     #可調用的
print(callable(an))       `#不可調用的
可調用 =>  能夠加(),進行調用

(7)

dir 查看數據類型有哪些操做

此類型的數據能夠執行哪些方法(函數)
print(dir('ni hao'))
print(dir([]))

[].count()

(8)

複數=實數(有理數,無理數(無限不循環小數))+虛數 i**2=-1

注意:專業的東西 作專業的事兒!!!!!!
shell就是寫腳本的

手機=>任何位置打電話
MP3=> 耳機+功效

數字類型(int bool float complex)

(9)
bin  #計算二進制 binary
print(bin(5)) #轉化成二進制 0b101 二進制
print(oct(8)) #八進制 #0o10
print(hex(16)) #十六進制 #0x10
'''
二進制(binary)沒有2
八進制(octonary)沒有8
十六進制(hexadecimal)沒有16
'''
def func():
pass
print(func) #內存地址:<function func at 0x000001D8864C1E18>

(10)
必須是可迭代對象
min max sum
print(sum([1,2,3,4,5]))
print(max([1,2,3,4,5]))
print(min([1,2,3,4,5]))

print(divmod(20,3))  #計算商和餘數
#結果(6, 2)

(11)

print(round(2.6))  #整數是奇數=> 正常四捨五入
                    #整數是偶數=>五舍六入
print(round(2.5))
print(round(1.5))
print(round(1.6))


print(pow(4,4))
#4的4次方

(12)

lis=['籃球','足球','摔跤','擠公交']

for el in lis:
    print(el)
#記住這個然哥
for i in range(len(lis)):
    print(i,lis[i])

for i,el in enumerate(lis,1):
    print(i,el)

for i,el in enumerate(lis):
    print(i,el)
enumerate 以元組形式返回!!!索引!!!和!!!元素!!!,咱們進行拆分
enumerate #第二個參數的設置起始位置,注意修改的時候須要減一

(13)

#any all
#all必須全是真,纔是真
print(all([1,3,'哈哈']))      #all 就是and
#any一個是真就是真
print(any([False,1,None]))   #any 就是or

(14)

zip 拉鍊函數

lst1=['趙四','劉能','香秀']
lst2=['劉小光','王小利'] #水桶效應
lst3=['街舞','磕巴','']
z=zip(lst1,lst2,lst3)
print('__iter__'in dir(z))  #判斷是不是可迭代對象
#這個__iter__是否在這拉鍊包起來的
for el in z:
    print(el)

應用場景:衛星數據,橫向時間切割,應用的就是拉鍊

#金融數據的同一時段對比可能會用到

 

2.匿名函數\map\filter\sorted\zip

(1)

def func(a,b):
    return a+b
ret=func(1,3)
print(ret)      #4
print(func)     #<function func at 0x000002252CFD1E18>

(2)

# 匿名函數統一的名字是:<lambda>
fn=lambda a,b:a+b         #定義一個很簡單的函數. 複雜的函數不要用lambda
ret=fn(3,5)
#爲何叫匿名函數?
print(ret)      #結果:8
print(fn)       #<function <lambda> at 0x000001CC501B1E18>//打印出來的fn中名字是lambda,因此是匿名函數
# #變量名:fn

 

(3)

lambda使用場景:配合着sorted,map,filter 一塊兒使用

sorted 排序函數,讓你本身去定義排序的規則
lst=[11,5,36,1,27,58]
s=sorted(lst) #默認從小到大排序
print(s)
lst=['胡一菲','張偉','關穀神奇','曾小賢呂小布','若蘭']
#按照字符串長度排序
def func(s):
    return len(s)  #返回長度
#執行流程:把可迭代對象中的每一項拿出來,做爲參數傳遞給後面key函數,
#函數返回數字,根據數字進行排序
a=sorted(lst,key=func)
print(a)
#傳統寫法:
lst=['胡一菲','張偉','關穀神奇','曾小賢呂小布','若蘭']
def func(s):
    return len(s)  #返回長度
a=sorted(lst,key=func)
print(a)

#lambda寫法:
lst=['胡一菲','張偉','關穀神奇','曾小賢呂小布','若蘭']
s=sorted(lst,key=lambda k:len(k),reverse=False)
print(s)
#注意:這裏的是拿出lst中的每一項對其進行排序

# sorted規則
# sorted(可迭代對象,規則,順序仍是倒敘)
# sorted(iterable,key,reverse)
# 說白了,內部仍是用數字排序的

# sorted中reverse默認是False
lst=['胡一菲','張偉','關穀神奇','曾小賢呂小布','若蘭']
s=sorted(lst,key=lambda k:len(k),reverse=False)
print(s)

 

(4)sorted

lst=[
    {'name':'alex','shenggao':150,'tizhong':'250'},
    {'name':'wusir','shenggao':158,'tizhong':'150'},
    {'name':'taibai','shenggao':177,'tizhong':'130'},
    {'name':'ritian','shenggao':165,'tizhong':'130'},
    {'name':'nvshen','shenggao':160,'tizhong':'120'},
    {'name':'baoyuan','shenggao':183,'tizhong':'190'},
]
# 按照體重進行排序,從大到小
print(sorted(lst,key=lambda dic:dic['tizhong'],reverse=True))
# 按照身高進行排序,從大到小
print(sorted(lst,key=lambda dic:dic['shengao'],reverse=True))

 

(5)filter() 過濾

lst=['張無忌','張翠山','范冰冰','金毛獅王','李冰冰']
# s=filter(lambda x:'張' not in x,lst)     #錯誤寫法
# 過濾掉姓張的人
# 把可迭代對象打開. 把內部元素一個一個的傳遞給前面的函數. 由這個函數決定此項是否保留
s=filter(lambda x: not x.startswith(''),lst)
print('__iter__' in dir(s))     #True
print(s)                         #<filter object at 0x0000016A2BCD74E0>
for i in s:
    print(i)
'''
迭代後的對象是:
范冰冰
金毛獅王
李冰冰
'''

練習:

lst=[
    {'name':'alex','shenggao':150,'tizhong':'250'},
    {'name':'wusir','shenggao':158,'tizhong':'150'},
    {'name':'taibai','shenggao':177,'tizhong':'130'},
    {'name':'ritian','shenggao':165,'tizhong':'130'},
    {'name':'nvshen','shenggao':160,'tizhong':'120'},
    {'name':'baoyuan','shenggao':183,'tizhong':'190'},
]
#過濾掉體重大於180的人,想要的是小於180的人

s=filter(lambda x:int(x['tizhong'])<180,lst)
# for i in s:
#     print(i)
print(list(s))

 

(6)

map() 映射函數

只對數據作處理

lst=['籃球','檯球','唱歌','爬黃山','徒步']
k=map(lambda a:'愛好:'+a ,lst)
print(list(k))

練習:在列表中,求每個數字的平方

lst=[1,5,78,12,16]
print([i**2 for i in lst])

m=map(lambda i:i**2,lst)
print(list(m))

 

3.eval\exec\compile(這一部分還有待總結)

(1)

#注意eval慎用,安全問題
# eval:是把字符串類型的數據做爲代碼進行執行
s='18+2'
ret=eval(s)   #執行字符串類型的代碼
print(ret)      #20

#計算器新寫法
code=input('請輸入你要執行的代碼')
ret=eval(code)
print(ret)

s="{'name':alex,'age':18,'isMan':False}" #字符串
# # 把字符串類型的代碼還原回字典,列表,元組
ret=eval(s)  #側重點是有返回值
print(ret)
print(type(ret))

(2)

# exec()  execute執行字符串類型的代碼, 不能太長. 不能太亂
code = input("請輸入你要執行的代碼")
a=exec(code) # 沒有返回值. 想要返回值用eval
print(a)   # pycharm報錯不必定準

(3)

# compile() 編譯:把你要執行的代碼先預編譯,經過exec和eval能夠執行咱們的代碼
code='''
for i in range(10):
    if i %2==0:
        print(i)
'''
c=compile(code,"",'exec')  #預加載代碼
exec(c)  #運行代碼

#應用:可使用compile寫一個編程大賽,是大賽寫的程序,在相同條件下運行
#用機器,動態運行

 

四.做業

4,用map來處理字符串列表,把列表中全部人都變成sb,比方alex_sb
name=[‘oldboy’,'alex','wusir']
name=['oldboy','alex','wusir']
s=map(lambda x:x+'sb', name)
# print(s)
print(list(s))
5,用map來處理下述l,而後用list獲得一個新的列表,列表中每一個人的名字都是sb結尾
l=[{'name':'alex'},{'name':'y'}]
l=[{'name':'alex'},{'name':'y'}]
s=map(lambda x:x['name']+'sb',l)
print(list(s))
l=[{'name':'alex'},{'name':'y'}]
a = list(map(lambda dic:{'name':dic['name'] + 'sb'},l))
print(a)
6,用filter來處理,獲得股票價格大於20的股票名字
shares={
'IBM':36.6,
'Lenovo':23.2,
'oldboy':21.2,
'ocean':10.2,
}
shares={
       'IBM':36.6,
       'Lenovo':23.2,
      'oldboy':21.2,
    'ocean':10.2,
    }
s=filter(lambda x:shares[x]>20,shares)
print(list(s))
7,有下面字典,獲得購買每隻股票的總價格,並放在一個迭代器中。
結果:list一下[9110.0, 27161.0,......]
portfolio=[
{'name':'IBM','shares':100,'price':91.1},
{'name':'AAPL','shares':50,'price':543.22},
{'name':'FB','shares':200,'price':21.09},
{'name':'HPQ','shares':35,'price':31.75},
{'name':'YHOO','shares':45,'price':16.35},
{'name':'ACME','shares':75,'price':115.65}]
portfolio=[
    {'name':'IBM','shares':100,'price':91.1},
    {'name':'AAPL','shares':50,'price':543.22},
    {'name':'FB','shares':200,'price':21.09},
    {'name':'HPQ','shares':35,'price':31.75},
    {'name':'YHOO','shares':45,'price':16.35},
    {'name':'ACME','shares':75,'price':115.65}]
s=map(lambda x:x['shares']*x['price'],portfolio)

print(list(s))
# l=[]
# for i in s:
# # print(round(i,1))
# l.append(round(i,1))
# print(l)
8,仍是上題的字典,用filter過濾出單價大於100的股票。
portfolio=[{'name':'IBM','shares':100,'price':91.1},
    {'name':'AAPL','shares':50,'price':543.22},
    {'name':'FB','shares':200,'price':21.09},
    {'name':'HPQ','shares':35,'price':31.75},
    {'name':'YHOO','shares':45,'price':16.35},
    {'name':'ACME','shares':75,'price':115.65}]
s=filter(lambda x:x['price']>100,portfolio)
print(list(s))
9,有下列三種數據類型,
l1 = [1,2,3,4,5,6]
l2 = ['oldboy','alex','wusir','太白','日天']
tu = ('**','***','****','*******')
寫代碼,最終獲得的是(每一個元祖第一個元素>2,第三個*至少是4個)
[(3, 'wusir', '****'), (4, '太白', '*******')]這樣的數據。
l1 = [1,2,3,4,5,6]
l2 = ['oldboy','alex','wusir','太白','日天']
tu = ('**','***','****','*******')
lis=zip(l1,l2,tu)
s=filter(lambda x:x[0]>2 and len(x[2])>=4,lis)      #注意條件*至少是4個
print(list(s))
10,有以下數據類型:
l1 = [ {'sales_volumn': 0},
{'sales_volumn': 108},
{'sales_volumn': 337},
{'sales_volumn': 475},
{'sales_volumn': 396},
{'sales_volumn': 172},
{'sales_volumn': 9},
{'sales_volumn': 58},
{'sales_volumn': 272},
{'sales_volumn': 456},
{'sales_volumn': 440},
{'sales_volumn': 239}]
將l1按照列表中的每一個字典的values大小進行排序,造成一個新的列表。
l1 = [ {'sales_volumn': 0},
       {'sales_volumn': 108},
       {'sales_volumn': 337},
       {'sales_volumn': 475},
       {'sales_volumn': 396},
       {'sales_volumn': 172},
       {'sales_volumn': 9},
       {'sales_volumn': 58},
       {'sales_volumn': 272},
       {'sales_volumn': 456},
       {'sales_volumn': 440},
       {'sales_volumn': 239}]

s=sorted(l1,key=lambda x:x['sales_volumn'],reverse=False )        #從小到大
s=sorted(l1,key=lambda x:x['sales_volumn'],reverse=True )            #從大到小
print(s)
相關文章
相關標籤/搜索