zoukankan      html  css  js  c++  java
  • python 匿名函数

    lambda 本身不是一个函数,而是一个关键字,它告诉python创建一个函数并在适当的位置使用它,而不是通过一个名称引用它。

    >>> filter_me=[1,2,3,4,5,6,7,8,11]
    >>> func=lambda x:x%2==0
    >>> result=filter(func,filter_me)
    >>> print(result)
    <filter object at 0x0000021D6FB26908>
    >>> print(*result)
    2 4 6 8

    >>> result=filter(lambda x:x%2==0,filter_me)
    >>> print(*result)

    由于缺少名称,lambda创建的函数被称为匿名函数,可以使用lambda 语句的结果给函数绑定一个名称。该名称只在创建名称的作用域内可用

    lambda只能是一个简单函数,并且不能包含其他语句,比如为变量创建一个名称。在lambda内部,只能执行有限的操作,比如测试相等性、将两个数相乘或者以特定的方式使用其他已经存在的函数。只能使用传递到lambda函数的参数。然而,可以通过使用and/or 操作。

    lambda主要用在内置函数map和filter中。通过使用lambda,这些函数能够以紧凑的方式执行一些大的操作,而不必使用循环。

    2 map短路循环:

    map是一个特殊的函数,它用于需要对列表中的每个元素执行一个指定的操作的情形。

    >>> map_me=['a','b','c','d']

    >>> result=map(lambda x:"the letter is %s"%x,map_me)
    >>> print(*result)

    如果向map中传递一个列表 或者元组 的列表,则它期待得到列表。主列表中的每个序列应该有相同数目的元素。

    >>> # use map with a list of lists,to re-order the output
    >>> map_me_again=[[1,2,3],[4,5,6]]
    >>> result=map(lambda list:[list[1],list[0],list[2]],map_me_again)
    >>> print(*result)
    [2, 1, 3] [5, 4, 6]

    map总是返回一个迭代器。可以传递给map一个非匿名函数的名称,它仍然以相同的方式运行。

    3 列表解析

    >>> everything=[1,2,3,4,5,6,7,8,12]

    >>> print([x for x in everything if x%2==0])
    [2, 4, 6, 8, 12]

    这是将列表的一部分放入循环中的一种简洁实用的方式。列表中只有相关的部分,也就是在程序中希望得到的部分才会被加入到循环中。

    列表解析可以包括循环和条件语句,能够提供更强大的做出决策的能力。而lambda只允许执行一个简单表达式。

    在大多数情况中,列表解析将比其他方式运行得更快。

    4 为循环生成迭代器

    python有一个能够创建迭代器的特殊特性,即range函数:

    >>> f=range(10,20)
    >>> print(*f)
    10 11 12 13 14 15 16 17 18 19

    如果只给range传递一个数值,那么它将从0数到该数值。这个数值既可以是正数,也可以是负数

    如果只希望每隔一个数值或者每隔两个数值打印数值,可以使用一个可选的第三个参数step

    >>> f=range(-1)
    >>> print(*f)

    >>> for number in range(5,55,4):
    print("number from 5 to 55 by fours:%d"%number)

    range返回一个行为与列表类似的迭代器对象。注意这个对象没有公共接口。而仅有私有方法。dir(range(0,10)

    可以通过同列表、序列以及字典相同的解除引用操作符(方括号)来访问它,当使用方括号访问时,是在告诉python要调用列表、元组或字典的__getitem__方法,range对象具有这个私有方法

    >>> f=range(2)
    >>> f[0]
    0

    5 使用字典的特殊字符串替换

    使用字典进行字符串替换

    >>> person={"name":"James","camera":"nikon","handedness":"lefty","baseball_team":"angels","instrument":"guitar"}
    >>> print("%(name)s,%(camera)s,%(baseball_team)s"%person)

    James,nikon,angels

    圆括号中的信息是键名,它的值将从字典中得到并替换为字符串。圆括号后面指定插入的数据类型,s 字符串,i 整数、j虚数、L长整数

    >>> import string
    >>> person={"name":"James","camera":"nikon","handedness":"lefty","baseball_team":"angels","instrument":"guitar"}

    >>> person["height"]=1.6
    >>> person["weight"]=80
    >>> t=string.Template("$name is $height m high and $weight kilos")
    >>> print(t.substitute(person))
    James is 1.6 m high and 80 kilos

    lambda允许编写一个简单的函数而不必在其他地方声明它。编写和运行这些函数不需要绑定一个名称,因此它们称为匿名函数。map在列表上操作,当用于一个简单列表时,将针对列表从头到尾的每个元素运行一个函数。当提供给map多个列表,或者列表中包含列表时,它具有更复杂的行为。

    列表解析是指在解除对序列的引用的方括号中运行有限量代码的能力,只有满足中括号中标准的那些元素被返回。通过列表解析可以简单快速的访问一个序列的指定成员

    range操作能够提供起始于任意数值并且终止于任意数值的数值列表,所以可以用来生成一个通常用于for循环的迭代器。

    除了简单的字符串替换以外,还可以提供一个具有格式说明符的字符串,这些格式说明符通过使用一种特殊的语法引用字典中的键名。这个形式允许继续使用格式说明符选项

    string.Template模块中为这种简单的基于键名字符串格式化提供了一种替换形式。它提供了略微简单一点的格式,在允许用户指定模板时更适合。生成套用信函是使用这个方法的一个例子。

  • 相关阅读:
    B2B商城网站前端开发
    Scss开发临时学习过程||webpack、npm、gulp配置
    移动开发注意几点
    拥有的50个CSS代码片段(上)
    css3基础、(弹性、响应式)布局注意点
    js封装、简单实例源码记录
    ES8
    es7与es8
    Iterator
    Math,Number
  • 原文地址:https://www.cnblogs.com/caojuansh/p/11613764.html
Copyright © 2011-2022 走看看