首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中对多个变量进行基本模式匹配的惯用方法

在Python中对多个变量进行基本模式匹配的惯用方法
EN

Stack Overflow用户
提问于 2018-07-26 04:31:25
回答 1查看 26关注 0票数 -3

我想实现这个代码(用Crystal编写)所做的事情:

代码语言:javascript
复制
enum PieceKind
    Pawn, Rook, Bishop, Knight, King, Queen
end

def piece_kind_at_init(x, y)
    case y
    when 2, 7 then PieceKind::Pawn
    when 1, 8
        case x
        when 1, 8 then PieceKind::Rook
        when 2, 7 then PieceKind::Bishop
        when 3, 6 then PieceKind::Knight
        when 4 then PieceKind::King
        when 5 then PieceKind::Queen
        end
    end
end

这是我在Python中能想到的“最好的”版本:

代码语言:javascript
复制
class PieceKind(Enum):
    Pawn = auto()
    Rook = auto()
    Bishop = auto()
    Knight = auto()
    King = auto()
    Queen = auto()

def piece_kind_at_init(x, y):
    if y in [2, 7]:     
        return PieceKind.Pawn
    elif y in [1, 8]:
        if x in [1, 8]:     
            return PieceKind.Rook
        elif x in [2, 7]:   
            return PieceKind.Bishop
        elif x in [3, 6]:   
            return PieceKind.Knight
        elif x == 4:        
            return PieceKind.King
        elif x == 5:        
            return PieceKind.Queen

这是好的,但它肯定是可读性较差的版本适当的模式匹配。编写代码最常用的方式是什么?

EN

回答 1

Stack Overflow用户

发布于 2018-07-26 04:48:45

消除冗长elif链的一种方法是创建转换表。

代码语言:javascript
复制
outer_row_pieces = [PieceKind.Rook,
                    PieceKind.Knight,
                    PieceKind.Bishop,
                    PieceKind.King,
                    PieceKind.Queen,
                    PieceKind.Bishop,
                    Piecekind.Knight,
                    PieceKind.Rook]

def piece_kind_at_init(x, y):
    if y == 2 or y == 7:
        return PieceKind.Pawn
    if y == 1 or y == 8:
        return outer_row_pieces[x]
    return None
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51527204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档