失去循环标记的Python,我这样实现跳出外层循环

python基础 专栏收录该内容
53 篇文章 0 订阅
朋友圈的学问

对于刚刚过去的教师节,大家是否发现了点什么…凡是哪个混的风生水起,都喜欢在朋友圈里面感谢一下母校,缅怀一番师生情。那混的不好的,比如我这种苦逼IT搬砖民工,在教师节的朋友圈说说是什么样的呢?哈哈…
教师节的朋友圈

孟子曾说 穷则独善其身,达则兼善天下。意思是不得志的时候就要管好自己的道德修养,得志的时候就要努力让天下人都能得到好处。所以贫穷的我就用苦荞籽庆祝这个节日,为什么说庆祝?只能说,这年头,谁还没个教师资格证了,跟谁俩呢!
呵呵哒

不完美的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,如果觉得不错,希望能动动手指转发给你身边的朋友们。
希望每周一至五清晨的7点10分,都能让清风Python的知识文章叫醒大家!谢谢……
清风Python

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值