2019独角兽企业重金招聘Python工程师标准>>>

1、列表生成式
      列表生成式是Python内置的可以用来创建list的生成式

列表生成式, 它的基础语法是: [exp for iter_var in iterable] 
      首先迭代 iterable 里所有内容, 每一次迭代, 都把 iterable 里相应内容放到 iter_var 中, 再在表达式 exp 中应用该 iter_var 的内容, 最后用表达式的计算值生成一个新的列表.

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import math# 导入数学公式模块
from collections import Iterable# 判断是否为可迭代对象
import os# 导入os模块# 生成L1[0,1,2,3....,9]可以使用range(0,10)
L1 = range(0,10)
print L1# 生成L2[0*0,1*1,2*2,,,,,9*9]可以使用range(0,10)和循环
L2 = []
for n in range(0,10):L2.append(n*n)
print L2# 利用列表生成式可以更方便的实现上面两个例子
L1 = [m for m in range(0,10)]
print L1
L2 = [n*n for n in range(0,10)]
print L2# 除此之外,还可以使用两层,三层等多层循环,但一般只用到两层
L_Sum = [(x + y) for x in range(0,10) for y in range(10,20)]# 全排列,共有100种结果
print L_Sum
L_Cat = [(x,y) for x in '012' for y in "abc"]
print L_Cat# 可以在列表生成式的循环之后加上if,实现筛选功能,筛选的结果是一个新的list
L_Sel = [i for i in range(1,21) if i % 2 == 0]
print L_Sel# 列表生成式中的for循环可以同时使用两个变量甚至多个变量
# 将dict变成对应的list,将key和values连接起来
D = {0:'a',1:'b',2:'c'}
L_L = [str(k) + '-' + v for k,v in D.iteritems()]
print L_L# 将list中的所有字符串元素的大写变成小写
# 当list中包含字符串与整数时,使用lower()函数会报错,所以,可以使用内置函数先判断一个元素是否是字符串
L = ['Abcd','aBcd',1,'abCd','abcD']
L_low = [s.lower() for s in L if (isinstance(s,str))]
print L_low
# 将list中的所有字符串元素的大写变成小写,其他元素不变
L_l = [s.lower() if (isinstance(s,str)) else s for s in L  ]
print L_l# 运用列表生成式可以列出某目录下额所有文件名和目录名
L_file1 = [f for f in os.listdir('.')]# 当前目录
print L_file1
L_file2 = [f for f in os.listdir(r'd:\\python')]# 指定目录
print L_file2
# os.listdir('.')不能访问其子文件夹
# 可以通过os.path.walk递归遍历,可以访问子文件夹,但是未进行格式化
L_file3 = [f for f in os.walk(r'd:\\python\\workspace')]# 当前目录
print L_file3,'\n'
# 自定义格式化函数
def processDirectory ( args, dirname, filenames ):print 'Directory:',dirnamefor filename in filenames:print 'File\\\\:',filename
os.path.walk(r'd:\\python\\workspace', processDirectory, None )

运行结果:

2、生成器

# ★★★先搞清与列表生成式的区别及生成器的原理★★★
通过列表生成式,我们可以直接创建一个列,当表达式的结果数量较少的时候, 使用列表生成式还好, 一旦数量级过大, 那么将占用很大的内存,如果仅仅访问前面一部分的元素,则后面的绝大部分占用的空间就浪费了。
而生成器并不是立即把结果写入内存,generator本身保存的一种计算方式(算法),通过不断的获取到相应的位置的值,是一边循环一边计算的机制,所以占用的内存仅仅是对计算对象的保存,即解决使用列表生成式创建包含超级多的元素时造成的内存空间浪费的问题。
在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。
generator的工作原理:在for 循环的过程中不断计算出下一个元素,并在适当的条件结束for 循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令, for 循环随之结束。

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import math# 导入数学公式模块
from collections import Iterable# 判断是否为可迭代对象
import os# 导入os模块# ★★使用生成器创建list列表时,与列表生成式很相似,即把中括号改为圆括号:即[]->()
L = [l ** 3 for l in range(0,10)]# 中括号[]
print L
G = (g ** 3 for g in range(0,10))# 小括号()
print G
# 从返回结果可以看出,列表生成式直接返回的是结果值,生成器返回的是一个包含了对表达式结果的计算引用的对象
# 区别:1、list生成式生成的list可以直接打印,generator生成器无法直接打印。2、list生成式使用的是[],generator生成器使用的是()# ★可以通过调用generator的next()方法打印各元素
G = (g ** 3 for g in range(0,10))
for i in range(0,10):#for i in range(0,11):print G.next()
# generator保存的是算法,每次调用next() ,就计算出下一个元素的值,直到计算到最后一个元素.
# 如果此时再使用next(),抛出StopIteration的错误。而且此时generator对象以为空# ★generator也是可迭代对象,所以基本上不会调用其next()方法,而是通过for 循环来迭代它
G = (g ** 3 for g in range(0,10))
if isinstance(G,Iterable):for i in G:print i# 在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator
# ★★如果一个函数定义中包含yield 关键字,那么这个函数就不再是一个普通函数,而是一个generator
# 如果推算的算法比较复杂,用类似列表生成式的for 循环无法实现的时候,还可以用函数来实现
# 例:斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到
def fib(N):# 打印前N个元素n, a, b = 0, 0, 1while n < N:print ba, b = b, a + b# ★对应连续赋值n = n + 1
fib(10)
# fib()函数实际上是定义了斐波拉契数列的推算规则,这种逻辑其实非常类似generator
# ★要把fib()函数变成generator,只需要把print b 改为yield b
def fib(N):# 打印前N个元素n, a, b = 0, 0, 1while n < N:yield ba, b = b, a + b# ★对应连续赋值n = n + 1
f = fib(10)
print f.next()
print f.next()
print f.next()
print f.next()
# ★generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。
# 而变成generator的函数,在每次调用next() 的时候执行,遇到yield 语句返回,再次执行时从上次返回的yield 语句处继续执行。# ★把函数改成generator后,基本上不会用到其next()方法来调用它,而是直接使用for 循环来迭代
for n in fib(10):print n

运行结果:

生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的

转载于:https://my.oschina.net/MasterLi161307040026/blog/747320

【Python学习笔记】列表生成式和生成器相关推荐

  1. Python 学习笔记 列表 range() xxx XXX

    Python 学习笔记 列表 range() xxx XXX print("-" * 30) for value in range(1, 5):print(value)number ...

  2. Python 学习笔记 列表 xxx XXX

    Python 学习笔记 列表 xxx XXX bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(bicycles) p ...

  3. Python 学习笔记 列表 排序 xxx XXX

    Python 学习笔记 列表 排序 xxx XXX print("-" * 30) cars = ['bmw', 'audi', 'toyota', 'subaru'] cars. ...

  4. Python自学笔记-列表生成式(来自廖雪峰的官网Python3)

    感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. 列表生成式 列 ...

  5. Python学习笔记 | 列表和字典

    基于Python3版本的学习. 列表 用中括号[ ]把里面的各种数据框起来,里面的每一个数据叫作"元素". 每个元素之间都要用英文逗号隔开. list1=['小明',18,1.70 ...

  6. Python学习笔记之迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

  7. python中的列表生成式_生成器中的列表推导式

    # 2,用列表推导式做下列小题 # 1)过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母 # lst=['abc','asfg','ad','ap'] # print([i.upper() fo ...

  8. python学习笔记列表和元组(三)

    列表(list) 是Python以及其他语言中最常用到的数据结构之一.Python使用使用中括号 [ ] 来解析列表.列表是可变的(mutable)--可以改变列表的内容. 对应操作: 1.查([]切 ...

  9. Python学习笔记 列表中的冒号作用

    python中括号[ ]:用于定义列表或引用列表.数组.字符串及元组中元素位置 冒号: 用于定义分片.步长. a[ : n]表示从第0个元素到第n个元素(不包括n),a[1: ] 表示该列表中的第1个 ...

  10. Python学习笔记 -- 列表2: 遍历:嵌套列表, 将其中同位置的元素组成新的列表

    #遍历:嵌套列表, 将其中同位置的元素组成新的列表 lsts = [[1,2,3], [4,5,6],[7,8,9],[10,11,12]]ret_x = [x for [x,y,z] in lsts ...

最新文章

  1. 「高并发秒杀」mysql数据库引擎区别
  2. SVN 版本服务器搭配全过程详解(服务端、客户端)[转]
  3. java mplayer 源码_师兄写的一个JAVA播放器的源代码
  4. [Windows]_[0基础]_[使用命令行工具dumpbin分析文件]
  5. E2. Square-free division (hard version) dp + 质因子分解
  6. 电脑 linux系统下载官网,红旗Linux操作系统
  7. 最详细的Faster RCNN论文笔记
  8. python路线选择试题_python例题练习
  9. jQuery 图片放大预览插件
  10. qpython能使用json吗l_现在还能使用土墙吗?
  11. 百度违规屏蔽词过滤查询工具
  12. java调用打印机没反应_java代码调用打印机没反应
  13. CPU、内存、I/O设备速度差异
  14. DS1302 的 BURST 模式
  15. word文档通配符换行_Word指定位置批量插入表格,别人花一天搞不出来,我只用了10秒...
  16. git仓库-客户端软件安装配置过程
  17. 集成框架 -- 快手接入
  18. 手机端(安卓) 微信内浏览器 / 微信公众号 网页调试
  19. Android 客户端与服务端的数据交互问题
  20. OOM-Java内存不足排查与分析

热门文章

  1. Atitit.词法分析的理论原理 part2
  2. Atitit. Xss 漏洞的原理and应用xss木马
  3. Atitit.index manager api design 索引管理api设计
  4. atitit.提升软件开发的生产力关健点-------大型开发工具最关健
  5. paip.提升用户体验----c++ c# 配色方案
  6. 睿远基金副总经理傅鹏博:用实业思维做投资 在认知范围之内做选择
  7. 证券基金行业大数据实施痛点及选型关注点
  8. Julia : 1亿条记录读取测试,及几个优化点
  9. 阿里云季度营收首次超200亿 云计算进入自研技术时代
  10. 详解《云原生架构白皮书》,附下载链接