常用内置函数,可迭代对象,迭代器对象,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循环
'''
