迭代器|三元表达式|生成器

import numpy as np
‘‘‘迭代:每次获得的结果都基于上次结果来的(更新换代)迭代器协议:对象必须提供一个next方法 ,执行该方法,要么返回迭代器的下一项,要么引起异常迭代对象(节省内存):实现迭代器协议的对象(内部:__iter__()方法)

for循环的本质:循环所有对象,全部使用迭代器协议for循环可以遍历(序列【字符串、列表、元祖】、非序列【字典、集合、文件对象】)‘‘‘‘‘‘疑问解答:(字符串、列表、元祖、字典、集合、文件对象)都不是可迭代对象,只是for循环调用了他们内部的__iter__方法,把他们变成可迭代对象‘‘‘

x = ‘hello‘
print(dir(x))     ##查看对应方法
iter_test = x.__iter__()     ###将字符串转化成迭代器对象
print(iter_test)  ##<str_iterator object at 0x000001FE5A566550>迭代器对象的内存地址
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())
# print(iter_test.__next__())
‘‘‘
总结:字符串对象执行for循环(内部解析):
1.先__iter__()转化成可迭代对象
2.再__next__()进行迭代(爷-父-子)
3.自动捕捉异常
‘‘‘

###序列类的访问(字符串、列表、元祖)
lis = [0,1,2,3,4]
for i in lis:
    print(i)

##迭代器协议取值(先变成迭代器对象)
iter_lis = lis.__iter__()
print(iter_lis.__next__())

##索引遍历
index = 0
while index<len(lis):
    print(lis[i])
    index+= 1

###非序列类型(字典、集合、文件对象)
#集合
s = {1,2,3}
for i in s:
    print(i)
#解析
iter_s = s.__iter__()
print(iter_s)
print(iter_s.__next__())
print(iter_s.__next__())
print(iter_s.__next__())
##字典
dic = {‘a‘:1,‘b‘:2}
iter_dic = dic.__iter__()
print(iter_dic.__next__())    ###取出的是key

##文件对象(先在工作目录创建一个文件)
f = open(‘test.txt‘,‘r+‘,encoding=‘utf-8‘)
# for i in f:
#     print(i)

iter_f = f.__iter__()
print(iter_f.__next__(),end=‘ ‘)
print(iter_f.__next__(),end=‘ ‘)
print(iter_f.__next__(),end=‘ ‘)
print(iter_f.__next__(),end=‘ ‘)

##next()同样是将对象变成可迭代对象,再调用.__next__()
dic1 = {‘a‘:1,‘b‘:2,‘c‘:3}
iter_dic1 = dic1.__iter__()
print(next(iter_dic1))
print(next(iter_dic1))
print(next(iter_dic1))

迭代-迭代器协议-迭代对象

生成器特性:【可迭代对象】

1.自动实现迭代器协议 2.生成器函数 : yield语句:一次返回一个结果,状态保持,下一次接着执行(每走一步,停顿,接着走)3.三元表达式之列表解析4.生成器表达式:‘‘‘

##三元表达式
name = ‘alex‘
res1 = ‘前真‘ if name == ‘alex‘ else ‘后假‘
res2 = ‘前真‘ if name == ‘lex‘ else ‘后假‘
print(res1,res2)
‘‘‘
如果判断【真】,res=‘前真’
如果判断【假】,res=‘后假’
‘‘‘

##列表解析
#二元
lis=[i for i in range(10)]
print(lis)
#三元
lis1 = [‘鸡蛋%s‘%i for i in range(10) if i>5]
print(lis1)

三元表达式-列表解析

生成器:1.生成器表达式(列表解析[]换成())2.生成器函数  yield语句

##1.生成器表达式(列表解析的[]换成()),相对于列表解析更省内存
laomuji = (‘鸡蛋%s‘%i for i in range(10))
print(laomuji) #<generator object <genexpr> at 0x00000218948C2318>
print(laomuji.__next__())
print(laomuji.__next__())
print(laomuji.__next__())
print(next(laomuji))

print(sum(x**2 for x in range(4))) ##生成器表达式直接计算
print(sum([x**2 for x in range(4)]))##生成器表达式生成列表,再进行计算
##2.生成器函数
def GenerateData(batchsize = 100):
    train_x = np.linspace(-1,1,batchsize)                     ###等差数列(一维数组)
    train_y = 2*train_x+np.random.randn(*train_x.shape)*0.3   ###加入噪声的y=zx (一维数组)
    ##np.random.randn(形状)生成0-1间,包括0但不包括1的随机数

    yield train_x,train_y      ##以生成器方式返回  训练数据 x,y
for i in range(5):
    for x,y in GenerateData():
        print(x[:3])
        print(y[:3])

生成器:两种形式



原文地址:https://www.cnblogs.com/liuhuacai/p/11505723.html

时间: 2024-08-05 11:48:35

迭代器|三元表达式|生成器的相关文章

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

生成器 三元表达式 列表生成式 匿名函数 内置函数

生成器 1.什么是生成器? ? -生成的工具 ? -生成器是一个自定义的迭代器,本质上是一个迭代器. 2.如何实现生成器? -但凡在函数内定义的yield ? -调用函数时,函数体代码不会执行 ? 会返回一个结果,这个结果就是生成器. 3.yield ? -每一次的yield都会往生成器对象中添加一个值. ? -yield只能在函数内定义 ? -yield可以保存函数的暂停状态 yield和return的对比 ? -相同点: ? 返回值的是不限制的: ? -不同点 ? return一次只可以返回

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

python学习笔记第九节(迭代器,生成器,三元表达式)

for循环相当于自动调动__iter__ for循环相当于上面这样每次__next__再打印一次 while循环的迭代方式,采用try的方式 判断是否为可迭代 判断是否为迭代器对象 加了蓝色段,可以调用原来的函数名 迭代对象 可以__iter__的迭代器 将__iter__之后的结果的迭代器对象 可以直接__next__的 生成器 迭代到yield后停止,相当于__next__函数加上yield后就是迭代器.可以每次__next__显示,每次显示到yield后停止,相当于return,但是下次_

函数---迭代器&amp;生成器&amp;列表解析&amp;三元表达式

可迭代对象:obj.__iter__ 迭代器:iter1=obj.__iter() 1iter1.__next__ 2iter2.__next__ 迭代器: 优点:不依赖索引 惰性计算,节省内存 缺点: 不如按照索引的取值方便 一次性,只能往后取,不能回退 迭代器的应用: 提供了一种不依赖索引的统一的迭代方法 惰性计算,比如取文件的每一行 判断可是否是可迭代对象和迭代器 from collections import Iterable, Iterator # 导入模块功能 isinstance(

python迭代器、生成器及三元表达式

(1)迭代器协议 字符串.元组.列表.字典.集合.文件对象这些都不是可迭代对象,只不过在for循环中,调用了他们内部的__iter__方法,把他们变成了可迭代对象 然后for循环调用可迭代对象的的__next__方法去取值,而且for循环会捕捉StopIateration异常,以终止迭代 x='hello'for i in x: print(i) for循环相当于: x='hello' iter_test=x.__iter__() print(iter_test) print(iter_test

三元表达式 ,迭代器, 生成器,二分法

三元表达式 # x if x > y else y ##如果x大于y,值返回左边,不然则返回右边 #用一行代码表达一个函数需要做的事情,使代码更简洁 # 例1,# res='x' if True else 'y'# print(res) 迭代器 # 1. 什么是迭代器# 什么是迭代?# 迭代是一个重复的过程,但是每次重复都是基于上一次重复的结果而继续 #下列循环知识单纯的重复 # while True: #while循环取值,是单纯的重复.迭代取得是基于上一次取下一次的值 # print(1)

三元表达式、列表解析、生成器

一.三元表达式 格式:result=值1 if x<y else 值2 满足if条件result=值1,否则result=值2 >>> 3 if 3>2 else 10 3 >>> 3 if 3>4 else 10 10 >>> 3+2 if 3>0 else 3-1 5 >>> 3+2 if 3>0 and 3>4 else 3-1 2 二.列表解析 1 s='hello' 2 res=[i.up

Day8:三元表达式、列表解析、生成器

一.三元表达式 格式:result=值1 if x<y else 值2 满足if条件result=值1,否则result=值2 >>> 3 if 3>2 else 10 3 >>> 3 if 3>4 else 10 10 >>> 3+2 if 3>0 else 3-1 5 >>> 3+2 if 3>0 and 3>4 else 3-1 2 二.列表解析 1 s='hello' 2 res=[i.up