简明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。
简明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教程 5.第一步
介绍 我们现在来看看如何在Python中运行传统的”Hello world”程序.这会教你如何写.保存以及运行Python程序. 有两种办法来运行您的Python程序——使用交互式的解释器提示符或者源 ...
- 简明Python3教程 18.下一步是什么
如果你有认真通读本书之前的内容并且实践其中包含的大量例程,那么你现在一定可以熟练使用python了. 同时你可能也编写了一些程序用于验证python特性并提高你的python技能.如果还没有这样做的话 ...
- 简明Python3教程 16.标准库
简介 python标准库作为python标准安装的一部分,其自身包含数量庞大的实用模块, 因此熟悉python标准库非常重要,因为很多问题都能利用python标准库快速解决. 下面我们将研究标准库中的 ...
- 简明Python3教程 9.函数
简介 函数是程序的可复用片段,允许你为语句块赋予名字之后在程序的任何地方运行它们任意次,这称做函数调用. 我们已经使用过一些内建函数,例如len和range等. 函数也许是任何有意义的软件中最重要的构 ...
- 简明Python3教程 6.基础
你肯定不满足于只打印"Hello World"吧? 你想要的更多 - 你希望得到一些输入,操纵它后再从中得到某些东西.我们可以使用python中的常量和变量实现这些功能. 字面常量 ...
- 简明Python3教程 1.介绍
Python是少有的几种既强大又简单的编程语言.你将惊喜地发现通过使用Python即可轻松专注于解决问题而非和你所用的语言格式与结构. 下面是Python的官方介绍: Python is an eas ...
- 简明Python3教程 15.异常
简介 当程序发生意外情况时则产生异常. 例如你需要读一个文件而这个文件并不存在会咋样?又或者是程序运行时你把它误删除了呢? 上述情形通过异常进行处理. 类似的,如果你的程序存在一些非法语句会发生什么呢 ...
- 简明Python3教程 13.面向对象编程
简介 (注: OOP代表面向对象编程,OO代表面向对象,以后全部使用英文缩写) 迄今为止我们编写的所有程序都是围绕函数创建的,函数即操纵数据的语句块.这称作面向过程编程. 除此之外还有另一种组织程序的 ...
随机推荐
- Linux环境编程之共享内存区(一):共享内存区简单介绍
共享内存区是可用IPC形式中最快的.一旦内存区映射到共享它的进程的地址空间,进程间数据的传递就不再涉及内核.然而往该共享内存区存放信息或从中取走信息的进程间通常须要某种形式的同步.不再涉及内核是指:进 ...
- 23种设计模式——Prototype模式
Prototype模式是提供自我复制的功能.包括浅拷贝和深拷贝. 一.Prototype模式的用途 场景1:游戏场景中有很多类似的敌人,它们的技能都一样,但是随着敌人出现的位置和不同,它们的能力也不太 ...
- Linux 下查看线程信息
1. 使用 pstree -p PID ps aux | grep firefox | grep -v grepcharles 26058 0.0 0.0 4908 1152 ? ...
- PWA之Service work
原文 简书原文:https://www.jianshu.com/p/84a4553d81a8 大纲 1.Service Workers: PWA 的关键 2.理解 Service Workers 3. ...
- Windows10终端优化方案:Ubuntu子系统+cmder+oh-my-zsh
原问地址:https://zhuanlan.zhihu.com/p/34152045 最近从MacBook换到了种草已久的Surface Book 2,而我的工作环境也自然要从macOS换到Windo ...
- pandas 学习(五)—— datetime(日期)
date range pd.date_range('2014-11-19', '2014-11-21', freq='D') # 起始时间,终止时间,时间间隔,也即步长,D ⇒ Day,5H:以 5 ...
- NET WinForm 开发所见即所得的 IDE 开发环境
Github 开源:使用 .NET WinForm 开发所见即所得的 IDE 开发环境(Sheng.Winform.IDE)[2.源代码简要说明] GitHub:https://github.co ...
- 嵌入式linux串口通信自发自收测试程序
/*串口自收自发程序主函数*/#include"uart_api.h"int main(){ int fd; char buff[BUFFER_SIZE]; char buff2 ...
- MySQL 监控-innotop
innotop 编写者Balon Schwartz,<高性能MySQL>的作者之一. innotop的作用为实时地展示服务器正在发生的事情,监控innodb,监控多个MySQL实例,是一款 ...
- C++ 工具类 —— 词条类(Entry)
Entry 以键值对(key-value pair)的形式定义. template <typename K, typename V> struct Entry{ K key; V valu ...