Python迭代器生成器与生成式

什么是迭代

迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。

例如for循环

a = ['abc', 123, ['4', 45]]
for i in a:
print(i)
#==========输出=============
abc
123
['4', 45]

for就是把这个列表迭代了一遍,但是根据迭代的定义每一次迭代得到的结果会作为下一次迭代的初始值。这也没看到用了上一次的值啊。

这里介绍两个函数__iter__()__next__,一个可迭代序列(同时它也是一个对象),它有一个__iter__()方法,可以返回一个迭代器对象,这个迭代器对象里面有一个__next__()方法,它可以将迭代器对象一个一个向下迭代。

例如上例

a = ['abc', 123, ['4', 45]]

#print(a.__iter__())
x = a.__iter__()
print(x.__next__())
print(x.__next__())
print(x.__next__()) ##其实还有一种迭代形式,一个调用内置方法一个调用外部方法罢了
x = iter()
next(x)
next(x)
next(x) x = iter(a)
print(next(x))
print(next(x))
print(next(x)) #===========输出结果=========
abc
123
['4', 45]
abc
123
['4', 45]

但是如果再加一个print(x.__next__())的话python会抛出一个异常。

然后我们可以结合while循环就可以大致猜出for迭代时的内部执行机理了。

a = ['abc', 123, ['4', 45]]

y = a.__iter__()
while True:
try:
print(y.__next__())
except StopIteration:
break #===========输出================
abc
123
['4', 45]

这样就把列表a迭代完了。

什么是生成式

要创建一个列表,就要有一个中括号,里面的数据就是列表的内容。如果我要创建一个列表,列表里面有按顺序的1~100所有的整数,一个一个输入吗?

有人可能说用循环,例如

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

确实这样是可以的,但是有了生成式可能会更加简单一点

x = [i for i in range(1, 101)]

再中括号里面,一个应该写入数据的地方放一个循环,在C语言看来这简直就是疯了。不过这也体现了python的灵活强大。

其实中括号里面除了加for循环还能加条件判断,例如

x = [i for i in range(1, 101) if i % 2 and not i % 3]
#列举出所有1~100能被3整除不能被2整除的数

除了list列表有这种操作以外,还有字典可以这样操作

字典

dict1 = {i:i + 1 for i in range(1, 101)if i % 2 and not i % 3 }

执行结果

{3: 4, 9: 10, 15: 16, 21: 22, 27: 28, 33: 34, 39: 40, 45: 46, 51: 52, 57: 58, 63: 64, 69: 70, 75: 76, 81: 82, 87: 88, 93: 94, 99: 100}

应该能看出点什么来了,也挺简单。

什么是生成器

就是有一个跟return差不多的东西yieldreturn返回之后程序就退出了,但是yield会把程序暂停,然后等你需要的时候来继续执行,但是跟return又有一点不一样,yield是迭代器的一种,返回的是一个生成器对象,需要借用next()函数来进行迭代。

其实yield就是一种特殊的迭代器。

def sc1():
yield 'one'
yield 'two' def sc2():
return 'one' s1 = sc1()
s2 = sc2()
print(type(s1))
print(type(next(s1)))
print(type(s2))

输出

<class 'generator'>
<class 'str'>
<class 'str'>

对于生成器的使用,最简单的例如

def sc():
print('进入函数1')
yield 'one'
print('进入函数2')
yield 'two' s = sc()
print(next(s))
print(next(s)) #============输出===========
进入函数1
one
进入函数2
two

使用与迭代器几乎一模一样

用这个生成一个斐波拉契数列可以这样写

def feb(x):
count = 0
a = 0
b = 1
while count < x:
yield a
a, b = b, a + b
count += 1

这样就会生成一个斐波拉契数列前x项的可迭代序列

可以测试一下,用for循环迭代它

for i in feb(10):
print(i,end=' ')

输出

0 1 1 2 3 5 8 13 21 34

Python迭代器生成器与生成式的更多相关文章

  1. Python 迭代器&生成器

    1.内置参数     Built-in Functions     abs() dict() help() min() setattr() all() dir() hex() next() slice ...

  2. python 迭代器 生成器

    迭代器 生成器 一 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  3. Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  4. python迭代器,生成器,推导式

    可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: ...

  5. Python迭代器生成器,私有变量及列表字典集合推导式(二)

    1 python自省机制 这个是python一大特性,自省就是面向对象的语言所写的程序在运行时,能知道对象的类型,换句话说就是在运行时能获取对象的类型,比如通过 type(),dir(),getatt ...

  6. Python迭代器,生成器,装饰器

    迭代器 通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值). 可迭代对象(iterable):是指该对象可以被 ...

  7. 4.python迭代器生成器装饰器

    容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元素存储在内存中 ...

  8. python迭代器生成器

    1.生成器和迭代器.含有yield的特殊函数为生成器.可以被for循环的称之为可以迭代的.而可以通过_next()_调用,并且可以不断返回值的称之为迭代器 2.yield简单的生成器 #迭代器简单的使 ...

  9. Python迭代器生成器,模块和包

      1.迭代器和生成器 2.模块和包 1.迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法.    其中__it ...

随机推荐

  1. Golang通脉之指针

    指针的概念 指针是存储另一个变量的内存地址的变量. 变量是一种使用方便的占位符,用于引用计算机内存地址. 一个指针变量可以指向任何一个值的内存地址. 在上面的图中,变量b的值为156,存储在内存地址0 ...

  2. SharkCTF2021 fastcalc题记

    web --> python脚本编写练习. 直接访问发现全是乱码: 看包发现Content-Type里面没有charset=utf-8. 于是用python访问一下,用.encoding='ut ...

  3. SharkCTF2021 BabyGame

    web类题. 访问题给页面,页面里没啥信息.抓包,发现: 访问它,发现是一个游戏. F12之后看调试器里的js代码,发现: console.log("balabalabala"); ...

  4. AtCoder Beginner Contest 223

    AtCoder Beginner Contest 223 A是纯纯的水题,就不说了 B - String Shifting 思路分析 我真的sb,一开始想了好久是不是和全排列有关,然后读了好几遍题目也 ...

  5. [no code][scrum meeting] Alpha 1

    项目 内容 会议时间 2020-04-06 会议主题 团队任务分析与拆解 会议时长 30min 参会人员 全体成员 $( "#cnblogs_post_body" ).catalo ...

  6. BUAA SE | 提问回顾与个人总结

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 深入理解软件工程 这个作业在哪个具体方面帮助我实现目标 ...

  7. 字符串与模式匹配算法(一):BF算法

    一.BF算法的基本思想 BF(Brute Force)算法是模式匹配中最简单.最直观的算法.该算法最基本的思想是从主串的第 start 个字符起和模式P(要检索的子串)的第1个字符比较,如果相等,则逐 ...

  8. 翻转子串 牛客网 程序员面试金典 C++ Python

    反转子串 牛客网 程序员面试金典 C++ Python 题目描述 假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串.请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查 ...

  9. Python 类似 SyntaxError: Non-ASCII character '\xc3' in file

    Python 类似 SyntaxError: Non-ASCII character '\xc3' in file 产生这个问题的原因: python 的默认编码文件是ACSII,而编辑器将文件保存为 ...

  10. surrounded-regions leetcode C++

    Given a 2D board containing'X'and'O', capture all regions surrounded by'X'. A region is captured by ...