如果图片出不来请转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