美文网首页
05--Python 判断与循环

05--Python 判断与循环

作者: Roger田翔 | 来源:发表于2018-03-25 20:54 被阅读0次
    @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 不做任何事情,一般用做占位语句。

    三、迭代器与生成器

    迭代器

    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语句就遍历了我们的生成器,当我们再次遍历我们的生成器的时候,将不会有任何记录。

    相关文章

      网友评论

          本文标题:05--Python 判断与循环

          本文链接:https://www.haomeiwen.com/subject/zyukcftx.html