简明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中并传给函数。

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

 

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。

 

 

 

--------------Python书籍推荐-----------------

Python基础教程-第2版.修订版 

购买地址1  购买地址2

 

 

PYTHON核心编程

购买地址1  购买地址2

 

 

零基础学Python

购买地址1  购买地址2

时间: 2024-09-11 22:51:03

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

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

 关键字:[A Byte of Python v1.92(for Python 3.0)] [A Byte of Python3] 简明Python教程 Python教程 简明Python3教程    简明Python3教程<A Byte of Python3>是一本关于用Python3语言编程的书.可以作为初学这的入门教程.也可以供计算机相关人员参考. 本书可作为Python编程语言的指导或辅导.主要是针对新手的,当然,对于有经验的程序员也很有用.如果你所了解的计算机的知识就是如何保存文本文

简明Python3教程 5.第一步

介绍 我们现在来看看如何在Python中运行传统的"Hello world"程序.这会教你如何写.保存以及运行Python程序. 有两种办法来运行您的Python程序--使用交互式的解释器提示符或者源代码文件.我们现在来分别看一看这两种方法. 使用解释器提示符 在命令提示符中输入python来打开解释器. 那些在GNU/Linux与BSD上同时安装了Python 3.x与Python 2.x的用户可能需要输入python3. 而对于Windows用户而言,如果您在PATH环境变量里正确

简明Python3教程 6.基础

你肯定不满足于只打印"Hello World"吧? 你想要的更多 - 你希望得到一些输入,操纵它后再从中得到某些东西.我们可以使用python中的常量和变量实现这些功能.   字面常量(literal constant)字面常量的一个例子是数字诸如5, 1.23, 9.25e-3或字符串This is a string', "It's a string!".顾名思义,字面常量的重点在于"字面", 你直接以字面的意义使用它们.数字2永远是数字2绝不

简明Python3教程 16.标准库

简介 python标准库作为python标准安装的一部分,其自身包含数量庞大的实用模块, 因此熟悉python标准库非常重要,因为很多问题都能利用python标准库快速解决. 下面我们将研究标准库中的一些常用模块.完整的标准库模块列表可以在安装python时附带的文档中的'Library Reference'一节找到. 现在就让我们来看看这些模块吧.   提示 如果你感觉本章内容对于你过于超前,那么可以跳过本章.但是当你熟悉python编程后我强烈建议你把这章补上.   sys模块 sys模块包

简明Python3教程 9.函数

简介 函数是程序的可复用片段,允许你为语句块赋予名字之后在程序的任何地方运行它们任意次,这称做函数调用. 我们已经使用过一些内建函数,例如len和range等. 函数也许是任何有意义的软件中最重要的构件,所以我们将在本章探究函数的方方面面. 函数以关键字def定义,其后紧跟函数名,由一对小括号闭合的形参,最后以冒号结束定义行, 定义行下面的是函数体,它是一个语句块. 听着有点复杂,其实定义起来是很简单的,见下面的例子: 范例: #!/usr/bin/python # Filename: func

简明Python3教程 15.异常

简介 当程序发生意外情况时则产生异常. 例如你需要读一个文件而这个文件并不存在会咋样?又或者是程序运行时你把它误删除了呢? 上述情形通过异常进行处理. 类似的,如果你的程序存在一些非法语句会发生什么呢?这时python会举手告诉你存在一个错误.   错误 考虑一个简单的print函数调用.如果我们把print错拼成Print(注意大小写),这时python将引发一个语法错误.     >>> Print('Hello World')     Traceback (most recent

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

如果你有认真通读本书之前的内容并且实践其中包含的大量例程,那么你现在一定可以熟练使用python了. 同时你可能也编写了一些程序用于验证python特性并提高你的python技能.如果还没有这样做的话,你应该去试试. 现在的问题是接下来应该做什么? 我建议你先解决下面的问题: 创建你自己的命令行版本的通讯录程序,利用它你可以浏览修改删除或搜索诸如朋友,家人,同事等联系人和 他们的email地址/或电话号码等信息.这些信息必须存起来以便需要时提取. 思考下我们已经学到的各种知识,这个问题其实相当简

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

简介 (注: OOP代表面向对象编程,OO代表面向对象,以后全部使用英文缩写) 迄今为止我们编写的所有程序都是围绕函数创建的,函数即操纵数据的语句块.这称作面向过程编程. 除此之外还有另一种组织程序的方法,将数据与功能组合到一起封装进被称为对象的东西中.这叫做OOP. 大多数时候你可以使用过程性编程,但当编写大型程序或问题更倾向以OO方式解决时,你还可以使用OOP技术. 类和对象是OOP的两个重要特征.类用于创建新的类型,而对象是类的实例.这就象你创建int类型的变量,这些变量就是int类的实例

简明Python3教程 4.安装

如果你已经安装了Python 2.x,你不需要在安装Python 3.0前卸载Python 2.x.这两者可以共存. GNU/Linux用户和BSD用户 如果你使用类似于Ubuntu.Fedora.OpenSUSE.Debian.CentOS或其他你选择的GNU/Linux发行版,或类似于FreeBSD的BSD系统,你的系统很可能已经了Python. 可通过开启shell程序(如konsole或gnome-terminal)并输入以下命令以检测Python是否安装在你的BSD或GNU/Linux