常用内置函数,可迭代对象,迭代器对象,for循环本质,异常捕获


目录
  • 常用内置
  • 内置函数之max,min
  • 可迭代对象
  • 迭代器对象
  • for循环的本质

常用内置

匿名函数(lambda())
def lambda(x):
	pass
return x+2
lambda(7)
# lanmbda 后面跟着形参,返回值,实参.
print((lambda x:x+2)(7))

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

拉链(zip())
l = [1, 2, 3, 4, 5, 6, 7]
l1 = ['junjie', 'junjie1', 'junji2', 'junjie3']
res = zip(l, l1)
print(list(res))

# [(1, 'junjie'), (2, 'junjie1'), (3, 'junji2'), (4, 'junjie3')]

内置函数之max,min

max(),min()
max求最大值,min求最小值
l = [11, 22, 33, 44, 55, 66, 77]
print(max(l)) # 77
print(min(l) # 11
# 遇到字典max的应用
d = {
    'jason': 3000,
    'Bevin': 1000000,
    'Ascar': 10000000000,
    'aerry': 88888
}
def index(key):
    return d[key]
print(max(d,key=index))

1.flter(过滤)
l = [11, 22, 33, 44, 55, 66]
res = filter(lambda x:x > 30, l)
print(list(res)) # [33, 44, 55, 66]
      
2.reduce 归总
使用归总一定要加这段
# from functools import reduce
d = [11, 22, 33, 44, 55, 66, 77, 88, 99]
res = reduce(lambda x, y: x + y, d)
print(res)
res1 = reduce(lambda x, y: x + y, d, 100)  
# 还可以额外添加元素值

可迭代对象

迭代:迭代即为更新换代,每次更新必须都依赖上一次的结果
# 迭代就是给我们提供一种不依赖索引取值的方式
可迭代对象:
  内置有__itter__方法都称为可迭代对象
  内置的意思是可以通过点的方式直接查看
#针对双下划线开头,双下划线结尾的方法,称呼双下方法名

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]
res = l1.__iter__() # l1转换为可迭代对象
while True:
    print(res.__next__()) # 循环执行__next__取值
# 输出完列表内的数值会报错
for i in l1:
  print(i)
# for循环输出不会报错
'''
for循环内部原理:
1.将关键字in后面的数据先调用__iter__方法转为迭代器对象
2.循环执行__next__方法
3.取完之后__next__会报错,但是for循环会自动捕获该错误并处理

res = 数据.__iter__()
while True:
		检测代码是否会报错
		res.__next__()
		如果报错了自动处理并结束while循环
'''
![](https://img2020.cnblogs.com/blog/2608123/202111/2608123-20211119221511041-87633080.webp)