Python成为专业人士笔记– 循环语句

专业人士笔记”系列目录:

创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!


循环函数是编程中最基本的函数之一,是几乎所有编程语言的重要组成部分。循环使开发人员能够设置他们的代码的某些部分来重复许多循环,这些循环被称为迭代;本文涵盖了在Python中使用多种类型的循环和循环的应用

循环中的 Break 和 Continue

break语句:

当一个break语句在一个循环中执行时,控制流将立即从循环中“断开”

         i = 0
 while i < 7:
      print(i)
      if i == 4:
           print("从循环中止")
           break
      i += 1
      

执行break语句后,循环语句将立即无条件终止

注意,从语法上讲,break语句只允许在循环内部使用,在某一个函数中的break语句不能用于终止它上级去调用这个函数的循环

break语句也可以在for循环中使用,这是Python提供的另一个循环结构 :

        for i in (0, 1, 2, 3, 4):
    print(i)
    if i == 2:
       break
      

执行这个循环将打印:

         0
 1
 2
      

注意,由于循环已经结束,所以3和4没有被打印出来

如果循环有一个else子句,那么当循环通过break语句终止时,这个else也不会执行

continue 语句

continue语句将跳过当前块的其余部分而继续循环,跳到循环的下一个迭代;与break一样,continue只能出现在循环中

        for i in (0, 1, 2, 3, 4, 5):
    if i == 2 or i == 4:
       continue
     print(i)

#输出
 0
 1
 3
 5
      

请注意,2和4没有打印,这是因为continue将进入下一个迭代,而不是在i == 2或i == 4时继续打印变量i。

嵌套循环

break and continue 只在单级循环中操作。下面的示例只会跳出内部的for循环,而不是外部的while循环 :

        while True:
   for i in range(1,5):
       if i == 2:
          break #  只会跳出内部循环 ! 
      

Python不具备同时跳出多个循环级别的能力——如果需要这样做,那么将一个或多个循环重构为一个函数,并使用return替换break即可

使用函数中的return代替break

return语句退出一个函数,而不执行函数之后的代码

如果在一个函数中有一个循环,那么在循环中使用return就相当于在循环中使用了break(当然,循环外的函数剩余的的代码也都没有执行) :

        def break_loop():
    for i in range(1, 5):
        if (i == 2):
            return(i)
        print(i)
   return(5)
      

如果代码里有嵌套循环,return语句将中止所有循环:

         def break_all():
     for j in range(1, 5):
         for i in range(1,4):
             if i*j == 6:
                 return(i)
             print(i*j)
      

将会输出:

        1# 1*1
2# 1*2
3# 1*3
4# 1*4
2# 2*1
4# 2*2 
 #  因为2*3 = 6,两个循环的剩余迭代都没有执行 
 
      

For 循环

for循环遍历集合类型变量,如list或dict,并使用集合中的每个元素运行代码块

         for i in [0, 1, 2, 3, 4]:
     print(i)
      

上面的for循环遍历一组数字

每次迭代都将i的值设置为列表的下一个元素。首先是0,然后是1,然后是2,等等。输出将如下所示 :

         0
 1
 2
 3
 4
      

range是一个在可迭代形式下返回一系列数字的函数,因此它可以在for循环中使用

        for i in range(5):
    print(i)
      


给出与第一个for循环完全相同的结果,注意,这里没有打印5,因为这里的范围是从0开始计数的前5个数字(不包括5本身)

这里分享论坛上有关迭代的一个热度问题:迭代器,可迭代和迭代到底是什么?

for循环可以在任何定义了__getitem__或__iter__函数的可迭代对象上进行迭代。__iter__函数返回一个迭代器,它是一个带有下一个函数的对象,该函数用于访问iterable的下一个元素。

迭代list列表

遍历可用于列表 :

        for x in ['one', 'two', 'three', 'four']:
    print(x)
#输出
 one
 two
 three
 four
      

如果希望循环遍历列表中的元素及其索引,可以使用Python的enumerate函数:

         for index, item in enumerate(['one', 'two', 'three', 'four']):
     print(index, '::', item)
  #这里,index将打印出索引  item将打印出元素项
 #枚举将生成元组,这些元组将解压缩为index(一个整数)和item(列表中的实际值)。上面的循环将打印出来 
 0 :: one
 1 :: two
 2 :: three
 3 :: four
      

可以使用map和lambda对列表进行值操作的迭代,即对列表中的每个元素应用lambda函数 :

        x = map(lambda e : e.upper(), ['one', 'two', 'three', 'four'])

print(list(x))  #python3  返回的是迭代器,需要转list

print(x) #python2 直接返回的list列表

#输出:
['ONE', 'TWO', 'THREE', 'FOUR']
      

补充:map函数

map() 会根据提供的函数对指定序列做映射。

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表(python2)或者迭代器(python3)

所以,x = map(lambda e : e.upper(), [‘one’, ‘two’, ‘three’, ‘four’]),这行代码相当于,先对每一个元素进行大写转换,返回值重新指定为list进行输出,此操作使用循环能达到同样的效果

带“else”条件的循环

for和while循环可以有一个else子句(实际上,这种用法相当少见)。else子句仅在for循环通过迭代直至完成而终止后执行,或在while循环通过其条件表达式变为false而终止后执行:

         for i in range(3):
    print(i)
 else:
    print('done')
 i = 0

 while i < 3:
    print(i)
    i += 1
 else:
 print('done')

#输出:
 0
 1
 2
 done
      

如果循环以其他方式(通过break语句或引发异常)终止,则else子句不执行

        for i in range(2):
    print(i)
    if i == 1:
       break
    else:
       print('done')

#输出:
 0
 1
      

大多数其他编程语言都没有这个可选的else循环子句。特别是else关键字的使用常常被认为是令人困惑的。

这种子句的最初概念可以追溯到Donald Knuth,如果我们根据结构化编程之前的if语句和goto语句或从低级汇编语言重写一个循环,else关键字的含义就会变得很清楚。

例如 :

        while loop_condition():
   ...
    if break_condition():
       break
    ...
      

等价于:

        #伪代码
 <start>:
 if loop_condition():
  …
   if break_condition():
       goto <end>
  …
  goto <start>
 <end>:
      

如果我们给它们每个附加一个else子句,它们仍然是等价的:

例如 :

        while loop_condition():
  …
   if break_condition():
      break
   …
   else:
     print('done')
      

等价于 :

        #伪代码
 <start>:
 if loop_condition():
   …
    if break_condition():
       goto <end>
  …
    goto <start>
 else:
    print('done')
<end>:
      

带有else子句的for循环也可以用同样的方式理解。从概念上讲,只要可迭代对象或序列仍然有一些剩余元素,循环条件就仍然为真。

为什么存在这种奇怪的结构呢

for else构造的主要用途是一个简洁的元素判断实现:

         a = [1, 2, 3, 4]
 for i in a:
     if type(i) is not int:
        print(i)
        break
 else:
     print("没有异常")
#当然,增加一个变量去计数来实现同样的功能是可以的,只是会更繁琐
      

为了使else在这个结构中更容易理解,我们可以把它想象成“如果没有中断”或“如果没有找到”。

Pass语句

当Python语法需要语句(例如for或while循环的主体内),但程序员不需要或不需要操作时,pass是一个空语句。这可以作为尚未编写的代码的占位符 :

        for x in range(10):
    pass
# 我们不想做任何事,或者还没有准备好做任何事,所以我们会先放个pass在这里,避免程序调试出错 
      

在这个例子中,什么也不会发生。for循环将不会出现错误,但是不会执行任何命令或代码;pass允许我们成功地运行代码,而不需要完全实现所有的命令和操作。类似地,pass可以用于while循环,也可以用于选择和函数定义等。

遍历dictionary 字典

考虑下面的字典:

        d = {"a": 1, "b": 2, "c": 3}
      

要遍历其键,可以使用:

         for key in d:
     print(key)

#输出:
 "a"
 "b"
 "c"
      

上面是这种写法的简化版本:

        for key in d.keys():
    print(key)
      

遍历它的值用:

        for value in d.values():
    print(value)

#输出:
 1
 2
 3
      

若要同时遍历其键和值,使用:

         for key, value in d.items():
     print(key, "::", value)
      

请注意,在Python 2中,.keys()、. values()和.items()返回一个列表对象。 如果您只需要遍历结果,您可以使用等效的.iterkeys()、. itervalues()和.iteritems()。

.keys()和.iterkeys()、. values()和.itervalues()、. items()和.iteritems()之间的区别是: iter *方法是生成器。 因此,字典中的元素按原样一一生成 ,在 返回列表对象时,所有元素都打包到列表中,然后返回以供进一步使用

do-while 循环

与其他语言不同,Python没有do-until或do-while结构(这将允许在测试条件之前执行一次代码)。然而,你可以结合while True和break关键字来达到同样的目的。

         a = 10
 while True:
     a = a-1
     print(a)
     if a<7:
         break
 print('Done.')

#输出:
 9
 8
 7
 6
 Done.
      

循环和元素解析

例如,如果你希望循环遍历一个对称元组(即每个元组长度一致)列表中的每一个固定位置的元素 :

        collection = [('a', 'b', 'c'), ('x', 'y', 'z'), ('1', '2', '3')]
      

假如,我希望快速把每一个元素的第1位找出来(即’a’,’x’,’1′),剩余的也如此:

直观反应是这样做:

        for item in collection:
    i1 = item[0]
    i2 = item[1]
    i3 = item[2]
    #业务逻辑
      

或这样:

        for item in collection:
    i1, i2, i3 = item
    #业务逻辑
      

其实你可以简单地这样:

        for i1, i2, i3 in collection:
    print(i1)
    print(i2)
    print(i3)
    #其它业务逻辑
#输出:
 a
 b
 c

 x
 y
 z

 1
 2
 3
      

上面的语句,很容易把每个元组中对称位置的元素输出出来,在需要这样处理业务逻辑的时候尤其有用

迭代的步长

假设您有一个很长的元素列表,并且您只对列表中的其他元素感兴趣。也许您只想检查列表中的第一个或最后一个元素,或特定范围的条目。Python具有强大的索引内置功能。下面是一些如何实现这些场景的示例

下面是一个简单的列表,将在整个示例中使用 :

        lst = ['alpha', 'bravo', 'charlie', 'delta', 'echo']
      

整个列表的迭代

要遍历列表中的每个元素并处理,可以使用如下所示的for循环 :

        for s in lst:
    print s[:1] # 打印出第一个字母
#输出:
 a
 b
 c
 d
 e
      

下面的循环从索引为1的元素开始,以步长为2的间隔进行循环遍历

两个for循环的结果一样,只是不同的写法:

        lst = ['alpha', 'bravo', 'charlie', 'delta', 'echo']

for s in lst[1::2]:
    print(s)

for i in range(1, len(lst), 2):
    print(lst[i])

#它们都会输出:
 bravo
 delta
 
      

While 循环

while循环将语句执行直到循环条件为false为止。下面的代码将总共执行循环语句4次。

        i = 0
while i < 4:
   #循环语句
   i = i + 1
      

虽然上面的循环可以很容易地转换成更优雅的for循环,但是While循环对于检查是否满足某些条件非常有用。下面的循环将继续执行,直到myObject准备好为止 :

        myObject = anObject()
while myObject.isNotReady():
    myObject.tryToGetReady()
      

while循环也可以在没有任何条件表达式的情况下通过使用数字(复数或实数)或True来运行

        import cmath

complex_num = cmath.sqrt(-1)
while complex_num: #  可以使用任意数字、True或任意值来替换这个复数 
    print(complex_num)
    #这里永远输出 1j
      

如果条件始终为真,并且没有break或return这样的语句进行中断或异常终止。 那么while循环将一直运行(无限循环)

        while True:
    print "无限循环"

#注意:当因为网络、内存溢出等原因导致中断时,循环依然会中止
如果要避免这样的原因,可以使用try/catch语句结合continue:

 while True:
    try:
        print "无限循环" 
    except Exception as e:
        continue
      

今天的分享就到这里,禁止转载,违者必究!

猜你喜欢

转载自blog.csdn.net/oSuiYing12/article/details/106211756