zoukankan      html  css  js  c++  java
  • Python基础 | 关于“循环”那些事

    Python中常见的循环有两类

    • for
    • while

    for 循环

    list

    list是最常见的可迭代对象,其他可迭代的对象例如 dict,set,file lines,string

    for i in set((1,2,3)):
        print(i)
    

    输出:
    1
    2
    3

    import string
    
    list_num = list(string.digits)
    
    for i in list_num:
        # 输出偶数
        if int(i)%2 == 0:
            print(i)
    

    输出:
    0
    2
    4
    6
    8

    range

    range 有头无尾,e.g. range(1,3) 实际得到的序列是(1,2)

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

    输出:
    0
    1
    2

    for i in range(1,9):
        # 输出偶数
        if int(i)%2 == 0:
            print(i)
    

    输出:
    2
    4
    6
    8

    enumerate

    enumerate为循环的list加上index,这个index是编号是从0开始的

    list_val = [1,2,3,5,8]
    for idx,val in enumerate(list_val):
        print(idx,val)
    

    输出:
    0 1
    1 2
    2 3
    3 5
    4 8

    zip

    同时遍历两个以上的list,并按顺序打包

    list_1 = string.digits[:3]
    list_2 = string.ascii_lowercase[:3]
    list_3 = string.ascii_uppercase[:3]
    
    print(list_1,list_2,list_3)
    

    输出:
    012 abc ABC

    list_merge_1 = list(zip(list_1,list_2,list_3))
    print(list_merge_1)
    
    list_merge_2 = [i+j+k for (i,j,k) in zip(list_1,list_2,list_3)]
    print(list_merge_2)
    

    输出:
    [('0', 'a', 'A'), ('1', 'b', 'B'), ('2', 'c', 'C')]
    ['0aA', '1bB', '2cC']

    # 元素组合
    list_merge_3 = [i+j for i in list('123') for j in list('ABC')]
    
    print(list_merge_3)
    

    输出:
    ['1A', '1B', '1C', '2A', '2B', '2C', '3A', '3B', '3C']

    while 循环

    while相当于for和if的结合体。

    while不一定执行的是循环,有时候功能和if差不多,这个时候while的意义相当于如果条件为真,那就执行如下操作

    while更多扮演for和if联合的角色,相当于重复执行如下操作,知道判断条件(会不断变化)不再成立为止

    for和while的区别

    • for循环中迭代的条件是遍历一个序列,这个序列是有限或者确定的。
    • while循环则是基于条件判断,而没有明确的迭代序列,所以while循环可以用来探索序列(先试着执行,有问题咱就退出),比如爬虫的时候你不知道网页page_index到哪结束;
    • for循环不会“重复”执行完全一样的操作,除非迭代的list对象是一样的,而while是可以重复执行相同操作的,这种特定在需要“重试”的场景中会经常用到。e.g.网页返回失败的时候可以重试几次,登陆失败的时候可以重试几次。

    while相当于if时

    # 需要break的配合
    x = 2
    
    while(x>1):
        print('这个值大于1')
        
        break
    

    输出:
    这个值大于1

    while充当for和if的混合体

    # 需要自增的index来配合
    
    idx = 1
    
    while(idx < 5):
        print(idx)
        
        idx += 1
    

    输出:
    1
    2
    3
    4

    泛循环

    如果将循环理解为按照顺序遍历一个序列。
    除了用for、while还可以用其他函数达到“遍历”的效果。

    列表解析

    本质还是循环,常见的for循环在语句上的表现是多行,而列表解析是一行

    # 筛选奇数
    num_odd = [i for i in range(1,10) if i%2==1]
    
    print(num_odd)
    

    输出:
    [1, 3, 5, 7, 9]

    map

    对序列中多个对象执行相同操作

    list(map(lambda x:x**2,range(4)))
    

    输出:
    [0, 1, 4, 9]

    list_words = ['life','is','short','use','python']
    
    list(map(lambda x:len(x),list_words))
    

    输出:
    [4, 2, 5, 3, 6]

    迭代器

    变种的for循环

    按顺序将序列值一次“弹出”,同时被”弹出“的值移出序列

    序列为空时,报错StopIteration

    vals_iter = iter(list(range(3)))
    
    next(vals_iter)
    

    输出:
    0

    迭代器可以如上述举例一样是”有穷“的迭代,也可以是”无穷“的,比如自增序列(index为自然顺序)

    # 定义一个迭代器
    class test_iter:
        def __init__(self):
            self.a = 1
            self.b = 1
            
        def __iter__(self):
            return self
     
        def __next__(self):
            x = self.a
            self.a, self.b = self.b, self.a+self.b
            return x
    
    fb = test_iter()
    
    for i in range(6):
        print(next(fb))
    

    输出:
    1
    1
    2
    3
    5
    8

    生成器

    生成器和迭代器的对比

    相同点:

    • 从执行的结果看都是基于一定的规则”迭代“产生序列(无论是“无穷”系列还是“有穷”系列)
    • 都支持iter,next方法
    • “弹出”数值后,会清除已“弹出”的数值

    不同点:

    • 生成器属于迭代器中的一种
    • 在定义的时候,定义生成器就和定义函数一样自然(同时会自动产生iter和next方法),而定义迭代器则主要通过iter,next来定义序列;
    • 更多参考1
    • 更多参考2
    def num_even(x):
        while(x>0):
            if x%2 == 0:
                yield x
            x -= 1
    
    x = num_even(9)
    
    for i in x:
        print(i)
    

    输出:
    8
    6
    4
    2

    循环的跳出和继续

    break跳出循环,也就是不再执行该循环的操作,如果是嵌套循环,那么上层的循环也终止

    continue 跳过当前的操作,进入下一轮循环,对上层的循环没有影响

    pass 接着执行,用得很少,此处不讲

    break,continue之后的语句也不会执行,所以一定要注意这两个关键字放置的位置

    单层循环

    for i in range(5):
        print(i)
        
        if i == 2:
            break # 当i=2时,循环结束
            print('不会出现')   
    

    输出:
    0
    1
    2

    for i in range(5):
        
        if i == 2:
            continue # 跳过2这个值
            print('不会出现')   
        print(i)
    

    输出:
    0
    1
    3
    4

    i = 1
    while(i<5):
        print(i)
        break # 执行一次就结束
        print('不会出现')   
    

    输出:
    1

    i = 1
    while(i<5):
        print(i)
        
        i += 1
        if i == 2:
            continue
            print('不会出现')   
        
    

    输出:
    1
    2
    3
    4

    while中用continue要小心啊,比如如下代码是会一直执行的

    i = 1
    while(i<5):
        print(i)
        
        if i == 2:
            continue
            print('不会出现') 
            
        i += 1
    

    嵌套循环

    for i in range(3):
        for j in list('abc'):
            if j == 'b':
                break # 到b的时候就停止了
            print(i,j)
    

    输出:
    0 a
    1 a
    2 a

    for i in range(3):
        for j in list('abc'):
            if i == 1 or j=='b':
                continue
            print(i,j) #不会出现带1和b的输出值
    

    输出:
    0 a
    0 c
    2 a
    2 c

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。

    转载请注明作者及出处

  • 相关阅读:
    WEBAPP开发技巧(手机网站开发注意事项)
    2014阿里前端线上笔试题
    [NOIp2008] 双栈排序 (二分图染色 + 贪心)
    [NOIp2012] 国王游戏(排序 + 贪心 + 高精度)
    关于错排公式以及扩展的一些小结论
    [NOI2009]诗人小G(dp + 决策单调性优化)
    Codeforces Round #429 (Div. 1) C. On the Bench(dp + 组合数)
    Educational Codeforces Round 33 (Rated for Div. 2) F. Subtree Minimum Query(主席树合并)
    Codeforces Round #511 (Div. 1) C. Region Separation(dp + 数论)
    Codeforces Round #471 (Div. 2) F. Heaps(dp)
  • 原文地址:https://www.cnblogs.com/dataxon/p/12563843.html
Copyright © 2011-2022 走看看