流程python学习笔记:第五章(1)

第五章:一等函数
在python中一切都可以视作为对象,包括函数。我们来看个例子:
def function_try():
    '''it is funciton try doc'''
    print 'function_try'


if __name__=="__main__":
    print function_try.__doc__
    print function_try.__name__
E:\python2.7.11\python.exe E:/py_prj/fluent_python/chapter5.py
it is funciton try doc
function_try
在这里__doc__输出了函数function_try在开头的帮助。__name__则是输出了具体的函数名
我们还可以将函数名赋值给变量。通过变量的形式来访问
def function_try():
    '''it is funciton try doc'''
    print 'function_try_print'


if __name__=="__main__":
    fun=function_try
    print fun.__doc__
    print fun.__name__
    fun()
E:\python2.7.11\python.exe E:/py_prj/fluent_python/chapter5.py
it is funciton try doc
function_try
function_try_print
 
函数也可以通过参数被传递给另外一个函数。
def function_try():
    '''it is funciton try doc'''
    print 'function_try_print'

def function_try1(fun):
    print fun.__doc__
    print fun.__name__
    fun()

if __name__=="__main__":
    f=function_try
    function_try1(f)
 
下面来介绍下函数的高级用法。
假设有一字符列表,想通过各个字符的长度来进行排序。我们首先想到的是下面的方法。用sort的方法,并在key中指明排序的依据。在这里用到了lambda来得到每个元素的长度。
fruits=['strawberry','fig','apple','cherry','rasberry','banana']
fruits.sort(key=lambda x:len(x))
print fruits
E:\python2.7.11\python.exe E:/py_prj/fluent_python/chapter5.py
['fig', 'apple', 'cherry', 'banana', 'rasberry', 'strawberry']
还可以直接用sorted的方法。不同的是sorted是另外返回一个排序后的列表,原列表fruits并没有发生改变
fruits=['strawberry','fig','apple','cherry','rasberry','banana']
ret=sorted(fruits,key=len)
print 'after sorted %s' % ret
print 'before sorted %s' % fruits
E:\python2.7.11\python.exe E:/py_prj/fluent_python/chapter5.py
after sorted ['fig', 'apple', 'cherry', 'banana', 'rasberry', 'strawberry']
before sorted ['strawberry', 'fig', 'apple', 'cherry', 'rasberry', 'banana']
 
下面来介绍几个高阶函数:map,filter,reduce
首先来看下map的定义:

map(functioniterable...)

Apply function to every item of iterable and return a list of the results. Ifadditional iterable arguments are passed,function must take that many arguments and isapplied to the items from all iterables in parallel. If one iterable is shorterthan another it is assumed to be extended withNoneitems. If function isNone, the identity function isassumed; if there are multiple arguments, map() returns a list consisting of tuplescontaining the corresponding items from all iterables (a kind of transposeoperation). The iterable arguments may be a sequence or anyiterable object; the result is always a list.

简单归纳就是对于可迭代对象iterable中的每一个元素应用function方法。并将结果做为list返回
来看下例子:
def add_num(n):
    return n+1

if __name__=="__main__":
    print map(add_num,range(1,6))
range(1,6)中的各个元素都被add_num调用然后生成一个列表。其实效果相当于[add_num(n) for n in range(1,6)].因此map可以看做是一个列表推导式
我们再来另外一个应用
def add_num(a,b,c):
    return a+b+c

if __name__=="__main__":
    print map(add_num,range(1,6),range(7,12),range(11,16))
E:\python2.7.11\python.exe E:/py_prj/fluent_python/chapter5.py
[19, 22, 25, 28, 31]
这个写法的作用是将3个range中的元素按照顺序依次想加。这样写是不是比逐个遍历要方便很多。
再来看下filter。
s=[1,2,3,4,5]
print filter(lambda x:x>3,s)
E:\python2.7.11\python.exe E:/py_prj/fluent_python/chapter5.py
[4, 5]
Filter的作用在于根据第一个参数为true还是false来进行过滤。上面例子中将大于3的数值过滤出来。
 
下面介绍下reduce的作用。我们先来看下说明:
Apply a function of two arguments cumulatively to the items of a sequence,
from left to right, so as to reduce the sequence to a single value.
For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
((((1+2)+3)+4)+5).  If initial is present, it is placed before the items
of the sequence in the calculation, and serves as a default when the
sequence is empty.
上面的说明很形象了,就是将参数累加的应用于函数中。就好比我们要对1到100进行求值。代码如下。效果等同于sum(range(100))
from operator import add
print reduce(add,range(100))
E:\python2.7.11\python.exe E:/py_prj/fluent_python/chapter5.py
4950
对于reduce请注意这句话:Apply a function of two arguments cumulatively to the items of a sequence,意思是传入的函数必须接受2个参数。意味着传输的计算源必须至少是有2个。
 
前面介绍到可以把函数当做对象。那么我们可以像调用函数那样调用类么。答案是肯定的。只需要我们重写类中的__call__就可以了
class function_try:
    def __init__(self,value):
        self.data=value
    def __call__(self, *args, **kwargs):
        print 'function try was called'
        for a in args:
            print a

if __name__=="__main__":
    f=function_try(3)
    print f(3,2)
E:\python2.7.11\python.exe E:/py_prj/fluent_python/chapter5.py
function try was called
3
2
当我们用print f(3,2).起作用的其实是__call__方法。
除了__doc__, __name__这些函数还有很多属性。可以用dir的方法进行查看
def add_num(a,b,c):
    return a+b+c
print dir(add_num)
E:\python2.7.11\python.exe E:/py_prj/fluent_python/chapter5.py
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
可以看到上面这么多的方法。类中也有很多的属性,哪些是函数特有的呢。可以写一个空类和空的函数来进行对比
class c:
    pass

def func():
    pass


if __name__=="__main__":
    print sorted(set(dir(func))-set(dir(c)))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿玩AI

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值