栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

第一次使用try...except来解决问题,break深化理解——基于一个具体项目

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第一次使用try...except来解决问题,break深化理解——基于一个具体项目

项目介绍:

给定

    from typing import List
    def remove_party(rank_ballots: List[List[str]], party_to_remove: str) -> None:

作用

    '''
    >>> party = [['LIBERAL', 'GREEN', 'CPC', 'NDP'], 
                ['CPC', 'NDP', 'LIBERAL', 'GREEN'], 
                ['NDP', 'CPC', 'GREEN', 'LIBERAL']]
    >>> remove_party(party, 'NDP')
    >>> party
    [['LIBERAL', 'GREEN', 'CPC'], ['CPC', 'LIBERAL', 'GREEN'], 
['CPC', 'GREEN', 'LIBERAL']]
    '''

求:

    party = [['LIBERAL', 'GREEN', 'CPC', 'NDP'], ['CPC', 'NDP', 'LIBERAL', 'GREEN'], ['NDP', 'CPC', 'GREEN', 'LIBERAL']]
    remove_party(party, 'NDP')

错误代码

    from typing import List
    def remove_party(rank_ballots: List[List[str]], party_to_remove: str) -> None:
        flag = False
        for l in rank_ballots:
            if l[3] == party_to_remove:
                l.pop()
            else:
                for i in range(3):
                    if l[i] == party_to_remove:
                        for k in range(i, 3):
                            l[k] = l[k + 1]
                            l.pop()
                            flag = True
                    if flag == True: break
            print(l)
    party = [['LIBERAL', 'GREEN', 'CPC', 'NDP'], ['CPC', 'NDP', 'LIBERAL', 'GREEN'], ['NDP', 'CPC', 'GREEN', 'LIBERAL']]
    remove_party(party, 'NDP')

返回

['LIBERAL', 'GREEN', 'CPC']
Traceback (most recent call last):
  File "D:Anacondalibsite-packagesIPythoncoreinteractiveshell.py", line 3437, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "", line 17, in 
    remove_party(party, 'NDP')
  File "", line 11, in remove_party
    l[k] = l[k + 1]
IndexError: list index out of range

解析原因:list index out of range

主要原因有2个:

1. 下标超出范围

2. list为空

用try...except找原因:

from typing import List
def remove_party(rank_ballots: List[List[str]], party_to_remove: str) -> None:
    flag = False
    for l in rank_ballots:
        try:
            if l[3] == party_to_remove:
                l.pop()
            else:
                for i in range(3):
                    if l[i] == party_to_remove:
                        for k in range(i, 3):
                            l[k] = l[k + 1]
                            l.pop()
                            flag = True
                    if flag == True: break
            print(l)
        except:
            print('hh')
party = [['LIBERAL', 'GREEN', 'CPC', 'NDP'], ['CPC', 'NDP', 'LIBERAL', 'GREEN'], ['NDP', 'CPC', 'GREEN', 'LIBERAL']]
remove_party(party, 'NDP')

返回

['LIBERAL', 'GREEN', 'CPC']
hh
hh

说明

这一块有问题

原来是l.pop()有问题,不应该缩进的(按回车的时候没有注意)

改一下

    from typing import List
    def remove_party(rank_ballots: List[List[str]], party_to_remove: str) -> None:
        flag = False
        for l in rank_ballots:
            try:
                if l[3] == party_to_remove:
                    l.pop()
                else:
                    for i in range(3):
                        if l[i] == party_to_remove:
                            for k in range(i, 3):
                                l[k] = l[k + 1]
                            l.pop()
                            flag = True
                        if flag == True: break
                print(l)
            except:
                print('hh')
    party = [['LIBERAL', 'GREEN', 'CPC', 'NDP'], ['CPC', 'NDP', 'LIBERAL', 'GREEN'], ['NDP', 'CPC', 'GREEN', 'LIBERAL']]
    remove_party(party, 'NDP')

 返回

['LIBERAL', 'GREEN', 'CPC']
['CPC', 'LIBERAL', 'GREEN']
['CPC', 'GREEN', 'LIBERAL']

【注意】

为什么要用flag整个布尔值变量,因为剔除最后一个元素后,应该跳出循环,否则会继续剔除变成空列表,仍然会出现list index out of range问题。l.pop()相当于一个信号,告诉我们要停止循环。于是用flag变量来告诉计算机要跳出循环。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/503756.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号