05--Python 判断与循环

2018-03-25  本文已影响0人  Roger田翔
@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

需要注意以下几点:

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子句

pass 语句

Python pass是空语句,是为了保持程序结构的完整性,pass 不做任何事情,一般用做占位语句。

三、迭代器与生成器

迭代器

  1. 我们知道集合数据类型,如listtupledictsetstr等;可以直接作用于for循环,这些可以直接作用于for循环的对象统称为可迭代对象:Iterable
  2. 迭代器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了,这些可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
  3. 生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator
  4. listdictstrIterable变成Iterator可以使用iter()函数。
  5. 为什么listdictstr等数据类型不是Iterator

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

生成器

Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。
这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator

Python有两种不同的方式提供生成器:
  1. 生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。
>>> 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

  1. 生成器函数:常规函数定义,但是,使用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循环无法实现的时候,就可以用生成器函数来实现。

  1. 生成器应用
    首先,生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。
    大家可以在自己电脑上试试下面两个表达式,并且观察内存占用情况。对于前一个表达式,我在自己的电脑上进行测试,还没有看到最终结果电脑就已经卡死,对于后一个表达式,几乎没有什么内存占用。
sum([i for i in xrange(10000000000)])
sum(i for i in xrange(10000000000))
  1. 生成器唯一注意事项就是:生成器只能遍历一次。
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语句就遍历了我们的生成器,当我们再次遍历我们的生成器的时候,将不会有任何记录。

上一篇下一篇

猜你喜欢

热点阅读