python第二章更多控制流程语句

第二章更多控制流程语句
除了前面介绍的while 语句外,python 也使用在其他语言中所熟知的一些流程控制语句。
2.1 if 语句
可能最被人周知控制语句就是if 语句了,例如:
>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
... x = 0
... print(’Negative changed to zero’)
... elif x == 0:
... print(’Zero’)
... elif x == 1:
... print(’Single’)
... else:
... print(’More’)
...
More


Elif 可不出现也可多次出现和else 部分也是可以选择的。关键elif 是else if 的缩写形式,对于避免冗长的定义有很大帮助。If... Elif... Elif 语句在其他变成语言中可用switch 或case 语句来替代。


2.2 for 语句

在python 中的for 语句可能有以前你在C 或者pascal 中所用的有点小差别。她既不像Pascal 语言中常常遍历数组的算法过程,也不像在C 语言中给用户自己定义遍历步骤或模糊条件的能力,python 中的for 语句可以按照元素在序列(列表或者字符串)中出现的顺序逐步地遍历它们。例如:
>>> # Measure some strings:
... a = [’cat’, ’window’, ’defenestrate’]
>>> for x in a:
... print(x, len(x))
...
cat 3
window 6
defenestrate 12


在循环语句中修改正在遍历的序列是不安全的(这种情况仅仅发生在可变类型中,如列表)。如果你需要修改你正在遍历的列表(例如,想复制选中项)你必须首先复制list。然后利用分片符号很方便实现它。

>>> for x in a[:]: # make a slice copy of the entire list
... if len(x) > 6: a.insert(0, x)
...
>>> a
[’defenestrate’, ’cat’, ’window’, ’defenestrate’]


2.3 range()方法

如果你想迭代一个数字序列,内置方法range()可以很方便实现它。它可以生成连续的数字:
>>> for i in range(5):
... print(i)
...
0
1
2
3
4


方法中给出的结点不是产生序列中的一部分。Range(10)就是产生为长度为10 序列中每个元素产生10 个合法的索引值。该方法也可以让范围从其他数字开始,或者指定不同的增长数(甚至是负数,有时称这为阶梯)。

range(5, 10)
5 through 9
range(0, 10, 3)
0, 3, 6, 9
range(-10, -100, -30)
-10, -40, -70


为了迭代序列的目录,你可以结合range()和len()结合起来,例如:

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


但是,在许多情况下,运用enumerate()方法会更加方法,具体参照Looping Techniques.如果你想打印一个范围,奇怪的现象将会出现。

>>> print(range(10))
range(0, 10)


在很多情况下利用range()返回对象表现像列表,但实际上它不是列表。尽管当你迭代期望序列时,它能够依次地返回元素,但是它没有真正生成列表,因此节省空间。

我们可以把对象成为是可迭代的,就是指它很适合作为预期得到有序元素事情的方法和结构的对象。我们已经知道for 语句就是这种迭代器。方法list()也算一个,它可以产生有序列表。
>>> list(range(5))
[0, 1, 2, 3, 4]

稍后我们会看到更多能返回迭代对象和把迭代对象当做内容的方法。


2.4 break 和continue 语句和在循环中的else 子句
与在C 语言中一样,Break 语句将会跳出离它最近的for 或者while 循环。Continue 语句也是从C 中借鉴而来,继续开始循环的下一步。循环语句中有时含有else 的子句。当通过遍历结束导致循环终止(for)或者当循环条件变为false(如while),它将会执行。但是当循环被break 语句所终止,它不会被执行。下面通过查询质数这个例子来学习:


是的,这是正确代码。请仔细看,else 语句是属于for 循环的,而不是if 语句。与else 用在if 语句中相比,else 用于循环中与用在try 语句有更多相同之处。在try 语句中当没有异常发生else 语句将会执行,循环中当没有break 发生else 语句就会执行。对于更多的关于try 语句和异常的信息可以查看处理异常。

2.5 Pass 语句
Pass 语句一般做些无关紧要的事情,当按照句法语句被要求时但是系统不需要任何操作,此时可以用pass 语句。例如:
>>> while True:
... pass # Busy-wait for keyboard interrupt (Ctrl+C)
...
还常常用在创建最小类中。
>>> class MyEmptyClass:
... pass
...
能用到pass 的另一个地方就是当你运行新代码时它作为方法或者条件主体的拥有者,允许你在一个更加抽象的层次去不停地思考。Pass 将会被静静忽略
>>> def initlog(*args):
... pass # Remember to implement this!
...


2.6 定义方法
我们可以创建一个实现任意范围内的斐波那契数列的输出功能方法。
>>> def fib(n): # write Fibonacci series up to n 写出在n 以内的斐波那契数列
... """Print a Fibonacci series up to n.""" 输出在n 以内的斐波那契数列
... a, b = 0, 1
... while a < n:
... print(a, end=’ ’)
... a, b = b, a+b
... print()
...
>>> # Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

关键字def 是方法定义的标志。接下来紧跟方法名和被圆括号所包围的参数列表。方法的主体语句将在下一行开始并且必须缩进。方法主体的首句可选择性地是一句字符,用来说明方法的主要功能。(更多的文档注释可以参照文档语句)。运用docString 可以自动地生成网页或者打印文档。或者让用户更有效地浏览代码。在你写的代码中包含文档语句是个很好的行为,因此要养成这个习惯。

方法的实施标志着将会有一张新的符号表用来保存该方法的本地变量。更准确地说,在方法中所有的变量赋值都会保存到新的本地符号表中。然而,在变量符号表中首先看到的是引用。接着是围绕方法的本地符号表,接着是全局符号表,最后是内置名称的表。因此,尽管全局变量在一个方法中被引用,但它们不能被直接赋值(除非在全局语句中被命名)。

方法调用的真正参数时候,参数将会在被调用方法的本地符号表中被标记。因此,参数可以用调用值来传递。(这里的值其实是对象的引用,而不是对象值本身)。当一个方法调用另一个方法,系统将会为新调用方法产生新的本地符号表。在目前的符号表中方法定义采用方法名字。方法名字的值有个被解释器确认为用户自定义方法的类型。其他可以用在方法名称的值可以重新赋值给上面提到的方法名称。这可以认为是一个普遍的重命名机制。
>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89

你从其他语言转过来学习python,你可能反对fib 不是一个方法而是一个过程。因为它没有返回值。事实上,任何没有return 语句的方法都有返回值,即使是相当无聊的方法。这个返回值就是null(这是内置名称)。如果返回值只有一个可写值,那么输出为空是被解释器所禁止的。如果你真想用print()方法你就会看到:
>>> fib(0)
>>> print(fib(0))
None

写一个有返回斐波那契数列值得方法是很简单的,代替打印输出。
>>> def fib2(n): # return Fibonacci series up to n
... """Return a list containing the Fibonacci series up to n."""
... result = []
... a, b = 0, 1
... while a < n:
... result.append(a) # see below
... a, b = b, a+b
... return result
...
>>> f100 = fib2(100) # call it
>>> f100 # write the result
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
通常一样,这个例子涉及一些新的python 特性。
 Return 语句表示从方法中返回一个值。没有return 语句表示放回一个None.没有执行到方法结尾也返回None.
 Result.append(a)语句是调用列表对象result 的一个方法。一个方法属于该对象就可以用对象.方法名称进行调用。不同类型可以定义不同的方法,不同类型的方法可以有相同的名称不会引起冲突。在例子中显示的方法append()被定义在list 对象中。该方法意思是在list 末尾增加一个新的元素。在这个例子它等同于result = result + [a], 但是比后
者更有效率。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值