Python知识十二,可迭代对象,迭代器对象,for循环的本质,异常捕获

昨日内容回顾

  • 递归函数

    递归:函数在执行过程中直接或者间接的调用了自己
    
    在python中函数的递归不能无限进行进去 有一个最大递归深度(1000)
    
    递归应该包含两个部分
    	递推:一步步往前推导出一个明确的结果(每次推导复杂度要降低)
        回溯:根据一个明确的结果回溯出最原始的需求的答案
        # 合格的递归函数必须每次复杂度降低并且有明确的结束条件
       
    递归函数到底可以解决哪些问题
    	有些代码需要反复执行 并且每次执行的对象都是上次简单一些
     
    实战案例
    	l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]
    
  • 算法之二分法

    算法即解决问题的高效方法
    
    二分法:
        1.能够口头表达出该算法逻辑
        2.能够手写出该算法伪代码
     
    二分法前提:
        数据集必须有有序的
      
    当我们要查找的元素就在数据集的开头那么该算法可能不是很高效
    target_list = [...]
    def my_two(target_list,target_num):
        if len(target_list) == 0:
            print('该元素不存在')
            return
        middle_index = len(target_list)//2
        if target_num > target_list[middle_index]:
            target_right = target_list[middle_index+1:]
            my_two(target_right,target_num)
        elif target_num < target_list[middle_index]:
            target_left = target_list[:middle_index]
            my_two(target_left,target_num)
        else:
            print('find it',target_num)
    
  • 三元表达式

    # 二选一的情况下推荐使用(最好不要嵌套)
    值1 if 条件 else 值2
    '''条件成立用值1 不成立用值2'''
    
    is_free = input('is_free>>>:').strip()
    is_free = '收费' if is_free=='y' else '免费'
    
  • 列表生成式

    # 使用频率很高
    [通过条件判断之后的变量名 for 变量名 in 可迭代对象 if 条件]
    
    l = [1,2,3,4,5,6,7]
    res = [i+1 for i in l if i != 4]
    
  • 其他式补充

    枚举
    	enumerate(l,start=1)
    字典 
    res = { i:j for i,j in enumerate(l)}
    集合
    res = {i for i,j in enumerate(l)}
    # 小括号不是生成式 是迭代器
    
  • 匿名函数

    lambda 形参:返回值
    # 匿名函数一般不单独使用 主要配合其他函数一起使用
    
    map()  # 映射
    map(函数名,可迭代对象)  # 结果是一个迭代器(老母猪)
    

今日内容概要

  • 结合匿名函数一起使用的函数
  • 可迭代对象
  • 迭代器对象
  • for循环内部本质
  • 生成器
  • 常见内置函数

今日内容详细

常用内置函数

# 1.map()  映射
l = [1,2,3,4]
map(lambda x:x+1,l)  # 循环获取列表中每个元素并传递给匿名函数保存返回值

# 2.zip()  拉链
l = [11, 22, 33, 44, 55, 66, 77]
name_list = ['jason', 'kevin', 'tony', 'jerry']
l1 = [1, 2, 3, 4, 5, 6, 7]
l2 = [8, 7, 6, 4, 3, 2, 1]
# new_list = []
# for i in range(len(l)):
#     new_list.append((l[i],name_list[i]))
# print(new_list)
res = zip(l, name_list, l1, l2)
print(list(res))

# 3.max与min  max求最大值 min求最小值
# l = [11, 22, 33, 44, 55, 66, 77]
# print(max(l))
# print(min(l))

d = {
    'jason':3000,
    'Bevin':1000000,
    'Ascar':10000000000,
    'aerry':88888
}
# def index(key):
#     return d[key]
# print(max(d,key=lambda key:d[key]))  # for循环先取值 之后再比较大小
"""
A-Z  65-90
a-z  97-122
"""
# print(min(d,key=lambda key:d[key]))  # jason

# 4.filter  过滤
l = [11, 22, 33, 44, 55]
res = filter(lambda x: x > 30, l)
print(list(res))  # [33, 44, 55]

# 5.reduce  归总
from functools import reduce
d = [11, 22, 33, 44, 55, 66, 77, 88, 99]
res = reduce(lambda x, y: x + y, d)
res1 = reduce(lambda x, y: x + y, d, 100)  # 还可以额外添加元素值
print(res)

可迭代对象

# 迭代
	迭代即更新换代 每次的更新都必须依赖于上一次的结果
    
'''迭代其实给我们提供了一种不依赖索引取值的方式'''

# 可迭代对象
	内置有__iter__方法的都称之为可迭代对象	
    	内置的意思是可以通过点的方式直接查看到的
    """
    针对双下滑线开头 双下滑线结尾的方法 最为专业标准的读法为
    	双下方法名
    	
    面向对象的时候为了与隐藏变量区分开
    """
 
# n = 1
# while True:
#     n+=1
#     print(n)

# l = [11,22,33,44,55,66]
# n = 0
# while n < len(l):
#     print(l[n])
#     n += 1

i = 12  # 没有
f = 11.11  # 没有
s = 'jason'  # 有
l = [111,22,33,4]  # 有
d = {'username':'jason','pwd':123}  # 有
t = (11,22,33)  # 有
se = {11,22,33}  # 有
b = True  # 没有
# file = open(r'a.txt','w',encoding='utf8')
"""
含有__iter__的有
    字符串 列表 字典 元组 集合 文件对象
上述通常为可迭代对象
"""
print(d)
print(d.__iter__())  # 等价于调用了一个内置方法 d.get()
print(iter(d))
print(d.__len__())
print(len(d))
"""
可迭代对象调用__iter__方法会变成迭代器对象(老母猪)

__iter__方法在调用的时候还有一个简便的写法iter()
    一般情况下所有的双下方法都会有一个与之对应的简化版本 方法名()
"""

迭代器对象

"""
迭代器对象
    即含有__iter__方法 又含有__next__方法
如何生成迭代器对象
    让可迭代对象执行__iter__方法

文件对象本身即是可迭代对象又是迭代器对象
迭代器对象无论执行多少次__iter__方法 还是迭代器对象(本身)

迭代器给我们提供了不依赖于索引取值的方式
"""
i = 12  # 没有
f = 11.11  # 没有
s = 'jason'  # 有
l = [111,222,333,444]  # 有
d = {'username':'jason','pwd':123}  # 有
t = (11,22,33)  # 有
se = {11,22,33}  # 有
b = True  # 没有
file = open(r'a.txt','w',encoding='utf8')

# res = s.__iter__()  # 转成迭代器对象
# print(res.__next__())  # 迭代器对象执行__next__方法其实就是在迭代取值(for循环)
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())
# print(res.__next__())


# res = d.__iter__()  # 转成迭代器对象
# print(res.__next__())  # 迭代器对象执行__next__方法其实就是在迭代取值(for循环)
# print(res.__next__())
# print(res.__next__())  # 取完元素之后再取会"报错"

# 易错
# print(d.__iter__().__next__())  # username
# print(d.__iter__().__next__())  # username
# print(d.__iter__().__next__())  # username
# print(d.__iter__().__next__())  # username
# print(d.__iter__().__next__())  # username
# print(d.__iter__().__next__())  # username

for循环的本质

l1 = [1,2,3,4,5,6,7,8,9,11,22,33,44,55]
# 循环打印出列表中每个元素 但是不能使用for循环  __next__()  next()
# 1.先将列表转为迭代器对象
# res = l1.__iter__()
# # 2.循环执行__next__取值
# while True:
#     print(res.__next__())

# for i in l1:
#     print(i)
"""
for循环内部原理
    1.将关键字in后面的数据先调用__iter__方法转为迭代器对象
    2.循环执行__next__方法
    3.取完之后__next__会报错 但是for循环会自动捕获该错误并处理

res = 数据.__iter__()
while True:
    检测代码是否会报错
    res.__next__()
    如果报错了则自动处理掉并结束while循环
"""

异常捕获

# 什么是异常
	代码运行出错会导致异常 异常发生后如果没有解决方案则会到底整个程序结束
 
# 异常三个重要组成部分
	1.traceback
    	翻到最下面从下往上的第一个蓝色字体鼠标左键点击即可跳转到错误的代码所在的行
    2.XXXError
    	错误的类型
    3.错误类型冒号后面的内容
    	错误的详细原因(很重要 仔细看完之后可能就会找到解决的方法)

# 错误的种类   
    1.语法错误
    	不被允许的 出现了应该立刻修改!!!
    2.逻辑错误
    	可以被允许的 出现了之后尽快修改即可
   		'''修改逻辑错误的过程其实就是在从头到尾理清思路的过程'''
        
# print(idna)  # NameError
# l = [11,22,33]
# print(l[100])  # IndexError
# d = {'username':'jason'}
# print(d['xxx'])  # KeyError
# int('abc')  # ValueError

"""
基本语法结构
    try:
        有可能会出错的代码
    except 错误类型 as e:
        出错之后对应的处理机制(e是错误的详细信息)
    except 错误类型 as e:
        出错之后对应的处理机制(e是错误的详细信息)
    except 错误类型 as e:
        出错之后对应的处理机制(e是错误的详细信息)
"""
# try:
#     int('abc')
# except NameError as e:
#     print('变量名name不存在',e)
# except ValueError:
#     print('值不是纯数字')

# 万能异常
try:
    # int('abc')
    print(name)
    # l = [11]
    # l[100]
except Exception:
    print('你来啥都行 无所谓')

"""
异常捕获句式和万能异常
    1.有可能会出现错误的代码才需要被监测
    2.被监测的代码一定要越少越好
    3.异常捕获使用频率越低越好
"""

作业

1.整理今日内容及博客
2.实现完整for循环功能
3.练习装饰器相关代码及练习题
posted @ 2021-11-22 21:15  弑悟  阅读(6)  评论(0)    收藏  举报