“人造太阳”计划

迭代器,生成器

↘锁芯ラ 提交于 2019-12-28 01:15:45
一,迭代的概念   迭代器是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下次一迭代的初始值 while True: #只是单纯地重复,因而不是迭代 print('===>') l=[1,2,3] count=0 while count < len(l): #迭代 print(l[count]) count+=1 二,为什么要用迭代器   迭代器:     优点: 1),提供一种不依赖索引的迭代取值方式        2),更加节省内存     缺点: 1),不如按照索引取值的方式灵活        2),取值一次性的,只能往后取值,无法预测值的个数 三,如何使用迭代器   可迭代的对象:str\ list\ tuple \dict \set \文件对象     但凡内置有_iter_方法的对象都称之为可迭代对象   迭代器对象: 文件对象     既可以内置_iter_方法又可以内置_next_方法的对象都称之为迭代器对象 调用可迭代对象_iter_ 方法,会有一个返回值,该返回值就是内置的迭代器对象 d = {'k1': 111, 'k2': 222, 'k3': 333} iter_d = d.__iter__() #将数据类型可迭代对象转变成迭代器对象 print(iter_d) try: #让报错继续运行 print(iter_d.__next__())

python基础6 迭代器 生成器

半城伤御伤魂 提交于 2019-12-28 01:13:15
迭代器 可迭代的或迭代对象 可迭代的: 内部含有__iter__方法的数据类型叫可迭代的,也叫 迭代对象 , range是一个迭代对象 ,内部含有iter()方法。为什么可迭代对象能被for 循环,因为可迭代对象含有iter方法,只要函数iter方法的对象就可以被for循环。这也是可迭代协议。 运用dir()方法来测试一个数据类型是不是可迭代的的。如果含有iter的,就是可迭代对象、 迭代器协议 迭代器协议 是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常, 以终止迭代 (只能往后走不能往前退)。 迭代器:可以被 next() 函数调用并不断返回下一个值的对象称为迭代器 ,迭代器是一个实现了迭代器协议的对象。也可以这样说包含next方法的可迭代对象叫迭代器 迭代器和列表的区别? 区别在于节省内存和惰性运算 如果我有一个列表中有500个数据,那么这个列表就非常占用内存,如果把列表变为迭代器,就占用很少的内存,为什么会占用内存少呢,因为迭代器只记录当前这元素和下一个元素,当你找我要的时候我才在内存中生成数据,不找我要,就不生成数据,也就不占用内存,这就是迭代器的惰性运算。 如何区分迭代器和可迭代对象?这个在我们时间长了后会混淆。 可迭代对象最简单的定义:可以使用for in 语句进行循环的对象。比如字符串、列表、元组

Python:Iterable和Iterator

泄露秘密 提交于 2019-12-27 22:29:47
转于: https://blog.csdn.net/whgqgq/article/details/63685066 博主: gongqi1992 iterable和iterator最基本的区别: iterable是一个迭代器对象,包含一个__iter__或__getitem__方法,__iter__方法会返回一个iterator对象。通常可以使用 isinstance(e,collection.Iterable) 方法判断一个对象e是否是可迭代的。__iter__方法需要返回一个iterator,也就是说这个方法需要被重写。例如: class AIterable: def __iter__(self): return iter([1, 2, 3]) it = AIterable() for i in it: print("current item is: " + str(i)) 运行结果为: current item is: 1 current item is: 2 current item is: 3 定义了一个iterable类,这个类含有一个__iter__方法,并且这个方法返回一个iterator。 *注:iter是Python的build-in函数,返回一个iterator。 iterator是一个可迭代对象。该对象的类必须实现next(Python2.x)或__next

函数复习

雨燕双飞 提交于 2019-12-27 09:57:02
1 什么是函数?  函数就是具备某一个功能的工具,    ----需要工具时,需要提前准备好,然后拿来就用且可以重复使用  所以    函数需要先定义,再使用 2 为什么要用函数?   1,代码的组织结构不清晰,可读性差  2,遇到重复的功能只能重复编写实现代码,代码冗余  3,功能需要扩展时,需要找出所有实现该功能的地方修改之,无法统一管理且维护难度极大 3 函数的分类:内置函数与自定义函数  内置函数:python解释器已经为我们定义好了的函数  自定义函数:我们自己根据需求,事先定制好的我们自己的函数,来实现某种功 4 如何自定义函数   语法  def 函数名(参数1,参数2,参数3.......):      """注释"""      函数体      return 返回的值  # 函数名要能反映其意义       函数使用的原则:先定义,再调用    函数即"变量","变量"必须先定义后引用。未定义而直接引用函数,就相当于在引用一个不存在的变量名    函数的使用,必须遵循原则:先定义,后调用   ###我们在使用函数时,一定要明确区分定义阶段和调用阶段###    #定义阶段      def foo():        print('from foo')        bar()      def bar():        print('from bar')  

函数、迭代器、生成器、装饰器

被刻印的时光 ゝ 提交于 2019-12-27 09:53:23
函数 函数基础 一、为什么要使用函数 把重复的代码提取出来,节省代码量 二、函数分类 内置函数,如len(),sun() 自定义函数 三、如何定义函数 def 函数名(参数1,参数2,参数3,...): '''注释''' 函数体 return 返回的值 四、函数使用的原则:先定义,后使用 五、调用函数 1、如何调用函数:函数名加括号 2、函数的返回值 函数的返回值通常都是一个,如果出现 return a,b 这种情况,其实是表示一个元组 六、函数的参数 #1、位置参数:按照从左到右的顺序定义的参数 位置形参:必选参数 位置实参:按照位置给形参传值,顺序必须一一对应 #2、关键字参数:按照key=value的形式定义的实参 无需按照位置为形参传值 注意的问题: 1. 关键字实参必须在位置实参右面 2. 对同一个形参不能重复传值 #3、默认参数:形参在定义时就已经为其赋值 可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参) 注意的问题: 1. 只在定义时赋值一次 2. 默认参数的定义应该在位置形参右面 3. 默认参数通常应该定义成不可变类型,举例 def add_end(L=[]): print(id(L)) L.append('END') return L print(add_end()) print(add_end()) 结果:

python函数

こ雲淡風輕ζ 提交于 2019-12-27 09:52:38
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。 定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 () 。 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数内容以冒号起始,并且缩进。 return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。 def ChangeInt(a): a = 10 b = 2 ChangeInt(b) print(b) def changeme(mylist): "修改传入的列表" mylist.append([1, 2, 3, 4]) print("函数内取值: ", mylist) return # 调用changeme函数 mylist = [10, 20, 30] changeme(mylist) print("函数外取值: ", mylist) def printme(str): "打印任何传入的字符串" print(str) return #

python之迭代器和生成器

天大地大妈咪最大 提交于 2019-12-27 07:30:34
一、迭代器协议 1、什么是迭代器协议 (1)、迭代器协议指对象必须提供一个next方法,执行该方法要么返回迭代中的下一项, 要么就引起一个StopIteration异常,以终止迭代(只能往后奏不能往前走) (2)、可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义了一个__iter__()方法) (3)、协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(for循环、sum、min、max函数) 使用迭代器协议访问对象 二、for循环机制 for循环的本质:循环所有对象,全都是使用迭代器协议 备注:for循环的本质就是遵循迭代器协议去访问对象,那么for循环的对象可定都是迭代器了啊,么错, 既然这样,for循环可以遍历(字符串、列表、元组、字典、集合、文件对象),那这些类型的数据肯定都是可迭代对象啊?但是,为什么我定义了一个列表l=[1,2,3,4,4]没有next()方法? ——字符串、列表、元组、字典、集合、文件对象这些都不是可迭代对象,只不过在for循环中,调用了他们 内部的__iter__方法,把他们变成了可迭代对象 ———for循环调用可迭代对象的__next__方法进行取值,而且for循环会捕捉Stopiteration异常,以终止迭代 1、for循环工作机制的模拟 1 l = [1,2,3] #将列表赋值为l 2 # for i in l:

Python-迭代器和生成器

▼魔方 西西 提交于 2019-12-27 07:25:23
一、递归和迭代:   1、递归(问路的案例)     递归算法是自己调用自己的过程   2、迭代(父生子,子生孙)       更新换代 二、迭代器协议:   1、迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就触发StopTteration异常,已终止迭代(只能往下走,不能往上走)   2、可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)   3、协议是一种约定,可迭代对象实现了迭代器协议,Python的内部工具(for循环,sum,max,min函数等)使用迭代器协议访问对象   4、for循环的本质就是遵循迭代器协议取访问对象,那么for循环的对象肯定都是迭代器。   5、不可迭代对象:字符串,列表,元组,字典,集合,文件对象。只不过for循环时,调用了他们的内部__iter__()方法,把他们变成了可迭代对象     -注-       1、生成器是可迭代对象       2、实现了延迟计算,看内存(按需执行)         3、生成器本质和其他类型一样,都是实现了迭代器协议,只不过生成器是一边计算一边生成,从而节省内存空间,其余的可迭代对象没有这个功能 三、迭代器:     1、遵循迭代器协议的访问方式: 1 x='hello' # 非可迭代对象 2 # print(dir(x)) 3 iter

python_10 迭代器和生成器

徘徊边缘 提交于 2019-12-27 07:21:27
迭代器协议: 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stopiteration异常,以终止迭代(只能往后走不能往前退) 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义_iter_方法) 3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象 for循环机制: for循环的本质:循环所有对象,全都是使用迭代器协议。 (字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在for循环时,调用了他们内部的_iter_方法,把他们变成了可迭代对象 然后for循环调用可迭代对象的_next_方法去取值,而且for循环会捕捉Stopiteration异常,以终止迭代。 s='abc' s_i=s.__iter__() print(s_i.__next__()) print(s_i.__next__()) print(s_i.__next__()) print(s_i.__next__())#抛StopIteration异常 >>>a >>>b >>>c >>>a Traceback (most recent call last): b File "E:/ch/Pylearning/Learning_09.py",

迭代器和生成器

情到浓时终转凉″ 提交于 2019-12-27 03:50:39
迭代器和生成器 迭代和可迭代 什么是迭代(iteration)? 如果给定一个list或tuple,我们要想访问其中的某个元素,我们可以通过下标来,如果我们想要访问所有的元素,那我们可以用for循环来遍历这个list或者tuple,而这种遍历我们就叫做迭代。 可迭代(iterable)? 其实你已经知道,不是所有的数据类型都是可迭代的。那么可迭代的数据类型都有什么特点呢? print(dir([1,2])) print(dir((2,3))) print(dir({1:2})) print(dir({1,2})) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '_