py13函数迭代器与生成器
"""
什么是迭代器
迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果
迭代器:迭代取值的工具
为什么要用
迭代器给你提供了一种不依赖于索引取值的方式
如何用
"""
# 不算 因为只是简单的重复
# n = 0
# while True:
# print(n)
# 重复 + 每次迭代都是基于上一次的结果而来的
# l = [1,2,3,4]
# s = 'hello'
# n = 0
# while n < len(s):
# print(s[n])
# n += 1
"""
需要迭代取值的数据类型
字符串
列表
元组
字典
集合
"""
# 可迭代对象
# 只有内置有__iter__方法的都叫做可迭代对象
"""
补充:针对双下线开头双下划线结尾的方法
推荐读:双下+方法名
基本数据类型中
是可迭代对象的有
str list tuple dict set
文件对象(执行内置的__iter__之后还是本身 没有任何变化):文件对象本身就是迭代器对象
"""
n = 1
f = 1.1
s = 'hello'
l = [1,2,34,]
t = (1,2,34)
s1 = {1,2,3,4}
d = {'name':'jason'}
f1 = open('xxx.txt','w',encoding='utf-8')
#
# res = s.__iter__() # res = iter(s)
#
# print(s.__len__()) # 简化成了len(s)
# res1 = l.__iter__() # res1 = iter(l)
# res2 = f1.__iter__() # res2 = iter(f1)
# print(res,res1,res2)
# print(f1)
# 可迭代对象执行内置的__iter__方法得到就是该对象的迭代器对象
"""
迭代器对象
1.内置有__iter__方法
2.内置有__next__方法
ps:迭代器一定是可迭代对象
而可迭代对象不一定是迭代器对象
"""
# l = [1,2,3,4]
# # 生成一个迭代器对象
# iter_l = l.__iter__()
#
# # 迭代器取值 调用__next__
# print(iter_l.__next__())
# print(iter_l.__next__())
# print(iter_l.__next__())
# print(iter_l.__next__())
# print(iter_l.__next__()) # 如果取完了 直接报错
# d = {'name':'jason','password':'123','hobby':'泡m'}
# # 将可迭代对象d转换成迭代器对象
# iter_d = d.__iter__()
# # 迭代器对象的取值 必须用__next__
# print(iter_d.__next__())
# print(iter_d.__next__())
# print(iter_d.__next__())
# print(iter_d.__next__()) # 取完了 报错StopIteration
f1 = open('xxx.txt','r',encoding='utf-8')
# 调用f1内置的__iter__方法
# iter_f = f1.__iter__()
# print(iter_f is f1)
"""
迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身(******)
"""
# print(f1 is f1.__iter__().__iter__().__iter__().__iter__())
"""
问:__iter__方法就是用来帮我们生成迭代器对象
而文件对象本身就是迭代器对象,为什么还内置有__iter__方法???
"""
d = {'name':'jason','password':'123','hobby':'泡m'}
# iter_d = d.__iter__()
# print(d.__iter__().__next__())
# print(d.__iter__().__next__())
# print(d.__iter__().__next__())
# print(iter_d.__next__())
# print(iter_d.__next__())
# print(iter_d.__next__())
# print(iter_d.__next__())
# 异常处理
# while True:
# try:
# print(iter_d.__next__())
# except StopIteration:
# # print('老母猪生不动了')
# break
# f = open('xxx.txt','r',encoding='utf-8')
# iter_f = f.__iter__()
# print(iter_f.__next__())
# print(iter_f.__next__())
# print(iter_f.__next__())
# print(iter_f.__next__())
# print(iter_f.__next__())
"""
迭代器取值的特点
1.只能往后依次取 不能后退
"""
04 for循环的本质
d = {'name':'jason','password':'123','hobby':'泡m'}
# for i in d:
# print(i)
# for循环后面的in关键 跟的是一个可迭代对象
"""
for循环内部的本质
1.将in后面的对象调用__iter__转换成迭代器对象
2.调用__next__迭代取值
3.内部有异常捕获StopIteration,当__next__报这个错 自动结束循环
"""
# for i in 1:
# pass
# iter(1)
"""
可迭代对象:内置有__iter__方法的
迭代器对象:既内置有__iter__也内置有__next__方法
迭代取值:
优点
1.不依赖于索引取值
2.内存中永远只占一份空间,不会导致内存溢出
缺点
1.不能够获取指定的元素
2.取完之后会报StopIteration错
"""
# l = [1,2,3,4]
# res = map(lambda x:x+1,l)
# print(map(lambda x:x+1,l))
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())
l1 = [1,2,3,4,5]
l2 = ['a','b','c']
print(zip(l1,l2))
05 生成器
"""
生成器:用户自定义的迭代器,本质就是迭代器
"""
# def func():
# print('first')
# yield 666 # 函数内如果有yield关键字,那么加括号执行函数的时候并不会触发函数体代码的运行
# print('second')
# yield 777
# print('third')
# yield 888
# print('forth')
# yield
# yield
# # yield后面跟的值就是调用迭代器__next__方法你能得到的值
# # yield既可以返回一个值也可以返回多个值 并且多个值也是按照元组的形式返回
# g = func() # 生成器初始化:将函数变成迭代器
# print(g)
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(range(1,10))
# for i in range(1,10,2):
# print(i)
def my_range(start,end,step=1):
while start < end:
yield start
start += step
for j in my_range(1,100,2):
print(j)
06 yield表达式形式(了解)
# yield支持外界为其传参
def dog(name):
print('%s 准备开吃'%name)
while True:
food = yield
print('%s 吃了 %s'%(name,food))
# def index():
# pass
# 当函数内有yield关键字的时候,调用该函数不会执行函数体代码
# 而是将函数变成生成器
# g = dog('egon')
# g.__next__() # 必须先将代码运行至yield 才能够为其传值
# g.send('狗不理包子') # 给yield左边的变量传参 触发了__next__方法
# g.send('饺子')
"""
yield
1.帮你提供了一种自定义生成器方式
2.会帮你将函数的运行状态暂停住
3.可以返回值
与return之间异同点
相同点:都可以返回值,并且都可以返回多个
不同点:
yield可以返回多次值,而return只能返回一次函数立即结束
yield还可以接受外部传入的值
"""
07 生成器表达式
# 列表生成式
# res = [i for i in range(1,10) if i != 4]
# print(res)
# res = (i for i in range(1,100000000) if i != 4) # 生成器表达式
# print(res)
# """
# 生成器不会主动执行任何一行代码
# 必须通过__next__触发代码的运行
# """
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())
# 占内存
# f = open('xxx.txt','r',encoding='utf-8')
# data = f.read()
# print(len(data))
# f.close()
# with open('xxx.txt','r',encoding='utf-8') as f:
# # n = 0
# # for line in f:
# # n += len(line)
# # print(n)
# g = (len(line) for line in f)
# # print(g.__next__())
# # print(g.__next__())
# # print(g.__next__())
# # print(g.__next__())
# print(sum(g))
08 常用内置方法
# print(abs(-11.11)) # 求绝对值
# l = [0,1,0]
# print(all(l)) # 只要有一个为False就返回False
# print(any(l)) # 只要有一个位True就返回True
def index():
username = '我是局部名称空间里面的username'
# print(locals()) # 当前语句在哪个位置 就会返回哪个位置所存储的所有的名字
print(globals()) # 无论在哪 查看的都是全局名称空间
# index()
# print(bin(10))
# print(oct(10))
# print(hex(10))
# print(int('0b1010',2))
# print(bool(1))
# print(bool(0))
# s = 'hello'
# print(s.encode('utf-8'))
# print(bytes(s,encoding='utf-8'))
# 可调用的(可以加括号执行相应功能的)
# l = [1,2,3]
# def index():
# pass
# print(callable(l))
# print(callable(index))
# print(chr(97)) # 将数字转换成ascii码表对应的字符
# print(ord('a')) # 将字符按照ascii表转成对应的数字
"""
面向对象需要学习的方法
classmethod
delattr
getattr
hasattr
issubclass
property
repr
setattr
super
staticmethod
"""
# dir获取当前对象名称空间里面的名字
# l = [1,2,3]
# print(dir(l))
#
# import test
# print(dir(test))
# print(test.name)
# divmod 分页器
# print(divmod(101,10))
# total_num,more = divmod(900,11)
# if more:
# total_num += 1
# print('总页数:',total_num)
# enumerate 枚举
# l = ['a','b']
# for i,j in enumerate(l,1):
# print(i,j)
# eval exec
s = """
print('hello baby~')
x = 1
y = 2
print(x + y)
"""
# eval(s)
# exec(s)
# eval不支持逻辑代码,只支持一些简单的python代码
s1 = """
print(1 + 2)
for i in range(10):
print(i)
"""
# eval(s1)
# exec(s1)
# name = 'jason'
# s2 = """
# name
# """
# print(eval(s2))
# format 三种玩法
# {}占位
# {index} 索引
# {name} 指名道姓
# print(globals())
def login():
"""
一起嗨皮
:return:
"""
# print(help(login))
# isinstance 后面统一改方法判断对象是否属于某个数据类型
# n = 1
# print(type(n))
# print(isinstance(n,list)) # 判断对象是否属于某个数据类型
# print(pow(2,3))
# print(round(3.4))
py13函数迭代器与生成器的更多相关文章
- Python 基础 内置函数 迭代器与生成器
今天就来介绍一下内置函数和迭代器 .生成器相关的知识 一.内置函数:就是Python为我们提供的直接可以使用的函数. 简单介绍几个自己认为比较重要的 1.#1.eval函数:(可以把文件中每行中的数据 ...
- python语法基础-函数-迭代器和生成器-长期维护
############### 迭代器 ############## """ 迭代器 这是一个新的知识点 我们学习过的可以迭代的对象有哪些? list str ...
- python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)
1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...
- python函数(5):迭代器和生成器
迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕 一.迭代器 for i in 50: pr ...
- Python语言的循环语句、迭代器与生成器、函数学习
while循环语句 无限循环 我们可以通过设置条件表达式永远不为false来实现无限循环,实例如下: for语句 Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串 Python ...
- Python学习笔记【第六篇】:迭代器、生成器、高阶函数、装饰器
迭代器 迭代器是访问集合元素的一种方式,迭代器从对象的第一个元素开始访问,知道所有元素被访问完成.迭代器只能往前访问,不能通过索引访问. 类型内部使用__iter__()方法转为迭代器,使用__nex ...
- Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器)
Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器) 1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数
- day12 函数的使用方法:初识迭代器和生成器
生成器和迭代器比装饰器简单多了... 这是老师的博客地址: http://www.cnblogs.com/Eva-J/articles/7213953.html 前情回顾: #装饰器: # 在不修改一 ...
- 【python基础】迭代器和生成器函数
1.迭代器协议: 1.迭代器协议是指:对象必须提供一个 __next__() 方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走不能往前退) ...
- day5--装饰器函数的信息打印,迭代器,生成器,列表推导式,内置函数
本文档主要内容: 一 装饰器函数的信息打印 二 迭代器 三 生成器 四 生成器表达式和列表推导式 五 内置函数 一 装饰器函数的信息打印 一个函数一旦被装饰器给装饰后,这个函数的信息使用原来的命令打印 ...
随机推荐
- 如何在Ubuntu 20.04上安装和保护phpMyAdmin
转载csdn:cukw6666 https://blog.csdn.net/cukw6666/article/details/107985170
- 原子类Atomic
前言 非阻塞算法:如果在某种算法中,一个线程的失败或挂起不会导致其他线程也失败或挂起,那么这种算法就被称为非阻塞算法.如果在算法的每个步骤中都存在某个线程执行下去,那么这种算法也被称为无锁(Lock_ ...
- PostGIS之维数扩展的九交模型
1. 概述 PostGIS 是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在 SQL 中运行空间查询 PostGIS官网:About PostGIS | PostGIS ...
- B树,B-树,B+树和B*树
B树和B-树(平衡多路查找树)规则:1.排序方法:所有结点关键字按递增次序,并遵循左小右大的原则.2.子结点数:非叶子结点的子结点数>1且<=M且M>=2,空树除外(M阶代表一个树的 ...
- Python实战项目6-后端多方式登录接口/手机登录接口
为开源项目共享代码 步骤: 1先fork开源项目 2clone下来,修改代码,进行提交 3提交pr,等作者同意 Pycharm 使用Git 右键文件会列出Git命令 登录注册功能分析 多方式登录接口: ...
- IIS部署WGCMS
一.下载所需的微软程序文件 安装插件:下载后直接安装就可以了,没有什么好说的. 安装1:点击下载 安装2:点击下载 二.在IIS上添加应用程序池 打开IIS,按照图片所示:在"应用程序池&q ...
- Vue 非单文件组件(不常用)3步骤(创建、注册、使用)和几个注意点、组件的本质(VueComponent)
Vue中使用组件的三大步骤: 1.定义组件(创建) 2.注册组件 3.使用组件(写组件标签) 一.如何定义一个组件? 使用Vue.extend(options)创建,其中options 和 new V ...
- snowland-smx密码算法库
snowland-smx密码算法库 一.snowland-smx密码算法库的介绍 snowland-smx是python实现的国密套件,对标python实现的gmssl,包含国密SM2,SM3,SM4 ...
- oracle收缩表和表空间
oracle shrink space收缩表 segment shrink分为两个阶段: 1).数据重组(compact):通过一系列insert.delete操作,将数据尽量排列在段的前面.在这个过 ...
- Java面向对象之创建对象内存分析
创建对象内存分析 代码 内存分析 属性 属性:字段Field 成员变量 默认初始化: 1.数字: 0 0.0 2.char: u0000 3.boolean:false 4.引用数据类型:null 5 ...