Python入门篇之条件、循环 1.if语句 Python 中的if子句看起来十分熟悉. 它由三部分组成: 关键字本身, 用于判断结果真假的条件表达式, 以及当表达式为真或者非零时执行的代码块. if 语句的语法如下: if expression:   expr_true_suite if 语句的 expr_true_suite代码块只有在条件表达式的结果的布尔值为真时才执行, 否则将继续执行紧跟在该代码块后面的语句. (1)多重条件表达式 单个if语句可以通过使用布尔操作符and,or和not实现多重判断条件或是否定判断条件. 复制代码 代码如下: if not warn and (system_load >= 10): print "WARNING: losing resources" warn += 1 (2)单一语句的代码块 如果一个复合语句(例如 if 子句, while 或 for 循环)的代码块仅仅包含一行代码, 那么它可以和前面的语句写在同一行上: if make_hard_copy: send_data_to_printer() 尽管它可能方便, 但这样会使得代码更难阅读, 所以我们推荐将这行代码移到下一行并合理地缩进. 2.else语句 Python提供了与if语句搭配使用的else语句.如果if语句的条件表达式的结果布尔值为假,那么程序将执行else语句后的代码.它的语法你甚至可以猜到: 复制代码 代码如下: if expression:   expr_true_suite else:   expr_false_suite if passwd == user.passwd: ret_str = "password accepted" id = user.id valid = True else: ret_str = "invalid password entered... try again!" valid = False 3.elif(即else-if)语句 elif是Python的else-if语句,它检查多个表达式是否为真, 并在为真时执行特定代码块中的代码. 和else一样, elif声明是可选的, 然而不同的是: if语句后最多只能有一个else语句, 但可以有任意数量的elif语句. 复制代码 代码如下: if expression1:   expr1_true_suite elif expression2:   expr2_true_suite elif expressionN:   exprN_true_suite else:   none_of_the_above_suite 4.条件表达式(即"三元操作符") Python 2.5 集成的语法确定为: X if C else Y . 复制代码 代码如下: >>> x, y = 4, 3 >>> smaller = x if x < y else y >>> smaller 3 5.while语句 Python的while是本章我们遇到的第一个循环语句. 事实它上是一个条件循环语句.与if声明相比,如果if后的条件为真, 就会执行一次相应的代码块. 而while中的代码块会一直循环执行, 直到循环条件不再为真. while 循环的语法如下: 复制代码 代码如下: while expression:   suite_to_repeat >>> x=1 >>> while x <=100: print x x+=10 6.for语句 Python提供给我们的另一个循环机制就是for语句. 它提供了Python中最强大的循环结构.它可以遍历序列成员, 可以用在列表解析和生成器表达式中,它会自动地调用迭代器的next()方法,捕获StopIteration异常并结束循环(所有这一切都是在内部发生的).和传统语言中的for语句不同, Python的for更像是 shell 或是脚本语言中的foreach循环. for循环会访问一个可迭代对象(例如序列或是迭代器)中的所有元素, 并在所有条目都处理过后结束循环.它的语法如下: 复制代码 代码如下: for iter_var in iterable:   suite_to_repeat 1.用于序列类型 复制代码 代码如下: >>> for c in 'names': print 'current letter: ', c current letter: n current letter: a current letter: m current letter: e current letter: s 迭代序列有三种基本方法: 1.通过序列项迭代: 复制代码 代码如下: >>> namelists = ['henry', 'john', 'steven'] >>> for eachName in namelists:   print eachName, 'Lim' henry Lim john Lim steven Lim 2.通过序列索引迭代: 复制代码 代码如下: >>> namelists = ['henry', 'john', 'steven'] >>> for nameindex in range(len(namelists)): print 'Liu, ', namelists[nameindex] Liu, henry Liu, john Liu, steven 3.使用项和索引迭代: 两全其美的办法是使用内建的 enumerate() 函数, 它是 Python 2.3 的新增内容. 代码如下: 复制代码 代码如下: >>> namelists = ['henry', 'john', 'steven'] >>> for i, eachLee in enumerate(namelists): print "%d %s Lee" % (i+1, eachLee) 1 henry Lee 2 john Lee 3 steven Lee 2.用于迭代器类型 迭代器对象有一个 next() 方法,调用后返回下一个条目. 所有条目迭代完后, 迭代器引发一个 StopIteration 异常告诉程序循环结束. for 语句在内部调用 next() 并捕获异常. 3.range()内建函数 内建函数 range() 可以把类似 foreach 的 for 循环变成你更加熟悉的语句 Python 提供了两种不同的方法来调用range().完整语法要求提供两个或三个整数参数: range(start, end, step =1) range() 会返回一个包含所有k的列表,这里start <= k < end ,从start到end, k每次递增step. step不可以为零,否则将发生错误. 复制代码 代码如下: >>> range(2, 19, 3) [2, 5, 8, 11, 14, 17] 如果只给定两个参数,而省略step,step就使用默认值1. 复制代码 代码如下: >>> range(3, 7) [3, 4, 5, 6] range() 还有两种简略的语法格式: range(end) range(start, end) 4.xrange()内建函数 xrange()类似range(),不过当你有一个很大的范围列表时, xrange()可能更为适合, 因为它不会在内存里创建列表的完整拷贝. 它只被用在for循环中, 在for循环外使用它没有意义。同样地,你可以想到,它的性能远高出range(),因为它不生成整个列表。 5.与序列相关的内建函数 sorted(), reversed(), enumerate(), zip() sorted() 和 zip() 返回一个序列(列表), 而另外两个函数 reversed() 和 enumerate() 返回迭代器(类似序列) 7.break语句 Python中的 break 语句可以结束当前循环然后跳转到下条语句, 类似 C 中的传统 break.常用在当某个外部条件被触发(一般通过if 语句检查),需要立即从循环中退出时break 语句可以用在 while 和 for 循环中. 8.continue语句 Python里的continue语句和其他高级语言中的传统continue并没有什么不同.它可以被用在while和for循环里.while循环是条件性的, 而for循环是迭代的, 所以continue 在开始下一次循环前要满足一些先决条件,否则循环会正常结束. 复制代码 代码如下: valid = False count = 3 while count > 0:   input = raw_input("enter password")   # check for valid passwd   for eachPasswd in passwdList:     if input == eachPasswd:       valid = True       break     if not valid: # (or valid == 0)       print "invalid input"       count -= 1       continue     else:       break 这里例子结合使用了 while , for , if , break以及 continue ,用来验证用户输入. 用户有三次机会来输入正确的密码, 如果失败, 那么 valid变量将仍为一个布尔假(0 ), 然后我们可以采取必要的操作阻止用户猜测密码. 9.pass语句 Python提供了pass语句,它不做任何事情 - 即NOP,(No OPeration ,无操作)我们从汇编语言中借用这个概念.pass同样也可作为开发中的小技巧,标记你后来要完成的代码,例如这样: 复制代码 代码如下: def foo_func(): pass #或是 if user_choice == 'do_calc': pass else: pass 这样的代码结构在开发和调试时很有用, 因为编写代码的时候你可能要先把结构定下来,但你不希望它干扰其他已经完成的代码. 在不需要它做任何事情地方, 放一个pass 将是一个很好的主意. 10.迭代器和iter()函数 迭代器就是有一个 next() 方法的对象, 而不是通过索引来计数. 当你或是一个循环机制(例如 for 语句)需要下一个项时, 调用迭代器的 next()方法就可以获得它.条目全部取出后, 会引发一个 StopIteration 异常, 这并不表示错误发生, 只是告诉外部调用者, 迭代完成. 限制:不能向后移动, 不能回到开始, 也不能复制一个迭代器. reversed() 内建函数将返回一个反序访问的迭代器. enumerate() 内建函数同样也返回迭代器. 另外两个新的内建函数,any()和all() Python 还提供了一整个itertools模块,它包含各种有用的迭代器. 复制代码 代码如下: >>> tupe=(12,'2',45.45) >>> i = iter(tupe) >>> i.next() 12 >>> i.next() '2' >>> i.next() 45.45 >>> i.next() Traceback (most recent call last): File "", line 1, in i.next() StopIteration 创建迭代器 对一个对象调用 iter() 就可以得到它的迭代器. 它的语法如下: iter(obj) iter(func, sentinel ) 如果你传递一个参数给iter(),它会检查你传递的是不是一个序列,如果是,那么很简单:根据索引从0一直迭代到序列结束. 另一个创建迭代器的方法是使用类, 一个实现了__iter__()和next()方法的类可以作为迭代器使用. 如果是传递两个参数给iter(),它会重复地调用 func ,直到迭代器的下个值等于sentinel . 11.将某件事作为另一事件导入 从模块导入函数的时候,可以使用 复制代码 代码如下: import somemodule 或者 复制代码 代码如下: from somemodule import somefunction 或者 复制代码 代码如下: from somemodule import somefunction, anotherfunction, yetanotherfunction 或者 复制代码 代码如下: from somemodule import * 如果两个模块都有open函数,只需要使用第一种方式导入,然后像下面这样使用函数: 复制代码 代码如下: module1.open(...) module2.open(...) 或者:可以在语句末尾增加一个as子句,在该子句后给出名字,或为整个模块提供别名: 复制代码 代码如下: >>> import math as foobar >>> foobar.sqrt(4) 2.0 >>> #也可以为函数提供别名; >>> from math import sqrt as foobar >>> foobar(4) 2.0 这里所做的事情叫做序列解包--将多个值的序列解开,然后放到变量的序列中,更加形象一点的表达出来就是: 复制代码 代码如下: >>> values=1,2,3 >>> values (1, 2, 3) >>> x,y,z=values >>> x 1 >>> y 2 >>> z 3