码迷,mamicode.com
首页 > 编程语言 > 详细

[Python笔记]Python学习笔记三

时间:2017-03-25 00:10:58      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:cto   map   nbsp   begin   方法   with   class   cal   port   

Python高阶函数

filter() 用于过滤序列

第一个参数接收一个函数,根据返回值来决定是否保留, True则留下,False则丢弃

def is_odd(n):
    return n%2 == 1

filter( is_odd, range(1,16) )

def not_empty(s):
    return s and s.strip()

filter( not_empty, [ A,  , B , None,    ])

 

内置sorted()函数用于列表排序

 

 

返回函数

将函数作为返回值, 这就涉及到"闭包"

返回函数不要引用任何循环变量,或者后续可能会发生变化的变量。

记住经典的循环问题,最后得到的数都是一样。

 

匿名函数:lambda表达式

匿名函数只能有一个表达式,不用写return

map(lambda n: n*n, range(1,11))
# 匿名函数的语法就是 lambda关键字后面跟上函数参数,再加冒号 : 没有return

匿名函数也可以作为函数的返回值使用

 

装饰器

在Python中,任何事物都是对象。 函数也是一个对象,函数对象有 __name__ 属性

def now():
    print 2016-03-23

f = now

now.__name__ # ‘now‘
f.__name__ # ‘now‘

在代码运行期间动态添加功能的方式就叫做 "装饰器Decorator" 本质上就是一个返回函数的高阶函数。

import functools
#
一个最简单的无参数的装饰器 # 定义一个能打印日志的函数作为装饰器 # 装饰器的本质就是返回一个函数 def log(func):
@functools.wraps(func)
def wrapper(*args, **kw): print call %s():%func.__name___ return func(*args, **kw) return wrapper # 使用装饰器的语法就是使用@符号将其放置在其他函数之上 @log #等价于 now = log(now) def now(): print 2016-03-23 now() # 一个需要传入参数的装饰器 def log(text): def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw): print %s %s()%(text, func.__name__) return func(*args, **kw) return wrapper return decorator @log(execute) # 等价于 log(‘execute‘)(now) def now(): print 2016-03-23 now()

为了不把原始函数的__name__属性进行修改,需要使用内置的 functools.wraps装饰器来保证属性不被修改。

#!/usr/bin/env python
# Python装饰器小练习
# 写出一个@log的装饰器,使得它既支持无参数,也支持带参数
import functools
import time

def log(obj):
    if isinstance(obj, (str,int,float,bool)):
        param = obj
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args, **kw):
                print call %s() begin with param %s:%(func.__name__, param)
                res = func(*args, **kw)
                print call %s() end:%func.__name__
                return res
            return wrapper
        return decorator
    else:
        @functools.wraps(obj)
        def wrapper(*args, **kw):
            print call %s() begin:%obj.__name__
            res = obj(*args, **kw)
            print call %s() end%obj.__name__
            return res
        return wrapper


# 写出一个装饰器用于在函数调用前后分别打印出‘begin call‘和‘begin end‘日志
import functools
import time

def showFunName(func):
    @functools.wraps(func)
    def wrapper(*args,**kw):
        print begin call
        res = func(*args, **kw)
        print begin end
        return res
    return wrapper

@showFunName
def myFunc():
    print executing...

myFunc()

 

偏函数

functools.partial()作用就是将一个函数的某些参数的值进行固定,从而返回一个新的函数,使得调用该函数变得更加简单。

由于任何函数都可以接收定义参数,可变参数,关键字参数。所以调用functools.partial()方法时也可以传入这两种参数。

 

[Python笔记]Python学习笔记三

标签:cto   map   nbsp   begin   方法   with   class   cal   port   

原文地址:http://www.cnblogs.com/joyjoe/p/6613980.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!