简单了解python 生成器 列表推导式 生成器表达式

yipeiwu_com6年前Python基础

生成器就是自己用python代码写的迭代器,生成器的本质就是迭代器。

通过以下两种方式构建一个生成器:

1、通过生成器函数

2、生成器表达式

生成器函数:

函数

def func1(x):
   x += 1
   return x
 print(func1(5))

生成器函数

def func1(x):
   x += 1
   yield x
 g_obj = func1(5)
 print(g_obj.__next__())

一个next对应一个yield。

yield VS return

return 结束函数,给函数的执行者返回值

yield 不会结束函数,一个next对应一个yield,给生成器对象。__next__()返回值。

生成器函数 VS 迭代器

区别1:自定制的区别:

l1 = [1,2,3,4,5]
 l1.__iter__()
 def func1(x):
   x += 1
   yield x
   x += 3
   yield x
   x += 5
   yield x
g1 = func1(5)
print(g1.__next__())
print(g1.__next__())
print(g1.__next__())

区别2:内存级别的区别。

迭代器是需要可迭代对象进行转化,可迭代对象非常占内存

生成器直接创建,不需要转化,从本质就节省内存

send & next

send与next一样,也是对生成器取值(执行一个yield)的方法。

send 可以给上一个yield传值,第一次取值永远都是next

最后一个yield永远也得不到send的值

列表推导式:一行代码搞定所需要的任何列表

循环模式 格式:[变量(加工后的变量)for 变量 in interable

lis = [i for i in range(1,101)]
print(lis)
lis = ['骑士计划%s期'% i for i in range(1,16)]
print(lis)
lis = [i**2 for i in range(1,11)]
print(lis)
print([i for i in range(1,31) if i % 3 == 0])
print([i*i for i in range(1,31) if i % 3 is 0 ])

筛选模式:

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
     ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
print([q for name in names for q in name if q.count('e') >= 2])

列表推导式

优点:一行解决,方便

缺点:容易着迷,不易排错,不能超过三次循环

列表推导式不能解决所有列表的问题,无需刻意使用

生成器表达式:将列表推导式的 [] 换成 () 即可

g = (i for i in range(199))
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

Python实现从URL地址提取文件名的方法

本文实例讲述了Python实现从URL地址提取文件名的方法。分享给大家供大家参考。具体分析如下: 如:地址为 //www.jb51.net/images/logo.gif 要想从该地址提...

如何利用Boost.Python实现Python C/C++混合编程详解

前言 学习中如果碰到问题,参考官网例子: D:\boost_1_61_0\libs\python\test 参考:Boost.Python 中英文文档。 利用Boost.Python...

matplotlib给子图添加图例的方法

matplotlib给子图添加图例的方法

代码如下: import matplotlib.pyplot as plt x = [1,2,3,4,5,6,7,8] y = [5,2,4,2,1,4,5,2] axe1 = p...

Python进阶_关于命名空间与作用域(详解)

写在前面 如非特别说明,下文均基于Python3 命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字、对象及其绑定的文章。 1. 命名空间 1.1 什么是命名空间...

python Django里CSRF 对应策略详解

CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的×××方式。 我的理解是,比如你访问过招商银行的网站并登陆之后,你的cookie信息暂时不会...