day05

今天首先要说的是深拷贝和浅拷贝。
copy/deepcopy
我觉得这个问题直接用代码说话比较直观

import copy
a=[1,2,3,4,[1,2,3]]
b=a
c=copy.copy(a)
d=copy.deepcopy(a)
a.append(5)
a[4].append(4)
结果:
	a -->[1,2,3,4,[1,2,3,4],5]
	b -->[1,2,3,4,[1,2,3,4],5]
	c -->[1,2,3,4,[1,2,3,4]]
	d -->[1,2,3,4,[1,2,3]]

解释:b是赋值,c是浅拷贝,d是深拷贝,所以得出结论,赋值是对象的引用,引用就是引用的[1,2,3,4,[1,2,3]],当这个值变了,a和b这两个变量还是指向那个地址,所以值变成什么,a和b就指向什么。c是浅拷贝,这个拷贝只有改变内层元素内的值时,才会跟着改变,改变外层的值,不会跟着改变(这里是最难理解和记忆的),d就牛逼了,d是深拷贝,相当于重新创造了一个值和变量,所以不管原有值变得天昏地暗,对d都没有影响。
以上是对于可变对象,那么不可变对象呢?

a=1
b=a
c=copy.cpoy(a)
d=copy.deepcopy(a)
a=2
结果:
a -->2
b -->1
c -->1
d -->1

由此看出,对于不可变对象,浅拷贝之后,其实是原有的a的指向变了,a指向一个新创造的2,而b和c都还是指向原有的1,d是深拷贝,所以肯定是不会有任何变化的,他有一个独立的1指向。

第二个要讲的内容是迭代器和生成器
迭代器和生成器有很多不同的理解,但是我有一个很好的可以区分他们的地方,先不管内部实现的情况下:

迭代器:一个函数内含有iter语句,并且用next方法取值的就是迭代器,如果没有值了,则会抛出异常,这个也是for循环遍历可迭代对象的内部实现原理。
生成器:函数内部有若干个yiled语句,调用一次函数,则生成一个值,然后继续阻塞在下一个yield地方,等待下一次被调用,继续生成制定值,如此循环直到最后一个yield结束。我们知道的xrange()就是一个生成器。
g = ( x*x for x in range(5))
这里的g就是一个生成器,可以用type(g)查看
可以用next方法返回值:g.next()
当没有值再生成是,就抛出一个异常,结束程序
def odd():
	print 'step 1'
	yield 1
	print 'step 2'
	yield 2
	print 'stet 3'
	yield 3
这个odd也是一个生成器
如果函数内可以生成的元素太多,比如有100万个,那么用next方法一个一个去取,那你的取到天荒地老,我们可以用for循环遍历。
### 苍穹外卖 Day05 课程相关内容 关于苍穹外卖项目的第五天教程,可以从多个角度了解其核心知识点和技术实现细节。以下是基于提供的参考资料以及专业知识整理的内容。 #### 1. **项目背景与目标** 苍穹外卖项目是一个综合性的电商类应用开发实践案例[^3]。Day05 的主要内容围绕缓存技术的应用展开,重点讲解如何利用 Redis 提升系统的性能和响应速度。此阶段的目标是让开发者掌握 Spring Boot 中集成 Redis 的方法及其实际应用场景。 #### 2. **Spring Data Redis 集成** 为了在项目中引入 Redis 支持,需完成 Maven 坐标的导入工作。具体依赖如下所示: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 上述配置文件片段定义了 Spring Boot Starter 数据模块中的 Redis 组件支持[^2]。 #### 3. **Redis 序列化器设置** 在使用 Redis 存储数据时,默认情况下会将 Java 对象序列化为字节数组存储到数据库中。如果希望以更直观的方式查看键值对内容,则需要自定义序列化方式。例如,可以采用 `StringRedisSerializer` 或者 Jackson JSON 格式的序列化工具来处理字符串类型的 Key 和 Value[^4]。 #### 4. **常用 API 操作** 通过 `RedisTemplate` 类型的对象实例能够便捷地访问不同类型的数据结构并执行相应命令: - **Value Operations**: 处理简单的 K-V 键值对。 ```java ValueOperations<String, String> valueOps = redisTemplate.opsForValue(); valueOps.set("key", "value"); String result = valueOps.get("key"); ``` - **Hash Operations**: 管理哈希表形式的复杂映射关系。 ```java HashOperations<String, Object, Object> hashOps = redisTemplate.opsForHash(); hashOps.put("hashKey", "field", "value"); Object fieldValue = hashOps.get("hashKey", "field"); ``` - **List Operations**: 实现队列或者栈的功能模拟。 ```java ListOperations<String, String> listOps = redisTemplate.opsForList(); listOps.rightPush("queueName", "item"); Long size = listOps.size("queueName"); ``` - **Set Operations**: 进行集合运算如交集、差集等操作。 ```java SetOperations<String, String> setOps = redisTemplate.opsForSet(); setOps.add("uniqueSetName", "element"); Boolean isMember = setOps.isMember("uniqueSetName", "element"); ``` - **ZSet (Sorted Set) Operations**: 排序后的有序集合管理。 ```java ZSetOperations<String, String> zSetOps = redisTemplate.opsForZSet(); zSetOps.add("sortedSetName", "member", score); Double memberScore = zSetOps.score("sortedSetName", "member"); ``` 以上代码展示了不同场景下针对各种数据模型的具体调用逻辑。 #### 5. **推荐学习资源链接** 根据已有信息汇总得出以下几篇博文可供进一步深入研究: - [苍穹外卖Day05——总结](https://blog.youkuaiyun.com/qq_43751200/article/details/...) - [程序喵正在路上原创系列专栏](https://blog.youkuaiyun.com/lushimeng/) 这些文档不仅提供了理论指导还附带大量实战演练示例供参考学习[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值