16

python的一些高阶用法

 4 years ago
source link: http://www.cnblogs.com/bbird/p/12150771.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

map的用法

def fn(x):
    return x*2
L1 = [1,2,3,4,5,6]
L2 = list(map(fn,L1))
L2
[2, 4, 6, 8, 10, 12]

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

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

reduce的用法

先看例子

from functools import reduce
def add(x,y):
    return x + y
L1 = [1,2,3,4,5,6]

L2 = reduce(add,L1)
L2

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

  1. map是python自带的函数,而reduce需要引入functools
  2. map 返回的是一个map对象,而reduce是返回的一个数字
  3. map函数需要一个参数,而reduce的参数需要两个。

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

filter函数

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

def fn(x):
    return x%2 ==0
L1 = [1,2,3,4,5,6,7,8]
F1 = filter(fn,L1)
print(F1)
print(list(F1))
<filter object at 0x7f1d38369358>
[2, 4, 6, 8]

sorted

顾名思义排序。用法如下

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

返回函数(闭包)

def fn(x):
    def add(y):
        return x + y
    return add
a = fn(5)
a(6)

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

def fn():
    rs = []
    for i in range(4):
        def sub():
            return i
        rs.append(sub)
    return rs
a,b,c,d = fn()

print(a())
print(b())
print(c())
print(d())

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

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

def efn():
    i = 1
    def sub():
        i = i + 1
        return i
    return sub

t = efn()
t()
---------------------------------------------------------------------------

UnboundLocalError                         Traceback (most recent call last)

<ipython-input-15-7574f0a729df> in <module>()
      7 
      8 t = efn()
----> 9 t()


<ipython-input-15-7574f0a729df> in sub()
      2     i = 1
      3     def sub():
----> 4         i = i + 1
      5         return i
      6     return sub


UnboundLocalError: local variable 'i' referenced before assignment

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

def efn():
    i = 1
    def sub():
        #关键字
        nonlocal i
        i = i + 1
        return i
    return sub

t = efn()
print(t())
print(t())

匿名函数

list(map(lambda x: 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中的面向切片编程

'''比如调用一个方法的时候,我们期望另外一个方法也被调用。比如我们执行一个操作,期望不改变任何代码,就可以打印出来这个方法的日志'''
def log(func):
    def wraper(*args,**kw):
        print(func.__name__+' is call to log')
        return func(*args,**kw)
    return wraper

@log
def fn():
    print('this is fn')
    
fn()
fn is call to log
this is fn
''' 如果我们希望往log里面传递参数'''
def log(text):
    def decorator(func):
        def wraper(*args,**kw):
            print(func.__name__+' is call to log ' + text)
            return func(*args,**kw)
        return wraper
    return decorator
@log('hello')
def fn():
    print('fn')
fn()
fn.__name__
fn is call to log hello
fn





'wraper'

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

''' 如果我们希望往log里面传递参数'''
import functools
def log(text):
    def decorator(func):
        @functools.wraps(func)
        def wraper(*args,**kw):
            print(func.__name__+' is call to log ' + text)
            return func(*args,**kw)
        return wraper
    return decorator
@log('hello')
def fn():
    print('fn')
fn()
fn.__name__
fn is call to log hello
fn





'fn'

以上的内容参考学习 廖学峰的学习网站


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK