zoukankan      html  css  js  c++  java
  • 简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他

    函数式编程

    Lambda

    exec,eval和assert语句,repr函数

     


    lambda语句

    用来创建简短的单行匿名函数

    print_assign = lambda name, value: name + '=' + str(value)
    等同于
    def print_assign(name, value):
        return name + '=' + str(value)
     

    lambda需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。注意,即便是print语句也不能用在lambda形式中,只能使用表达式。

    >>> ftwice = lambda s:s*2 
    >>> ftwice(2) 
    4

    再如make_repeater函数在运行时创建新的函数对象,并且返回它。

    image

    image

    yield表达式

    类似于迭代器,生成器允许处理数据序列

    不同的是生成器通过使用yi e l d表达式,可以尽量减少程序耗费的内存,同时还能在大规模数据集上提供类似迭代器的功能

    map()函数
    从iterA,iterB...中取出对应元素应用map

    map(f, iterA, iterB, ...)

    built-in functions often used with iterators.

    returns a list containing f(iterA[0], iterB[0]), f(iterA[1], iterB[1]), f(iterA[2], iterB[2]), ....

    map(f, iterable)基本上等于[f(x) for in iterable]

    但在多元的情况下不同:


    >>> list1 = [11,22,33]
    >>> list2 = [44,55,66]
    >>> list3 = [77,88,99]

    map()只做了列内运算
    >>> def abc(a, b, c):
    ... return a*10000 + b*100 + c
    ... 

    >>> map(abc,list1,list2,list3)
    [114477, 225588, 336699]

    列表解析做的是笛卡尔乘积

    >>> [abc(a,b,c) for a in list1 for b in list2 for c in list3]

    [114477, 114488, 114499, 115577, 115588, 115599, 116677, 116688, 116699, 224477, 224488, 224499, 225577, 225588, 225599, 226677, 226688, 226699, 334477, 334488, 334499, 335577, 335588, 335599, 336677, 336688, 336699]

    等同于

    result = []

    for a in list1:
      for b in list2:
        for c in list3:
          result.append(abc(abc))

    filter()函数

    (可以被列表解析替代)


    从iter中选择满足predicate条件的元素
    filter(predicate, iter) 
    returns a list that contains all the sequence elements that meet a certain condition
    形式非常简洁 
    existing_files = filter(os.path.exists, file_list)
     
    reduce()函数
    对iter中每个元素依次两两使用func
    reduce(func, iter, [initial_value])

    func must be a function that takes two elements and returns a single value. 

    先算init=func(initial_value,A)再算func(init,B)再算func(func(init, B), C)...



    sorted()函数
    sorted(iterable, [cmp=None], [key=None], [reverse=False]) 
    参考 http://wiki.python.org/moin/HowTo/Sorting
    any()和all()函数
    any() returns True if any element in the iterable is a true value 

    all() returns True if all of the elements are true values
    >>> any([1,1,1])
    True
    >>> all([0,1,0])
    False
    Generator expressions
    和list comprehensions的语法稍有不同
    ( expression for expr1 in sequence1
                 if condition1...
                 for exprN in sequenceN
                 if conditionN)

    Output: the successive values of expression

    obj_total sum(obj.count for obj in list_all_objects())

    Generators
    functions that simplify the task of writing iterators, which

    functools.partial()

    partial function application
       
       
    exec语句 用来执行储存在字符串或文件中的Python语句。 

    例如,可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。

    >>> exec 'print "Hello World"' 
    Hello World

    eval语句 用来计算存储在字符串中的有效Python表达式。 

    >>> eval('2*3') 
    6

    assert语句 用来声明某个条件是真的。 
    当assert语句失败的时候,会引发一个AssertionError。 
    image
    repr函数 用来取得对象的规范字符串表示。 
    反引号(也称转换符)可以完成相同的功能。 
    注意,在大多数时候有eval(repr(object)) == object。 

    >>> i = ['item'] 
    >>> `i` 
    "['item']" 
    >>> repr(i) 
    "['item']"

    函数修饰符 通过介入函数的启动和关闭机制,调整一个已存在函数的行为

    类的特殊方法


    __init__(self,...)  

    在新建对象恰好要被返回使用之前被调用。

    __del__(self)   

    恰好在对象要被删除之前调用。

    __str__(self)  

    对对象使用print语句或是使用str()的时候调用。

    __lt__(self,other) 

    当使用 小于 运算符(<)的时候调用。类似地,对于所有的运算符(+,>等等)都有特殊的方法。

    __getitem__(self,key)   

    使用x[key]索引操作符的时候调用。

    __len__(self)

    对序列对象使用内建的len()函数的时候调用。

    测试


     对于规模更大的程序,测试框架必不可少。

    在标准库中,unittest模块基于流行的xunit测试框架。doctest允许从shell会话取得输入。

    参考:

    Python中map()函数浅析 

    http://docs.python.org/2/howto/functional.html

    Python特殊语法:filter、map、reduce、lambda、yield

    http://www.dataguru.cn/blog-10716-1133.html

    http://jgy3.ggclk.com/url?url=http%3A%2F%2Fmikecvet.wordpress.com%2F2010%2F07%2F02%2Fparallel-mapreduce-in-python%2F&v=4&i=6&q=map%20python%20lambda%20%20yield%20reduce%20filter&p=0&tr=0&at=0&ar=0&ab=0&mr=0&ir=0&kgr=0&nr=0&iar=0&sr=0

    from: http://www.cnblogs.com/wei-li/p/3439182.html

  • 相关阅读:
    linux 挂载本地iso
    安装python
    QT中如何使用MYSQL 以及静态编译QT中如何加上MYSQL(2)
    qt中如何使用mysql 以及静态编译qt中如何加上mysql(1)
    关于写qt项目时的代码格式问题
    qt相关学习以及 qt creator如何静态编译
    Qt Creator中如何在QLabel上画矩形框并且保存画完后的图形
    android localsocket 传输大量数据的问题
    android binder使用demo
    android binder使用
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/5280782.html
Copyright © 2011-2022 走看看