# 第四章 流程控制

## 4.1 If 语句

If 语句可能是最基本的程序分支语句了。例如：

>>> if x < 0:
...      x = 0
...      print 'Negative changed to zero'
... elif x == 0:
...      print 'Zero'
... elif x == 1:
...      print 'Single'
... else:
...      print 'More'
...



## 4.2 for 语句

Python中的for语句与你可能熟悉的C或者Pascal中的相应语句略有不同。不象Pascal 那样总是对数字序列进行循环，也不是象C中那样完全由程序员自由地控制循环条件和循环体，Python的for循环是对任意种类的序列（如列表或字符串）按出现次序遍历每一项。例如：

>>> # 计算字符串长:
... a = ['cat', 'window', 'defenestrate']
>>> for x in a:
...     print x, len(x)
...
cat 3
window 6
defenestrate 12
>>>



>>> for x in a[:]: # 生成整个列表的片段副本
...    if len(x) > 6: a.insert(0, x)
...
>>> a
['defenestrate', 'cat', 'window', 'defenestrate']
>>>



## 4.3 range() 函数

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>



>>> range(5, 10)
[5, 6, 7, 8, 9]
>>> range(0, 10, 3)
[0, 3, 6, 9]
>>> range(-10, -100, -30)
[-10, -40, -70]
>>>



>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
...     print i, a[i]
...
0 Mary
2 a
3 little
4 lamb
>>>



## 4.4 break语句，continue语句和循环中的else子句

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...            print n, 'equals', x, '*', n/x
...            break
...     else:
...          print n, 'is a prime number'
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
>>>



## 4.5 pass 语句

pass语句不执行任何操作，当语法要求一个语句而程序不需要执行操作时就用此语句。例如：

>>> while 1:
...       pass # 等待键盘中断
...



## 4.6 函数定义

>>> def fib(n):    # 写出 n 以下的所有Fibonacci序列值
...     a, b = 0, 1
...     while b < n:
...           print b,
...           a, b = b, a+b
...
>>> # 调用刚刚定义的函数:
... fib(2000)

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
>>>




>>> fib
<function object at 10042ed0>
>>> f = fib
>>> f(100)
1 1 2 3 5 8 13 21 34 55 89
>>>




>>> print fib(0)
None
>>>

>>> def fib2(n): # 返回直到n的Fibonacci 序列值
...     result = []
...     a, b = 0, 1
...     while b < n:
...           result.append(b)    # 解释见下面
...           a, b = b, a+b
...     return result
...
>>> f100 = fib2(100)    # 调用
>>> f100                # 输出结果
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

>>>



## 4.7 函数参数

可以定义使用可变个数参数的函数。这样的定义方法有三种，可以联合使用。

### 4.7.1 参数缺省值

def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
while 1:
ok = raw_input(prompt)
if ok in ('y', 'ye', 'yes'): return 1
if ok in ('n', 'no', 'nop', 'nope'): return 0
retries = retries - 1
if retries < 0: raise IOError, 'refusenik user'
print complaint



i = 5
def f(arg = i): print arg
i = 6
f()



def f(a, l = []):
l.append(a)
return l
print f(1)
print f(2)
print f(3)
This will print

[1]
[1, 2]
[1, 2, 3]



def f(a, l = None):
if l is None:
l = []
l.append(a)
return l



### 4.7.2 关键字参数

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print "-- This parrot wouldn't", action,
print "if you put", voltage, "Volts through it."
print "-- Lovely plumage, the", type
print "-- It's", state, "!"



parrot(1000)						# 缺省值
parrot(action = 'VOOOOOM', voltage = 1000000)		# 关键字，缺省值，次序可变
parrot('a thousand', state = 'pushing up the daisies')	#  位置参数，缺省值，关键字
parrot('a million', 'bereft of life', 'jump')		# 位置参数，缺省值



parrot()                     # 非缺省的参数没有提供
parrot(110, voltage=220)     # 参数值重复提供
parrot(actor='John Cleese')  # 未知关键字



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
for kw in keywords.keys(): print kw, ':', keywords[kw]



cheeseshop('Limburger', "It's very runny, sir.",
"It's really very, VERY runny, sir.",
client='John Cleese',
shopkeeper='Michael Palin',
sketch='Cheese Shop Sketch')



-- 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



### 4.7.3 任意个数参数

def fprintf(file, format, *args):
file.write(format % args)



### 4.7.4 Lambda形式

def make_incrementor(n):
return lambda x, incr=n: x+incr



### 4.7.5 文档字符串

Python的扫描程序不会从多行字符串中去掉缩进空白，所以处理文档的工具需要自己处理缩进。只要遵循如下的惯例就可以有利于缩进空白的处理。在第一行之后的第一个非空白的行决定整个文档字符串的缩进数量（我们不用第一行，因为它经常是直接跟在表示字符串开始的引号后面）。文档字符串中除第一行以外的各行都要删除等价于此行的缩进量的空白。对制表符将扩展为空格后再删除。

• 本文已收录于以下专栏：

## 《Python编程入门（第3版）》学习笔记

• louissimons
• 2015年04月23日 10:34
• 694

## Python编程：从入门到实践（课后习题3）

# 3-1 姓名 names = ['Zhou Kai', 'Zhang Lili', 'Liu Jie', 'Zhou Ting', 'Zhou Jing'] for i in names: pr...
• z120379372
• 2017年09月19日 10:57
• 856

## Python编程从入门到实践：习题4-3~4-9

• v490003181
• 2017年11月16日 17:29
• 475

## Python交互编程入门

• u014089183
• 2014年04月03日 06:43
• 1064

## Python编程：从入门到实践（课后习题7）

# 7-1 汽车租 car = input("What kind of car do you want to rent: ") print("Let me see if I can find you ...
• z120379372
• 2017年09月19日 11:04
• 1305

## 《OpenCV3编程入门》学习笔记一：邂逅OpenCV

• NNNNNNNNNNNNY
• 2016年09月14日 10:50
• 4773

## 开始学习 Python编程 从入门到实践。

• xgdtxwd
• 2017年12月21日 15:35
• 151

## Python编程：从入门到实践（课后习题8）

# 8-1 消息 def display_message(): print("This chapter I will learning function.") display_message() ...
• z120379372
• 2017年09月19日 11:05
• 1841

## Python编程：从入门到实践的动手试一试答案（第三章）

#3-1 姓名 names = ['Qiqi','Danliang','Mingliang','Peng'] for x in range(0,4): print(names[x])#3-2 ...
• weixin_39449570
• 2017年10月26日 22:30
• 349

## 《Python编程从入门到实践》学习笔记

• u013647951
• 2017年09月07日 13:51
• 870

举报原因： 您举报文章：Python编程入门(3) 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)