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 ...
随机推荐
- 【php】提交的特殊字符会被自动转义
在处理mysql和GET.POST的数据时,常常要对数据的引号进行转义操作. PHP中有三个设置可以实现自动对’(单引号),”(双引号),\\(反斜线)和 NULL 字符转移. PHP称之为魔术引号, ...
- C语言为运算及 两个变量的赋值问题
#include <stdio.h>#define ARRAY_SIZE 10int main() { int arr[ARRAY_SIZE] = {51,116,53,120,85 ...
- Struts2 应知应会
struts.xml 文件的 action 的配置: Struts2 中结果类型的配置来自于下面: 其中: dispatcher:转发技术,转发到一个 jsp 视图 redirect:重定向到一个 j ...
- CentOS卸载系统自带的OpenJDK并安装Sun的JDK的方法
查看目前系统的jdk: rpm -qa | grep jdk 得到的结果: [root@dc-01 java]# rpm -qa | grep jdk java-1.6.0-openjdk-1.6. ...
- oracle锁与死锁概念,阻塞产生的原因以及解决方案
锁是一种机制,一直存在:死锁是一种错误,尽量避免. 首先,要理解锁和死锁的概念: 1.锁: 定义:简单的说,锁是数据库为了保证数据的一致性而存在的一种机制,其他数据库一样有,只不过实现机制上可能大 ...
- 【Python】tuple and list 练习
Tuple: 1. __add__ a = (,,,,,,,,,) b = (,,,,,,,), c = (,,,,), result = a.__add__(b) print(resul ...
- webpack打包css样式出错
有两个组件home和search 两个组件中都有class为footer的元素 但是search的footer比home的多一条background的样式 本地开发的时候没问题,但是打包之后,home ...
- HTML option 标签的 selected 属性
HTML option 标签的 selected 属性 http://www.w3school.com.cn/tags/att_option_selected.asp 1.一般做WEB的时候,Chro ...
- POJ P1185 炮兵阵地 【状压dp】
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29502 Accepted: 11424 Description 司令 ...
- Java高级应用之泛型与反射20170627
/*************************************************************************************************** ...