2015/9/5 Python基础(9):条件和循环
条件语句
Python中的if语句如下:
if expression:
expr_true_suite
其中expression可以用布尔操作符and, or 和 not实现多重判断条件。
如果一个复合语句的的代码块仅仅包含一行代码,那么它可以和前面的语句写在同一行:
if expression: dosomething
但实际上,为了可读性,我们尽量不这么做
else语句的使用:
if expression:
expr_true_suite
else:
expr_false_suite
Python使用缩进强制使代码对齐,可以避免制造一些类型的悬挂else问题。但同样要让我们非常小心代码的对齐问题,否则代码很可能不能使用。
elif(else—if)语句
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'
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)
条件表达式(即“三元操作符”)
也就是C里的C?X:Y
Python里使用了 X if C else Y:
>>> x, y = 4, 3
>>> smaller = x if x < y else y
>>> smaller
3
while语句
while循环的一般语法如下:
while expression:
suite_to_repeat
while循环一般被用作计数循环或者无限循环:
>>> count = 0
>>> while (count < 9):
print 'the index is:', count
count += 1 the index is: 0
the index is: 1
the index is: 2
the index is: 3
the index is: 4
the index is: 5
the index is: 6
the index is: 7
the index is: 8
>>>while True:
message = raw_input("please input :")
if message.lower() == 'q':
break
for 语句
Python的for非常强大,它可以遍历序列成员,可用在列表解析和生成器表达式,会自动地调用迭代器的 next()方法,捕获StopIteration异常并结束循环(这都是在内部发生的),Python的for循环不同于传统语言的for循环,类似于shell的foreach
一般语法
for循环访问一个可迭代对象(如序列或迭代器)中所有元素,并在所有条目都处理后结束循环
for iter_var in iterable:
suit_to_repeat
for循环迭代不同的序列对象,有如下例子:
>>> for eachLetter in 'Names': #迭代字符串
print 'current letter:',eachLetter current letter: N
current letter: a
current letter: m
current letter: e
current letter: s
>>> nameList = ['Amy', 'Bob', 'Henry']
>>> for eachName in nameList: #迭代序列项
print eachName, 'Lim' Amy Lim
Bob Lim
Henry Lim
>>> for nameIndex in range(len(nameList)): #不迭代元素,迭代索引
print "Liu,", nameList[nameIndex] Liu, Amy
Liu, Bob
Liu, Henry
>>> nameList = ['Donn', 'Shirley', 'Ben', 'Jane']
>>> for i, eachone in enumerate(nameList): #用项和索引迭代
print '%d %s' %(i+1, eachone) 1 Donn
2 Shirley
3 Ben
4 Jane
for循环访问迭代器和访问序列的方法差不多,只是for语句会做一些额外的事而迭代器不代表循环条目的集合。
迭代器对象有一个next()方法,调用后返回下一个条目。迭代完后引发一个StopIteration异常告诉程序循环结束。for在内部直接调用next()并捕获异常。
range()内建函数在之前的博文Python基本使用(2)里已经详细说明。这里不赘述
xrange()
xrange()类似range(),当一个列表范围很大时,xrange()更为合适,因为它不会在内存里创建列表的完整拷贝,它只能用于for循环中,在for循环外没有任何意义。使用时性能远高于range()。
sorted(), reversed(), enumerate(), zip()
>>> for album in sorted(albums):
print album, Freud Gaudi Poe Poe2
>>> for album in reversed(albums):
print album, Poe2 Freud Gaudi Poe
>>> for i, album in enumerate(albums):
print i, album 0 Poe
1 Gaudi
2 Freud
3 Poe2
>>> for album, yr in zip(albums, years):
print yr, album 1976 Poe
1987 Gaudi
1990 Freud
2003 Poe2
break语句和continue语句
break,continue和C中的break,continue十分相似。
pass语句
因为Python没有传统的括号,所以用pass表示此代码块什么都不做。
另外,循环语句也可以接else语句
表示循环结束后执行此代码块。
迭代器和iter()函数
迭代器为类序列对象提供了一个类序列的接口。序列可以利用索引从0开始一直迭代到序列的最后一个条目,用计数的方法迭代序列是很简单的。Python的迭代无缝支持序列对象,还允许非序列类型,包括用户定义的对象。
迭代器用起来很灵巧,可以迭代不是序列但表现出序列行为的对象,例如字典的key,一个文件的行等等。Python在使用迭代时分不出是迭代器还是序列,让人不用去关注这些,因为Python让它像一个序列那样操作。
使用迭代器:
序列:
>>> myTuple = (123, 'xyz', 45.67)
>>> i = iter(myTuple)
>>> i.next()
123
>>> i.next()
'xyz'
>>> i.next()
45.67
>>> i.next() Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
i.next()
StopIteration
如果这是一个实际应用程序,那么我们需要把代码放在一个try—except 块中。序列现在回自动地产生它们自己的迭代器,所以一个for循环:
for i in seq:
do_something_to(i)
实际上是这样工作:
fetch = iter(seq)
while True:
try:
i = fetch.next()
except StopIteration:
break
do_something_to(i)
字典:字典的迭代器会遍历它的键(keys)
>>> legends = {('Poe', 'author'):(1809, 1849, 1976),}
>>> legends = {('Poe', 'author'):(1809, 1849, 1976),('Gaudi','architect'):(1852, 1906, 1987),('Freud', 'psychoanalyst'):(1856, 1939, 1990)}
>>> for eachLegend in legends:
print 'Name: %s\tOccupation: %s' % eachLegend
print 'Birth: %s\tDeath: %s\tAlbum:%s\n' % legends[eachLegend] Name: Poe Occupation: author
Birth: 1809 Death: 1849 Album:1976 Name: Gaudi Occupation: architect
Birth: 1852 Death: 1906 Album:1987 Name: Freud Occupation: psychoanalyst
Birth: 1856 Death: 1939 Album:1990
另外,Python还引进了三个新的内建字典方法来定义迭代:myDict.iterkeys()(通过keys迭代),myDict.itervalues()(通过values迭代)以及myDict.iteritems()(通过key/value对来迭代)
文件
文件对象生成的迭代器会自动调用readline()方法,这样,循环就可以访问文本文件的所有行。 程序员可以用for eachLine in myFile 替换 for eachLine in myFile.readlines():
>>> myFile = open('config-win.txt')
>>> for eachLine in myFile:
... print eachLine, # comma suppresses extra \n
...
[EditorWindow]
font-name: courier new
font-size: 10
>>> myFile.close()
可变对象和迭代器
迭代可变对象时修改它们不是一个好主意,除了列表外其他序列类型不可变,所以危险就发生在这里。序列的迭代器只记录你当前到达第多少个元素,如果你迭代时改变了元素,更新会立即反映到你所迭代的条目上。在迭代字典的key时,绝对不能改变这个字典(因为字典是无序的)。使用字典的keys()方法是可以的,因为keys()返回一个独立于字典的列表,而迭代器与实际对象绑在一起,它将不会继续执行下去:
>>> myDict = {'a': 1, 'b': 2, 'c': 3, 'd':4}
>>> for eachKey in myDict:
print eachKey, myDict[eachKey]
del myDict[eachKey] a 1 Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
for eachKey in myDict:
RuntimeError: dictionary changed size during iteration
创建迭代器
对一个对象调用iter()就可以得到它的迭代器:
iter(obj)
iter(func, sentinel)
如果传递一个参数给 iter() ,它会检查你传递的是不是一个序列,如果是,那么很简单:根据索引从0一直迭代到序列结束。
如果传递两个参数给iter(),它会重复地调用func,直到迭代器的下个值等于sentinel
另一个创建迭代器的方法是类,以后我将在后面的章节详细学习。
列表解析
列表解析是一项非常有用,简单,而且灵活的工具,可以用来动态地创建列表。
列表解析的语法:
[expr for iter_var in iterable]
核心是for循环,迭代iterable对象的所有条目。前边的expr应用于序列的每个成员,最后的结果值是该表达式产生的列表。迭代变量并不需要是表达式的一部分。
lambda函数表达式:
>>> map(lambda x: x ** 2, range(6)) #这是lambda函数表达式
[0, 1, 4, 9, 16, 25]
>>> [x ** 2 for x in range(6)] #这是列表解析
[0, 1, 4, 9, 16, 25]
列表解析还有结合if的拓展版本
[expr for iter_var in iterable if cond_expr]
这个语法在迭代时会过滤/捕获满足条件表达式cond_expr的序列成员
以下例子是挑出序列中的奇数:
>>> seq = [11, 12, 16, 13, 10, 9, 9, 10, 8]
>>> filter(lambda x: x % 2, seq) #用filter和lambda实现
[11, 13, 9, 9]
>>> [x for x in seq if x % 2] #用列表解析实现
[11, 13, 9, 9]
生成器表达式
生成器表达式是列表解析的一个扩展,语法如下:
(expr for iter_var in iterable if cond_expr)
语法和列表解析基本相同,不过它并不真正创建数字列表,而是返回一个生成器,这个生成器在计算出一个条目后,把这个条目“产生”(yield)出来。生成器表达式用了“延迟计算”,所以它在使用内存上更有效。将在以后的学习中详细地说明这一点
2015/9/5 Python基础(9):条件和循环的更多相关文章
- Python基础之条件和循环
阅读目录 一.if语句 1.1功能 1.2语法 1.2.1:单分支,单重条件判断 1.2.2:单分支,多重条件判断 1.2.3:if + else 1.2.4:多分支if + elif +else 1 ...
- Python基础:条件判断 &&循环
1:条件判断 2:循环 2.1:for 2.2 while 小结: continue :跳出本次循环 进行下次循环, break :结束循环体.
- 『Python基础-7』for循环 & while循环
『Python基础-7』for循环 & while循环 目录: 循环语句 for循环 while循环 循环的控制语句: break,continue,pass for...else 和 whi ...
- 【Python】-NO.99.Note.4.Python -【Python3 条件语句 循环语句】
1.0.0 Summary Tittle:[Python]-NO.99.Note.4.Python -[Python3 条件语句 循环语句] Style:Python Series:Python Si ...
- python基础之条件控制与循环
Python3 条件控制 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户 ...
- Python基础__Python语法基础、条件、循环
之前主要讨论的是Python的对象,这本节将第一次走进Python的语言之旅,将会介绍条件与循环.本节我们将会涉及到复合语句,简要介绍一下Python的语法规则是有必要的Python语法规则 1.语句 ...
- Python基础:条件判断与循环的两个要点
一.条件判断: Python中,条件判断用if语句实现,多个条件判断时用if...elif实现:看下面一段程序 #python 3.3.5 #test if...elif age = 20 if ag ...
- Python基础之条件语句和循环
条件语句 Python中的条件语句分为 if ...else . if ...elif...else 以及if ...else 的嵌套使用: username = input('请输入您的用户名:' ...
- 【Python基础】条件语句
Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和非空(null)值为tr ...
- python学习第六天:python基础(条件判断、循环)
条件判断 格式 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: <执行3> ...
随机推荐
- FZU 1844 Earthquake Damage(最大流最小割)
Problem Description Open Source Tools help earthquake researchers stay a step ahead. Many geological ...
- 2017-2018-2 20172314 『Java程序设计』课程 结对编程练习_四则运算
相关过程截图 截图为我负责的部分关于计算的测试 关键代码解释 根据代码中的部分解释,这部分代码实现了结果的整数和分数的输出,如果算出的结果为一个真分数,就输出真分数的形式,如果结果为整数,就输出整数形 ...
- 软工实践Alpha冲刺(1/10)
队名:我头发呢队 组长博客 作业博客 张杰(组长) 过去两天完成了哪些任务 查阅Python爬取音源的资料,如 Python3爬虫抓取网易云音乐热评实战 Python爬取高品质QQ音乐(2) 如何爬网 ...
- sublime Text3 设置用新标签页打开新的文件
今天用sublime Text3 打开项目文件,发现单击文件就可以打开,但是有一个问题:每次打开新文件就会覆盖当前的标签页,无法在新的标签页打开.于是在网上查了一下. 网上有人说在Preference ...
- array_intersect_assoc 与array_intersect区别
1.array_intersect_assoc — 带索引检查计算数组的交集 说明 array array_intersect_assoc ( array $array1 , array $array ...
- cacti 添加tomcat监控
监控主机 192.168.24.69 ,以下用A表示 被监控主机 192.168.24.79,以下用B标识 一.A主机cacti中 1.导入TomcatStat中的xml模版 2.将TomcatSta ...
- PHP给图片添加图片水印
涉及到的函数: 1.file_get_contents():用于将文件的内容读入到一个字符串中的首选方法.如果操作系统支持,还会使用内存映射技术来增强性能. 2.list():list() 函数用于在 ...
- 动态include是通过servlet进行页面信息交互的
动态include是通过servlet进行页面信息交互的
- bzoj4501 旅行
题面: 小C来到了F国,小C想好好地参观F国.F国可以看一个有n个点m条边的有向无环图,小C刚开始站在1号点.假设现在小C站在x号点: 1.点x没有出边,结束旅游. 2.点x有o条出边,小C等概率地选 ...
- ARC077C pushpush 递推
---题面--- 题解: 貌似一般c题都是递推... 观察到最后一个插入的数一定在第一个,倒数第二个插入的数一定在倒数第一个,倒数第三个插入的数一定在第2个,倒数第四个插入的数一定在倒数第2个…… O ...