溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

三元運(yùn)算式、lambda表達(dá)式、內(nèi)置函數(shù)map、reduce、filter以及yield生成器

發(fā)布時(shí)間:2020-06-18 21:40:50 來(lái)源:網(wǎng)絡(luò) 閱讀:2263 作者:027ryan 欄目:開(kāi)發(fā)技術(shù)

一、三元運(yùn)算(式)

對(duì)于一般簡(jiǎn)單的if else條件判斷句可以用三元運(yùn)算來(lái)表示

具體模式為:

if condition:
  expr1
else:
  expr2
等價(jià)于:
expr1 if condition else expr2


解釋:如果if condition條件成立就執(zhí)行expr1表達(dá)式,否則就執(zhí)行else expr2表達(dá)式

示例①

>>> if 2 == 2:
...    name = 'cool'
... else:
...    name ='hot'
... 
>>> name = 'cool' if 2==2 else 'hot'
>>> print name
cool
>>>



二、lambda表達(dá)式:

對(duì)于簡(jiǎn)單的函數(shù)可以用另外一種方式來(lái)代替,即lambda

比如有如下函數(shù):

>>> def fun(arg):
...      return arg + arg
... 
>>> 
>>> result = fun(100) 
>>> print result
200
>>>

定義一個(gè)變量f_lambda,將lambda arg:arg+1賦予f_lambda

>>> f_lambda = lambda arg:arg +1
>>> result = f_lambda(111)
>>> print result
112
>>>

也可以用其他表達(dá)式:

>>> test = lambda a:a**2
>>> test_result = test(3)
>>> print test_result
9
>>>

從上面的例子可以看出,lambda后面表達(dá)式可以隨意定義,只要符合Python的語(yǔ)法要求。

lambda表達(dá)式:

①用于處理簡(jiǎn)單邏輯

②會(huì)自動(dòng)返回?cái)?shù)據(jù)


三、內(nèi)置函數(shù)map


map的作用是對(duì)序列中每個(gè)元素進(jìn)行操作,然后輸出新的序列


三元運(yùn)算式、lambda表達(dá)式、內(nèi)置函數(shù)map、reduce、filter以及yield生成器


>>> num1 = [10,9,8,7,6]
>>> num2 = map(lambda a:a**2,num1)
>>> print num2
[100, 81, 64, 49, 36]
>>> 
>>> num3 = [1,2,3,4,5]
>>> num4 = map(lambda a,b:a -b,num1,num3)
>>> print num4
[9, 7, 5, 3, 1]
>>>

或者

>>> num = [12,33,55,85]
>>> def func(arg):
...     return arg + 10
... 
>>> new_num = map(func,num)
>>> print new_num
[22, 43, 65, 95]
>>>


對(duì)于上述例子實(shí)質(zhì)解釋如下:

>>> new_num = []
>>> for item in num:
...     new_item = item + 10
...     new_num.append(new_item)
... 
>>> 
>>> print new_num
[22, 43, 65, 95]


四、內(nèi)置函數(shù)filter

filter的作用的是將序列中滿足條件的過(guò)濾出來(lái)然后形成新的序列

三元運(yùn)算式、lambda表達(dá)式、內(nèi)置函數(shù)map、reduce、filter以及yield生成器

>>> num1 = [10,9,8,7,6]
>>> tmp = filter(lambda arg:arg >5,num1) 
>>> print tmp
[10, 9, 8, 7, 6]
>>>

或者

>>> tmp2 = filter(lambda n:n >5,num1)     
>>> print tmp2
[10, 9, 8, 7, 6]
>>>

或者

#!/usr/bin/env python
# -*- coding:utf8 -*-
num = [11,22,0,33]
print filter(None,num)
[root@Python day004]# python lam.py 
[11, 22, 33]
[root@Python day004]# 
[root@Python day004]# cat  lam.py    
#!/usr/bin/env python
# -*- coding:utf8 -*-
num = [11,22,0,33,""]
print filter(None,num)
[root@Python day004]# python lam.py  
[11, 22, 33]
[root@Python day004]# cat  lam.py   
#!/usr/bin/env python
# -*- coding:utf8 -*-
num = [11,22,0,33,"",False]
print filter(None,num)
[root@Python day004]# python lam.py  
[11, 22, 33]

小結(jié):從上可以發(fā)現(xiàn),默認(rèn)情況下,當(dāng)用filter進(jìn)行處理數(shù)據(jù)時(shí),filter會(huì)將布爾值為真的輸出(一般將布爾值為True的返回到新列表中,反之不會(huì)返回到新列表中),為假的忽略掉;當(dāng)然filter中也可以傳入函數(shù),如上例中的lambda語(yǔ)句;


五、內(nèi)置函數(shù)reduce

reduce的作用是對(duì)序列內(nèi)的所有元素進(jìn)行操作

三元運(yùn)算式、lambda表達(dá)式、內(nèi)置函數(shù)map、reduce、filter以及yield生成器



>>> num1 = [10,9,8,7,6]                  
>>> result =reduce(lambda arg1,arg2:arg1+arg2,num1)
>>> print result
40
>>> num5 = [1,2,3,4,5,6]  
>>> sum = reduce(lambda a,b:a+b,num5)
>>> print sum
21
>>>

# reduce的第一個(gè)參數(shù),函數(shù)必須要有兩個(gè)參數(shù)

# reduce的第二個(gè)參數(shù),要循環(huán)的序列

# reduce的第三個(gè)參數(shù),初始值


六、yield生成器(它可以記住上一次的操作,下次再執(zhí)行時(shí),繼續(xù)執(zhí)行)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
def func():
    pass
    return 1
    return 2
    return 3
result = func()
print result


執(zhí)行以上代碼,輸出結(jié)果:

D:\Python27\python.exe C:/Users/ryan/PycharmProjects/day04/yield.py
1
Process finished with exit code 0

發(fā)現(xiàn)函數(shù)返回的只有1,后面的2、3都沒(méi)有返回,這里說(shuō)明return語(yǔ)句結(jié)束后,代表函數(shù)體生命周期結(jié)束,接下來(lái)講return替換成yield

#!/usr/bin/env python
# -*- coding:utf-8 -*-
def func():
    pass
    yield 1
    yield 2
    yield 3
for i in func():
    print i



輸出結(jié)果:

1
2
3


1、對(duì)比range和xrange的區(qū)別

有如下例子:

>>> print range(8)
[0, 1, 2, 3, 4, 5, 6, 7]
>>> print xrange(8)
xrange(8)
>>>

從上面可以發(fā)現(xiàn),range和xrange的區(qū)別是:

range可以生成一個(gè)列表,即在內(nèi)存中創(chuàng)建指定的數(shù)字,而xrange則不會(huì),接著往下看:

>>> for n in xrange(8):
...     print n
... 
0
1
2
3
4
5
6
7
>>>

 

xrange只有在進(jìn)行循環(huán)的時(shí)候才會(huì)創(chuàng)建數(shù)字,即在迭代的時(shí)候才會(huì)去創(chuàng)建;

>>> def nrange(num):
...     temp = -1   
...     while True:
...          temp = temp +1
...          if temp >= num:
...              return
...          else:
...              yield temp
... 
>>> nrange(10)
<generator object nrange at 0x7fe42d0bd820>
>>>


2、文件操作的read和xreadlines的區(qū)別

①read會(huì)讀取所有內(nèi)容到內(nèi)存中

②xreadlines則只會(huì)在循環(huán)迭代時(shí)才獲取數(shù)據(jù)

def NReadlines():
    with open('log','r') as f:
        while True:
            line = f.next()
            if line:
                yield line
            else:
                return
for i in NReadlines():
    print i

注:基于next自定義生成器NReadlines

def NReadlines():
    with open('log','r') as f:
        seek = 0
        while True:
            f.seek(seek)
            data = f.readline()
            if data:
                seek = f.tell()
                yield data
            else:
                return
for item in NReadlines():
    print item


基于seek和tell自定義生成器NReadlines


七、裝飾器

裝飾器是函數(shù),只不過(guò)該函數(shù)可以具有特殊的含義,裝飾器用來(lái)裝飾函數(shù)或者類,使用裝飾器可以在函數(shù)執(zhí)行前和執(zhí)行后添加相應(yīng)的操作

def wrapper(func):
    def result():
        print 'before'
        func()
        print 'after'
    return result
 
@wrapper
def foo():
    print 'foo'


import functools
def wrapper(func):
    @functools.wraps(func)
    def wrapper():
        print 'before'
        func()
        print 'after'
    return wrapper
@wrapper
def foo():
    print 'foo'


示例代碼:

#!/usr/bin/env python
#coding:utf-8
 
def Before(request,kargs):
    print 'before'
     
def After(request,kargs):
    print 'after'
 
 
def Filter(before_func,after_func):
    def outer(main_func):
        def wrapper(request,kargs):
             
            before_result = before_func(request,kargs)
            if(before_result != None):
                return before_result;
             
            main_result = main_func(request,kargs)
            if(main_result != None):
                return main_result;
             
            after_result = after_func(request,kargs)
            if(after_result != None):
                return after_result;
             
        return wrapper
    return outer
     
@Filter(Before, After)
def Index(request,kargs):
    print 'index'
     
     
if __name__ == '__main__':
    Index(1,2)






向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI