首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python的这些高阶用法,你知道多少?

map的用法

deffn(x):

returnx*2

L1 = [1,2,3,4,5,6]

L2 = list(map(fn,L1))

L2

[2,4,6,8,10,12]

通过上面的运行,可以知道map就是把一个数组内所有的元素都执行map加入的方法。

用法如下 map(方法,数组)

reduce的用法

先看例子

fromfunctoolsimportreduce

defadd(x,y):

returnx + y

L1 = [1,2,3,4,5,6]

L2 = reduce(add,L1)

L2

通过上面的例子,直观的来看,我们可以发现reduce和map方法有一些不一样。

map是python自带的函数,而reduce需要引入functools

map 返回的是一个map对象,而reduce是返回的一个数字

map函数需要一个参数,而reduce的参数需要两个。

map是对一个集合中的每个元素执行指定的方法。而reduce则是依次对集合的元素调用指定的方法。先把前两个参数执行reduce以后形成的返回之作为第一个参数,再和第三个参数形成返回值,依次执行。

filter函数

filter则是对集合的每个元素执行一次判断,能让filter指定的函数返回真值则返回,否则则不出现在返回集合中。

deffn(x):

returnx%2==

L1 = [1,2,3,4,5,6,7,8]

F1 = filter(fn,L1)

print(F1)

print(list(F1))

sorted

顾名思义排序。用法如下

sorted(集合,key=排序的算法,reverse=True) #reverse=True如果添加反向排序

返回函数(闭包)

deffn(x):

defadd(y):

returnx + y

returnadd

a = fn(5)

a(6)

需要注意的是闭包的代码是到最后执行a(6)的时候,才调用了函数里面的执行。举个例子

deffn():

rs = []

foriinrange(4):

defsub():

returni

rs.append(sub)

returnrs

a,b,c,d = fn()

print(a())

print(b())

print(c())

print(d())

从上面的例子中,我们如果没有理解到返回的函数是在最后加上括号的时候才调用,可能以为返回之是0,1,2,3

但是实际上def sub()里面的内容一直都没执行,但是外面的i 一直到了3.当调用a()的时候。开始执行。所以如上面的返回结果。

defefn():

i =1

defsub():

i = i +1

returni

returnsub

t = efn()

t()

---------------------------------------------------------------------------

UnboundLocalError Traceback (most recentcalllast)

in()

7

8t = efn()

----> 9 t()

insub()

2i =1

3defsub():

----> 4 i = i + 1

5returni

6returnsub

UnboundLocalError:localvariable'i'referencedbeforeassignment

上面的报错,需要引入关键词nonlocal如下:

defefn():

i =1

defsub():

#关键字

nonlocali

i = i +1

returni

returnsub

t = efn()

print(t())

print(t())

匿名函数

list(map(lambdax: x * x, [1,2,3,4,5,6,7,8,9]))

[1,4,9,16,25,36,49,64,81]

通过上面的式子我们简单可以看到lambda函数或者匿名函数的意义

f = lambda x,y:x + y

f(5,6)

我们大概可以看到lambda函数的:前面相当于参数,后面的是返回数值

装饰器

我的理解类似java中的AOP或者.net中的面向切片编程

'''比如调用一个方法的时候,我们期望另外一个方法也被调用。比如我们执行一个操作,期望不改变任何代码,就可以打印出来这个方法的日志'''

deflog(func):

defwraper(*args,**kw):

print(func.__name__+' is call to log')

returnfunc(*args,**kw)

returnwraper

@log

deffn():

print('this is fn')

fn()

fniscalltolog

thisisfn

''' 如果我们希望往log里面传递参数'''

deflog(text):

defdecorator(func):

defwraper(*args,**kw):

print(func.__name__+' is call to log '+ text)

returnfunc(*args,**kw)

returnwraper

returndecorator

@log('hello')

deffn():

print('fn')

fn()

fn.__name__

fniscalltologhello

fn

'wraper'

fn的名称发生了改变,要保持不变,需要@functools.wraps(func)

''' 如果我们希望往log里面传递参数'''

importfunctools

deflog(text):

defdecorator(func):

@functools.wraps(func)

defwraper(*args,**kw):

print(func.__name__+' is call to log '+ text)

returnfunc(*args,**kw)

returnwraper

returndecorator

@log('hello')

deffn():

print('fn')

fn()

fn.__name__

fniscalltologhello

fn

'fn'

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200105A0BNPP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券