简介

迄今为止我们已经学习了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中并传给函数。

如果这里的*换成**,则所有额外的形参都会被当做一个字典的键/值对。

execeval

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。

简明Python3教程 17.更多的更多相关文章

  1. 简明Python3教程(A Byte of Python 3)

    关键字:[A Byte of Python v1.92(for Python 3.0)] [A Byte of Python3] 简明Python教程 Python教程 简明Python3教程  简明 ...

  2. 简明Python3教程 5.第一步

    介绍 我们现在来看看如何在Python中运行传统的”Hello world”程序.这会教你如何写.保存以及运行Python程序. 有两种办法来运行您的Python程序——使用交互式的解释器提示符或者源 ...

  3. 简明Python3教程 18.下一步是什么

    如果你有认真通读本书之前的内容并且实践其中包含的大量例程,那么你现在一定可以熟练使用python了. 同时你可能也编写了一些程序用于验证python特性并提高你的python技能.如果还没有这样做的话 ...

  4. 简明Python3教程 16.标准库

    简介 python标准库作为python标准安装的一部分,其自身包含数量庞大的实用模块, 因此熟悉python标准库非常重要,因为很多问题都能利用python标准库快速解决. 下面我们将研究标准库中的 ...

  5. 简明Python3教程 9.函数

    简介 函数是程序的可复用片段,允许你为语句块赋予名字之后在程序的任何地方运行它们任意次,这称做函数调用. 我们已经使用过一些内建函数,例如len和range等. 函数也许是任何有意义的软件中最重要的构 ...

  6. 简明Python3教程 6.基础

    你肯定不满足于只打印"Hello World"吧? 你想要的更多 - 你希望得到一些输入,操纵它后再从中得到某些东西.我们可以使用python中的常量和变量实现这些功能. 字面常量 ...

  7. 简明Python3教程 1.介绍

    Python是少有的几种既强大又简单的编程语言.你将惊喜地发现通过使用Python即可轻松专注于解决问题而非和你所用的语言格式与结构. 下面是Python的官方介绍: Python is an eas ...

  8. 简明Python3教程 15.异常

    简介 当程序发生意外情况时则产生异常. 例如你需要读一个文件而这个文件并不存在会咋样?又或者是程序运行时你把它误删除了呢? 上述情形通过异常进行处理. 类似的,如果你的程序存在一些非法语句会发生什么呢 ...

  9. 简明Python3教程 13.面向对象编程

    简介 (注: OOP代表面向对象编程,OO代表面向对象,以后全部使用英文缩写) 迄今为止我们编写的所有程序都是围绕函数创建的,函数即操纵数据的语句块.这称作面向过程编程. 除此之外还有另一种组织程序的 ...

随机推荐

  1. Eclipse下配置Ant脚本 自己主动打包带签名的Android apk

    尽管eclipse非常少用了,可是在古老的项目上还是会用到.一个麻烦事是打带签名包的时候.非常不方便.下边纪录下配置ant,自己主动打包带签名apk的过程,作为备忘.(PC环境为MAC) 1,第一步得 ...

  2. swift学习第十天:函数

    函数的介绍 函数相当于OC中的方法 函数的格式如下 func 函数名(参数列表) -> 返回值类型 { 代码块 return 返回值 } func是关键字,多个参数列表之间可以用逗号(,)分隔, ...

  3. php求和为s的两个数字(多复制上面写的代码,有利于检查错误)(由浅入深,先写简单算法,做题的话够用就行)

    php求和为s的两个数字(多复制上面写的代码,有利于检查错误)(由浅入深,先写简单算法,做题的话够用就行) 一.总结 1.多复制上面写的代码,有利于检查错误 2.一层循环就解决了,前后两个指针,和大了 ...

  4. 【C++竞赛 A】xxx的项链

    时间限制:2s 内存限制:64MB 问题描述 xxx有一个长度为n的宝石链,宝石有m种不同的颜色.xxx想截取其中连续的一段做一个项链.为了让项链更漂亮,xxx希望项链中的宝石包含所有颜色. 输入描述 ...

  5. 【codeforces 742A】Arpa’s hard exam and Mehrdad’s naive cheat

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. Arcengine 实现要素选取的方法(转载)

    转自原文Arcengine 实现要素选取的方法(转载) 选择一个要素或者一个要素集(FeatureSelection)的方法很多,如IMap::SelectByShape.ILayer::search ...

  7. 【u215】河床

    问题描述 小明是一个地理学家,经常要对一段河流进行测量分析.他从上游开始向下游方向等距离地选择了N个点测量水位深度.得到一组数据d1,d2,--,dn,回到实验室后数据分析员根据需要对数据进行分析,发 ...

  8. [CSS Flex] Flex direction

    flex-direction: main two 'row' or 'column', you can use reverse also.

  9. Ajax基础与Json应用(一)

    一.Ajax概念 Ajax是异步的javacript和xml 发音: Ajax [ˈeɪˌdʒæks] 二.同步与异步 传统方式(同步):一个请求对应一个回应,他们是同步的,回应不完成,没办法对这个页 ...

  10. 一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对照

    本文主要介绍String类.StringBuffer类.StringBuilder类的差别  : 一.概述 (一)String 字符串常量.可是它具有不可变性,就是一旦创建,对它进行的不论什么改动操作 ...