内置函数、迭代器、异常处理

常见内置函数

# 1.help()  用来查看函数注释信息
使用方法
help(len)
# 2.id() 返回一串相当于地址的数字
print(id(1))
# 3.int() 进行类型转换和进制转换
int('11')
# 4.isinistance() 判断数据类型
isinstance('jason',str)  # 类型判断正确返回True不正确返回False
# 5.pow() 指数幂
pow(10,5)  # 将返回10的5次方计算后的值
# 6.round()  # 返回数字四舍五入后的结果,第二个参数可以决定保留多少位小数
# 7.sun() 对数据集中的数字求和
list = (70,23,11.2,12)
print(sum(list))

可迭代对象

# 1.什么是迭代
	迭代就是更新换代,每一次迭代都需要依赖上一次的结果比如游戏或者软件的每一次更新,都是迭代
    '''
    单纯的循环并不是迭代,迭代必须依赖上一次的结果
    '''
while True:
    print(123)  #这不是迭代,这是循环

n = 0
while True:
    n += 1
    print(n)  # 这是迭代,每一此的结果都需要依赖于上一次
    
# 2.什么是可迭代对象
只要内置方法中有__iter__方法的都是可迭代对象
__iter__  的读法是双下iter
# 我们可以将每种基本数据类型后加点,来看看他是否具有__iter__方法
尝试之后就会发现,'可迭代对象都可以进行for循环',而之所以不说 '凡是能够被for循环的都能够被迭代的对象'。 是因为for循环是使用迭代器对象实现的,而生成迭代器对象的前提就是,该对象必须可迭代

迭代器对象

# 1.什么是迭代器对象
可迭代对象调用__iter__方法后的结果就是迭代器对象
# 2.迭代器对象的特征
含有__iter__和__next__方法
# 3.如何理解迭代器对象,
迭代器对象可以极大的节省存储空间
类似一个四次元口袋,只占很小的空间,但是可以拿出很多东西
# 4.迭代器对象如何取值
通过调用__next__方法,每调用一次取出一个元素顺序是从左向右,如果取完所有元素,在取就会报错(for循环的底层依据就是迭代器对象)
# 补充说明
# 1.有很多双下方法都可以简写,但并不是全部都可
    __方法名()__ 等价于 方法名()
    __iter__和__next__方法的简写最为常见
    print(s.__iter__()) <==> print(iter(s))
    print(s.__next__()) <==> print(next(s))
# 2.有一些可迭代对象本身也是迭代器对象 比如  文件对象
# 3.可迭代对象调用一次__iter__变成迭代器对象,调用多次__iter__同样也是
	s.__iter__() <==> s.__iter__().__iter__()
# 4.迭代取值的要求
    print(s.__iter__().__next__())  # j 每次先产生一个新的迭代器对象然后取值
    print(s.__iter__().__next__())  # j 每次先产生一个新的迭代器对象然后取值
    print(s.__iter__().__next__())  # j 每次先产生一个新的迭代器对象然后取值
    res = iter(s)
    next(res) # j
    next(res) # s
    next(res) # o

for循环内部原理

l1 = [1,2,3,2,1,5,4,8,7]
# 不依赖for循环 完成对列表的取值
res = iter(l1)
n = 0
while n<len(l1):
    print(next(res))
    n += 1
'''
for循环的底层原理:
for 变量名 in 可迭代对象
1.对in后面的可迭代对象调用__iter__()将其变成迭代器对象
2.对产生的迭代器对象调用__next__()方法迭代取值
3.取完值后 自动处理报错
'''

异常处理

# 1.什么是异常
代码运行出现错误就是异常,异常会导致程序停止运行,我们在编程过程要极力避免异常的出现(异常也被称之为bug)
# 2.异常信息的组成部分
Traceback (most recent call last):
  File "D:/py/pytest/work.py", line 300, in <module>
    res = iter(l1)
NameError: name 'l1' is not defined
    
    1.line关键字所在的那一行,,是用来提示你哪一行出错了点击line关键字前的类似地址信息的一串字符,可以跳转到错误行 '如果报错信息很长,一般最后一个才是'
    2.NameError 错误类型
    3.name 'l1' is not defined
     '具体的错误原因'
# 3.异常的分类
	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 错误类型 as e:  # e将获得错误的提示信息
    异常的处理措施
except 错误类型2 as e:  # e将获得错误的提示信息
    异常的处理措施'有点类似与分支结构,根据不同的情况执行不同的代码'
    
# 错误类型
当不知道会报什么类型的错误时可以使用 Exception
Exception常见的报错类型都可以接受
try:
    可能会报错的代码
except Exception as e:
    统一的处理措施
###### 异常处理的准则
1.被检测的代码越少越好
2.能尽量少用就少用
    

异常处理需要了解的

# 1.结合else使用
'''当try检测的代码没有出现异常时,就会执行else中的代码'''
    try:
        可能会出错的代码
	except Exception as e:  
		统一的处理措施
	else:
		可能会出错的代码没有出错 最后走else子代码
# 2.结合finally使用
'''无论有没有检测到异常都会执行finally的子代码'''
try:
    print('jason')
except Exception as e:
    print('e')
finally:
    print('hello')
>>>jason
>>>hello
# 3. else和finall一起使用
try:
    name
except Exception as e:
    print(e)
else:
    print('没有异常')
finally:
    print('我来了')
>>>name 'name' is not defined
>>>我来了
# 断言
name = 1
assert isinstance(name,str)  # 断言正确则程序正常实现,不正确就报错

# 主动报错
raise NameError('hello') #可以指定报错类型

for 循环的本质

# 利用while与异常捕获,实现for循环的功能

# 定义一个函数,并写一个形参用来接收被循环的数据
def index(data):
    # 将数据集转换成迭代器对象
    res = iter(data)
    # 循环迭代取值
    while True:
        # 捕获异常
        try:
            print(next(res))
		# 处理异常
        except Exception as e:
            break

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

1.索引取值
优势:可以反复的获取同一个元素,并且取值没有固定的方向
劣势:只能支持有序的容器类型,无需的无法直接取值,兼容性没有迭代器高
2.迭代取值
优势:兼容所有的容器类型
劣势取值顺序固定为从左向右,并且无法重复取值
posted @   名字只需六字  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示