1. 程式人生 > >python之路 ---列表/字典生成式及匿名函式

python之路 ---列表/字典生成式及匿名函式

列表解析:

l = ['aaa','bbb','ccc']    #將l內的元素全部變為大寫...
L = []
for i in l:
    L.append(i.upper())
print(L) 
#使用列表解析:
L = [i.upper() for i in l]
print(L)
#for之後可以跟個if判斷語句(但不能有else)
l = ['aaa','bbb','ccc']
L = [i.upper() for i in l if i.endswith('c')]
print(L)

字典生成式: 

l1 = ['name','age','sex']
l2 = ['bob',23,'men']
d = {key:l2[i] for i,key in enumerate(l1)}
print(d)
--->
#{'name': 'bob', 'age': 23, 'sex': 'men'}
d = {key for i,key in enumerate(l1)}
-->生成的是集合

匿名函式: 

def 函式名() --->建立的是有名函式,使函式名指向函式體的記憶體地址,因此可以重複呼叫,而匿名函式,顧名思義函式體是沒有與變數名存在繫結關係的

注:1.給匿名函式賦名是沒有意義的

       2.匿名函式的引數規則與作用域與有名函式一致

       3.匿名函式的函式體應該是一個表示式,並且該表示式必須有返回值

匿名函式通常與內建函式結合使用:

1.與max():取出一個可迭代物件的最大值

d = {'bob':32,
     'tom':23,
     'lucy':30,}
print(max(d)) 
#---->max首先實現一個類似for迴圈的功能(迭代器協議),遍歷字典的key,按照字串的原則的比較大小
def func(key):
    return d[key]
print(max(d,key=func))
#--->實現原理是,max對第一引數(可迭代物件)進行for迴圈,將得到的值作為引數傳給函式func,然後以函式func的返回值作為比較依據,
#而func在這裡僅僅是提供給內建函式max()使用,所以完全可以將其變成匿名函式
print(max(d,key=lambda x:d[x]))

2.min()的用法與max()類似:取出一個可迭代物件的最小值

3.map():對映:將後面的可迭代物件按照前面的規則對映成新的物件---->在python2中得到的是一個列表,3中則是一個迭代器

#python2
> names = ('1','2','3','4')
>>> res=(map(lambda x:x+'a',names))
>>> print res
['1a', '2a', '3a', '4a']
#python3
names = ('1','2','3','4')
res=(map(lambda x:x+'a',names))
print(res)
print(iter(res) is res)
--->
<map object at 0x032F3290>
True

4:reduce():將多值合併成一個列表  

from functools import reduce
res = reduce(lambda x,y:x+y,range(100))
print(res)
--->
4950

z = ['love','your']
res1 = reduce(lambda x,y:x+' '+y,z,'i')
print(res1)
--->
i love your
#第三個引數為初始值,如果不指定,則在第二個引數中拿出一個作為初始值

5:filter() ---->過濾出為True的  --->python3中生成的是迭代器

l = [1,2,3,4,5,6,7]
res = filter(lambda x:x>3,l)
print(res)
print(list(res))
--->過濾出大於3的數字
<filter object at 0x02F03210>
[4, 5, 6, 7]


d = {'bob':32,
     'tom':23,
     'lucy':30}
print(list(filter(lambda key:d[key]>30,d)))
--->過濾出大於30歲的人
'b0b'