05--Python 判断与循环
@Author : Roger TX (425144880@qq.com)
@Link : https://github.com/paotong999
计算机之所以能完成许多复杂的任务,就在于通过条件判断和循环控制来一步步运行流程。
一、条件判断
Python条件语句是通过一条或多条语句(用if
语句实现)的执行结果(True或者False)来决定执行的代码块。
Python中if语句的一般形式if – elif – else
if condition_1:
statement_block_1
elif condition_2:
statement_block_2
else:
statement_block_3
- 如果 "condition_1" 为 True 将执行 "statement_block_1" 块语句
- 如果 "condition_1" 为False,将判断 "condition_2"
- 如果"condition_2" 为 True 将执行 "statement_block_2" 块语句
- 如果 "condition_2" 为False,将执行"statement_block_3"块语句
需要注意以下几点:
- 每个条件后面要使用冒号(:),表示接下来是满足条件后要执行的语句块。
- 使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块。
- 在Python中没有switch – case语句。
if 嵌套
在嵌套 if 语句中,可以把 if...elif...else
结构放在另外一个 if...elif...else
结构中。
if 表达式1:
语句
if 表达式2:
语句
elif 表达式3:
语句
else:
语句
elif 表达式4:
语句
else:
语句
二、循环
Python中的循环语句有 for 和 while。
while 循环
Python中while语句的一般形式:
#!/usr/bin/python3
count = 0
while count < 5:
print (count, " 小于 5")
count = count + 1
else:
print (count, " 大于或等于 5")
同样需要注意冒号和缩进。另外,在Python中没有do..while
循环。
for 循环
Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。
for循环的一般格式如下:
for <variable> in <sequence>:
<statements>
else:
<statements>
以下 for 实例中使用了 break 语句,break 语句用于跳出当前循环体:
#!/usr/bin/python3
sites = ["Baidu", "Google","Runoob","Taobao"]
for site in sites:
if site == "Runoob":
print("菜鸟教程!")
break
print("循环数据 " + site)
else:
print("没有循环数据!")
print("完成循环!")
循环数据 Baidu
循环数据 Google
菜鸟教程!
完成循环!
range()函数
如果你需要遍历数字序列,可以使用内置range()
函数。它会生成数列,例如:
>>>for i in range(5):
... print(i, end=',')
0,1,2,3,4,
还可以使用range()函数来创建一个列表:
>>>list(range(10,1,-3))
[10, 7, 4]
break和continue语句及else子句
- break 语句可以跳出 for 和 while 的循环体。如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行。
- continue语句被用来告诉Python跳过当前循环块中的剩余语句,然后继续进行下一轮循环。
- else语句在穷尽列表(以for循环)或条件变为 false (以while循环)导致循环终止时被执行,但循环被break终止时不执行。
pass 语句
Python pass
是空语句,是为了保持程序结构的完整性,pass
不做任何事情,一般用做占位语句。
三、迭代器与生成器
迭代器
- 我们知道集合数据类型,如
list
、tuple
、dict
、set
、str
等;可以直接作用于for
循环,这些可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。 - 迭代器不但可以作用于
for
循环,还可以被next()
函数不断调用并返回下一个值,直到最后抛出StopIteration
错误表示无法继续返回下一个值了,这些可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。 - 生成器都是
Iterator
对象,但list
、dict
、str
虽然是Iterable
,却不是Iterator
。 - 把
list
、dict
、str
等Iterable
变成Iterator
可以使用iter()
函数。 - 为什么
list
、dict
、str
等数据类型不是Iterator
?
这是因为Python的
Iterator
对象表示的是一个数据流,Iterator
对象可以被next()
函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration
错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()
函数实现按需计算下一个数据,所以Iterator
的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator
甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
生成器
Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。
这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator
。
Python有两种不同的方式提供生成器:
- 生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
方法很简单,只要把一个列表生成式的[]改成(),就创建了一个
generator
,L是一个list
,而g是一个generator
。
- 生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行。
我们来看一个例子,使用生成器返回自然数的平方(注意返回的是多个值):
def gensquares(N):
for i in range(N):
yield i ** 2
for item in gensquares(5):
print (item)
使用普通函数:
def gensquares(N):
res=[]
for i in range(N):
res.append(i*i)
return res
for item in gensquares(5):
print (item)
推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,就可以用生成器函数来实现。
- 生成器应用
首先,生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。
大家可以在自己电脑上试试下面两个表达式,并且观察内存占用情况。对于前一个表达式,我在自己的电脑上进行测试,还没有看到最终结果电脑就已经卡死,对于后一个表达式,几乎没有什么内存占用。
sum([i for i in xrange(10000000000)])
sum(i for i in xrange(10000000000))
- 生成器唯一注意事项就是:生成器只能遍历一次。
def get_province_population(filename):
with open(filename) as f:
for line in f:
yield int(line)
gen = get_province_population('geck.log')
all_population = sum(gen)
#print all_population
for population in gen:
print (population/all_population)
执行上面这段代码,将不会有任何输出,这是因为,生成器只能遍历一次。
在执行sum语句就遍历了我们的生成器,当我们再次遍历我们的生成器的时候,将不会有任何记录。