简介

迄今为止我们已经学习了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. 前端项目课程3 jquery1.8.3到1.11.1有了哪些新改变

    web项目课程3  jquery1.8.3到1.11.1有了哪些新改变 一.总结 一句话总结:领会官方升级的意思.  1.live();    2.die();    3.bind();    4.u ...

  2. LDR: LdrpWalkImportDescriptor() failed to probe C:\WINDOWS\system32\opencv_core243d.dll for its manifest, ntstatus 0xc0150002

    LDR: LdrpWalkImportDescriptor() failed to probe C:\WINDOWS\system32\opencv_core243d.dll for its mani ...

  3. Linux 常用性能工具

    Linux 常用性能工具简介. 一.wget 文件下载 使用wget下载单个文件:wget URL 下载并以不同的文件名保存:wget -O wordpress.zip URL wget限速下载:wg ...

  4. Android多线程研究(9)——线程锁Lock

    在前面我们在解决线程同步问题的时候使用了synchronized关键字,今天我们来看看Java 5.0以后提供的线程锁Lock. Lock接口的实现类提供了比使用synchronized关键字更加灵活 ...

  5. UVA 1564 - Widget Factory(高斯消元)

    UVA 1564 - Widget Factory 题目链接 题意:n种零件, 给定m个制作时间.每段时间制作k个零件,每种零件有一个制作时间,每段时间用Mon到Sun表示,求每一个零件的制作时间.还 ...

  6. 用CMake代替makefile进行跨平台交叉编译

    在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译: 1 2 3 ./c ...

  7. Springmvc+Shiro实战

    原文链接:http://blog.csdn.net/qq_37936542/article/details/79010449 springmvc+shiro实现系统粗细粒度的权限管理步骤: 1:表格设 ...

  8. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(4)for == while ?

    一.for和while等价替换 int i = 1; for (i; i<=100; i++){ sum = sum + 1; } int i = 1; while(i<=100){ su ...

  9. 关于ulimit -a中需要修改的两个值

    以root用户运行 ulimit -a 命令,其中有两个参数分别为: open files和max user processes   修改方法:  vi /etc/security/limits.co ...

  10. Web开发之分页算法,N(N>=3)种解决方案

    在Web开发中,分页是最常用的一个功能了.但是,想简单.灵活.方便地解决分页这个问题,还是需要动点脑筋的. 今天,简要梳理下,过去6年中,亲自遇到的分页问题和解决办法. 1. 定义问题 原由:在页面中 ...