首页 > 其他分享 >16迭代器/for循环本质/异常处理

16迭代器/for循环本质/异常处理

时间:2023-07-27 16:03:40浏览次数:28  
标签:__ .__ 迭代 16 iter 本质 print 取值

常见内置函数(补充)

 1.help()  查看注释信息
 help(len)

2.id()  返回一串相当于内存地址的数字
 print(id('jason'))

3.int()  类型转换、机制转换

4.isinstance()  判断数据类型
 print(type('jason') is str)  # 类型判断 别扭的很 不推荐
 print(isinstance('jason', str))  # True
 print(isinstance('jason', int))  # False

5.pow()  幂指数
 print(pow(10,2))

6.round()  四舍五入
 print(round(11, 1))  # 第二个参数控制需要保留几位小数部分
 print(round(11.29, 1))   #11.3
 print(round(11.59, 1))   #11.6

 7.sum()求和
 print(sum([11,2,2,3,4,3,2]))

可迭代对象

1.什么叫迭代?
迭代其实就是更新换代 每一次迭代的过程都需要依赖于上一次的结果
eg:游戏的更新其实就是版本的迭代

2.什么是可迭代对象?
内置有__iter__方法的都可以称之为是可迭代对象

"""
(1).大白话理解就是数据可以通过点的方式点出来__iter__
(2).__iter__该类代码的读法>>>:双下iter方法
千万不要读成杠杠iter杠杠、杠杠iter
"""

3.哪些数据是可迭代对象?
依次列举并尝试调用__iter__方法即可!!!

属于可迭代对象的有:
字符串、列表、字典、元组、集合、文件对象
可迭代对象其实就是为了后续迭代取值做准备
提供了不依赖于索引取值的方式

迭代器对象

1.什么是迭代器对象?
可迭代对象调用__iter__方法之后生成的结果就是迭代器对象
 2.迭代器对象的特征
含有__iter__方法和__next__方法

3.如何理解迭代器对象
迭代器对象能够极大的节省存储空间(平时所用空间很小,但是可以从里面取出很多东西)
eg:类似于哆啦A梦的口袋 不用的时候就是一个口袋的面积 用的时候可以从中取出很多数据

4.迭代器对象如何取值
调用__next__方法即可 如果取完了则会直接报错!!!

ps:开辟了一种不需要索引取值的方式(for循环底层依据的就是迭代器对象)

'''有了迭代器对象才出现了针对字典和集合的迭代取值操作'''

5.迭代器对象补充说明

( 1).有很多双下方法其实都有简便写法 但不是全部
"""
__方法名__ 等价 方法名()
最为常见的两个是
__iter__ iter()
__next__ next()

 

(2).有一些可迭代对象本身也是迭代器对象>>>:文件对象
( 3).可迭代对象调用一次__iter__方法变成迭代器对象 如果继续调用 结果还是迭代器对象本身
 res = s.__iter__()
res1 = s.__iter__().__iter__().__iter__()
print(res, res1)    # <str_iterator object at 0x10762bdd8> <str_iterator object at 0x107636dd8>  (这里的res和res1是一样的)

(4).迭代取值的要求
 print(s.__iter__().__next__()) #  j   每次先产生一个新的迭代器对象然后取值
 print(s.__iter__().__next__()) #  j   每次先产生一个新的迭代器对象然后取值
 print(s.__iter__().__next__()) #  j   每次先产生一个新的迭代器对象然后取值
 print(s.__iter__().__next__()) #  j   每次先产生一个新的迭代器对象然后取值

res = s.__iter__() # 已经变成迭代器对象了
print(res.__iter__().__next__()) # j 之后再调用还是自身
print(res.__iter__().__next__()) # a
print(res.__iter__().__next__()) # s
print(res.__iter__().__next__()) # o

for循环内部原理(先有的迭代器,后有的for循环)

 

①
l1 = [11,22,33,44,55,66,77,88]
'''需求:不依赖于for循环 完成对列表元素的取值'''
 res = l1.__iter__()
 n = 0
 while n < len(l1):
     print(res.__next__())
     n += 1
"""
for循环底层原理
    for 变量名 in 可迭代对象:
        循环体代码
1.会将in后面的数据调用__iter__()变成迭代器对象
    为什么文件对象也可以for循环 因为本身就是迭代器对象 再次调用不变
2.针对产生的迭代器对象依次调用__next__()方法迭代取值
3.当值取完之后 会自动处理报错并退出循环
"""
②
res = l1.__iter__()
while True:
    print(res.__next__())   #②中只有第三个需求:当值取完之后 会自动处理报错并退出循环,暂时不能达到

 

 

 

 

异常处理

1.什么是异常?
代码运行出错之后就是异常 异常会导致程序立刻停止
是我们以后在编程过程中需要极力避免的情况(异常的外号>>>:bug)

2.异常信息的组成部分

#举例子
Traceback (most recent call last):
  File "/Users/jiboyuan/PycharmProjects/day16/05 异常处理.py", line 3, in <module>
    name
NameError: name 'name' is not defined



(1).line关键字所在的一行
      用于提示你代码哪一行出错了 点击前面的蓝色字体可以直接定位
    '''如果报错的信息很长 一般最后一个才是'''
(2).NameError错误的类型
      代码的报错也可以分为很多类型
  (3).name 'name' is not defined
      具体的报错原因(就是解决报错的答案)

3.异常的分类

(1).语法异常
不被允许的 如果出现了必须立刻改正
eg:if分支结构都不会写...
if 1, while :,...

(2).逻辑异常
可以允许的 如果出现了尽快修改即可
eg:代码动态获取到了一个字符串类型的数据但是调用了列表的内置方法
name = 'jason'
print(name.append())
# 改bug其实就是在重新梳理你的思路
ps:有时候改bug是非常漫长且痛苦的 此时程序员尽量不要被打扰
"""
公司里面写代码的流程
  1.程序员写完之后自己先大致测试
   2.然后交给专门的测试人员去测试
"""

{4}.异常的类型(有很多 不一一列举)
print(name) # NameError 名字错误
 l1 = [11, 22, 33]
 print(l1[100]) # IndexError 索引错误
 d = {'name':'jason'}
 print(d['age']) # KeyError 键错误
 int('jason') # ValueError 值错误

异常处理实操(有时候针对可能会出错的代码 也可以自己提前写好处理措施)

正常情况下代码出错 肯定是直接导致程序停止
但是也可以自己通过代码来处理 从而避免程序的停止

①# 基本语法结构
    try:
    可能会出错的代码
  except 错误的类型1 as e:  # e指代的就是错误的提示信息
    针对性的处理措施
  except 错误的类型2 as e:  # e指代的就是错误的提示信息
    针对性的处理措施
  except 错误的类型3 as e:  # e指代的就是错误的提示信息
    针对性的处理措施
  ...

eg
try:
    name
except NameError as e:
    print('变量名没有定义!')
# 错误类型
    很多时候可能自己都不知道会报什么类型的错误
  '''万能异常:常见的报错都可以照单全收'''
②
try:
    可能会出错的代码
  except Exception as e:  
    统一的处理措施

"""
学到这里 有很多同学心里很高兴 以后永远都不会写bug了
只需要在代码的开头加try 所有代码全部写带try的里面 之后万能结尾
    这么做没有任何意义!!!
"""
#########################################
异常处理使用原则:
    1.被检测的代码越少越好
  2.能尽量少用就尽量少用
#########################################

异常处理了解

# 1.结合else使用
    当try检测的代码没有发生异常 正常运行完毕之后执行else的子代码
   
# 2.结合finally使用
    无论try检测的代码是否有异常 最后都会执行finally子代码

# 3.全部整合到一起使用
  try:
      name
  except Exception as e:     #错了才走这个异常
      print(e)
  else:
      print('没报错 好极了')   #没有报错进行打印这个
  finally:
      print('管你错不错 都执行')  #不管错不错都执行
    
# 4.断言(了解中的了解)
    name = 'jason'
    assert isinstance(name,str)  #不报错,什么结果都没有

        name = 'jason'
    assert isinstance(name,list)  #报错

 
# 5.主动报错(需要掌握)
    raise NameError('不爽 就要作!!!')
  '''由于是主动报错 所以可以非常明确的知道错误的类型'''

 

for循环的本质

 

# 利用while与异常捕获 实现for循环的功能
info = {'name': 'jason', 'age': 18, 'pwd': 123}
# 1.先转换成迭代器对象
# res  = info.__iter__() ①  #res为迭代器对象
res = iter(info) ①
# 2.迭代取值
while True:
    # print(res.__next__())  ②
    try:   #多加个异常捕获,解决刚刚第三个for循环不报错,并且自动结束的需求
        print(next(res))  ②
    except StopIteration as e:
        # 结束while循环
        break

 

迭代取值与索引取值的对比

1.索引取值
优势:可以反复获取相同的元素 并且没有固定的方向
劣势:只能支持有序的容器类型 无序的无法取值,兼容性没有迭代取值高
 
2.迭代取值
优势:兼容所有的容器类型
 劣势:取值的顺序永远都是从左往右 并且无法重复获取 取值完就完了
  # 真正底层的迭代取值后续可能很少用, 一般都是for循环代替
"""
迭代器里面的东西是固定的 每取一个就会少一个 取值完就空了
"""

 

 

 

 

标签:__,.__,迭代,16,iter,本质,print,取值
From: https://www.cnblogs.com/Milk1/p/17584674.html

相关文章

  • 16. 最接近的三数之和(threeSumClosest)
    给你一个长度为n的整数数组nums和一个目标值target。请你从nums中选出三个整数,使它们的和与target最接近。返回这三个数的和。假定每组输入只存在恰好一个解。 示例1:输入:nums=[-1,2,1,-4],target=1输出:2解释:与target最接近的和是2(-1+2+1=2)。示......
  • scrum工具管理敏捷产品迭代
    ​什么是Sprint Backlog? Sprint Backlog是Scrum的主要工件之一。在Scrum中,团队按照迭代的方式工作,每个迭代称为一个Sprint。在Sprint开始之前,PO会准备好产品Backlog,准备好的产品Backlog应该是经过梳理、估算和优先级排列的。在Sprint开始时,第一件事情是Sprint计划会议,在Sprin......
  • ChatGPT 在JavaScript中,由于Number类型只能表示52位精度,因此默认情况下无法进行超过16
    ChatGPT在JavaScript中,由于Number类型只能表示52位精度,因此默认情况下无法进行超过16位的乘法运算。但是,你可以使用BigInt来处理大数字。BigInt是目前JavaScript中处理超出Number精度限制的数字的最佳方式。它是一种新的数据类型,可以表示任意精度的整数。以下是一种解决方案:1.......
  • 安装nginx 1.16.1版本
    vi/etc/yum.repos.d/nginx.repo[nginx-stable]name=nginxstablerepobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/gpgcheck=1enabled=1gpgkey=https://nginx.org/keys/nginx_signing.key[nginx-mainline]name=nginxmainlinerepoba......
  • Day16(2023.07.26)
    行程9:00 到达上海市徐汇区宛平南路1099号城建大厦9:45  与客户进行漏扫方面交流11:30--13:00   吃饭休息13:30         管理方面交流16:30         下班......
  • Oracle日常性能问题查看 转载 https://www.cnblogs.com/yhq1314/p/10601630.html
    1判断回滚段竞争的sql--当Ratio大于2时存在回滚段竞争,需要增加更多的回滚段)selectrn.name,rs.GETS,rs.WAITS,(rs.WAITS/rs.GETS)*100ratiofromv$rollstatrs,v$rollnamernwherers.USN=rn.usn;2判断恢复日志竞争的sql,这句有问题不能使用--immediate_con......
  • 中国16岁女高中生徐卓媛成功登顶珠穆朗玛峰,在赞叹之余,她的成功会带给您怎样的启示?
    近日看到这样一个帖子:https://www.zhihu.com/question/601227878     ===============================================  对此我的观点是,富人的努力总比穷人的努力抓人眼球。在世人眼中,穷人的努力就是为了解决温饱,为了生计,为了基本的生理需求,而富人的努力则是......
  • m基于16QAM软解调和LDPC信道编译码的通信链路误码率仿真
    1.算法仿真效果matlab2022a仿真结果如下:   2.算法涉及理论知识概要基于16QAM软解调和LDPC信道编译码的通信链路包括以下主要步骤: 2.1数据源编码       在数据源编码阶段,输入的二进制数据会被编码为纠错码,以提高数据传输的可靠性。常用的纠错码包括卷积码、L......
  • Python【22】 __iter__, __next__, iterable, iterator, 可迭代对象, 迭代
    参考:https://www.jianshu.com/p/1b0686bc166d......
  • 2167 - 树的公共祖先(LCA)
    题目描述给定一棵树和两个不同的结点,求出他们最近的公共祖先父结点。已知该树有n个结点,标号1..n。输入第1行输入一个整数nn,代表结点数量(n≤100)第2行输入两个整数x,yx,y,表示需要计算的结点;以下n−1行,每行两个整数a和b,表示a的父结点是b。输出输......