Python 生成器

Souleigh ✨ 等级 650 0 0

列表生成式

列表生成式是 python 内置的非常强大的可以用来生成列表的生成式。在学习生成器之前先来了解一下列表生成式,者有利于我们队生成器的理解。

列表生成式的语法格式如下

[exp for iter_var in iterable if_exp] 

列表生成式的实际执行过程如下:

  • 迭代 iterable 中的每个元素,每次迭代都先判断 if_exp 表达式结果为真,如果为真则进行下一步,如果为假则进行下一次迭代;
  • 把迭代结果赋值给 iter_var,然后通过 exp 得到一个新的计算值;
  • 最后把所有通过 exp 得到的计算值以一个新列表的形式返回。

如果迭代得到的元素无需过滤的话,if_exp 可以省略。

我们如果要生成一个 1 至 100 的整数的列表可以使用 list(range(1,101)), 如果要 1 到 100 的整数的平方我们可以使用循环来实现

list = []
for x in range(1, 101):
    list.append(x * x)

print(list) 

除了使用选好我们还可以使用列表生成式来实现

list = [x * x for x in range(1, 101)]
print(list) 

现在我们需要 1 至 100 中所有偶数的的平方,我们也可以使用列表生成式来实现

list = [x * x for x in range(1, 101) if x % 2 == 0]
print(list) 

通过使用列表生成式我们可以写出简洁的代码来快速的初始化列表。

生成器

生成器从名字上来看可以理解为生成数据的工具。生成器按照某种特定的规则不断的生成数据,直到结束为止。

生成器的语法规则如下:

(exp for iter_var in iterable if_exp) 

从形式上看生成器和列表生成式非常相似,生成器仅仅是将列表生成式的方括号换成了圆括号。而实际使用上却有很大的差别,列表生成式一次生成一个列表若列表的元素过多则占用很大的内存空间,而生成器一次仅生成一个元素即节省了内存空间又可以获取完整的列表内容。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

list1 = [x * x for x in range(1, 20) if x % 2 == 0]
list2 = (x * x for x in range(1, 20) if x % 2 == 0)

print(type(list1))
print(type(list2))
print(list1)
print(list2)
for n in list2:
    print(n)
for n in list2:
    print(n) 

以上代码执行结果如下:

<class 'list'>
<class 'generator'>
[4, 16, 36, 64, 100, 144, 196, 256, 324]
<generator object <genexpr> at 0x101163390>
4
16
36
64
100
144
196
256
324 

从以上代码的执行结果我们可以看出,使用列表生成式即生成了一个完整的列表,包含了列表的所有元素;使用生成器产生的是一个生成器,本身未含有任何元素,当我们使用 for 循环进行迭代时可以获取生成器生成的整个列表的元素,但是生成器仅能迭代一次,迭代完成后将无法再获取内容,这也是迭代器的特性。

生成器解具有很多用途,在很多地方替代列表使用是一个不错的选择。特别是针对大量值的时候,列表占内存较多,生成器的优势就在于少占内存,因此无需将生成器实例化为一个列表,直接对其进行操作,方显示出其迭代的优势。

以上列表是比较简单的生成器,可以直接使用列表生成式修改得到,如果是比较复杂的生成器则需要使用包含 yield 的函数来实现。下面我们通过 yield 函数来实现上面的列表(包含 1 至 20 中所有偶数的平方)。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

def even_squares(start, end):
    for n in range(start, end):
        if n % 2 == 0:
            yield n * n

list = even_squares(1, 20)
print(type(list))
print(list)
for n in list:
    print(n) 

以上代码执行结果如下

<class 'generator'>
<generator object even_squares at 0x10aa38c00>
4
16
36
64
100
144
196
256
324 

从以上代码运行结果可以看出使用 yield 函数和使用列表生成式的生成器获取的结果完全相同。

生成器具有以下特点:

  1. 可以使用类似列表生成式的方式生成,也可以使用 yield 函数生成。
  2. 生成器只在使用时才生成数据,可用来节省内存空间。
  3. 生成器实际是一个特殊的迭代器,可以使用 for 循环进行迭代。
  4. 只记录当前的位置,只能向前不能向后,「生成器只能使用一次,再次使用需重新初始化」。
收藏
评论区

相关推荐

Python的环境搭建和下载
Python是一个跨平台、可移植的编程语言,因此可在windows、Linux和Mac OS X系统中安装使用。 安装完成后,你会得到Python解释器环境,可以通过终端输入python命令查看本地是否已经按照python以及python版本。这里有一点需要注意的是,如果没有将python的安装目录添加到环境变量中,会报错(python不是内部命令或外部命
Python编程基础(快速入门必看
Python编程基础一、Python语言基本语法 Python是一
python文件的第一行 #!/usr/bin/python3 是什么意思?
python文件的第一行代码通常在脚本语言的第一行会看到: !/usr/bin/env python或 !/usr/bin/python 首先要确定的一点是它不是注释。这两句话的目的都是指出你的python文件用什么可执行程序去运行它。1. !/usr/bin/python 是告诉操作系统执行这个脚本的时候,调用 /usr/bin 下的 python 解释
Ubuntu 常用命令记录
一、Python相关设置 ------------ 修改Python默认版本 ------------ cd /usr/bin sudo rm -rf python sudo ln -s /usr/bin/python3 /usr/bin/python 检查是否设置成功: python -V 安
Atom的python插件和常用插件
python: simplified-chinese-menu:中文汉化(英文差的) 代码高亮:Atom自带 自动补全:autocomplete-python 语法检查:linter-flake8 定义跳转:python-tools 代码运行:atom-runner (只能输出,不能输入),atom-python-run(Windows,可以输入
CentOS升级Python到2.7版本
查看python的版本 python -V Python 2.4.3 1.先安装GCC yum -y install gcc 2.下载Python-2.7.2 wget http://python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2 3.解压Python-2.7.2
Django学习笔记
1\. django-admin.py startproject mysite 2\. python manage.py help 3\. python manage.py runserver 4\. python 搜索路径为sys.path,运行时可追加目录至sys.path 5\. python模板使用: \>>> from django im
FreeBSD python安装MySQL
fetch https://pypi.python.org/packages/source/M/MySQL-python/MySQL-python-1.2.4.zip unzip MySQL-python-1.2.4.zip cd MySQL-python-1.2.4 python setup.py install ln -s /usr/loca
Linux下Python编程
linux下python编程可以使用sublime-text3来作为编辑器,很方便,而且linux默认就是有python2和python3环境安装的,我们只要安装sublime-text3即可进行python编程 sudo update-alternatives --install /usr/bin/python python /usr/bin/p
Python 3 教程
Python 3 教程 =========== ![python3](https://www.runoob.com/wp-content/uploads/2014/05/python3.png) Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,
Python List数据的遍历
方式一: <!-- lang: python --> app_list = [1234, 5677, 8899] <!-- lang: python --> for app_id in app_list: <!-- lang: python --> print app_id 输出: 123
Python中的参数传递与解析
Python传递命令行参数 ============= Python的命令行参数传递和C语言类似,都会把命令行参数保存到argv的变量中。对于python而言,argv是sys模块中定义的一个list。与C语言不同的是,python中并没有定义argc,要获得参数的个数,需要使用len(sys.argv) 当用户使用'python -c "command
Python环境搭建—安利Python小白的Python和Pycharm安装详细教程
人生苦短,我用Python。众所周知,Python目前越来越火,学习Python的小伙伴也越来越多。最近看到群里的小伙伴经常碰到不会安装Python或者不知道去哪下载Python安装包等系列问题,为了方便大家学习Python,小编整理了一套Python和Pycharm安装详细教程,只要大家按照这个步骤来,就可以轻松的搞定Python和Pycharm的安装了。
Python解释器和IPython
简介 == 今天给大家介绍一下Python的一个功能非常强大的解释器IPython。虽然Python本身自带解释器,但是相对而言IPython的功能更加的强大。 Python解释器 ========= Python是自带解释器的,我们在命令行输入python即可进入python的解释器环境: $> pythonPython 2.7.15 (d
Python进阶丨如何创建你的第一个Python元类?
> **摘要:**通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类。 Python元类设置类的行为和规则。元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一。通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类。本文介绍以下概念: * * 什么是Python元类?