Python回顾与整理6:条件和循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python回顾与整理6:条件和循环相关的知识,希望对你有一定的参考价值。

0.说明


        提及的内容为:if、while、for及与他们相搭配的else、elif、break、continue和pass语句。




1.if语句


  • 语法

if expression:
        expr_true_suite

        其中对于expression部分可以使用逻辑连接词an、or和not来实现多重判断条件。

  • 单一语句的代码块

        即如果只有一个语句执行时,可以写成下面这样:

if True: print ‘OK‘

        但还是建议写在不同的行。




2.else语句


  • 语法

if expression:
        expr_true_suite
else:
        expr_false_suite
  • 避免“悬挂else”

        像C语言这种使用括号来分隔代码块的语言会出现这种情况(即在有多个if语句蛙,else语句不知道是属于哪一个if语句的),但由于Python是强制使用缩进来使代码对齐的,因此不可能会出现这种问题。




3.elif语句


  • 语法

if expression1:
        expr1_true_suite
elif expression2:
        expr2_true_suite
elif expression3:
        expr3_true_suite
        ……
elif expressionN:
        expr1_true_suite
else:
        none_of_the_above_suite

        可以有任意数量的elif语句,但只能有一个else语句。

  • switch/case语句的替代品

        在C语言中有switch/case语句用于在多个选项中进行选择,Python虽然没有switch/case语句,但却有更好的解决方案来实现同样的功能:

#方案一:大量的if-elif语句
if user.cmd == ‘create‘:
        action = ‘create item‘
elif user.cmd == ‘delete‘:
        action = ‘delete item‘        
elif user.cmd == ‘update‘:
        action = ‘update item‘        
        
#方案二:用序列和成员关系操作符
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)
#使用映射对象(比如字典)的一个最大好处就是它的搜索操作比类似if-elif-else语句或是for循环这样的序列查询要快很多

        可以看到,对于实现同样的功能,Python中的解决方案更加强大和简洁。




4.条件表达式(三元操作符)


  • 语法:X if C else Y

        使用如下:

>>> x, y =4, 3
>>> smaller = x if x < y else y
>>> smaller
3




5.while语句


  • 语法

while expression:
        suite_to_repeat
  • 计数循环

count = 0
while (count < 9):
        print ‘the index is: ‘,count
        count += 1
  • 无限循环

while True:
        suite_to_repeat

        无限循环主要是用在Server/Client模式中Server端的设计,用以等待来自客户端的连接,当然如果有必要的话也是可以通过break语句来结束循环的。




6.for语句


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


(1)语法

for iter_var in iterable:
        suite_to_repeat

        每次循环,iter_var抚迭代变量被设置为可迭代对象iterable(序列、迭代器或其他支持迭代的对象)的当前元素,提供给suite_to_repeat语句使用。


(2)用于序列类型

        主要是下面用于序列迭代的三种方法:

  • 通过序列项迭代

>>> nameList = [‘xpleaf‘, ‘clyyh‘, ‘cl‘]
>>> for name in nameList:
...   print name
... 
xpleaf
clyyh
cl
  • 通过序列索引迭代

>>> nameList = [‘xpleaf‘, ‘clyyh‘, ‘cl‘]
>>> for nameIndex in range(len(nameList)):
...   print nameList[nameIndex]
... 
xpleaf
clyyh
cl

        显然会比第一种方法慢很多。

  • 使用项和索引迭代

>>> nameList = [‘xpleaf‘, ‘clyyh‘, ‘cl‘]
>>> for nameIndex, name in enumerate(nameList):
...   print nameIndex, name
... 
0 xpleaf
1 clyyh
2 cl


(3)用于迭代器类型

        for语句用于迭代器时,会自动帮我们处理很多问题(在内部调用next()并处理StopIteration异常),不过需要注意的是,迭代器并不代表循环条目的集合。


(4)range()内建函数

        range()可以用来生成一个数字顺序列表,从而可以使用for来进行迭代,它主要有以下两种语法:

  • 完整语法

        如下:

range(start, end, step=1)

        即默认步长为1,举例如下:

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

        但是步长不能为0,否则会出错:

>>> range(1, 10, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: range() step argument must not be zero
  • 简单语法

range(end)    #即默认start=1
range(start, end)    #其实就是默认步长为1的情况

        举例如下:

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


(5)xrange()内建函数

        当调用range()时,会直接生成一个列表并写入内存中,但当生成的列表很大时,使用range()就不适合了,这时可以考虑可以xrange(),它返回一个可迭代的对象,而并不会生成一个完整的列表,因此它只被用于for循环中,否则是没有意义的:

>>> xrange(10)
xrange(10)
>>> type(xrange(10))
<type ‘xrange‘>
>>> for num in xrange(10):
...   print num,
... 
0 1 2 3 4 5 6 7 8 9


(6)与序列相关的内建函数

        主要是:sorted()reversed()enumerate()zip()

        之所以说是与序列相关,是因为其中两个函数(sorted()和zip())返回一个序列(列表),而另外两个函数(reversed()和enumerate())返回迭代器,举例如下:

  • sorted():返回一个列表

>>> nameTuple = (‘xpleaf‘, ‘cl‘)
>>> years = (1994, 1995)
>>> sorted(nameTuple)
[‘cl‘, ‘xpleaf‘]
>>> for name in sorted(nameTuple):
...   print name,
... 
cl xpleaf
  • reversed():返回一个迭代器

>>> reversed(nameTuple)
<reversed object at 0x7f2fa02df390>
>>> for name in reversed(nameTuple):
...   print name,
... 
cl xpleaf
  • enumerate():返回一个迭代器

>>> enumerate(nameTuple)
<enumerate object at 0x7f2f9e1c1d20>
>>> for nameIndex, name in enumerate(nameTuple):
...   print nameIndex, name
... 
0 xpleaf
1 cl
  • zip():返回一个列表

>>> zip(nameTuple, years)
[(‘xpleaf‘, 1994), (‘cl‘, 1995)]
>>> for name, year in zip(nameTuple, years):
...   print name, year
... 
xpleaf 1994
cl 1995




7.break语句

        

        break可以结束当前循环然后跳转到下一条语句(如果存在的话),可用于while和for两各循环中:

>>> count = 0
>>> while True:
...   if count>10:
...     print ‘OK‘
...     break
...   count += 1
... 
OK




8.continue语句


        continue语句的作用:当遇到ontinue语句时,程序会终止当前循环,并忽略剩余的语句,然后回到循环的顶端。在开始一次迭代前,如果是条件循环,我们将验证条件表达式;如果是迭代循环,我们将验证是否还有元素可以迭代。只有在验证成功的情况下,才会开始下一次迭代。

        对在Python中,while循环是条件性的,for循环是迭代的,这就可以跟上面的两种情况对应起来,可简单举例如下:

>>> count = 0
>>> while count<10:
...   count += 1
...   if count != 6:
...     continue
...   print count
... 
6
>>>
>>> for count in range(10):
...   if count != 6:
...     continue
...   print count
... 
6




9.pass语句


        主要是下面几个方面会用到pass语句:

  • 有些地方在语法上要求有代码

  • 标记后来要完成的代码(比如先定义个类或函数,但什么也不做)

  • 在异常处理中对于影响不大的异常可以直接pass




10.再谈else语句


        在Python中,除了在条件语句中使用else外,还可以在while和for循环中使用else语句。当在循环中使用时,else子句只在循环完成后执行,即如果此时循环中存在break语句就会跳过该else语句。

        举例如下:寻找一个数的最大约数

#!/usr/bin/env python


def showMaxFactor(num):
    count = num / 2  #从一半开始计数,这样就可以检查这个数是否可以被2整除,如果可以,那就找到了最大的约数
    while count > 1:
        if num % count == 0:
            print ‘largest factor of %d is %d‘ % (num, count)
            break
        count -= 1
    else:
        print num, ‘is prime‘

if __name__ == ‘__main__‘:
    showMaxFactor(10)
    showMaxFactor(31)

        这是是一个非常好的特性,可以考虑一下,如果没有该特性,要实现上面的功能,在逻辑上就肯定没有那么清晰了。




本文出自 “香飘叶子” 博客,请务必保留此出处http://xpleaf.blog.51cto.com/9315560/1754975

以上是关于Python回顾与整理6:条件和循环的主要内容,如果未能解决你的问题,请参考以下文章

Python回顾与整理3:数字

Python回顾与整理2:Python对象

Python回顾与整理4:序列(字符串/列表/元组)

Python回顾与整理12:执行环境

python运算学习之Numpy ------ 数组的切片索引与循环遍历条件和布尔数组

python考前复习,python基础语法知识点整理