迭代器

  什么是迭代器

    迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果

    迭代器:迭代取值的工具

  为什么要用迭代器

    迭代器给你提供了一种不依赖索引取值的方式

重复+每次迭代都是基于上一次的结果而来的

l = [1, 2, 3, 4]
s = 'hello'
n = 0
while n < len(s):print(s(n))n+=1

  根据我们知道的数据类型中,其中 字符串(str)、列表(list)、元组(tuple)、字典(dict)、集合(set)、文件对象 都属于需要迭代取值的数据类型,内置有__iter__方法的都叫做可迭代对象

    文件对象(执行内置的__iter__之后还是本身,没有任何变化):文件对象本身就是迭代器对象

迭代器对象

  1.内置有__iter__方法

  2.内置有__next__方法

  注意:迭代器一定是可迭代对象,而可迭代对象不一定是迭代器对象

列表取值

l = [1,2,3,4]
iter_l = l.__iter__()  #生成一个迭代器对象#迭代器取值,调用__next__方法
print(iter_l.__next__())  #取值:1
print(iter_l.__next__())  #取值:2
print(iter_l.__next__())  #取值:3
print(iter_l.__next__())  #取值:4
print(iter_l.__next__())  #当列表中的值被取完时,直接报错StopIteration

字典取值

d = {'name':'zhangsan', 'password':'123', 'hobby':'study'}#将可迭代对象d转换成迭代器对象
iter_d = d.__iter__()#迭代器对象取值,使用__next__
print(iter_d.__next__())   #取值:name
print(iter_d.__next__())   #取值:password
print(iter_d.__next__())   #取值:hobby
print(iter_d.__next__())   #当字典中的key被取完时,直接报错StopIteration

在项目过程中,所有的程序肯定是不允许有报错信息的,这时我们可以使用捕获异常来处理

while True:try:print(iter_d.__next__())except StopIteration:    #放入程序的报错信息print('值已经被取完了')break

ps:迭代器取值的特点:只能从前往后依次取,不能倒序

for循环内部的本质

for循环内部的本质

  1.将in后面的对象调用__iter__转换成迭代器对象

  2.调用__next__迭代取值

  3.内部有异常捕获StopIteration,当__next__报这个错,自动结束循环

d = {'name':'zhangsan', 'password':'123', 'hobby':'study'}
for i in d:print(i)#for循环后面的in是关键,跟的是一个可迭代对象

小示例:

#使用匿名函数,以及map方法求取出的值

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__())
print(res.__next__())#打印结果
2
3
4
5

小结:

可迭代对象:内置有__iter__方法

迭代器对象:内置既有__iter__方法,内置也有__next__方法

迭代取值:

  优点:

    1.不依赖于索引取值

    2.内存中永远只占一份空间,不会导致内存溢出

  缺点:

    1.不能够获取指定的元素

    2.取完之后会报错StopIteration

生成器

生成器:用户自定义的迭代器

def func():print('first')yield  666  # 函数内如果有yield关键字,那么加括号执行函数的时候并不会触发函数体代码的运行print('second')yield  777print('third')yield  888,999print('forth')yield
g = func()  # 生成器初始化:将函数变成迭代器
print(g)
print(g.__next__())
print(g.__next__())
print(g.__next__())打印结果:

<generator object func at 0x000001F4D0F73780>
first
666
second
777
third
(888, 999)

# yield后面跟的值就是调用迭代器__next__方法能得到的值

# yield既可以返回一个值,也可以返回多个值,并且多个值也是按照元组的形式返回

小练习:

有这样一个例子,如何把它写成一个生成器呢?

for i in range(1,10,2):
  print(i)

def my_range(start,end,step=2):   # 定义三个形参while start < end:                     yield start    # 返回start的值start += step     #每次循环start都加上step的值
for j in my_range(1,10,2):print(j)

View Code

yield的用法

yield支持外界为其传参

def eat(name):print('%s 准备开吃' %name)while True:food = yieldprint('%s 吃了 %s' %(name, food))g = eat('zhangsan')
g.__next__()   # 必须现将代码运行至yield,才能够为其传参
g.send('包子')   #send给yield左边的变量传值,其中触发了__next__方法
g.send('火腿')# 打印结果
zhangsan 准备开吃
zhangsan 吃了 包子
zhangsan 吃了 火腿# 当函数内有yield关键字的时候,调用该函数不会执行函数体代码,而是将函数变成生成器

小结:

yield:

  1.提供了一种自定义生成器方式

  2.会帮助将函数的运行状态暂停住

  3.可以返回值

与return之间异同点

  相同点:都可以返回值,并且都可以返回多个

  不同点:

    1.yield可以返回多次值,而return只能返回一次函数就会立即结束

    2.yield还可以接收外部传入的值

生成器生成式

  生成器不会主动执行任何一行代码,必须通过__next__触发代码的运行

with open('xxx.txt','r',encoding='utf-8') as f:g = (len(line) for line in f)print(sum(g))    #求和

练习

def add(n,i):return n+i
def test():for i in range(4):yield i
g=test()
for n in [1,10]:g=(add(n,i) for i in g)# 第一次for循环g=(add(n,i) for i in test())# 第二次for循环g=(add(n,i) for i in (add(n,i) for i in test()))
print(n)
res=list(g)
print(res)res的结果是多少

答案

[20,21,22,23]

View Code

内置方法

abs:绝对值

print(abs(-11.11))  # 求绝对值
l = [0,1,0]
print(all(l))  # 只要有一个为False就返回False
print(any(l))  # 只要有一个位True就返回True

callable :可调用的(可调用返回True,不可调用返回False)

l = [1,2,3]
def index():pass
print(callable(l))
print(callable(index))

# print(chr(97))  # 将数字转换成ascii码表对应的字符
# print(ord('a'))  # 将字符按照ascii表转成对应的数字

dir:获取当前对象名称空间里面的名字

l = [1,2,3]
print(dir(l))

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

s = """
print('hello baby~')
"""
eval(s)# 打印结果
hello  baby~
s1 = """print(1 + 2)for i in range(10):    print(i)"""eval(s1)

# 报错:SyntaxError: invalid syntax

# eval不支持逻辑代码,只支持一些简单的python代码

exec

s1 = """
print(1 + 2)
for i in range(10):print(i)
"""
exec(s1)

# 打印结果123456789

format 三种玩法
  {}占位
  {index} 索引
  {name} 指名道姓

isinstance:判断是否属于某个数据类型

n = 1
print(type(n))
print(isinstance(n,int))# 打印结果
<class 'int'>
True

print(pow(2,3))   #2的三次方# 打印结果
8

print(round(3.4))  #四舍五入# 打印结果
3

help:打印函数注释

def login():"""一起嗨皮:return:"""
print(help(login))

转载于:https://www.cnblogs.com/chengzige/p/11190559.html

迭代器、for循环本质、生成器、常用内置方法整理相关推荐

  1. python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05...

    迭代器 迭代器 迭代: # 更新换代(其实也是重复)的过程,每一次的迭代都必须基于上一次的结果(上一次与这一次之间必须是有关系的) 迭代器: # 迭代取值的工具 为什么用迭代器: # 迭代器提供了一种 ...

  2. Python基础总结之常用内置方法总结

    文章目录 前言 1.str 1.1.内置方法: 1.2.常用的内置方法 1.3.String模块的一些方法 2.list 2.1.内置方法 2.2.常用内置方法 3.tupple 3.1.内置方法 3 ...

  3. python常用内置模块-Python之OS模块常用内置方法汇总

    OS模块的常用内置方法 chdir修改当前工作目录到指定目录 Change the current working directory to the specified path. chmod修改一个 ...

  4. 字符串的常用内置方法

    字符串的常用内置方法 capitalize() 将字符串的第一个字符转换为大写. lower() 转换字符串中所有大写字符为小写. upper() 转换字符串中的小写字母为大写. swapcase() ...

  5. 数字、字符串、列表类型及常用内置方法

    目录 可变不可变类型 基本数据类型及内置方法 数字类型 整型 浮点型 数字类型总结 字符串类型 字符串类型的常用操作+内置方法 字符串类型总结 列表类型 列表类型的常用操作+内置方法 列表类型总结 可 ...

  6. python 类的内置方法_Python 类的常用内置方法

    类的内置方法(魔法方法): 凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,类的内置方法,会在满足某种条件下自动触发. 1.1__new__ __new__:在___init__触发前, ...

  7. JavaScript基础 -- js常用内置方法和对象

    JS中常用的内置函数如下: 1.eval(str):计算表达式的结果. 2.parseInt(str,n):将符串转换成整数数字形式(可指定几进制). 3.parseFloat(str):将字符串转换 ...

  8. python内置方法怎么使用_python的常用内置方法

    __author__ = 'coco' ''' python内置函数 ''' # all() 全为真,才为真 print(all([0,-2,3])) # False print(all([1,-2, ...

  9. python内置方法怎么使用_python中的常用内置方法

    s='sdfsdfsd' # # lista=[1,2,3,4,5] # # l2=reversed(lista) sli=slice(1,4,2) print(s[sli]) # # print(l ...

最新文章

  1. dataset string dataset
  2. linux-搜索查找类
  3. SAP UI5 jQuery.sap.formatMessage
  4. 阿联酋esma认证怎么做_百度爱采购企业认证是怎么做的?这些你要知道!
  5. c4503文件服务器,理光C3503/C4503/C5503检查状态下各项目说明解释
  6. 箱线图怎么判断异常值_异常数值识别(检测)
  7. svn 在windows下创建仓库子目录失败解决办法
  8. java线程知识点拾遗(排队CAS)
  9. Toggle和Slider组件
  10. 【超强、超详细Redis入门教程】
  11. 啊哈算法---快速排序(C语言)
  12. 斐讯K2刷机加上桥接网络
  13. C语言学习笔记-各项为正整数的一元二次方程的十字交叉法因式分解
  14. ES文件浏览器访问电脑共享文件夹,输入正确的密码、账号,始终在登录界面
  15. vscode源代码管理不显示修改的文件夹
  16. 一文带你吃透汉诺塔和其变形题
  17. [题解] 哈夫曼编码(附图分析)
  18. 红黑树与平衡二叉树_百图详解红黑树
  19. 用python 画太阳_Python PIL画一个太阳神的圆圈
  20. 计算机系统要素--第六章,02-HACK汇编编译器实现

热门文章

  1. java 内存分析之jmap 详细用法完整版(一)
  2. linux sed命令:查看gitlab配置文件删除注释行并过滤空行后的内容
  3. firefox设置代理服务器
  4. linux case if for语法
  5. golang函数入门示例
  6. Scala代码案例:统计三个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分
  7. npm教程:使用nrm切换镜像源
  8. Python3 编程示例:斐波纳契数列
  9. 【软考-软件设计师】总线结构
  10. mysql存储过程在实际开发中怎么用_MYSQL存储过程开发中怎么使用游标嵌套