在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