Python 可变类型和不可变类型,可迭代对象、迭代器和生成器

在Python中,变量可以分为可变类型和不可变类型。这两种类型主要指的是变量的值是否可以被修改。

1、不可变类型(Immutable):
不可变类型的对象一旦创建,就不能被修改。任何对不可变对象的操作都会返回一个新的对象,而不是在原对象上进行修改。常见的不可变类型有:

例子:

示例:

示例:

  • int
  • float
  • bool
  • str
  • tuple
  • # 不可变类型示例 - 整数
    a = 5
    b = a  # 创建一个新的变量b,其值与a相同
    b = b + 2  # 修改b的值,但不影响a的值
    
    print(a)  # 输出:5
    print(b)  # 输出:7
    # 不可变类型示例 - 字符串
    str1 = "Hello"
    str2 = str1  # 创建一个新的字符串对象str2,其值与str1相同
    str2 = str2 + " World"  # 修改str2的值,但不影响str1的值
    
    print(str1)  # 输出:Hello
    print(str2)  # 输出:Hello World

    2、可变类型(Mutable):
    可变类型的对象在创建后可以被修改。对可变对象的操作会直接影响原对象,而不会创建新的对象。常见的可变类型有:

  • list
  • dict
  • # 可变类型示例 - 列表
    list1 = [1, 2, 3]
    list2 = list1  # 创建一个新的列表对象list2,与list1共享相同的内存地址
    
    list2.append(4)  # 修改list2,也会影响list1
    
    print(list1)  # 输出:[1, 2, 3, 4]
    print(list2)  # 输出:[1, 2, 3, 4]
    # 可变类型示例 - 字典
    dict1 = {'a': 1, 'b': 2}
    dict2 = dict1  # 创建一个新的字典对象dict2,与dict1共享相同的内存地址
    
    dict2['c'] = 3  # 修改dict2,也会影响dict1
    
    print(dict1)  # 输出:{'a': 1, 'b': 2, 'c': 3}
    print(dict2)  # 输出:{'a': 1, 'b': 2, 'c': 3}

    3、可迭代对象:

  • 可迭代对象是能够逐个返回其元素的任何Python对象。
  • 可迭代对象实现了__iter__()方法,该方法返回一个迭代器。
  • 常见的可迭代对象包括列表、元组、字符串、字典、集合等。
  • 可以使用for循环对可迭代对象进行迭代。
    my_list = [1, 2, 3, 4]
    for item in my_list:
        print(item)

    4、迭代器:

  • 迭代器是表示数据流的对象,必须实现两个方法:__iter__()__next__()
  • __iter__()方法返回迭代器对象本身。
  • __next__()方法返回数据流的下一个元素,并在没有更多元素时引发StopIteration异常。
  • 可以为自定义对象创建迭代器,使其能够在for循环中使用。
    class A(object):
        def __init__(self, num):
            print("__init__")
            self.num = num
            self.start_num = -1
    
        def __iter__(self):
            '''
            @summary: 迭代器,生成迭代对象时调用,返回值必须是对象自己,然后for可以循环调用next方法
            '''
            print("__iter__")
            return self
    
        def __next__(self):
            '''
            @summary: 每一次for循环都调用该方法(必须存在)
            __next__()方法是迭代器协议中的一个特殊方法,用于定义迭代器的行为。
            当你使用内置的next()函数来迭代一个对象时,解释器会自动调用该对象的__next__()方法来获取下一个元素
            '''
            self.start_num += 1
            if self.start_num >= self.num:
                raise StopIteration()
            return self.start_num
    
        def __str__(self):
            '''
            @summary:
            __str__: 这是一个用于返回对象的字符串表示的特殊方法。当你使用print函数或str()函数时,
            解释器会自动调用对象的__str__方法来获取对象的字符串表示
            '''
            return f"A instance with x = {self.num}"
    
    
    if __name__ == "__main__":
        a=A(10)
        print(a)
        for i in a:
            print(i)

    结果

    C:\Users\Thinkpad\AppData\Local\Programs\Python\Python39\python.exe C:/Users/Thinkpad/Desktop/iter/main.py 
    __init__
    A instance with x = 10
    __iter__
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Process finished with exit code 0
    

    5、生成器:

  • 生成器是使用函数创建迭代器的简洁方式。
  • 它们使用yield语句定义,允许函数在产生值的同时将执行权让给调用者,而不会丢失其状态。
  • 生成器会自动实现__iter__()__next__()方法。
  • 生成器在内存上效率高,因为它们会即时生成值,而不是将它们存储在内存中。
  • def my_generator(data):
        for item in data:
            '''
            相当于return,但是区别在与函数不会终止,会在下一个循环继续执行
            遇到yield继续返回暂停
            在每次循环迭代中,生成器函数my_generator被调用,并且从上次暂停的地方继续执行,直到遇到下一个yield语句为止。
            yield语句产生一个值,并将执行权返回给循环,循环将打印生成器产生的值
            '''
            yield item
            print("lll",item)
    
    
    gen = my_generator([1, 2, 3, 4])
    
    for item in gen:
        print(item)

    结果

    C:\Users\Thinkpad\AppData\Local\Programs\Python\Python39\python.exe C:/Users/Thinkpad/Desktop/iter/main.py 
    1
    lll 1
    2
    lll 2
    3
    lll 3
    4
    lll 4
    
    Process finished with exit code 0
    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值