手把手教你学python3第六讲(续字典和集合)

如果图片出不来请转https://www.bilibili.com/read/cv250217,都是我写的

上一讲评论里有大佬提示了笔者如何用尾递归写斐波那契数列,我们来看一下

结果是对的。以a(4)为例,计算过程

a(4,1,1)

a(3,1,2)

a(2,2,3)

3

和上一讲的普通递归对比

今天接着上面继续学习字典的bif或者说bim(built-in method)

首先补充一点关于浅拷贝和深拷贝

首先说明前面学过的类型,只有列表和字典可以用copy()这个bif,它是一种浅拷贝,因为我们查看它的id看到,是不一样的,这也就是说pytho另外开辟了一块地方来存b这个标签指向的内容,所以说当我们改变a的元素,b是不受影响的。而赋值是一种深拷贝,我们看到c和a的id是一样的,也就是说a和c这两个标签都指向同一个地方,所以改变a会改变c,上面的例子是列表,字典也是一样,但是注意区别

这是把a这个标签从19940416撕下来,给了26897864。而上一个代码实例只是改变了a中的一个元素,没有改变a标签贴的id。我们来看一个有意思的情况

虽然a只有一个元素,但是只要是对元素操作,a贴的id都不变。下面是pop和popitem,pop后面参数是key值,,还有一个可选参数d,如果key字典里没有,会返回d,如果没有设置d,会报错。popitem是返回some(某个)(key,value)是元组的形式。

下面是实例


注意字典没有索引,没有顺序,括号里参数是key,d可以数字和字符串,还可以是列表元组

我们看到a和b弹出的和你输进去的顺序是不一样的,a弹出了第一个输的,b弹出了最后一个输的,归根到底,还是因为字典没有顺序,所以随机弹出一个some。下面是setdefault


我们看到如果传进去的第一个参数key在字典里没有,字典里会创建一个。如果第二个参数没有,对应的value是None,如果有第二个参数,value就是第二个参数。如果传进去的第一个参数字典里有,那么就会打印对应的value,这时候第二个参数有没有是不影响的,有也不会影响原来的value。

再介绍一个update


看到update可以去替换一些key对应的value,如果这些key字典里没有,就加入,但是必须key和value同时加入,不能缺失。

最后总结几点字典注意事项;keys不能是列表和字典,因为它们是可以改变的不是hash的,可以时元组和字符串,因为它们不可以被改变。一个key不可以被多次赋值,会报错。如果你试图为字典里没有的key赋值,字典里会加入这个key和对应的value,但是如果你访问字典里没有的key会报错,下面就是例子

关于哈希



以上内容摘自http://bbs.fishc.com/forum.php?mod=viewthread&tid=45016&extra=page%3D1&page=1

下面做下尝试,看看key值可不可以是存放列表的元组

确实不可以,还有一个1和1.0是一样的key的问题

其实笔者上面说过现在我用的是python3.4,而在家里用的是python3.6,所以这里没有报错而前面的文章是会报错的。fromkeys是创建一个新的字典

python众多对象之一的字典介绍到这,下面是集合

集合也是用花括号来表示的,但是它是没有对应关系的,它和字典一样,也是无序的,不能用索引去访问元素,创建一个集合可以直接用花括号,可以用set工厂函数

我们看到{}是一个空字典不是一个空集合,创建空集合可以用set去转换一个空列表。和数学里学到的集合一样,集合的元素必须具有唯一性,这也是集合的用处所在,并且会识别1和1.0是一样的,而且返回了精度更高的。

不能用索引去访问(因为集合是无序的),我们来直观的看下无序

感觉集合的存储和字典一样是哈希存储,集合元素也应该是经过哈希函数生成id的。

那么我们可以用for和in来访问,可以用in来判断元素是否在集合里

集合有什么用处呢?唯一的用处就是唯一,哈,这就话有点绕

可以用上图中的for来消除列表中的重复元素,也可以直接用c那条语句,但是注意由于集合是无序的(虽然它内部有哈希函数会排序,但是用户是不可操作的,所以我们说字典和集合是无序的,并且字典里的key和集合里的元素都是唯一的),c中0就被放到了最前面,如果你不希望列表中元素顺序被改变,那么还是不要用set,用前面for循环去做。

集合里的元素是哈希的


上图看到集合也不是哈希的,因为它可以被改变

下面就介绍几个内置方法改变集合的元素,一个是add一个是remove

add就是加元素,remove是移除,如果remove的元素集合里没有,那就报错,并且一次只能移除一个参数

如果你希望一个集合不可以被改变,你可以用frozenset


从上面的图我们可以看到,

1.frozenset没有add,clear,remove这些改变元素的内置方法,但是copy可以用,它不影响原集合。这里对比一下元组和字符串

元组和字符串没有copy内置方法。

2.frozenset是hash的,它可以作为一个元素在集合里。

3.clear之后集合是个空集合,这也是创建一般空集合(不是frozenset)的方式

看集合中有多少元素很简单,用len这个bif。这里还看到clear后的类型都是nonetype但是你再看a就是一个空的集合或者列表,这一点用的时候要注意。

下面提供一个内置方法总结,集合不是重点,只是列出来


以上集合内置方法摘自http://bbs.fishc.com/thread-45276-1-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值