Python之迭代器及可迭代对象

1 匿名函数
匿名函数:其实就是没有名字的函数

# 匿名函数也是必须加括号才能使用

语法格式:
    lambda 形参:返回值
     def index(形参):
         返回值

 res = lambda x:x**2
 
方法一
 def index(x):
     return x**2
 index(2)
 
方法二
 
res = lambda x,y:x+y
print(res(1, 2))
2 常见的内置函数
一些配合匿名函数一起使用的内置函数:

map zip max min filter

2.1 map函数
        map函数是Python内置函数之一,它可以对一个序列中的每个元素应用一个函数,并返回一个结果列表。

# 定义函数
def square(x):
    return x ** 2
 
# 应用函数
result = map(square, [1, 2, 3, 4, 5])
 
# 输出结果
print(list(result))  # 输出 [1, 4, 9, 16, 25]
        在上面的示例中,map函数将square函数作用于列表[1, 2, 3, 4, 5]中的每个元素,得到一个结果列表[1, 4, 9, 16, 25]。注意,最后还需要使用list函数将结果转换为列表形式。

        配合匿名函数使用

ll = [1, 2, 3, 4, 5, 6, 7]
res = map(lambda x: x ** 2, ll)  
print(list(res))  # [1, 4, 9, 16, 25, 36, 49]
2.2 zip函数
zip()函数是一个内置函数,用于将多个可迭代对象打包成一个元组序列,例如将两个列表 

a = [1, 2, 3] 和 b = ['a', 'b', 'c'] 打包成一个元组序列

 [(1, 'a'), (2, 'b'), (3, 'c')]。

它的语法为:

zip(*iterables)
        其中,iterables 是可迭代对象,可以是多个列表、元组或其他可迭代对象。zip()函数将会返回一个zip对象,其中的元素是由每个传入可迭代对象的元素一一对应生成的元组。

a = [1, 2, 3]
b = ['a', 'b', 'c']
c = zip(a, b)
print(list(c))  # [(1, 'a'), (2, 'b'), (3, 'c')]
 
# 可以使用*将zip对象转换为元组序列
a, b = zip(*[(1, 'a'), (2, 'b'), (3, 'c')])
print(a)  # (1, 2, 3)
print(b)  # ('a', 'b', 'c')
        可以看出,zip()函数返回的是一个zip对象,需要使用list()函数将其转换为列表或使用*操作符将其转换为元组序列。

2.3 max函数
        max函数是Python的内置函数之一,用于返回给定参数中的最大值。可以接受多个参数,也可以传入一个可迭代对象。

语法:

max(iterable, *[, default=obj, key=func]) 或 

max(arg1, arg2, *args[, key=func])

        其中,iterable是一个可迭代对象,default是当可迭代对象为空时返回的默认值(默认为抛出ValueError异常),key是定义一个函数,用于从每个参数中提取比较关键字。如果省略,则默认使用每个参数本身进行比较。

# 对于数字形参
print(max(1, 2, 3, 4, 5, 6))  # 输出6
print(max([-5, -3, 0, 3, 5], key=abs))  # 输出-5
 
# 对于字符串形参
print(max("apple", "banana", "orange"))  # 输出"orange"
print(max("apple", "banana", "orange", key=len))  # 输出"banana"
        以上例子中,我们可以看到,通过max函数,我们可以找到数字或字符串列表中的最大值,并指定一个可选的关键字来进行比较。

2.4 min函数
  min()是Python内置函数之一,用于返回给定可迭代对象中的最小值。可以接受任何可迭代对象作为参数,包括列表、元组、集合和字典等。

语法: 

min(iterable[, key=func])

参数:

iterable: 要查找最小值的可迭代对象。
key: 可选参数,指定一个函数,用于计算可迭代对象中每个元素的排序值,然后根据这个排序值来查找最小元素。默认为None,表示直接比较可迭代对象中的元素。
# 查找列表中最小值
>>> my_list = [5, 3, 8, 4, 2]
>>> min(my_list)
2
 
# 查找元组中最小值
>>> my_tuple = (9, 1, 6, 3, 5)
>>> min(my_tuple)
1
 
# 查找集合中最小值
>>> my_set = {8, 4, 2, 6, 3}
>>> min(my_set)
2
 
# 指定 key 函数来查找最小值
>>> words = ['apple', 'banana', 'orange', 'pear']
>>> min(words, key=len)
'pear'

2.5 filter 函数

    filter() 函数是 Python 内置的高阶函数,用于过滤序列(例如列表、元组等)中的元素。它的基本语法是:

filter(function, iterable)
其中,function 是一个函数,可以是内置函数或者自定义函数;iterable 是一个可迭代对象,如列表、元组、字典、集合等。

filter() 函数会通过对可迭代对象中的每个元素应用 function 函数进行筛选,返回一个新的可迭代对象,其中仅包含应用 function 函数后结果为 True 的元素。

以下是一个使用 filter() 函数筛选出列表中所有偶数的示例:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 
def is_even(num):
    return num % 2 == 0
 
even_numbers = filter(is_even, numbers)
print(list(even_numbers))  # 输出 [2, 4, 6, 8, 10]
在上述示例中,我们定义了一个函数 is_even(),它接收一个数字作为参数,检查该数字是否为偶数并返回 True 或 False。我们将这个函数作为第一个参数传递给 filter() 函数,同时将列表 numbers 作为第二个参数传递给它。filter() 函数返回一个新的可迭代对象 even_numbers,其中仅包含应用 is_even() 函数后结果为 True 的元素,我们将其转换为列表并输出。

3 可迭代对象
迭代:更新换代,每一次的更新都是基于上一次的结果

可迭代对象:
    内置有__iter__方法的都可以称之为是可迭代对象
    '内置': 直接可以使用点出来的

可迭代对象:
    str、list、dict、set、tuple、文件类型
以上基本数据类型都是可迭代对象

s.__iter__()
l.__iter__()
t.__iter__()
se.__iter__()
d.__iter__()
# b.__iter
file = open('a.txt', 'w')
file.__iter__()
可迭代对象调用__iter__方法之后就是迭代器对象了

print(s.__iter__()) # <str_iterator object at 0x0000023F68F31100>
print(iter(s))
 
def iter(s):
    return s.__iter__()
 
print(len(s))
print(s.__len__())
 
def len(s):
    return s.__len__()
__iter__开头的方法都有一个与之对应的简写:iter(s) 方法名()

4 迭代器对象
迭代器:
    内置有__iter__方法还内置有__next__方法
    
如何转为迭代器对象
    有可迭代对象调用__iter__()方法转为迭代器对象

# 可迭代对象调用多次__iter__方法仍然是迭代器对象
# print(res.__iter__().__iter__().__iter__())
 
#### 易错题
l = [1, 2, 3, 4]
print(l.__iter__().__next__()) # 1
print(l.__iter__().__next__()) # 1
print(l.__iter__().__next__()) # 1
print(l.__iter__().__next__()) # 1
 
res = l.__iter__()
print(res.__next__())  # 1
print(res.__next__())  # 2
print(res.__next__())  # 3
print(res.__next__())  # 4 

 5 for循环内部原理
for循环内部的原理:
        1. 首先把关键字in后面的可迭代对象转为迭代器对象
        2. while循环取值__next__迭代取值,当next取值完毕的时候会报错
        3. 当内部报错的时候,for循环进行了异常捕捉

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
 
res=l.__iter__()
while True:
    try:
        print(res.__next__())
    except:
        break
6 异常捕捉
什么是异常:
    异常就是错误发生的信号,如果不对该信号做处理,那么,异常发生的位置之后的代码都不能正常运行
    
6.1 异常的信息:
    1. Traceback:追踪信息,异常发生的位置
         File "D:/Python27/day17/05 for循环内部原理.py", line 21, in <module>
        # 有时候错误发生的信息可能会有很多行,你就找最后一行,然后点击可以跳转到错误发生的位置
        
    2. XXXError: 异常发生的类型
        NameError  KeyError  ...
    3. 错误发生的详细信息(最重要的:一般情况从这里就可以知道错位发生的原因)
        name 'a' is not defined

6.2异常的分类:
    1. 语法错误
        # 是代码运行过程中一开始就不允许的,只要语法错误,代码一定是不能够运行的
        # 通过代码提示就知道语法错误的原因
    2. 逻辑错误
        # 在编码过程中,逻辑错误是允许出现的
        但是我们应该尽量避免逻辑错误出现的可能性

6.3 异常如何进行捕捉:

        在Python中,异常处理是通过try和except语句实现的,可以在try块中放置可能会引发异常的代码,然后在except块中处理这些异常。以下是一个基本的语法格式:

try:
    # 可能会引发异常的代码
except ExceptionType:
    # 异常处理代码
        其中,ExceptionType是要捕获的异常类型,可以是Python内置的异常类型(如ValueError、TypeError等),也可以是自定义的异常类型。如果try块中的代码引发了指定类型的异常,程序将会跳转到对应的except块执行异常处理代码。

除了直接指定异常类型,还可以用多个except块处理不同类型的异常,或使用一个except块捕获所有异常。例如:

# 指定多个异常类型
try:
    # 可能会引发异常的代码
except (ValueError, TypeError):
    # 异常处理代码
 
# 捕获所有异常
try:
    # 可能会引发异常的代码
except Exception as e:
    # 异常处理代码,其中e是捕获到的异常对象
        在捕获到异常后,可以使用异常对象的属性和方法获取异常相关信息,例如错误消息等。常见的异常处理方式包括输出错误信息、重新抛出异常、执行特定的补救措施等。需要注意的是,在使用try-except语句处理异常时,应该尽量精确地指定异常类型,以免屏蔽掉其他未预料到的异常。

异常捕捉练习

l = [1,2,3,4,5,6,7]
res= l.__iter__()
while True:
    try:
        print(res.__next__())
    except Exception:
        break

————————————————
版权声明:本文为CSDN博主「森木在花开」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38104453/article/details/132856821

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值