前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python基础入门(迭代器和生成器)

Python基础入门(迭代器和生成器)

作者头像
py3study
发布于 2020-01-19 03:14:35
发布于 2020-01-19 03:14:35
37200
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

Python迭代器

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。

迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next(),且字符串、列表或元组对象都可用于创建迭代器,迭代器对象可以使用常规 for 语句进行遍历,也可以使用 next() 函数来遍历。

具体的实例:

字符创创建迭代器对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str1 = 'jaybo'

iter1 = iter ( str1 )

list对象创建迭代器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list1 = [1,2,3,4]

iter2 = iter ( list1 )

3、tuple(元祖) 对象创建迭代器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tuple1 = ( 1,2,3,4 )

iter3 = iter ( tuple1 )

for 循环遍历迭代器对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for x in iter1 :

print ( x , end = ' ' )
print('\n------------------------')

next() 函数遍历迭代器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while True :

try :

    print ( next ( iter3 ) )

except StopIteration :

    break

最后输出的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
j a y b o

1

2

3

4

list(列表)生成式:

语法为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[expr for iter_var in iterable]

[expr for iter_var in iterable if cond_expr]

第一种语法:首先迭代 iterable 里所有内容,每一次迭代,都把 iterable 里相应内容放到iter_var 中,再在表达式中应用该 iter_var 的内容,最后用表达式的计算值生成一个列表。

第二种语法:加入了判断语句,只有满足条件的内容才把 iterable 里相应内容放到 iter_var 中,再在表达式中应用该 iter_var 的内容,最后用表达式的计算值生成一个列表。

实例,用一句代码打印九九乘法表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('\n'.join([' '.join ('%dx%d=%2d' % (x,y,x*y) for x in range(1,y+1)) for y in range(1,10)]))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1x1= 1

1x2= 2 2x2= 4

1x3= 3 2x3= 6 3x3= 9

1x4= 4 2x4= 8 3x4=12 4x4=16

1x5= 5 2x5=10 3x5=15 4x5=20 5x5=25

1x6= 6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36

1x7= 7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49

1x8= 8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64

1x9= 9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

2 生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值。并在下一次执行 next() 方法时从当前位置继续运行。

①创建:

生成器的创建:最简单最简单的方法就是把一个列表生成式的 [] 改成 ()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gen= (x * x for x in range(10))

print(gen)

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
generator object at 0x0000000002734A40

创建 List 和 generator 的区别仅在于最外层的 [] 和 () 。但是生成器并不真正创建数字列表, 而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生” ( yield ) 出来。 生成器表达式使用了“惰性计算” ( lazy evaluation,也有翻译为“延迟求值”,我以为这种按需调用 call by need 的方式翻译为惰性更好一些),只有在检索时才被赋值( evaluated ),所以在列表比较长的情况下使用内存上更有效。

②以函数形式实现生成器:

其实生成器也是一种迭代器,但是你只能对其迭代一次。这是因为它们并没有把所有的值存在内存中,而是在运行时生成值。你通过遍历来使用它们,要么用一个“for”循环,要么将它们传递给任意可以进行迭代的函数和结构。而且实际运用中,大多数的生成器都是通过函数来实现的。

生成器和函数的不同:

函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成 generator 的函数,在每次调用 next() 的时候执行,遇到 yield语句返回,再次执行时从上次返回的 yield 语句处继续执行。

举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def odd():

print ( 'step 1' )

yield ( 1 )

print ( 'step 2' )

yield ( 3 )

print ( 'step 3' )

yield ( 5 )
o = odd()

print( next( o ) )

print( next( o ) )

print( next( o ) )

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
step 1

1

step 2

3

step 3

5

可以看到,odd 不是普通函数,而是 generator,在执行过程中,遇到 yield 就中断,下次又继续执行。执行 3 次 yield 后,已经没有 yield 可以执行了,如果你继续打印 print( next( o ) ) ,就会报错的。所以通常在 generator 函数中都要对错误进行捕获。

打印杨辉三角:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def triangles( n ): # 杨辉三角形

L = [1]

while True:

    yield L

    L.append(0)

    L = [ L [ i -1 ] + L [ i ] for i in range (len(L))]
n= 0

for t in triangles( 10 ): # 直接修改函数名即可运行

print(t)

n = n + 1

if n == 10:

    break

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[1]

[1, 1]

[1, 2, 1]

[1, 3, 3, 1]

[1, 4, 6, 4, 1]

[1, 5, 10, 10, 5, 1]

[1, 6, 15, 20, 15, 6, 1]

[1, 7, 21, 35, 35, 21, 7, 1]

[1, 8, 28, 56, 70, 56, 28, 8, 1]

[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

 3 延伸

①反向迭代

使用 Python 中有内置的函数 reversed()。

要注意一点就是:反向迭代仅仅当对象的大小可预先确定或者对象实现了 reversed() 的特殊方法时才能生效。 如果两者都不符合,那你必须先将对象转换为一个列表才行。

②同时迭代多个序列

为了同时迭代多个序列,使用 zip() 函数,具体示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
names = ['jaychou', 'zjl', '周杰伦']

ages = [18, 19, 20]

for name, age in zip(names, ages):

 print(name,age)

输出的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jaychou 18

zjl 19

周杰伦 20

其实 zip(a, b) 会生成一个可返回元组 (x, y) 的迭代器,其中 x 来自 a,y 来自 b。 一旦其中某个序列到底结尾,迭代宣告结束。 因此迭代长度跟参数中最短序列长度一致。注意理解这句话,也就是说如果 a , b 的长度不一致的话,以最短的为标准,遍历完后就结束。加V:mmp9972 小编准备了一份2018年最新Python入门教程资料,都会发给大家的~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
EF Core关系配置
关系配置: EF Core中实体之间关系的配置的套路: HasXXX(…).WithXXX(…); 有XXX、反之带有XXX。 XXX可选值One、Many。
鱼找水需要时间
2024/03/24
1450
EF Core关系配置
03-EF Core笔记之查询数据
微软提供了一百多个示例来演示查询,地址:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
拓荒者IT
2019/09/23
2.5K0
优化 EF Core 和 LINQ 以实现高性能应用程序
实体框架核心(Entity Framework Core,简称 EF Core)是一款强大的对象关系映射(ORM)工具,它弥合了面向对象编程与关系型数据库之间的差距,而 LINQ 在.NET 中提供了强大的查询语法。二者结合起来简化了与数据库的交互操作,但一些不经意的使用方式可能会导致性能瓶颈以及可扩展性问题。本文将深入探讨针对 EF Core 和 LINQ 的有效优化技巧,展示好与不好的代码示例,讨论相关优势,并着重介绍那些有助于提升性能和可扩展性的特性。
郑子铭
2025/02/28
730
优化 EF Core 和 LINQ 以实现高性能应用程序
Entity Framework Core 2.0 入门
LearnEf.Console依赖LearnEf.Domains和LearnEf.Data:
solenovex
2018/03/12
3.5K0
Entity Framework Core 2.0 入门
【asp.net core 系列】8 实战之 利用 EF Core 完成数据操作层的实现
通过前两篇,我们创建了一个项目,并规定了一个基本的数据层访问接口。这一篇,我们将以EF Core为例演示一下数据层访问接口如何实现,以及实现中需要注意的地方。
程序员小高
2020/06/09
1.6K0
【愚公系列】2023年02月 .NET/C#知识点-使用控制台手搭webapi框架
WebAPI是一种协议,用于允许网络应用程序(如浏览器)与网络服务器(如Web服务器)之间进行通信。它可以用于处理数据,访问数据库,处理图像和视频,以及进行其他高级功能。
愚公搬代码
2023/03/16
1.5K0
【愚公系列】2023年02月 .NET/C#知识点-使用控制台手搭webapi框架
.NET 性能—Entity Framework Core调优
在实际开发过程中,我们遇到性能问题,常见的性能提升方案整体分为硬件、软件、网络三个方面。
郑子铭
2023/08/30
4050
.NET 性能—Entity Framework Core调优
EF 通用数据层父类方法小结
注:该数据层方法为小弟平时项目所用方法,特此贡献出来,各位如有疑问或者好的建议可以提出来,大家一起成长!!!
跟着阿笨一起玩NET
2018/09/20
1.1K0
EF 通用数据层父类方法小结
ASP.NET Core 入门教程 8、ASP.NET Core + Entity Framework Core 数据访问入门
本篇代码以下代码进行调整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-02
KenTalk
2018/12/29
2.2K0
ASP.NET Core 入门教程 8、ASP.NET Core + Entity Framework Core 数据访问入门
.NET EF Core(Entity Framework Core)
1、Entity Framework Core(EF Core)是微软官方的ORM框架。优点:功能强大、官方支持、生产效率高、力求屏蔽底层数据库差异;缺点:复杂、上手门槛高、不熟悉EFCore的话可能会进坑。 2、Dapper。优点:简单,N分钟即可上手,行为可预期性强;缺点:生产效率低,需要处理底层数据库差异。 3、EF Core是 模型驱动 (Model-Driven)的开发思想,Dapper是 数据库驱动(DataBase-Driven)的开发思想的。没有优劣,只有比较。 4、性能: Dapper等≠性能高;EF Core≠性能差。 5、EF Core是官方推荐、推进的框架,尽量屏蔽底层数据库差异,.NET开发者必须熟悉,根据的项目情况再决定用哪个。
鱼找水需要时间
2024/03/23
5750
.NET EF Core(Entity Framework Core)
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
加载相关数据:https://docs.microsoft.com/zh-cn/ef/core/querying/related-data/
郑子铭
2020/12/30
1.2K0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
.net 温故知新:【10】.NET ORM框架EFCore使用入门之CodeFirs、DBFirst
前言:本系列是我自己学习.net相关知识,以便跟上.net跨平台的步伐,目前工作原因基本在.net Framework4.7以下,所以才有了这一系列的学习总结,但是并不是从基本的C#语法和基础知识开始的,而是围绕.net core以后平台的重要设计和差异进行温故知新。目的在于通过要点的梳理最后串联起整个跨平台框架。之前的几篇算是把框架重要设计和框架重要知识点复习了,当然什么系统都可能使用到ORM框架。所以这里为了整个过程的完整连续性加入一个EFCore的示例,ORM不算详细写了,毕竟ORM框架可以根据需求选择很多,如果再详细那又是另外一个系列了,这里只做简单介绍。从这篇ORM完成之后就将进入asp.net core的学习总结!
SpringSun
2022/12/22
3K0
.net 温故知新:【10】.NET ORM框架EFCore使用入门之CodeFirs、DBFirst
02-EF Core笔记之保存数据
EF Core通过ChangeTracker跟踪需要写入数据库的更改,当需要保存数据时,调用DbContext的SaveChanges方法完成保存。
拓荒者IT
2019/09/23
1.8K0
C# 数据操作系列 - 8. EF Core的增删改查
到目前为止,我们看了一下如何声明EF Core的初步使用,也整体的看了下EF Core的映射关系配置以及导航属性的配置。
程序员小高
2020/05/21
3.3K0
对EF Core进行扩展使支持批量操作/复杂查询
EF Core的问题一言难尽,然后有了各种插件,批量插入扩展,批量更新扩展,查询扩展。。。然后一个项目引入一堆扩展
用户8604107
2021/07/06
1.4K0
初级.NET程序员,你必须知道的EF知识和经验
注意:以下内容如果没有特别申明,默认使用的EF6.0版本,code first模式。 推荐MiniProfiler插件 工欲善其事,必先利其器。 我们使用EF和在很大程度提高了开发速度,不过随之带来的
逸鹏
2018/04/10
1.9K0
初级.NET程序员,你必须知道的EF知识和经验
采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
本文主要介绍了如何使用Entity Framework Core对数据库进行增删改查操作,包括原生SQL查询方式、Entity Framework Core原生API、DbContext的API以及原生SQL查询的批量操作、数据审计日志和查询缓存等。
GuZhenYin
2018/01/04
7820
采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
Entity Framework Plus: 让 EF Core 开发如虎添翼
Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术,EF Core 是适用于 .NET 的现代对象数据库映射器。它支持 LINQ 查询、更改跟踪、更新和架构迁移。EF Core 通过提供程序插件 API 与 SQL Server、Azure SQL 数据库、SQLite、Azure Cosmos DB、MySQL、PostgreSQL 和其他数据库一起使用(微软官方出品)。
追逐时光者
2024/09/14
2230
Entity Framework Plus: 让 EF Core 开发如虎添翼
浅析Entity Framework Core中的并发处理
本文讲述如何使用Entity Framework Core来实现一个乐观并发控制,并介绍在.NET Core中使用DbContext进行数据库操作时的一些常见问题和解决方案。
GuZhenYin
2018/01/04
2.8K0
浅析Entity Framework Core中的并发处理
【ASP.NET Core 基础知识】--数据库连接--使用Entity Framework Core进行数据库访问
Entity Framework Core(简称EF Core)是微软推出的一个轻量级版的Entity Framework,它是一个开源的、跨平台(Windows、Linux和macOS)的对象关系映射(ORM)框架。EF Core 旨在提供快速的数据访问和强大的数据库操作功能,同时保持较低的资源占用。 EF Core 支持与多种数据库系统的集成,包括 SQL Server、SQLite、MySQL、PostgreSQL 和 Oracle 等。它提供了 Code First 开发方法,允许开发人员通过代码来定义模型、配置映射关系和创建数据库。此外,EF Core 还支持数据迁移,使得在开发过程中数据库模式的变更更加容易管理和部署。 EF Core 与传统的 Entity Framework (EF) 相比,具有以下特点:
喵叔
2024/05/24
6990
推荐阅读
相关推荐
EF Core关系配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文