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)

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

时间: 2024-10-15 01:29:28

Python回顾与整理6:条件和循环的相关文章

Python回顾与整理5:映像和集体类型

0.说明 依然是按照前面介绍的几种序列类型的思路来总结字映像类型和集合类型,即先做一个介绍,再讨论可用操作符.工厂函数.内建函数和方法. 1.映射类型:字典 映射类型被称做哈希表,而Python中的字典对象就是哈希类型,即它是按照这样的方式来存储数据:(哈希表的算法)是获取键,对键执行一个叫做哈希函数的操作,并根据计算的结果,选择在数据结构的某个地址中来存储对象的值.任何一个值存储的地址取决于它的键,正因为这种随意性,哈希表中的值是没有顺序的,所以Python中的字典对象中的元素也是无序的. 下

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

0.说明 序列其实是Python的某几类数据类型的统称,如字符串,列表和元组,将它们统称为序列,是因为:它们的成员有序排列,并且可以通过下标偏移量访问到它的一个或者几个成员. 总结的思路为:先介绍适用于所有序列类型的操作符和内建函数,然后再分别对这几种序列类型进行介绍. 1.序列 序列类型都有相同的访问模式:它的每一个元素都可以通过指定一个偏移量的方式得到,多个元素通过切片操作的方式得到.而在Python序列中,偏移量的规则如下(假设序列长度为N): (1)标准类型操作符 在<Python回顾与

Python回顾与整理3:数字

Python回顾与整理3:数字 0.说明 数字用的次数是否多主要是看需求,如果是做自动化运维平台开发,比如做一个自动监控的系统,那么你肯定需要收集一定量的数据,然后再对这些数据做一定的处理,那么这时候,你就一定需要用得上数字的.当然,我这里所说的要不要用数字,指的是,你是否需要对你的数据做一定的处理. 1.数字简介 数字是不可更改类型,也就是说变更数字的值会生成新的对象. (1)创建数值对象并用其赋值(数字对象) >>> anInt = 1 >>> aComplex =

python学习[第十三篇] 条件和循环

python学习[第十三篇] 条件和循环 if语句 单一if 语句 if语句有三个部分构成,关键字if本身,判断结果真假的条件表达式,以及表达式为真或非0是执行的代码 if expression: expr_true_suite 条件表达式可以是多重的 通过布尔操作符 and or not来实现 单一语句的if 代码块,如果if语句的执行代码只有一行,可以放在一行来写 if expresssion: expr_tru_suite >>> if True: print True ... T

Python 2.7 学习笔记 条件与循环语句

本文介绍下python条件和循环语句的语法 一.if条件语句 语法格式如下: if 表达式: .... elif 表达式: .... elif 表达式: .... else: ..... 说明:与其它语言的语法区别是,表达式或else后面要加 冒号 结尾. 语句块没有用一些标识符括起来,而是靠缩进来标记. 二.while循环 语法格式是: while 表达式: ........ 三.for循环 for循环用于遍历一个集合,语法格式是: for  元素  in  集合 ........ 举例如下:

.Net程序员之Python基础教程学习----判断条件与循环[Fourth Day]

    今天学习Python的判断条件与循环操作. 一. 布尔变量: 在学习判断条件之前必须的了解bool变量,在Python中bool变量与C语言比较类似,与.net差别比较大,其中下面集中情况需要记住. False, '', 0, (), [],{},None 为空,而True,12,'hello',[1] 这些普遍都为真. 其实可以简单理解为,无即是false,有既是true >>> bool(True) True >>> bool(0) False >&g

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

0.说明 作为<Python核心编程>核心部分的最后一章,这篇的内容也相当重要.对于高级部分的整理,将采用<Python核心编程>第三版,但是,方式会以之前的完全不一样了. 1.可调用对象 可调用对象即可通过函数操作符"()"来调用的对象,也可以通过函数式编程接口来进行调用,如apply().filter().map()和reduce().Python有4种可调用对象:函数.方法.类和一些类的实例. (1)函数 Python中有三种不同类型的函数:内建函数(BI

Python回顾与整理2:Python对象

0.说明 说对象是面向对象编程语言最重要的一部分一点也不为过,没有了"对象",面向对象将无从谈起.Python也是如此,如果无法掌握对象,你很难有大的进步与提升. 1.Python对象 (1)对象特性 Python使用对象模型来存储数据,构造任何类型的值都是一个对象,所有的Python对象都拥有下面的三个特性: 身份:每个对象一唯一身份标识,可使用内建函数id()查看该值(可以认为这个值是该对象的内在地址) 类型:对象的类型决定了对象(可以保存什么类型的值,进行什么样的操作,遵循什么样

Python回顾与整理10:模块

0.说明 模块是用来组织Python代码方法的方法,而包则是用来组织模块的,充分利用好包和模块将有利于开发出结构清晰的大型程序. 1.什么是模块 所谓模块,其实就是一个包含了特定功能代码的.py文件,在这个.py文件中,主要有如下的代码类型: 包含数据成员和方法的类 一组相关但彼此独立的操作函数 全局变量 使用import语句就可以导入一个模块中的相关属性. 2.模块和文件 模块是按照逻辑上来组织Python代码的方法,而体现在物理层面上,它就是一个文件,因此,一个文件被看作是一个独立模块,一个