Python核心编程--学习笔记--8--条件与循环

  本章讲述if、while、for以及与他们搭配的else、elif、break、continue、pass等语句。

 

1 if语句

  语法:三部分——关键字if、条件表达式、代码块。(记住冒号)

if cond_expr:
    expr

1.1 多重条件表达式

  条件表达式可以是一个由not、and、or连接起来的逻辑表达式。

1.2 单一语句的代码块

  如果代码块只有一行,可以将三部分写在一行,不推荐这样。

2 else语句

  同C语言中的if...else...,记住冒号。else一定要与和它搭配的if对齐。

if cond_expr:
    expr0
else:
    expr1

3 elif语句

  类似于C中使用else if。if后面只可以配一个else,但是可以有多个elif。

if cond_expr0:
    expr0
elif cond_expr1:
    expr1
elif cond_expr2:
    expr2
else:
    expr3

  如果出现这种形式的用法:

if user.cmd == 'create': 
  action = "create item" 
elif user.cmd == 'delete': 
  action = 'delete item' 
elif user.cmd == 'update': 
  action = 'update item' 
else: 
  action = 'invalid choice... try again!' 

  不如使用元组或字典来判断成员,效率更高,顺便复习一下之前学到的知识:

#判断元组成员
if user.cmd in ('create', 'delete', 'update'): 
  action = '%s item' % user.cmd 
else: 
  action = 'invalid choice... try again!' 

#判断字典成员,并使用字典方法
msgs    = {'create': 'create item', 'delete': 'delete item', 'update': 'update item'} 
default = 'invalid choice... try again!' 
action  = msgs.get(user.cmd, default)

4 条件表达式

  即C语言中的?:表达式。C语言中的 cond ? A : B   等价于  Python中的 A if cond else B  。

5 while语句

5.1 语法

  类似C语言中while的用法,记住冒号:

while cond_expr:
    expr

5.2 计数循环

>>> count = 0
>>> while count < 9:
...     print 'index is', count
...     count += 1

5.3 无限循环

  死循环,while True:  ,很多通讯服务器的客户端/服务端就采用无限循环。

6 for语句

  Python中最强大的循环结构,可以遍历序列成员,可以用在“列表解析”和“生成器表达式”中,它会自动地调用迭代器的next()方法,捕获StopIteration异常并结束循环,这一切都是在内部发生的。

6.1 语法

for iter_val in iterable:
    expr

  序列可以直接迭代,而且比通过索引迭代更有效率。可以通过enumerate()的返回值同时迭代索引和元素。

6.2 用于迭代器类型

  迭代器对象有一个next()方法,调用它则返回下一个元素,迭代结束后引发一个StopIteration异常。

>>> it = reversed( range(3) )    #reversed函数返回一个迭代器,它是参数的逆序
>>> it.next()
2
>>> it.next()
1
>>> it.next()
0
>>> it.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

  for语句迭代一个迭代器时,在内部调用next()方法,并自动捕获异常。

6.3 range()内建函数

  返回一个包含数值的列表。有三种语法,完整的和简略的:

1 range(start, end, step = 1)  #完整语法,返回一个列表,包含[start, end - 1]
2 range(start, end)            #步长默认为1
3 range(end)                   #开始默认为0,步长默认为1

6.4 xrange()内建函数

  和range()很相似,参数一样。不过它返回一个xrange对象,可迭代。在数据量很大时,比range()高效且节省内存。(即数据是按需计算)

6.5 与序列相关的内建函数

  以下函数都返回一个可迭代的对象:

1 sorted()    #返回一个序列
2 zip()       #返回一个序列
3 
4 reversed()  #返回一个迭代器
5 enumerate() #返回一个迭代器

7 break语句

  类似于C语言里的break,用于退出循环。

8 continue语句

  类似于C语言里的continue,忽略循环中的剩余语句,立即回到循环头,检查条件表达式,进行下一次循环或退出循环。

9 pass语句

  NOP,即no operation。对于想好结构,没有想好具体代码的程序,可以作为一个占位语句。类似C语言的空语句 {} 或 ;  。

10 用在循环中的else

  else与while或for对齐使用,当循环正常结束时(非break)执行else里的语句。可以认为它与循环的判断条件(当成一个if)搭配使用。

#!/usr/bin/env python 

for i in range(3):
    if i == 1:
        break    #跳出循环,不执行后面的else语句
    print i
else:
    print 'loop over'
$ python pytest.py   #执行脚本
0

  将break改成continue,最终循环也是正常结束的(即循环的判断条件失败时推出的循环),则执行else语句:

$ python pytest.py 
0
2
loop over

11 迭代器

  • 迭代器为类序列对象提供一个类序列接口,可以用它来迭代不是序列但是表现出序列行为的对象(比如字典、文件等)。
  • 迭代字典,结果就是遍历dict.keys()返回的列表;迭代文件对象,结果就是遍历fp.readlines()返回的列表。
  • 序列迭代的时候可以修改成员,其他对象不可以修改,也不推荐迭代的时候修改。
  • iter()可以为一个序列或者集合等生成其迭代器。

12 列表解析

  语法:

[expr for iter_val in iterable]

  例如:

#一维列表
>>> [x*x for x in range(3)]
[0, 1, 4]

#二维列表
>>> [(x, y**2) for x in range(2) for y in range(3)]
[(0, 0), (0, 1), (0, 4), (1, 0), (1, 1), (1, 4)]

  扩展形式,对迭代变量加一个条件:

>>> [x*x for x in range(4) if x % 2]     #只求奇数的平方
[1, 9]

13 生成器表达式

  语法和列表解析类似:

(expr for iter_val in iterable)  #这里是小括号

  类似于range和xrange的区别,列表解析会返回一个列表,数据量大时占用大量内存;生成器表达式则是返回一个生成器,调用next()方法时计算并返回一个数据。

14 模块

  Python有一个模块itertools,用于辅助使用迭代器。

 

练习题

8–4 素数。编写函数,函数名为isprime()。如果输入的是一个素数,那么返回True,否则返回False。

 1 #!/usr/bin/env python 
 2 
 3 import math
 4 
 5 def isprime(num):
 6     if type(num) is not type(1) or num < 2:
 7         print 'You should input an integer >= 2'
 8         return
 9     for i in range(2, int(math.sqrt(num)) + 1):
10         if not num % i:
11             return False 
12     return True
8-4 View Code

8-5 约数。完成一个名为getfactors()的函数。它接受一个整数作为参数,返回它所有约数的列表,包括1和它本身。 

1 #!/usr/bin/env python 
2 
3 def getfactors(num):
4     factors = []
5     for i in range(1, num + 1):
6         if not num % i:
7             factors.append(i)
8     return factors
8-5 View Code 

8–6 素因子分解。以刚才练习中的isprime()和getfactors()函数为基础编写一个函数,它接受一个整数作为参数,返回该整数所有素数因子的列表。这个过程叫做求素因子分解,它输出的所有因子之积应该是原来的数字。注意列表里可能有重复的元素。例如输入20,返回结果应该是[2, 2, 5]。 

 1 #!/usr/bin/env python
 2 
 3 def getprimefactors(num):
 4     primefactors = []
 5     while num != 1:
 6         for i in range(2, num + 1):
 7             if isprime(i) and not num % i:   #调用isprime()
 8                 primefactors.append(i)
 9                 num /= i
10                 break
11     return primefactors
8-6 View Code 

8–7 全数。完全数被定义为这样的数字:它的约数(不包括它自己)之和为它本身。例如:6的约数是1、2、3,因为1 + 2 + 3 = 6,所以6被认为是一个完全数。编写一个名为isperfect()的函数,它接受一个整数作为参数,如果这个数字是完全数,返回1;否则返回0。 

1 #!/usr/bin/env python 
2 
3 def isperfect(num):
4     if sum( getfactors(num) ) - num == num:   #调用getfactors()
5         return 1
6     return 0
8-7 View Code
posted @ 2013-12-02 15:42  阿杰的专栏  阅读(295)  评论(0编辑  收藏  举报