简介

迄今为止我们已经学习了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. GTK入门学习:glade的使用

    搭建好环境后,在终端敲 glade 就可以启动glade工具. glade的总体框图: 经常使用控件选择区:列举了经常使用的控件,经常使用的有三类:顶层(主窗体等).容器(各种布局容器等).控制和显示 ...

  2. CD Linux U盘启动办法

    1.用ULtraISO打开cdlinux的ISO文件,用USB-HDD+写入到U盘上。 2.下载GRUB4DOS软件,复制grldr和menu.lst到U盘。 3.下载bootice软件,在U盘的分区 ...

  3. 24、驱动调试之printk

    1.uboot跳转到内核启动的时候通过环境变量 console设置控制台 (console = ttySAC0表示输出到串口,并从串口结束输入,也可以设置console=tty1,表示输出到LCD,从 ...

  4. java导出word直接下载

    导出word工具类 package util; import java.io.IOException; import java.io.Writer; import java.util.Map; imp ...

  5. SDUT OJ 2862 勾股定理

    #include<iostream> using namespace std; int a[1010]; void qsort(int a[],int l,int r) { int x=a ...

  6. Java中的日期操作 分类: B1_JAVA 2015-02-16 17:55 6014人阅读 评论(0) 收藏

    在日志中常用的记录当前时间及程序运行时长的方法: public void inject(Path urlDir) throws Exception { SimpleDateFormat sdf = n ...

  7. 【55.70%】【codeforces 557A】Ilya and Diplomas

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

  8. php实现二叉树遍历

    php实现二叉树遍历 一.总结 关注输入输出 二.php实现二叉树遍历 题目描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储). 例如如下的先序遍历字符串 ...

  9. 探讨jsp相对路径和绝对路径

    原文链接:http://blog.csdn.net/qq_37936542/article/details/79076768 问题:当在jsp使用相对路径引入其他js文件的时候,通过浏览器访问该页面一 ...

  10. 【hdu 2955】Robberies

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...