简明Python3教程 17.更多
简介
迄今为止我们已经学习了python中的大多数常用知识。本章中我们会接触到更多的知识,使得我们更全面的掌握python。
传递元组
你是否希望过从函数返回两个不同的值?做到这点使用元组即可。
>>> def get_error_details():
... return (2, 'second error details')
...
>>> errnum, errstr = get_error_details()
>>> errnum
2
>>> errstr
'second error details'
注意a, b = <某些表达式>的使用,它会将表达式的结果解释为带有两个值的元组。
如果你希望将结果解释成(a, <其它值>)的形式,那么你要做的就象在函数形参中的那样:
>>> a, *b = [1, 2, 3, 4]
>>> a
1
>>> b
[2, 3, 4]
这种语法也暗示出在python中快速交换两个变量值的方法:
>>> a = 5; b = 8
>>> a, b = b, a
>>> a, b
(8, 5)
特殊方法
有一些诸如__intit__和__del__的方法在类中拥有特殊的含义。特殊方法用于模拟某些内建类型的行为。
例如,你希望为你的类使用x[key]索引操作(就像在列表和元组中那样),那么你仅仅需要实现__getitem__方法就可以了。
顺便思考一下,python正是这样实现list类的!
一些有用的特殊方法列在下表中。如果你想了解所有的特殊方法,详见(http://docs.python.org/py3k/reference/datamodel.html#special-method-names)。
方法名 |
解释 |
__init__(self, ...) |
在对象被返回以变的可用前调用 |
__del__(self) |
在对象被销毁前调用 |
__str__(self) |
在使用print函数或str()时调用 |
__lt__(self, other) |
在使用小于运算符时(<)调用。 类似的其它运算符也存在对象的特殊方法(+, >等) |
__getitem__(self, key) |
当使用x[key]索引操作时调用 |
__len__(self) |
当使用内建len()函数时调用。 |
单语句块
我们已经看到每个语句块都根据它的缩进级别将彼此区分开。不过有一个例外。
如果某语句块只包含单条语句,你可以把它放到同一行,例如条件语句或循环语句。
下面的例子清楚的说明了这点:
>>> flag = True
>>> if flag: print 'Yes'
...
Yes
注意上面的单条语句被放置到同一行而没有作为单独的块。
虽然你利用这点可以让程序变的更短,但我强烈建议你避免之(除了错误检测),主要原因是使用适当的缩进可以更方便的添加额外的语句。
Lambda表达式
lambda语句用于在运行时创建并返回新的函数对象。
#!/usr/bin/python
# Filename: lambda.py
def make_repeater(n):
return lambda s: s * n
twice = make_repeater(2)
print(twice('word'))
print(twice(5))
输出:
$ python lambda.py
wordword
10
代码如何工作:
在运行时我们利用函数make_repeater创建一个新的函数对象并返回它。其中一条lambda语句用于创建函数对象。
本质上这条lambda需要一个参数后跟一个相当于函数体的单表达式,这个表达式的值将成为函数的返回值。
注意就算print这样的语句也不能出现在lambda中,只能是表达式。(注:py3k中print是个函数,作者out了)。
思考一下
我们能否利用lambda创建一个比较函数并将其提供给list.sort()?
points = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ]
# points.sort(lambda a, b : cmp(a['x'], b['x']))
列表解析(List Comprehension)
列表解析用于从一个现有的列表派生出一个新的列表。
假设你有一个数字列表,你想让其中所有大于2的元素乘以2并组成一个新的列表。
类似问题正是使用列表解析的理想场合。
#!/usr/bin/python
# Filename: list_comprehension.py
listone = [2, 3, 4]
listtwo = [2*i for i in listone if i > 2]
print(listtwo)
输出:
$ python list_comprehension.py
[6, 8]
代码如何工作:
当某些条件满足时(if i > 2)我们执行某些操作(2 * i),由此产生一个新列表。注意原始列表并不会被改变。
使用列表解析的好处在于当我们使用循环遍历元素并将其存储到新列表时可以减少样板代码量。
函数接收元组和列表
这里有一种特殊的方法可以将函数的形参当做元组或字典,那就是分别使用*和**前缀。
当需要在函数内得到可变数量的实参时这个方法很有用。
>>> def powersum(power, *args):
... '''Return the sum of each argument raised to specified power.'''
... total = 0
... for i in args:
... total += pow(i, power)
... return total
...
>>> powersum(2, 3, 4)
25
>>> powersum(2, 10)
100
因为args变量带有*前缀,因此所有额外的实参都会被当做一个元组存入args中并传给函数。
如果这里的*换成**,则所有额外的形参都会被当做一个字典的键/值对。
exec和eval
exec函数用于执行python语句,不过这些语句储存在字符串或文件中而不是程序自身中。
例如,我们可以在运行时产生一个包含python代码的字符串,然后利用exec执行之。
>>> exec('print("Hello World")')
Hello World
与之类似,eval函数用于执行合法的存储在字符串中的python表达式。下面是一个简单的例子。
>>> eval('2*3')
6
assert语句
assert用于断言一个表达式为真。
例如,你需要确保正在使用的列表至少有一个元素,否则引发一个错误,这正是使用assert的理想场合。
当assert语句断言失败,则引发一个AssertError。
>>> mylist = ['item']
>>> assert len(mylist) >= 1
>>> mylist.pop()
'item'
>>> mylist
[]
>>> assert len(mylist) >= 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
assert应当慎重使用。多数时候用于捕获异常,处理问题或是向用户显示错误后随即终止程序。
repr函数
repr函数用于获得对象的正规字符串表示。有趣的是多数时候eval(repr(object))等于object。
>>> i = []
>>> i.append('item')
>>> repr(i)
"['item']"
>>> eval(repr(i))
['item']
>>> eval(repr(i)) == i
True
基本上,repr函数用来获得一个对象的可打印形式。你可以通过在类中定义__repr__方法控制repr的返回值。
小结
本章我们介绍了更多的python特性,虽然没有引入python的所有特性但足以应付实践中的大多数应用了。
接下来我们考虑如何进一步学习python。
转载于:https://www.cnblogs.com/txw1958/archive/2012/12/10/A_Byte_of_Python3_More.html
简明Python3教程 17.更多相关推荐
- 简明 Python3 教程 | 学习笔记
GitBook 原电子书地址:简明 Python 教程 <A Byte of Python>是一本由 Swaroop C H 编写,旨在于介绍如何使用 Python 语言进行编程的自由图书 ...
- python退出帮助系统help应该使用exit_简明Python3教程 5.第一步
介绍 我们现在来看看如何在Python中运行传统的"Hello world"程序.这会教你如何写.保存以及运行Python程序. 有两种办法来运行您的Python程序--使用交互式 ...
- 简明Python3教程 16.标准库
简介 python标准库作为python标准安装的一部分,其自身包含数量庞大的实用模块, 因此熟悉python标准库非常重要,因为很多问题都能利用python标准库快速解决. 下面我们将研究标准库中的 ...
- 简明Python3教程 8.控制流
简介 迄今为止我们见到的所有程序总是含有一连串语句并且python忠实的顺序执行它们. 那么如何改变它们的执行顺序呢?例如你希望程序根据不同情况作出不同反应,按照当前时间分别 打印出'Good Mor ...
- 简明python教程购买-简明Python3教程 6.基础
你肯定不满足于只打印"Hello World"吧? 你想要的更多 - 你希望得到一些输入,操纵它后再从中得到某些东西. 我们可以使用python中的常量和变量实现这些功能. 字面常 ...
- python运行怎么下一步_简明Python3教程 18.下一步是什么
如果你有认真通读本书之前的内容并且实践其中包含的大量例程,那么你现在一定可以熟练使用python了. 同时你可能也编写了一些程序用于验证python特性并提高你的python技能.如果还没有这样做的话 ...
- 简明Python3教程 15.异常
简介 当程序发生意外情况时则产生异常. 例如你需要读一个文件而这个文件并不存在会咋样?又或者是程序运行时你把它误删除了呢? 上述情形通过异常进行处理. 类似的,如果你的程序存在一些非法语句会发生什么呢 ...
- 简明Python3教程 4.安装
如果你已经安装了Python 2.x,你不需要在安装Python 3.0前卸载Python 2.x.这两者可以共存. GNU/Linux用户和BSD用户 如果你使用类似于Ubuntu.Fedora.O ...
- 简明Python3教程 10.模块
简介 现在你已经知道通过定义函数可以在你的程序中复用代码.但当你想在你编写的其他程序中复用大量函数怎么办呢? 也许你可以猜到了,办法就是利用模块. 有各种编写模块的方式,但最简单的方式是创建一个以.p ...
- python34怎么安装_简明Python3教程 4.安装
如果你已经安装了Python 2.x,你不需要在安装Python 3.0前卸载Python 2.x.这两者可以共存. GNU/Linux用户和BSD用户 如果你使用类似于Ubuntu.Fedora.O ...
最新文章
- android 重启后进入安全模式_图文详细教程:台式电脑或笔记本也可以运行Android系统,凤凰OS...
- jawstats php,JAWStats 配置(为AWStats配上华丽的外衣)
- python判断灰度图
- python可以做什么毕业设计-Python
- java跳转html页面_springboot 2.0.8 跳转html页面
- 个人计算机有控制器和运算器吗,cpu是由控制器和运算器组成的对还是错
- avue-crud 会多出来空白的一列
- 前端开发中使用build.js完成区分环境的打包配置
- c语言设计评分程序,C语言程序设计课程设计---设计比赛评分系统
- http请求417错误
- 安装ie9提示未能完成安装_ie9无法安装的原因以及安装步骤【图文教程】
- java8:lambda级联表达式(Cascading)或柯里化(Currying)原理简化详解
- 《数学之美》——吴军#读书笔记
- 【公开课】如何使用Arm-2D在小资源Cortex-M处理器芯片中实现图形界面?
- vue中给高德地图添加地图名片
- HDD深圳站:全生命周期赋能开发者,华为引领应用生态升级
- BoxCutter:吸附
- Portraiture中文版最新mac3.5版win5.0版插件介绍
- 区块链开发(一)Windows平台搭建基于以太坊的区块链开发环境
- 深度学习未来的发展点