迭代器

常见的内置函数

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

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

3.int()  类型转换机制

4.isinstance()  判断数据类型
print(type('bob')is str)
print(isinstance('bob', str))  # True

5.pow()  幂指数
print(pow(10, 3))  # 1000

6.round()  四舍五入
print(round(11.111,2))  # 11.11

7.sum()  求和
print(sum([1,2,3,4]))  # 8

可迭代对象

迭代
更新换代 每次迭代的过程都需要依赖上一次的结果
游戏更新就是这样的
单纯更新 不是迭代
import time
while Ture:
    print(123)
    time.sleep(0.2)
属于迭代
n = 1
while Ture:
    print(n)
    n += 1
迭代取值
l1 = [11, 22, 33, 44]
n = 0
while n < len(l1):
    print(l1(n))
    n += 1

2.可迭代对象
内置有__iter__方法有都可以称作可迭代对象

3.数据的可迭代对象
i = 11  # 整型不是
f = 11.11  # 浮点型不是
s = 'jason'  # 字符是
l = [1,2,3,4]  # 列表是
d = {'name':'jason','age':18}  # 字典是
t = (1,2,3,4)  # 元组是
se = {1,2,3,4,5}  # 集合是
b = True  # 布尔值不是
f = open()  # 文件是
def index():pass  # 普通函数不是
"""
属于可迭代对象的有
    字符串、列表、字典、元组、集合、文件对象
可迭代对象其实就是为了后续迭代取值做准备
    提供了不依赖于索引取值的方式
"""

迭代器对象

1.迭代对象
可迭代对象调用__iter__方法之后生成结果就是迭代器对象
2.迭代对象的对象的特征
含有__iter__方法和__next__方法
3.对迭代器的理解
可以很大节省储存空间
4.迭代器对象的取值
调用__next__方法即可 如果取完了则会直接出错
开辟了一种不需要索引取值的方式(for循环底层依据的就是迭代器对象)
'''有了迭代器对象才出现了针对字典和集合的迭代取值操作'''
5.迭代器对象补充说明
	# 1.有很多双下方法其实都有简便写法 但不是全部
  """
  __方法名__  等价  方法名()
      最为常见的两个是
          __iter__    iter()
          __next__    next()
  """
s = 'alarnun'
 res = s.__iter__()  # 已经变成迭代器对象了
  print(res.__iter__().__next__())  # a  之后再调用还是自身
  print(res.__iter__().__next__())  # l
  print(res.__iter__().__next__())  # a
  print(res.__iter__().__next__())  # r

for循环内部原理

l1 = [11, 22, 33, 44, ]
res = iter(l1)
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指代的就是错误的提示信息
    针对性的处理措施
  ...

# 错误类型
	很多时候可能自己都不知道会报什么类型的错误
  '''万能异常:常见的报错都可以照单全收'''
  try:
    可能会出错的代码
  except Exception as e:  
    统一的处理措施

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

异常处理了解

# 1.结合else使用try检测的代码没有发生异常 正常运行完毕之后执行else的子代码
  try:
    可能会出错的代码
  except Exception as e:  
    统一的处理措施
  else:
    可能会出错的代码没有出错 最后走else子代码
   
# 2.结合finally使用
	无论try检测的代码是否有异常 最后都会执行finally子代码
  try:
    name
	except Exception as e:
    print(e)
	finally:
    无论try检测的代码是否有异常 最后都会执行finally子代码
 
# 3.全部整合到一起使用
  try:
      name
  except Exception as e:
      print(e)
  else:
      print('没报错 好极了')
  finally:
      print('管你错不错 都执行')
    
# 4.断言(了解中的了解)
	name = 'jason'
	assert isinstance(name,str)
 
# 5.主动报错(需要掌握)
	raise NameError('不爽 就要作!!!')
  '''由于是主动报错 所以可以非常明确的知道错误的类型'''

for循环的本质

# 利用while与异常捕获 实现for循环的功能
info = {'name': 'jason', 'age': 18, 'pwd': 123}
# 1.先转换成迭代器对象
# res  = info.__iter__()
res = iter(info)
# 2.迭代取值
while True:
    # print(res.__next__())
    try:
        print(next(res))
    except StopIteration as e:
        # 结束while循环
        break

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

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

posted @   末笙  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示