三filter
- filter() 函数用于过滤序列,过滤掉不符合条件的元素
- 语法:
filter(function, iterable)
- 参数
function -- 判断函数。
iterable -- 可迭代对象
- 返回值:
- py2:返回结果为True的元素组成的列表
- py3: 返回Python2.x 中返回的是过滤后的列表, 而 Python3 中返回到是一个 filter 类。
- filter 类实现了 __iter__ 和 __next__ 方法, 可以看成是一个迭代器, 有惰性运算的特性, 相对 Python2.x 提升了性能, 可以节约内存。
- a = filter(lambda x: x % 2 == 0, range(10))
- print(a)
输出:
<filter object at 0x0000022EC66BB128>
可以用list将filter类中的元素转化为列表输出
- a = list(filter(lambda x: x % 2 == 0, range(10)))
输出:[0,2,4,6,8]
四lambda函数
- 编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数
- 语法:
lambda argument_list: expression
argument_list: 参数,expression:表达式
其中,参数可以是:
表达式可以是:
- a,b
- a=1,b=2
- *args
- **kwargs
- a,b=1,*args
- 空
- ……
表达式可以是:
- 1
- none
- a+b
- sum(a)
- 1 if a>10 else 0
- …….
lambda argument_list: expression表示的是一个函数。这个函数叫做lambda函数
- lambda函数有如下特性:
- lambda函数是匿名的:所谓匿名函数,通俗地说就是没有名字的函数。lambda函数没有名字。
- lambda函数有输入和输出:输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。
- lambda函数一般功能简单:单行expression决定了lambda函数不可能完成复杂的逻辑,只能完成非常简单的功能。由于其实现的功能一目了然,甚至不需要专门的名字来说明。
- lambda x, y: x*y;函数输入是x和y,输出是它们的积x*y
- lambda:None;函数没有输入参数,输出是None
- lambda *args: sum(args); 输入是任意个数的参数,输出是它们的和(隐性要求是输入参数必须能够进行加法运算)
- lambda **kwargs: 1;输入是任意键值对参数,输出是1
- 四种用法:
- 将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。例如,执行语句add=lambda x, y: x+y,定义了加法函数lambda x, y: x+y,并将其赋值给变量add,这样变量add便成为具有加法功能的函数。例如,执行add(1,2),输出为3
- 将lambda函数赋值给其他函数,从而将其他函数用该lambda函数替换
例如,为了把标准库time中的函数sleep的功能屏蔽(Mock),我们可以 在程序初始化时调用:time.sleep=lambda x:None。这样,在后续代码中调用time库的sleep函数将不会执行原有的功能。例如,执行time.sleep(3)时,程序不会休眠3秒钟,而是什么都不做。
- 部分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'。
- 另外,部分Python库函数也接收函数作为参数,例如gevent的spawn函数。此时,lambda函数也能够作为参数传入。
- 一个争议
- 支持方认为使用lambda编写的代码更紧凑,更“pythonic”。
- 反对方认为,lambda函数能够支持的功能十分有限,其不支持多分支程序if...elif...else...和异常处理程序try ...except...。并且,lambda函数的功能被隐藏,对于编写代码之外的人员来说,理解lambda代码需要耗费一定的理解成本。他们认为,使用for循环等来替代lambda是一种更加直白的编码风格。
五推导列表
- 列表推导式书写形式:
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]
- 举例:
#!/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]
支持切片的:
-
- 列表:返回列表
- 元组:返回元组
- 字符串:返回字符串
举例:编写一个函数,实现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!'