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函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
概括的讲,装饰器的作用就是为已经存在的函数或对象添加额外的功能。
python初步学习-生成式、生成器、迭代器、装饰器的更多相关文章
- Python之旅Day5    列表生成式 生成器  迭代器    装饰器
		装饰器 器即函数,装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器涉及的知识点= 高阶函数+函数嵌套+闭包 在遵循下面两个原则的前提下为被装饰者新功能 ... 
- Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化
		一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ... 
- python基础(八)生成器,迭代器,装饰器,递归
		生成器 在函数中使用yield关键字就会将一个普通的函数变成一个生成器(generator),普通的函数只能使用return来退出函数,而不执行return之后的代码.而生成器可以使用调用一个next ... 
- python的迭代器、生成器、装饰器
		迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ... 
- python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器
		1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ... 
- Day4- Python基础4 深浅拷贝、三目运算、列表生成式,迭代器&生成器、装饰器
		本节内容: 1.深浅拷贝 2.三目运算 3.迭代器和生成器 4.装饰器 1.深浅拷贝 拷贝意味着对数据重新复制一份,深浅拷贝的含义就是:对于修改复制的数据是否会影响到源数据,拷贝操作对于基本数据结构需 ... 
- Python 闭包、迭代器、生成器、装饰器
		Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ... 
- Python3基础教程(十六)——  迭代器、生成器、装饰器
		在这个实验里我们学习迭代器.生成器.装饰器有关知识. 这几个概念是 Python 中不容易理解透彻的概念,务必把所有的实验代码都完整的输入并理解清楚其中每一行的意思. 迭代器 Python 迭代器(I ... 
- python 基础 4.4 生成式  生成器  迭代器
		一.生成式和生成器 列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理. #/usr/bin/python #coding=u ... 
随机推荐
- 上传web端——个人项目
			我用visual studio新建了一个web窗口,如图: 然后这里是系统自带的代码: [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile ... 
- 【leetcode】198.HouseRobber
			198.HouseRobber You are a professional robber planning to rob houses along a street. Each house has ... 
- 使用vue的mixins混入实现对正在编辑的页面离开时提示
			mixins.ts import { Vue, Component, Watch } from "vue-property-decorator" Component.registe ... 
- 第123天:移动web开发中的常见问题
			一.函数库 underscoreJS _.template: <ol class="carousel-indicators"> <!--渲染的HTML字符串--& ... 
- bzoj2013[CEOI2010] A huge tower
			题意 有N(2<=N<=620000)快砖,要搭一个N层的塔,要求:如果砖A恰好在砖B上面,那么A不能比B的长度+D要长.问有几种方法,输出 答案 mod 1000000009的值 分析 ... 
- OpenGL 加载DDS文件(压缩纹理)
			想必很多人都见过DDS这种文件,它是一个“图片文件”,如果你安装了某些看图软件,你可以直接双击打开它来进行预览. 那么,这种DDS文件和我们常见的TGA/PNG之类的文件有何不同呢? DDS和TGA/ ... 
- 【BZOJ4200】【NOI2015】小园丁与老司机(动态规划,网络流)
			[BZOJ4200][NOI2015]小园丁与老司机(动态规划,网络流) 题面 BZOJ权限题,洛谷链接 题解 一道二合一的题目 考虑第一问. 先考虑如何计算六个方向上的第一个点. 左右上很好考虑,只 ... 
- windows主机防护
			Netsh命令-修改网络IP设置 网络管理相关函数 Windows用户相关操作 SID(安全标识符) 策略其他说明 主机防护设置 命令行添加防火墙 防火墙规则 使用SetupDI* API列举系统中的 ... 
- BZOJ2277 [Poi2011]Strongbox  【数论】
			题目链接 BZOJ2277 题解 orz太难了 如果一个数\(x\)是密码,那么所有\((x,n)\)的倍数都是密码 如果两个数\(x,y\)是密码,那么所有\((x,y)\)的倍数都是密码 那么如果 ... 
- MapReduce(五) mapreduce的shuffle机制  与  Yarn
			一.shuffle机制 1.概述 (1)MapReduce 中, map 阶段处理的数据如何传递给 reduce 阶段,是 MapReduce 框架中最关键的一个流程,这个流程就叫 Shuffle:( ... 
