根据程序员制定的规则循环生成数据,当条件不成立则生成数据结束。数据不是一次性全部生成处理,而是使用一个,再生成一个,可以节约大量的内存
生成器推导式
# 生成器创建方式:# 1. 生成器推导式,把列表推导式中的中括号改成小括号即可my_generator = (value * 2 for value in range(3))print(my_generator)# 生成器取值使用next函数,获取生成器中的下一个值# # 方式一:# value = next(my_generator)# print(value)# value = next(my_generator)# print(value)# # 当生成器已经没有值时,会抛出StopIteration,表示生成器生成数据完毕# value = next(my_generator)# print(value)# # 方式二:# while True:# try:# value = next(my_generator)# print(value)# except Exception as e:# break # 跳出循环表示取值完成# 方式三:(推荐)# for循环内部循环调用next函数获取生成器中的下一个值,当出现异常for循环自动进行了异常捕获for value in my_generator: print(value)# 2. yield:只要在函数里面看到yield,那么这个函数可以看成是一个生成器代码说明:
yield关键字
# 在函数里面看到有yield关键字,那么这个函数就是一个生成器def my_generator(): for i in range(3): print('开始生成数据啦...') yield i print('上一次的数据生成完了...')result = my_generator()print(result)# 获取生成器的值for value in result: print(value)生成器的使用场景(斐波那契数列)
0,1,1,2,3,5,8,13,21,34,...
现在我们可以使用生成器来实现斐波那契数列,每次取值都通过算法来生成下一个数据,生成器每次调用只生成一个数据,可以节省大量的内存。
# num表示生成斐波那契数列的个数def fibonacci(num): # 初始化前两个值 a = 0 b = 1 # 记录每次生成数据个数的索引 current_index = 0 # 循环判断条件是否成立 while current_index < num: result = a # 条件成立交换两个变量的值 a, b = b, a + b current_index += 1 yield result# 创建生成器f = fibonacci(10)for value in f: print(value)copy函数时浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象。
浅拷贝
# 浅拷贝:只会对可变类型的第一层对象进行拷贝,不会对子对象进行拷贝,# 拷贝成功后会开辟一个新的内存空间,存储拷贝的对象import copy# 不可变类型:数字、字符串、元组num1 = 1num2 = copy.copy(num1)# 查看后内存地址没有发生变化,说明没有进行浅拷贝,没有开辟新的内存空间print('num1:', id(num1), 'num2:', id(num2))my_tuple = (1, 3)my_tuple1 = copy.copy(my_tuple)print('my_tuple:', id(my_tuple), 'my_tuple1:', id(my_tuple1))# 对于不可变类型,进行浅拷贝,实际是对引用的拷贝,两个变量指向同一个内存地址# 可变类型:列表、字典、集合my_list = [1, 4, [5, 9]]my_list1 = copy.copy(my_list)print('my_list:', id(my_list), 'my_list1:', id(my_list1))# 只拷贝了第一层对象print('my_list[2]:', id(my_list[2]), 'my_list1[2]:', id(my_list1[2]))深拷贝
deepcopy函数时深拷贝,只要发现对象有可变型就会对该对象到最后一个可变类型的每一层对象进行拷贝,对每一层拷贝的对象都会开辟新的内存空间进行存储。
# 深拷贝:只要发现对象是可变类型,那么就会对该对象到最后一个可变类型的每一层对象# 进行拷贝,拷贝成功会开辟新的内存空间import copy# 不可变类型:数字、字符串、元组num1 = 1num2 = copy.deepcopy(num1)print('num1:', id(num1), 'num2:', id(num2))str1 = 1str2 = copy.deepcopy(str1)print('str1:', id(str1), 'str2:', id(str2))tuple1 = (1, 2)tuple2 = copy.deepcopy(tuple1)print('tuple1:', id(tuple1), 'tuple2:', id(tuple2))tuple3 = (1, [1, 2])tuple4 = copy.deepcopy(tuple3)print('tuple3:', id(tuple3), 'tuple4:', id(tuple4))print('tuple3[1]:', id(tuple3[1]), 'tuple4[1]:', id(tuple4[1]))# 可变类型:列表、字典、集合my_list1 = [1, [2, 4]]my_list2 = copy.deepcopy(my_list1)print('my_list1:', id(my_list1), 'my_list2:', id(my_list2))print('my_list1[1]:', id(my_list1[1]), 'my_list2[1]:', id(my_list2[1]))深拷贝和浅拷贝的区别
| 留言与评论(共有 0 条评论) “” |