python初识函数(6)

引言

今天来讲点迭代器的内容,我们一开始接触到的for循环底层就是用了迭代器。

# 常见内置函数
# help()  查看注释信息
help(len)
# id()  返回一串相当于内存地址的数字
print(id('king'))  # 2524633022904
# int()  类型转换、进制转换
print(int('123'))  # 123
print(int(0x1564654))  # 22431316
# isinstance()  判断数据类型
print(type('king') is str)  # True
print(isinstance('king', str))  # True
# pow()  幂指数
print(pow(8,3))  # 512
# round()  四舍五入
print(round(11.59, 1))  # 11.6
# sum()求和
print(sum([11, 55, 99, 44]))  # 209

可迭代对象

迭代就是更新换代,每次迭代的过程都需要依赖上一次的结果,游戏的更新就是版本的迭代。可迭代对象必须要内置有双下iter方法。目前所学的知识中,字符串、列表、字典、元组、集合、文件对象是可迭代对象。

l = [1, 2, 3, 4]
l.__iter__()  # 点之后有__iter__()这个内置方法才是可迭代对象

迭代器对象

可迭代对象调用iter方法之后生成的结果就是迭代器对象,迭代器对象含有iter方法和next方法。迭代器对象能够极大的节省存储空间,想用的时候就能取出很多数据。迭代器对象取值是用next方法取值的。双下iter和双下next方法可以简写为iter()和next()。文件对象不调用iter()方法就含有iter和next方法,所以它本身就是迭代器对象。迭代器对象调用了iter方法之后得到还是它本身。

ls = [11, 22, 33, 55]
a = ls.__iter__()
print(a.__next__())  # 11
print(a.__next__())  # 22
print(a.__next__())  # 33
print(a.__next__())  # 55

for循环内部原理

for循环底层就是用到了迭代器对象,首先将in后面的可迭代对象用iter()变成迭代器对象,然后对迭代器对象一次调用next()方法来迭代取值,迭代器对象中的值取完会报错,底层处理报错然后退出循环。有了迭代器才有了for循环。

l1 = [11, 22, 33, 44, 55]
res = l1.__iter__()
while True:
    print(res.__next__())

异常处理

异常就是代码执行过程中报错了,异常的外号就是bug,我们在以后编程中要尽量避免产生异常。异常分为语法异常和逻辑异常,语法异常是不被允许的,语法异常表示你学的不好。逻辑异常表示你的逻辑思考在某处出现了错误,只要找到错误并改正即可。

File "G:/python_work/pythonProject2/迭代器对象.py", line 9, in <module>
    print(king)
NameError: name 'king' is not defined
'''
line关键字所在那一行是用来提醒你代码在哪一行出现了错误,可以点击前面的路径直接跳转到相应位置。下面的NameError是错误的类型,这个类型意思是名字错误。错误类型有很多种类。错误类型后面的一串字符串的意思是错误的原因
'''

异常处理实操

异常处理操作是为了防止代码出现错误让程序停止运行。但要记住异常处理使用的要求,第一点被检测的代码越少越好,第二点能尽量少用就尽量少用。异常处理发现第一个异常就不会执行下面的异常。

try:
    print(king)
except NameError as e:
    print('名字错误')
    print(e)
'''
try
可能会出错的代码
except 错误的类型 as e: 
针对性的处理措施
e 得到的就是错误的原因
有时候不知道错误的类型可以用万能异常Exception,记住这个万能异常可以处理常见的报错,一些稀奇的可能处理不了。
'''
# 结合else和finally一起是用
try:
    可能会出错的代码
except:
    统一的处理措施
else:
    可能会出错的代码没有出错 最后走else子代码
finally:
    无论try检测的代码是否有异常 最后都会执行finally子代码
# 断言
name = 'jason'
assert isinstance(name, str)  # 如果结果是True正常运行,False就报错  AssertionError
# 主动报错
raise NameError('不爽 就要作!!!')  # 主动报明确的错误类型。

for循环的本质

学完了迭代器,我们可以开始讲讲最终版的for循环本质了

ls = [11, 22, 33, 44]
res = ls.__iter__()
while True:
    try:
        print(res.__next__())
    except StopIteration:  
        break  # 触发异常主动退出循环

总结

今天的学习让我们知道了迭代取值这种新的取值方法,迭代取值和索引取值的区别在于索引取值可以繁复获取相同的元素并且没有固定的方向,迭代取值取值顺序永远都是从左往右并无法重复获取。迭代取值兼容所有的容器类型,索引取值只支持有序的容器类型。

posted @ 2022-03-23 16:55  小金同学要加油  阅读(36)  评论(0)    收藏  举报