python filter/lambda/推导列表

三filter

  1. filter() 函数用于过滤序列,过滤掉不符合条件的元素
  2. 语法:

filter(function, iterable)

  1. 参数

function -- 判断函数。

iterable -- 可迭代对象

  1. 返回值:
  • py2:返回结果为True的元素组成的列表
  • py3: 返回Python2.x 中返回的是过滤后的列表, 而 Python3 中返回到是一个 filter 类。
  • filter 类实现了 __iter__ 和 __next__ 方法, 可以看成是一个迭代器, 有惰性运算的特性, 相对 Python2.x 提升了性能, 可以节约内存。
  • a = filter(lambda x: x % 2 == 0, range(10))
  • print(a)

输出:

   object at 0x0000022EC66BB128>

可以用listfilter类中的元素转化为列表输出

  • a = list(filter(lambda x: x % 2 == 0, range(10)))

输出:[0,2,4,6,8]

 

 

四lambda函数

  1. 编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想神去命名一个函数合下使用,也就是指匿名函数
  2. 语法:

lambda argument_list: expression

argument_list: 参数,expression:表达式

其中,参数可以是:

表达式可以是:

  1. a,b
  2. a=1,b=2
  3. *args
  4. **kwargs
  5. a,b=1,*args
  6. ……

表达式可以是:

  1. 1
  2. none
  3. a+b
  4. sum(a)
  5. 1 if a>10 else 0
  6. …….

    lambda argument_list: expression表示的是一个函数。个函数叫做lambda函数

  1. lambda函数有如下特性:
  1. lambda函数是匿名的:所谓匿名函数,通俗地说就是没有名字的函数。lambda函数没有名字。
  2. lambda函数有输入和输出:输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。
  3. lambda函数一般功能简单:单行expression决定了lambda函数不可能完成复杂的逻辑,只能完成非常简单的功能。由于其实现的功能一目了然,甚至不需要专门的名字来说明。
  • lambda x, y: x*y;函数输入是xy,输出是它们的积x*y
  • lambda:None;函数没有输入参数,输出是None
  • lambda *args: sum(args); 输入是任意个数的参数,输出是它们的和(隐性要求是输入参数必须能够进行加法运算)
  • lambda **kwargs: 1;输入是任意键值对参数,输出是1
  1. 四种用法:
  1. 将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。例如,执行语句add=lambda x, y: x+y,定义了加法函数lambda x, y: x+y,并将其赋值给变量add,这样变量add便成为具有加法功能的函数。例如,执行add(1,2),输出为3
  2. lambda函数赋值给其他函数,从而将其他函数用lambda函数替

        例如,了把time中的函数sleep的功能屏蔽(Mock),我可以      在程序初始化时调用:time.sleep=lambda x:None这样,在后time库的sleep函数将不会行原有的功能。例如,time.sleep(3),程序不会休眠3,而是什么都不做。

  1. 部分Python内置函数接收函数作参数。典型的此内置函数有些:
  • filter函数。此时lambda函数用于指定过滤列表元素的条件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定将列表[1,2,3]中能够被3整除的元素过滤出来,其结果是[3]
  • sorted函数。此时lambda函数用于指定对列表中所有元素进行排序的准则。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))将列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素与5距离从小到大进行排序,其结果是[5, 4, 6, 3, 7, 2, 8, 1, 9]
  • map函数。此时lambda函数用于指定对列表中每一个元素的共同操作。例如map(lambda x: x+1, [1, 2,3])将列表[1, 2, 3]中的元素分别加1,其结果[2, 3, 4]
  • reduce函数。此时lambda函数用于指定列表中两两相邻元素的结合条件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])将列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素从左往右两两以逗号分隔的字符的形式依次结合起来,其结果是'1, 2, 3, 4, 5, 6, 7, 8, 9'
  1. 另外,部分Python库函数也接收函数作为参数,例如gevent的spawn函数。此时,lambda函数也能够作为参数传入。
  1. 一个争议
  1. 支持方认为使用lambda编写的代码更紧凑,更“pythonic”
  2. 反对方认为,lambda函数能够支持的功能十分有限,其不支持多分支程序if...elif...else...和异常处理程序try ...except...。并且,lambda函数的功能被隐藏,对于编写代码之外的人员来说,理解lambda代码需要耗费一定的理解成本。他们认为,使用for循环等来替代lambda是一种更加直白的编码风格。

五推导列表

  1. 列表推导式书写形式:  

[表达式 for 变量 in 列表]    或者  [表达式 for 变量 in 列表 if 条件]

  1. 举例:

#!/usr/bin/python

# -*- coding: utf-8 -*-

 

li = [1,2,3,4,5,6,7,8,9]

print [x**2 for x in li] 

***********************************

 

print [x**2 for x in li if x>5]

***********************************

print dict([(x,x*10) for x in li])

***********************************

print  [ (x, y) for x in range(10) if x % 2 if x > 3 for y in range(10) if y > 7 if y != 8 ]

***********************************

vec=[2,4,6]

vec2=[4,3,-9]

sq = [vec[i]+vec2[i] for i in range(len(vec))]

print sq

***********************************

print [x*y for x in [1,2,3] for y in  [1,2,3]]

***********************************

testList = [1,2,3,4]

def mul2(x):

    return x*2

print [mul2(i) for i in testList]

 

结果如下:

[1, 4, 9, 16, 25, 36, 49, 64, 81]
[36, 49, 64, 81]
{1: 10, 2: 20, 3: 30, 4: 40, 5: 50, 6: 60, 7: 70, 8: 80, 9: 90}
[(5, 9), (7, 9), (9, 9)]
[6, 7, -3]
[1, 2, 3, 2, 4, 6, 3, 6, 9]
[2, 4, 6, 8]

六 切片

>>> m = list(range(100))#通过range函数创建一个0-99的数列,组成一个list赋值给m
>>> m
[0, 1, 2, 3, 4, 5, 6, ……,99]

>>> m[:10]#取前十个数
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> m[-10:]#取后十个数
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> m[10:20]#取前11-20个数
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> m[:10:2]#前十个数中,每2个数取一个
[0, 2, 4, 6, 8]
>>> m[5:15:3]#6-15个数中,每3个数取一个
[5, 8, 11, 14]
>>> m[::10]#所有的数中,每10个数取一个
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> m[:]#什么都不写,可以原样复制一个list
[0, 1, 2, 3, 4, 5, 6, 7,……,99]

 

支持切片的:

    1. 列表:返回列表
    2. 元组:返回元组
    3. 字符串:返回字符串

举例:编写一个函数,实现strip()函数功能

>>> def trim(str):

...     while str[:1]==' ':

...             str = str[1:]

...     while str[-1:] == ' ':

...             str = str[:-2]

...     return str

...

>>> trim('  abc  hh  welcome!      ')

'abc  hh  welcome!'

python filter/lambda/推导列表_第1张图片

 

你可能感兴趣的:(python filter/lambda/推导列表)