常见内置函数
使用方法
help(len)
print(id(1))
int('11')
isinstance('jason',str)
pow(10,5)
list = (70,23,11.2,12)
print(sum(list))
可迭代对象
迭代就是更新换代,每一次迭代都需要依赖上一次的结果比如游戏或者软件的每一次更新,都是迭代
'''
单纯的循环并不是迭代,迭代必须依赖上一次的结果
'''
while True:
print(123)
n = 0
while True:
n += 1
print(n)
只要内置方法中有__iter__方法的都是可迭代对象
__iter__ 的读法是双下iter
尝试之后就会发现,'可迭代对象都可以进行for循环',而之所以不说 '凡是能够被for循环的都能够被迭代的对象'。 是因为for循环是使用迭代器对象实现的,而生成迭代器对象的前提就是,该对象必须可迭代
迭代器对象
可迭代对象调用__iter__方法后的结果就是迭代器对象
含有__iter__和__next__方法
迭代器对象可以极大的节省存储空间
类似一个四次元口袋,只占很小的空间,但是可以拿出很多东西
通过调用__next__方法,每调用一次取出一个元素顺序是从左向右,如果取完所有元素,在取就会报错(for循环的底层依据就是迭代器对象)
__方法名()__ 等价于 方法名()
__iter__和__next__方法的简写最为常见
print(s.__iter__()) <==> print(iter(s))
print(s.__next__()) <==> print(next(s))
s.__iter__() <==> s.__iter__().__iter__()
print(s.__iter__().__next__())
print(s.__iter__().__next__())
print(s.__iter__().__next__())
res = iter(s)
next(res)
next(res)
next(res)
for循环内部原理
l1 = [1,2,3,2,1,5,4,8,7]
res = iter(l1)
n = 0
while n<len(l1):
print(next(res))
n += 1
'''
for循环的底层原理:
for 变量名 in 可迭代对象
1.对in后面的可迭代对象调用__iter__()将其变成迭代器对象
2.对产生的迭代器对象调用__next__()方法迭代取值
3.取完值后 自动处理报错
'''
异常处理
代码运行出现错误就是异常,异常会导致程序停止运行,我们在编程过程要极力避免异常的出现(异常也被称之为bug)
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
'具体的错误原因'
1.语法异常
'语法异常时不被允许的,如果出现必须立刻进行改正'
2.逻辑异常
'可以允许但是出现后,也要尽快进行改正'
print(name)
l1 = [11, 22, 33]
print(l1[100])
d = {'name':'jason'}
print(d['age'])
int('jason')
异常处理操作
'''针对可能会出错的代码 可以自己提前写好处理措施'''
正常情况下 代码出错会直接导致程序停止运行,但可以通过异常处理,让代码继续运行
try:
可能会出错的代码
except 错误类型 as e:
异常的处理措施
except 错误类型2 as e:
异常的处理措施'有点类似与分支结构,根据不同的情况执行不同的代码'
当不知道会报什么类型的错误时可以使用 Exception
Exception常见的报错类型都可以接受
try:
可能会报错的代码
except Exception as e:
统一的处理措施
1.被检测的代码越少越好
2.能尽量少用就少用
异常处理需要了解的
'''当try检测的代码没有出现异常时,就会执行else中的代码'''
try:
可能会出错的代码
except Exception as e:
统一的处理措施
else:
可能会出错的代码没有出错 最后走else子代码
'''无论有没有检测到异常都会执行finally的子代码'''
try:
print('jason')
except Exception as e:
print('e')
finally:
print('hello')
>>>jason
>>>hello
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 循环的本质
def index(data):
res = iter(data)
while True:
try:
print(next(res))
except Exception as e:
break
迭代取值与索引取值的对比
1.索引取值
优势:可以反复的获取同一个元素,并且取值没有固定的方向
劣势:只能支持有序的容器类型,无需的无法直接取值,兼容性没有迭代器高
2.迭代取值
优势:兼容所有的容器类型
劣势取值顺序固定为从左向右,并且无法重复取值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人