Python从入门到入坟进阶-那些容易被忽略的问题
前言
哈喽,大家好,入门部分连载一路走过来,得到了很多好评
原因主要是:
1.通俗易懂
2.幽默风趣
我将延续这个传统,继续进阶部分的连载
如果还没看过我的入门连载部分,可以点击这条获取免费的讲解视频
int()强制转换浮点数
在int()的强制转换浮点数时候,不管是正数还是负数,只取整数部分。
注意:这里不是向上或者向下取整,也不是四舍五入。
无限递归
还记得我们讲的俄罗斯套娃么,还记得数列求通项公式么,都用到了递归的思想
如果不记得了,记得回看入门教程哦~
递归是为了将问题简化为更小规模的同类型问题,最后加以解决。
但是有一种情况是递归时不断调用自身,达到不了最简单的情况(例如俄罗斯套娃一层层打开到最内层的)
所以一直找不到递归的出口
我们定义了一个函数名为recurse
然后函数体中调用自身
当我们运行调用这个函数时,系统抛出异常,意思是达到了最大的递归深度。
你可以认为系统设置了一个最大递归次数,如果超过这个次数还没解决问题,则抛出异常
简答点说,就是:绕来绕去你怎么还没解决问题,你是要上天么!
这种问题,我们要避免!
字符串是不可变的
在入门阶段我们说过,字符串和元组是不可变的数据类型,那字符串的不可变体现在哪呢?
看个例子:
如果我想改名字,而且改的是姓【不要当真,只是为了举例子,我爸应该看不到这篇文章的】
我把姓 '王' 改为 ' 方',我就做了如下修改:
结果抛出异常,提示不让我修改,这体现了字符串的不可变性,如果你执意要改呢?
可以这样
联合使用字符串的切片和拼接完成~
一些遗漏的字符串方法
upper()和lower()方法
upper()能将一个字符串的字母全变成大写,lower()与之相反:
find()方法
find()可以在字符串中查找子串是否存在:
如果找到,返回的是子串的起始索引位置,例如Hello是从字符串索引0位置开始,空格是在索引5位置
当找不到子串时,返回-1,而不是抛出异常
还可以限定查找开始的索引位置:
我们知道,空格的索引是5,当我们从索引3开始往后找,能找到空格
当我们从索引7开始找,则返回没找到,因为索引7已经在索引5之后了
注意操作的返回值
我们用a来 接盘 , 啊呸!接收来自print的返回值,发现a是NoneType,所以print是没有返回值的
例如在列表中,你希望接收排序的结果,你可能会这样写:
发现这样是没有结果的!
你还能找出哪些容易犯错的地方呢?
字符串快速转换为列表
在入门阶段我们讲了不同数据类型的转换关系,比如列表和元组。
这里讲讲字符串转为列表!
小明:老湿!字符串和列表好像不像会发生关系的啊!
小明,那我问问你,如果把一个字符串 'Python' 的每个字符作为列表元素,怎么操作?
小明:emmm,小红,还是你来回答吧,毕竟我们也是有关系的。
小红:。。。
小红:老师,我觉得可以这样:
小红的列表生成式学的很不错啊!给你点赞~
我们今天新学一种方法:
这样是不是很简单,就像给元组穿上list外衣一样,给字符串披上list的外衣,就变成了list
小明:老湿!这个看起来也就一般般啊!如果我想把‘I love Python’变成列表,元素分别是I love Python这三个,怎么做呢??
这个嘛...应该是...
小明:老湿,你不会了吧!!!
其实我是在逗你的,我们新学一个字符串分割的方法,分割,有点像列表的切片,只不过之前我们一般是定好位【找到索引】,一刀切下去。
小明:那现在呢?
现在嘛,按照特点切。
小明:什么是按照特点切?
听过庖丁解牛的故事么?
小红:老师,是因为他是从牛身上的骨节脆弱部分切开!
是啊,所以我们可以认为骨节是一种特征,我们找到字符串的特征就能完成任务!
小明:我明白了,我要求的分割字符串就是按照空格分开的!
是的没错,我们现在根据空格将字符串转为列表,小明,给我把我用了19年的那把宰牛刀拿来!
小明:emmm
使用方法:字符串.split('分隔符')
默认是空格,所以这里写了两种!
小明:那如果是2017-12-06呢?
小红:这很简单啊,这样即可:
小红举一反三能力不错~
像之前的空格和这里的‘-’都叫做分隔符。
字典中按照键的顺序输出
还记得入门部分降到字典时候么?字典有三大特性其中有一个就是无序性!
小明:老湿,所以呢?
emmm,小明,你听我说完!所以我给你出个题:
你看,现在我想按照key的字母顺序看看打印出来的结果,但是先打印的是b,这怎么办!
小明:老湿,你要求真高!不过我真的不会。。
好吧,可以这样的:
我们给字典套上个sorted的外衣就行啦!
小明,我们要讲的重点是,还记得字典里的key是唯一的么?
小明:记得啊,我还记得根据key可以查找value呢!
那你很棒棒哦,如果让你通过value找key,怎么做呢?
小明:自己挖的坑....
嗯,这个确实比较难,我们来看看
还是用刚才的dict1:
我们定义一个叫reverse_lookup的函数,传入两个参数
第一个是要查询的字典,第二个是要查的值
然后循环字典,将键对应的值分别和要查找的值比较,当出现异样的就返回!
小明:看起来不错啊
是啊,看起来不错,但是当我们要找的值不在字典里呢?
什么都没返回的样子!按照我们的思路,找不到东西也应该告诉我啊
还记得我大学时去面试实习生,面试了3家公司,最后都没给我结果,也不通知我面试没过,这样确实不太好,直白点多好!
所以我们这里学个新的系统关键字:raise
它可以抛出异常!
小明:老湿,我们不喜欢异常,你还要生成异常???
我们看一下具体操作!
仔细看看函数重新定义的吧
小明:不就是加了raise那句么?
注意缩进!当找到值对应的key,直接运行return,然后将返回的值传回函数调用处,函数就调用结束了
当我们没找到时候,最后会抛出我们设定的LookupError
小明:老湿,那其实可以这样啊!
emmm,是的,这样也可以,不过我这里要强调的是raise的用法!
小明:好吧。。。
人生苦短,我用Python