循环可以有一个 else 子句;它在循环迭代完整个列表(对于 for )或执行条件 为 false (对于 while )时执行,但循环被 break 中止的情况下不会执行。
以下搜索素数的示例程序演示了这个子句
for n in range(2, 10): for x in range(2, n): if n % x == 0: print n, ‘equals‘, x, ‘*‘, n/x break else: # loop fell through without finding a factor print n, ‘is a prime number‘
默认值在函数 定义 作用域被解析,如下所示 i = 5 def f(arg=i): print arg i = 6 f() will print 5.
引入一个形如 **name 的参数时,它接收一个字典(参见 typesmapping ) ,该字典包含了所有未出现 在形式参数列表中的关键字参数。
这里可能还会组合使用一个形如 *name (下一小节詳細介绍) 的形 式 参数,它接收一个元组(下一节中会详细介绍),包含了所有没有出现在形式 参数列表中的参数值。
( *name 必须在 **name 之前出现) 例如,我们这样定 义一个函数
def cheeseshop(kind, *arguments, **keywords): print "-- Do you have any", kind, "?" print "-- I‘m sorry, we‘re all out of", kind for arg in arguments: print arg print "-" * 40 keys = keywords.keys() keys.sort() for kw in keys: print kw, ":", keywords[kw] It could be called like this: 它可以像这样调用 cheeseshop("Limburger", "It‘s very runny, sir.", "It‘s really very, VERY runny, sir.", shopkeeper=‘Michael Palin‘, client="John Cleese", sketch="Cheese Shop Sketch") and of course it would print: 当然它会按如下内容打印 -- Do you have any Limburger ? -- I‘m sorry, we‘re all out of Limburger It‘s very runny, sir. It‘s really very, VERY runny, sir. ---------------------------------------- client : John Cleese shopkeeper : Michael Palin sketch : Cheese Shop Sketch
出于实际需要,有几种通常在函数式编程语言例如 Lisp 中出现的功能加入到了 Python 。
通过 lambda 关键字,可以创建短小的匿名函数。这里有一个函数返 回它的两个参数的和: lambda a, b: a+b 。
Lambda 形式可以用于任何需要的 函数对象。出于语法限制,它们只能有一个单独的表达式。
语义上讲,它 们只是 普通函数定义中的一个语法技巧。类似于嵌套函数定义,lambda 形式可以从外部作用域引用变量。
>>> def make_incrementor(n): ... return lambda x: x + n ... >>> f = make_incrementor(42) >>> f(0) 42 >>> f(1) 43
你也可以把链表当做队列使用,队列作为特定的数据结构,最先进入的元素最先 释放(先进先出)。不 过,列表这样用效率不高。
相对来说从列表末尾添加和弹 出很快;在头部插入和弹出很慢(因为,为了一 个元素,要移动整个列表中的所 有元素)。
要实现队列,使用 collections.deque ,它为在首尾两端快速插入和 删除而设计。例如
>>> from collections import deque >>> queue = deque(["Eric", "John", "Michael"]) >>> queue.append("Terry") # Terry arrives >>> queue.append("Graham") # Graham arrives >>> queue.popleft() # The first to arrive now leaves ‘Eric‘ >>> queue.popleft() # The second to arrive now leaves ‘John‘ >>> queue # Remaining queue in order of arrival deque([‘Michael‘, ‘Terry‘, ‘Graham‘])
filter(function, sequence) 返回一个sequence(序列),包括了给定序列中所有调用 function(item) 后返回值为true的元素。(如果可能的话, 会返回相同的类型)。
如果该序列(sequence) 是一个 string (字符串)或者 tuple (元组),返回值必定是同一类型,否则,它 总是 list 。
>>> def f(x): return x % 2 != 0 and x % 3 != 0 ... >>> filter(f, range(2, 25)) [5, 7, 11, 13, 17, 19, 23]
map(function, sequence) 为每一个元素依次调用 function(item) 并将返回值 组成一个链表返回。例 如,以下程序计算立方
>>> def cube(x): return x*x*x ... >>> map(cube, range(1, 11)) [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
可以传入多个序列,函数也必须要有对应数量的参数,执行时会依次用各序列上 对应的元素来调用函数 (如果某些序列比其它的短,就用 None 来代替)。
如果把 None做为一个函数传入,则直接返回参数做为替代。例如
>>> seq = range(8) >>> def add(x, y): return x+y ... >>> map(add, seq, seq) [0, 2, 4, 6, 8, 10, 12, 14]
reduce(func, sequence) 返回一个单值,它是这样构造的:首先以序列的 前两个元素调用函数 function ,再以返回值和第三个参数调用,依次执行下去。
例如,以 下程序计算 1 到 10 的整数之和
>>> def add(x,y): return x+y ... >>> reduce(add, range(1, 11)) 55