今日总结

常见内置函数

1.help():查看注释信息
 
2.id():返回一串内存地址的数字
 
3.int():类型转换、进制转换
    
4.isinstance():判断数据类型,结果是bool5.pow():幂指数
    
6.round():四舍五入,第二个参数控制需要保留几位小数部分
    
7.sum():求和

可迭代对象

# 迭代其实就是更新换代,每一次迭代的过程都需要依赖于上一次的结果,单纯的循环不是迭代
eg:
n = 1
 while True:
    print(n)
     n += 1   # 这个函数就属于是迭代
        
# 迭代取值
eg:l1 = [11, 22, 33, 44, 55]
   n = 0
   while n < len(l1):
   		print(l1[n])
   		 n += 1
            
# 可迭代对象
内置有__iter__方法的都可以称之为是可迭代对象(__iter__读法:双下iter方法)
# 可迭代的数据类型都是可for循环的数据类型,有字符串、列表、字典、元祖、集合、文件对象

迭代器对象

# 可迭代对象调用__iter__方法之后生成的结果就是迭代器对象
# 迭代器的特征就是含有__iter__方法和__next__方法
# 迭代器对象能够极大的节省存储空间,类似于哆啦A梦的口袋,不用的时候就只占用一个口袋的位置,使用的时候能够拿出很多东西
# 调用__next__方法可以迭代取值,全部取完之后再继续取的话会报错(for循环底层依据的就是迭代器对象,可以不用索引取值)
# __iter__可以简写成iter(),__next__可以简写成next()
# 文件对象本身就是迭代器对象
# 可迭代对象调用一次__iter__方法编程迭代器对象,如果继续调用,结果还是迭代器对象本身
# 迭代取值的要求
 eg: print(s.__iter__().__next__())  # j 每次先产生一个新的迭代器对象然后取值
     print(s.__iter__().__next__())  # j 每次先产生一个新的迭代器对象然后取值
    
    res = s.__iter__()   # 已经变成迭代器对象了
 	print(res.__iter__().__next__())  # j  之后再调用还是自身
  	print(res.__iter__().__next__())  # a

for循环内部原理

不依赖for循环,完成对列表元素的取值
eg:l1 = [11,22,33,44,55,]
res = l1.__iter__()
 n = 0
 while n < len(l1):
     print(res.__next__())
     n += 1
# for循环底层原理:
for  变量名  in 可迭代对象:
		循环体代码
 1.会将in后面的数据调用__iter__()变成迭代器对象
 2.针对产生的迭代器对象依次调用__next__()方法迭代取值
 3.取完所有值之后就会自动处理报错并退出循环
eg:res = l1.__iter__()
    while True:
        print(res.__next__())

异常处理

# 异常就是代码运行出错,异常会导致程序立刻停止(bug)
# 异常信息的组成部分
1. Traceback
翻到最下面从下往上的第一个蓝色字体鼠标左键点击即可跳转到错误的代码所在的行
2. XXXError
错误的类型
3. 错误类型冒号后面的内容
错误的详细原因(很重要,仔细看完之后可能就会找到解决的方法)
# 异常的分类
1.语法异常:不被允许的,如果出现了必须立刻改正
2.逻辑异常:可以允许的,如果出现了尽快修改即可
# 改bug其实就是在重新梳理你的思路
# 异常的类型
1.NameError(名字错误)
2.IndexError(索引错误)
3.KeyError(键错误)
4.ValueError(值错误)

异常处理实操

# 面对代码异常,可以自己提前写好处理措施
# 基本语法结构
try:
    可能会出错的代码
  except 错误的类型1 as e:  # e指代的就是错误的提示信息
	针对性的处理措施
  except 错误的类型2 as e:  # e指代的就是错误的提示信息
     针对性的处理措施
        ...
        
 # 万能异常:常见的报错都可以照单全收
		try:
    		可能会出错的代码
  		except Exception as e:  
    		统一的处理措施
            
 # 异常处理使用尊则
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:
            
  3.全部整合到一起使用
  try:
      name
  except Exception as e:
      print(e)
  else:
      print('没报错 好极了')
  finally:
      print('管你错不错 都执行')
        
  4.主动报错
	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.节省内存
# 缺点
1.不能知道可迭代对象的长度。只能往前走,不能往后走
 
# 索引取值的优点
1.可以反复获取相同的元素,并且没有固定方向
# 缺点
1.只能支持有序的容器类型 无序的无法取值兼容性没有迭代取值高