zoukankan      html  css  js  c++  java
  • 失去循环标记的Python,我这样实现跳出外层循环

    不完美的Python

    自从各类Python大火,感觉天上地下哪儿都有Python的一席之地,Python功夫好啊…但python有些细节上缺少其他语言的便利。今天我们就来举几个例子。

    跳出外层循环

    大家都知道,在Java中存在标签的概念,当我们存在多层循环时,Java可以使用标签控制指定的循环层。举个小栗子:

    public class OuterLoop {
        public static void main(String[] args) {
            outer:
            for (int i = 0; i < 5; i++) {
                inner:
                for (int j = 0; j < 5; j++) {
                    System.out.println(j);
                    if (j == 2) {
                        break outer;
                    }
                }
            }
            System.out.println("over!");
        }
    }
    
    output:
    0
    1
    2
    over!
    

    我们通过定义标签,在遇到break continue等关键字时,可以控制指定的循环层,然而Python没有标签的概念,那么Python该如何实现这种功能呢?

    Python循环跳出

    为了方便大家理解,我们来举一个臭不要脸的例子吧!
    加入小张、我、小李三个人经常一起吃饭,吃饭就涉及付账了,如果AA那大家都能接受,如果一个人请客,那他俩付钱我当然愿意,如果是我付钱那我吃完了就赶紧尿遁…好了,有这个前提,我们开始写代码吧。

    定义函数实现

    对于多层循环,在Python中,也许最易于理解的方式就是通过函数return来实现了。但这里要注意一个问题,函数的return会跳出所有循环,对于两层以上的循环不适用…
     

    # -*- coding: utf-8 -*-
    # @Author   : 王翔
    # @WeChat   : King_Uranus
    # @公众号    : 清风Python
    # @Date     : 2019/9/11 0:03
    # @Software : PyCharm
    # @version  :Python 3.7.3
    # @File     : OuterLoop.py
    import random
    
    people = ['zhang', 'me', 'li']
    payments = ['AA', 'stand_treat']
    
    def dine_together():
        # 为了避免一成不变的套路,我们添加两个列表随机
        random.shuffle(payments)
        print(payments)
        random.shuffle(people)
        print(people)
    
        for payment in payments:
            for person in people:
                if payment == 'stand_treat':
                    if person == 'me':
                        print("居然我请客,赶紧尿遁...")
                        people.remove('me')
                        schlemiel = random.choice(people)
                        print("倒霉孩子{}请客".format(schlemiel))
                        # 当遇到我请客,直接结束外层循环,函数返回...
                        return
                    else:
                        print("今天{}请客".format(person))
                else:
                    print('今天吃饭{},等下{}付钱,大家记得把钱给它...'
                          .format(payment, person))
    
    dine_together()
    
    output:
    ['stand_treat', 'AA']
    ['zhang', 'li', 'me']
    今天zhang请客
    今天li请客
    居然我请客,赶紧尿遁...
    倒霉孩子li请客
    

    标记变量实现

    我们可以通过定义变量值来进行判断是否退出循环,操作如下:

    import random
    
    people = ['zhang', 'me', 'li']
    payments = ['AA', 'stand_treat']
    
    # 为了避免一成不变的套路,我们添加两个列表随机
    random.shuffle(payments)
    print(payments)
    random.shuffle(people)
    print(people)
    
    runaway = False
    for payment in payments:
        for person in people:
            if payment == 'stand_treat':
                if person == 'me':
                    print("居然我请客,赶紧尿遁...")
                    people.remove('me')
                    schlemiel = random.choice(people)
                    print("倒霉孩子{}请客".format(schlemiel))
                    # 修改标记变量
                    runaway = True
                    # 当遇到我请客,直接结束外层循环,函数返回...
                    break
                else:
                    print("今天{}请客".format(person))
            else:
                print('今天吃饭{},等下{}付钱,大家记得把钱给它...'
                      .format(payment, person))
        # 判断标记变量
        if runaway:
            break
    
    output:
    ['stand_treat', 'AA']
    ['li', 'me', 'zhang']
    今天li请客
    居然我请客,赶紧尿遁...
    倒霉孩子zhang请客
    

    for else实现

    for…else…的运行逻辑是当for循环正常执行结束就会运行其else语句,如果中途break的话,就不会执行else中的内容
    有失必有得,虽然python没有循环标记,却多出了一个for else的操作,帮助我们实现需求。

    import random
    
    people = ['zhang', 'me', 'li']
    payments = ['AA', 'stand_treat']
    
    # 为了避免一成不变的套路,我们添加两个列表随机
    random.shuffle(payments)
    print(payments)
    random.shuffle(people)
    print(people)
    
    for payment in payments:
        for person in people:
            if payment == 'stand_treat':
                if person == 'me':
                    print("居然我请客,赶紧尿遁...")
                    people.remove('me')
                    schlemiel = random.choice(people)
                    print("倒霉孩子{}请客".format(schlemiel))
                    # 当遇到我请客,直接结束外层循环,函数返回...
                    break
                else:
                    print("今天{}请客".format(person))
            else:
                print('今天吃饭{},等下{}付钱,大家记得把钱给它...'
                      .format(payment, person))
        else:
            # 未出现break操作,执行else,通过continue继续操作
            continue
        # 出现break操作,跳过else,直接外层break,结束外层循环
        break
    

    The End

    OK,今天的内容就到这里,如果觉得内容对你有所帮助,欢迎点赞。
    期待你关注我的公众号 清风Python,如果觉得不错,希望能动动手指转发给你身边的朋友们。

    作者:清风Python

  • 相关阅读:
    spring使用中ModelAttribute的内容被覆盖
    html中,纯数字或纯英文的一串字符超出父容器不会折行显示,如何解决?
    js实现刷新页面出现随机背景图
    为tomcat配置项目必须的引擎文件
    mysql如何出查出最近7天,最近30天,最近n天的记录?
    为了显示此页面,Firefox 必须发送将重复此前动作的数据(例如搜索或者下订单)
    git 恢复到旧版本命令
    七大经典排序算法总结(C语言描述)
    C语言描述栈的实现及操作(链表实现)
    C语言的文件读写操作函数小结
  • 原文地址:https://www.cnblogs.com/huaweicloud/p/11861369.html
Copyright © 2011-2022 走看看