python初步学习-生成式、生成器、迭代器、装饰器

生成式

  • 列表生成式
  • 字典生成式
  • 集合生成式
  • 嵌套列表生成式

列表生成式

列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理。语法格式为:

[exp for val in collection if condition]

看几个例子:

1、将列表中的字符串转换为小写组成一个新的列表

L = ['HELLO','WORLD']
print [s.lower() for s in L if isinstance(s,str)] 运行结果:['hello','world']

2、获取1-20中的奇数

L = [x for x in range(20) if x%2 == 1]
print L 运行结果:[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

字典生成式

字典生成式基本格式如下:

{key-exp:val-exp for value in collection if condition}

例如:

print {i:i*10 for i in range(1,10) if(i%2==0)}

运行结果为: {8: 80, 2: 20, 4: 40, 6: 60}

集合生成式

集合生成式格式和列表生成式类似,只不过用的是大括号:

{exp for value in collection if condition}

例如:统计列表中字符串元素的各种长度。

L=['Hello',10,'World',None,'aa']
print {len(x) for x in L if isinstance(x,str)} 运行结果: set([2, 5])

嵌套列表生成式

嵌套列表生成式要注意for循环的顺序。

例如:我们想提取由两个列表组成的嵌套列表中,含有a的字符串:

L1=[['Cathy','Li'],['Zhang','Wang','Mike','Tom','Jack']]
print [name for list in L1 for name in list if name.count('a')>0] 运行结果: ['Cathy', 'Zhang', 'Wang', 'Jack']

我们还可以将嵌套列表中的数据进行扁平化展现,例如:

L2=[(1,3,5),(2,4,6),(100,200)]
print [value for t in L2 for value in t] 运行结果: [1, 3, 5, 2, 4, 6, 100, 200]

生成器

在Python中,有一种自定义迭代器的方式,称为生成器(Generator)。

generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

定义生成器的两种方式:

1.创建一个generator,只要把一个列表生成式的[]改成(),就创建了一个generator:

g=(x for x in range(1,10))
print g.next()

2、定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

#!/usr/bin/env python
#coding:utf8 def fun1(n):
for x in range(n):
yield x print fun1(5) #结果为<generator object fun1 at 0x7f50de2e9730>
for y in func1(5):
print y
#结果为:
0
1
2
3
4
5

生成器和普通函数区别:

  • 通函数是顺序执行,遇到return语句或者最后一行函数语句就返回;
  • 而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

迭代器

__iter__就是对象的一个特殊方法,它是迭代规则(iterator potocol)的基础。或者说,对象如果没有它,就不能返回迭代器,就没有next()方法,就不能迭代。

提醒注意,如果读者用的是python3.x,迭代器对象实现的是__next__()方法,不是next()。并且,在python3.x中有一个内建函数next(),可以实现next(it),访问迭代器,这相当于于python2.x中的it.next()(it是迭代对象)。

装饰器(待补充)

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

概括的讲,装饰器的作用就是为已经存在的函数或对象添加额外的功能。

上一篇:iOS原生自动布局NSLayoutConstraint


下一篇:每天一个Linux命令(18)--locate命令