Python基础篇---内置函数补充,迭代和异常
本章内容
• 常见内置函数
• 可迭代对象
• 迭代器对象
• 异常问题
• for循环内部原理和本质
• 迭代取值和索引取值的对比
常见内置函数
1.help() 查看注释信息
help(len) 输出 Return the number of items in a container.
2.id() 返回一串相当于内存地址的数字
print(id('1')) 输出 2294005398752
3.int() 类型转换、机制转换
print(int('22'))
输出 22
print(int(0b1100100))
输出 100
4.isinstance() 判断数据类型
s = 'str' print(isinstance(s,int)) 输出 False print(isinstance(s,str)) 输出 True
5.pow() 幂指数
print(pow(10,2)) # 10*10 输出 100 print(pow(3,4)) # 3*3*3*3 输出 81
6.round() 四舍五入
print(round(11, 1)) # 第二个参数控制需要保留几位小数部分 输出 11 print(round(11.128, 2)) 输出 11.13 print(round(11.1234, 3)) 输出 11.123
7.sum() 求和
s=sum([1,2,3,4,5,6,7,8,9]) print(s) 输出 45

1.认识可迭代对象之前我们要先知道什么是迭代?
迭代其实就是更新换代,每一次迭代的过程都需要依赖于上一次的结果,eg:游戏的更新。
迭代案列:
# 单纯的循环 不是迭代 import time while True: print('单纯的循环,不是迭代') time.sleep(1) # 属于迭代 n = 1 while True: print(n) n += 1 # 循环 且n的值是在上一次循环的n的基础上+1 # 迭代取值 l1 = [11, 22, 33, 44, 55] n = 0 while n < len(l1): print(l1[n]) n += 1
2.那我们知道了什么是迭代,那可迭代对象又是什么呢?
可迭代对象就是内置又__iter__方法的都可以称之为可迭代对象。
大白话理解就是数据可以通过点的方式点出来__iter__ __iter__该类代码的读法>>>:双下iter方法 千万不要读成杠杠iter杠杠、杠杠iter

3.那可迭代对象有哪些数据类型呢?
我们可以列举出所学过的数据类型,依次尝试调用__iter__方法即可。
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.如何理解迭代器对象?
迭代器对象能够极大的节省存储空间, 类似于哆啦A梦的口袋,不用的时候就是一个口袋的面积,用的时候可以从中取出很多数据, 类似于工厂车间 你需要什么我就立刻造什么 你不需要我就不造 节省资源。
4.迭代器对象如何取值?
调用__next__方法即可 如果取完了则会直接报错!!! 开辟了一种不需要索引取值的方式(for循环底层依据的就是迭代器对象)。 '''有了迭代器对象才出现了针对字典和集合的迭代取值操作'''
5.迭代器对象补充说明

♦ 双下方法的简编写法
""" __方法名__ 等价 方法名() 最为常见的两个是 __iter__ iter() __next__ next() """ s = '123' print(s.__iter__()) # <str_iterator object at 0x000001A1C23992E8> print(iter(s)) # <str_iterator object at 0x000001A1C22BA4E0> print(s.__len__()) # 3 print(len(s)) # 3
♦ 有些可迭代对象本身也是迭代器对象>>>:文件对象
s=open('b.txt') s.__iter__() # 内置有双下iter方法 s.__next__() # 内置有双下next方法
♦ 可迭代对象调用一次__iter__方法变成迭代器对象 ,如果继续调用,结果还是迭代器对象本身
s =[] res = s.__iter__() res1 = s.__iter__().__iter__() print(res, res1) # <list_iterator object at 0x000001708FA592E8> <list_iterator object at 0x000001708FA59518>
♦ 迭代取值的要求
s = [1,2,3] print(s.__iter__().__next__()) # 1 每次先产生一个新的迭代器对象然后取值 print(s.__iter__().__next__()) # 1 每次先产生一个新的迭代器对象然后取值 res = s.__iter__() # res成了迭代器对象 print(res.__iter__().__next__()) # 1 res是迭代器对象,再调用还是自身 print(res.__iter__().__next__()) # 2 res是迭代器对象,再调用还是自 print(res.__iter__().__next__()) # 3 res是迭代器对象,再调用还是自
异常问题
1.什么是异常?
代码运行出错之后就是异常,异常会导致程序立刻停止 , 我们还称其为'bug',是我们之后写代码需要规避的情况。
2.异常信息的组成部分
Traceback (most recent call last): File "E:/pythonProject/3.14/3.22.py", line 2, in <module> print(int(s)) TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
Flie 出错的文件路径 line 用于提示代码出错在哪一行 点击前方蓝色路径可以直接定位 TypeError 代码错误的类型,当前是数据类型的错误,代码的报错分很多类 nt() argument must be a string, a bytes-like object or a number, not 'list' 具体的报错原因
3.异常的分类
♦ 语法异常
在编写代码的时候语法异常是不被允许的,出现了就必须改正,例如:if分支语法,while语法等。
♦ 逻辑异常
可以允许的,如果出现了尽快修改即可。例如字符串类型却调用了列表的内置方法。
4.异常的类型(例举部分)
| 异常名称 | 错误类型 |
| NameError | 名字错误 |
| IndexError | 索引错误 |
| KeyError | 键错误 |
| ValueError | 值错误 |
| IndentationError | 缩进错误 |
5.
正常情况下代码出错肯定是直接导致程序停止,但是也可以自己通过代码来处理,从而避免程序的停止。

♦ 针对性的处理措施
try: 可能会出错的代码 except 错误的类型1 as e: # e指代的就是错误的提示信息 针对性的处理措施 except 错误的类型2 as e: # e指代的就是错误的提示信息 针对性的处理措施 except 错误的类型3 as e: # e指代的就是错误的提示信息
♦ 万能异常:常见的报错都可以照单全收
try: 可能会出错的代码 except Exception as e: 统一的处理措施
♦ 主动报错(需要掌握)
raise NameError('不爽 就要作!!!') # 由于是主动报错 所以可以非常明确的知道错误的类型
♦ 了解操作---结合else使用
当try检测的代码没有发生异常 正常运行完毕之后执行else的子代码 try: 可能会出错的代码 except Exception as e: 统一的处理措施 else: 可能会出错的代码没有出错 最后走else子代码
♦ 了解操作---结合finally使用
# 无论try检测的代码是否有异常 最后都会执行finally子代码 try: name print('1') except Exception as e: print('a') finally: print('b') # 无论try检测的代码是否有异常 最后都会执行finally子代码
♦ 了解操作---全部整合到一起使用
try: name except Exception as e: print('1') # 执行 else: print('没报错 好极了') # 不执行 finally: print('管你错不错 都执行') # 执行
♦ 了解操作---断言(了解中的了解)
name = 'jason' assert isinstance(name,str) # 不报错 assert isinstance(name,int) # 报错 ''' assert 在表达式条件为 false 的时候触发异常 '''
for循环的内部原理和本质
思考:不依赖于for循环,完成对下列列表元素的取值。
l = [11,22,33,44,55,66,77,88] res = l.__iter__() # res为迭代器对象,是l可迭代对象调用双下iter方法的返回值 n = 0 while n < len(l): print(res.__next__()) # 迭代输出 n += 1
for循环底层原理:
for 变量名 in 可迭代对象: 循环体代码
会将in后面的数据调用__iter__()变成迭代器对象 针对产生的迭代器对象依次调用__next__()方法迭代取值 当值取完之后 会自动处理报错并退出循环
for循环的本质:利用while与异常捕获 实现for循环的功能
info = {'name': 'jason', 'age': 18, 'pwd': 123}
# 1.先转换成迭代器对象
# res = info.__iter__()
res = iter(info)
# 2.迭代取值
while True:
try:
print(next(res)) # 当值不够的时候会报错 执行下方的异常捕获
except StopIteration as e:
# 结束while循环
break
1.索引取值
优点:可以反复获取相同的元素,并且没有固定的反向 缺点:只能支持有序的容器类型,无序的无法取值兼容性没有迭代取值高
2.迭代取值
优势:兼容所有的容器类型 劣势:取值的顺序永远都是从左往右,并且无法重复获取,只能获取一次
PS:真正底层的迭代取值后续可能很少用,一般都是for循环代替。





浙公网安备 33010602011771号