前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python入门(18)

Python入门(18)

作者头像
高一峰
发布2020-09-22 09:56:10
4390
发布2020-09-22 09:56:10
举报
文章被收录于专栏:高渡号外
Python入门(18/18)

第十八节 与众不同

大家好!今天来到这里,我要恭喜各位,因为,当你看到今天的课程,意味着你已经学习甚至掌握了 Python 技术的大部分基础知识。

你拥有的这些知识,如果你恰好又能够勤奋练习,那么,它们就不仅存在于你的头脑中,而且还变成了你手上的技能,这样,你才算真正的拥有了Python这门技术。

在你豪情万丈,准备勇闯江湖,一显身手之前,俺还是要提醒你:天外有天,人外有人,强中自有强中手 ... 哎呀,这个扯远了。我是想说,你学会的基础知识,估计绝大多数人也可能学会了。那么,问题是,人就是有时候忍不住想显摆一下,那怎样才能显得与众不同呢?

对,就是这个意思,

是不是说到你心坎上去了。

哈哈!别不好意思,

其实,

大家都在这么想 ...

OK,那我们今天就来分享一些与众不同的东西。

1、传递元组

我们一直在使用函数,而且,绝大多数时候,我们的函数时有返回值的。但是,大家有没有注意到,我们得到的返回值通常只有一个。

那么问题来了,假如我希望函数的代码块执行完毕以后,能够返回2个甚至2个以上的值,那该怎么办?效率最高的方法又是什么?

答案是:你只需要把它们放置在一堆圆括号之中就行了。

天啦,就这么简单?是的。不信,你编写和运行下面的代码试试:

提醒:请注意 a, b = <some expression> 的用法会将表达式的结果解释为具有两个值的一个元组。这也意味着在 Python 中交换两个变量的最快方法是:

还可以这样?实在是很爽啊!

2、魔法方法

我们知道,Python的一些序列类数据类型,比如字典,能够按键索引。那么,如果,我们自己自定义某个类,也希望它能够具有类似按键索引的能力,可以不可以呢?可以的!

下面就推荐一个这样的魔法方法:如果你希望自定义的类也具有按键索引的功能(如列表、元组中使用的x[key]那样),那么,你只需要在你的类中添加 __getitem__() 方法即可。其实, Python 对 list 列表类就是干了这件事情!

3、Lambda 表达式

很多高级编程语言中都有lambda,lambda就是用来定义一个匿名函数的。

既然是定义匿名函数,如果还硬是要给他一个名字的话,就会显得有点画蛇添足。所以,我们通常是直接使用lambda函数。如下所示:

上面的代码,就通过使用lambda创建了一个匿名函数,这个函数拥有两个变量x和y,函数的代码块就是一个算式:x+y,我们把它作为一个对象通过“等式(赋值)”符号,赋值给add。这时候add实际上就成了一个函数对象。所以,只要给它传递2个实参,就能计算出它们的和。

这个用法,看起来是不是很酷?!没感觉出来?我去...那再看看下面这个例子吧。

PS:通常在函数式编程中,我们会用到lambda表达式。Python提供了很多函数式编程的特性,如:map、reduce、filter、sorted等这些函数都支持函数作为参数。

4、列表推导

列表推导(List Comprehension)用于从一份现有的列表中得到一份新列表。

想象一下,现在你已经有了一份数字列表,你想得到一个相应的列表,需求是将其中大于 2 的数字乘以 2 得到一个新列表。怎么搞?

代码如下:

感觉怎么样?Python,你牛逼!

兄弟,惊呆了吧,别光傻笑啊,光看不练假把式,建议这个代码赶紧随手写十遍!

写十遍!

写十遍!

写着写着,

印象就深刻了,

忘不了了。

5、在函数中传递可变数量的参数

想象一下,如果我们有一个函数,它有多个形参,它的代码块能够实现一些我们需要的功能。问题是,当参数的个数不确定时,函数代码块运算的结果可能不一样。遇上这样的情况,蛋刀我们需要为每一种可能去写一个类似的函数吗?

当然不需要,Python总有办法搞定它。

它有这样一种特殊的方法,即分别使用 * 或 ** 参数的前缀,来实现弹性参数的传递。我们看下面的示例,当我们传递3个参数和2个参数时,函数都能执行,但结果不一样。

因为我们在 args 变量前添加了一个 * 前缀,这样函数的所有其它的额外参数都将传递到 args 中,并作为一个元组予以储存。如果采用的是 ** 前缀,则额外的参数将被视为字典的键值配对。

6、assert 语句

assert 语句用以断言(Assert)某事是真的。例如说你非常确定你正在使用的列表中至少包含一个元素,并想确认这一点,如果判断失误,就抛出一个错误,assert 语句就是这种情况下的理想选择。当语句断言失败时,将会抛出 AssertionError类的异常(马上介绍异常) 。

我们应该明智地选用 assert 语句。在大多数情况下,它好过捕获异常,也好过定位问题或向用户显示错误信息然后退出。

7、异常

跟程序的bug不同,有时,我们在编写代码的时候,无法预料此处的代码处理是否会出现例外情形,而一旦出现例外,程序就会终止和报错。这种情形被称之为发生异常(Exception)。

Python通过使用 try...except 来处理异常状况。

try语句按照如下方式工作:

(1)首先,执行try子句(在关键字try和关键字except之间的语句)

(2)如果没有异常发生,忽略except子句,try子句执行后结束。

(3)如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。

(4)最后执行 try 语句之后的代码。如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。

一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。从官方文档可以查询更多的标准异常类。

学会处理异常,是一个程序员变得成熟的标志。

8、标准库

最后,我们来介绍一下标准库。Python 标准库(Python Standrad Library)中包含了大量有用的模块,它也是Python 安装包中的一部分。

熟悉 Python 标准库十分重要,这绝对是一个宝库!因为你越熟悉它,你就越发现许多问题的轻松解决之道。如下列举部分标准库的常用模块:

os:操作系统接口模块

sys :系统内置函数模块

glob:提供了一个函数用于从目录通配符搜索中生成文件列表的模块

re:为高级字符串处理提供正则表达式的工具模块

math:数学运算模块

random:提供生成随机数的工具模块

date:日期时间模块

zlib,gzip,bz2,zipfile,以及 tarfile:直接支持通用的数据打包和压缩格式的模块

我们需要强调的是,特别对于一个新手来说,当你寻求一个解决方案的时候,你不要总是苦兮兮的企图自己手写代码来解决问题,很多时候,Python的标准库已经为我们提供了非常完美的解决方案,至少可能提供解决方案的一大部分。所以,你要习惯于尝试去更多的了解和熟悉Python的标准库,知道它那里面到底藏着多少宝贝,需要的时候,你只需要导入模块即可使用,这也是Python编程效率高的一个重要原因。

备注:你能在你的 Python 安装包中附带的文档中查找到所有模块的全部细节。

小结

我们在本章中介绍了有关 Python 的更多功能,但还是远远没有涵盖到 Python 的全部。不过,经过入门阶段的学习,我们已经涉猎了大多数你将在实践中遇到的东西,这足以让你能够开始编写任何你所期望的程序。

到此,我们的Python入门课程就全部结束了。如果大家由此写出了什么好的代码,记得过来分享哦。

总有人意犹未尽,是吧?

那好,还没有散场的同学,悄悄告诉:课程的后面还有彩蛋哦!没错,聪明如你,明天继续关注。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 高渡号外 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档