如何将条件语句转换为简单表达式?以这种方式复利是否可以接受?

Armagon

我正在做的练习是由一本接受字典参数的书进行的,该书要求我给出True或False的返回值。我是Python 3的新手,作为学习的个人练习,我想将“作为棋盘的有效词典”的所有条件转换为单个返回值。我尚未实际测试此代码的错误,因为它尚未完成,但是我确实通过一个在线验证器运行了它,该验证器位于https://extendsclass.com/python-tester.html

我想知道如何将下面的2个代码块转换为简单的表达式,以在下面的函数中的return语句中使用。您可以在下面看到,我已经使用“和”将大多数表达式转换为返回值,因为“所有表达式必须== True”

for pieces in dictionary.values():
    if all(pieces.startswith('b')) or \
         all(pieces.startswith('w')):
        return True
    else:
        return False

上面的代码块循环浏览传递给“件”的字典键,并分别比较每个键,以确定它是否以“ b”或“ w”开头。因此,如果任何键都不以“ b”或“ w”开头,则字典“ chessboard”为假,因为它包含不正确的部分。好的,我想我会发现一个错误,我将对其进行调查并尝试解决。好的,我注意到以上代码中的一些错误需要解决,我目前正在研究如何正确执行以上代码。

for square in dictionary:
    try:
        if int(square[:0]) <= 8 and \
            square[-1] <= 'h':
            return True
        else:
            return False
    except ValueError:
        return False

我在上面的代码块上工作了很长时间,但仍然不确定这是我想要执行的操作的“最佳”实现。但是我还是个新人,尽我所能。无论如何,它都会对字典键进行切片,并比较键中的第一个字符,以确保它不超过8,这是最大的“有效范围”;如果超出有效范围,它将返回false,而任何非int值显然会自动为False并返回通过“例外”。

然后,它对字典键进行切片以获取字典键的最后一个字符,并将其与<='h'比较,因为这是有效范围,并且超过'h'或无效类型值的任何内容都将返回False。然后将“ True / False”和“ True / False”与“ and”的结果进行比较,因为两个条件都必须为True。

这是当前字典末尾的功能:

def cBV(dic):                        # (c)hess(B)oard(V)alidator
    Err = 'Error: Invalid Board -'
    if not isinstance(dic, type({})):
        raise TypeError('Object passed to cBV is not of type <class dict>')
    
    chess_pieces = {'bk pieces': 0, 'wh pieces': 0,
                    'bk pawns': 0, 'wh pawns': 0}

    # converts dictionary values into keys and assigns those keys "counn of values"      
    for squares, pieces in dic.items:
        if pieces.startswith('b'):                 # alt if pieces[:0] == 'b':
            if pieces.startswith('bpawn'):         # alt if pieces == 'bpawn':
                chess_pieces['bk pawns'] += 1
            chess_pieces['bk pieces'] += 1
        elif pieces.startswith('w'):
            if pieces.startswith('wpawn'):
                chess_pieces['wh pawns'] += 1
            chess_pieces['wh pieces'] += 1
        
    return 'wking' in dic.values() and \                
            'bking' in dic.values() and \
            chess_pieces['bk pieces'] <= 16 and \
            chess_pieces['wh pieces'] <= 16 and \ 
            chess_pieces['bk pawns'] <= 8 and \
            chess_pieces['wh pawns'] <= 8 and \ 
            


dict = {'8h': 'wking', '2c': 'bking', '3a': 'wpawn', '3b': 'wpawn', '3c': 'wpawn',
    '3d': 'wpawn', '3e': 'wpawn', '3f': 'wpawn', '3g': 'wpawn', '3h': 'wpawn', '4b': 'wpawn'}
test = cBV(dict)
print('Is this a valid chessboard? ' + str(test))
绿色披风的家伙

您现在拥有的一切都很好,您应该感到自豪-有更多新颖的技巧可以使事情变得更简洁,并且随着各种数据结构的工作方式的发展,您会逐渐习惯这些技巧。

    for pieces in dictionary.values()
        if pieces.startswith('b') or \
             pieces.startswith('w'):
            return True
        else:
            return False

可以转换为单线

return all(
    piece.startswith('b') or piece.startswith('w')
    for piece in dictionary.values()
)

这做了几件事。

  • all()函数接受任何可迭代的对象,并返回该可迭代对象中的True所有值是否为真。如果其中之一不是,则“短路”并返回False
  • 作为对的争论all(),我们给出了“理解”。理解本质上是一种单行for循环,其形式为f(element) for element in iterablef(element)对于element迭代中的每一个它执行任何操作
    • 在我们的示例中,iterable是dictionary.values(),它返回(此处为)中的所有(但不包括键)。在这种情况下,这些是字符串。dictionary'wking', 'wpawn', ...
    • piece是我们为理解的每个“迭代”分配的每个元素。它将运行piece = 'wking',然后运行piece = 'wpawn',等等。
    • piece.startswith('b') or piece.startswith('w')是我们为每个人执行的功能piece根据是否满足条件,输出TrueFalse
    • 您可以将领悟包装在方括号中,[]以将其输出为常规列表。但是,如果您将理解作为函数的参数all(),这就是我们在这里所做的,那么它将最终成为“生成器”,这是一种效率更高的对象,一次只能计算一个对象。就我们的目的而言,这并不重要。
    • 总体而言,该理解会产生一个包含True的系列False,这些系列all()将消耗掉。

与您的第二个代码段类似。您已经掌握了基础知识,但可以更加简洁。您的代码:

def allSquaresAreInRange(dictionary):
    for square in dictionary:
        try:
            if int(square[:0]) <= 8 and \
                pieces[-1] <= 'h':
                return True
            else:
                return False
        except ValueError:
            return False

可以变成

def allSquaresAreInRange(dictionary):
    try:
        return all(
            (1 <= int(row) <= 8) and ('a' <= col <= 'h')
            for (row, col) in dictionary
        )
    except ValueError:
        return False

这里我们利用一些东西:

  • 和以前一样,我们使用all(),并且和以前一样,使用理解。但是这次,我们dictionary直接 进行迭代
    • dict循环访问a与循环访问在功能上相同dict.keys()因此,我们在按键中进行迭代'8h', '2c', ...
  • 每个键都是两个字符的字符串。字符串是可迭代的,就像列表一样,并且大多数可迭代的对象都有一个有趣的属性,称为“多重分配”:如果我们分配的变量与可迭代对象具有的元素数量一样多,那么这些元素就会被拆分。
    • (row, col) = '8h'例如,在功能上与row = '8h'[0]相同col = '8h'[1]在这两种情况下,我们都只剩下row = '8'and col = 'h'
    • ValueError如果任一侧的元素数量不匹配,例如,如果键只有一个字符或只有三个字符,则这将生成一个这方面的一个副产品是,rowcol保证是只有一个字符的长字符串,如果错误不会发生。
  • 我们的条件使用大于/小于符号检查a是否row在1到8之间,以及a是否col在A和H之间。再次返回TrueFalse
    • 正如你似乎发现,使用int()的东西,并不代表整数会抛出ValueError
  • 这个新代码段将try/except保留在您的代码块中,因为它们可以正常工作。

Python围绕着某种文化,以“高效编写”代码为荣。就是说,看起来尽可能花哨的代码并遵循函数式编程范例。内涵,以及all()any(),是其中一个重要组成部分,因此他们很可能对任何问题的“正确”的解决方案,他们一个解决方案(如果它们可以简洁地写)。

同样,该代码段

if condition:
    return True
else:
    return False

几乎总是可以凝结为

return condition

(或return bool(condition),在condition处理具有真实性但不是布尔值的值(例如None或空列表或字符串)的情况下)。如果适用,这是个好习惯(但同样,并不总是适用)。

最重要的事情,不过,是你的代码的工作,你希望它的方式,这很明显足以让你回来给它几个月的路线,并找出什么,你在做什么,以及为什么你在做这样。在某些情况下,事物可以写为理解,但这会使它们变得极其复杂且难以阅读-在这些情况下,最好不要将它们写为理解,并且以更冗长的方式进行。在继续发展时,请记住这一点,您会做得很好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将Foreach语句转换为linq表达式?

来自分类Dev

如何将SQL语句转换为正确的SQLAlchemy表达式

来自分类Dev

如何将lambda表达式转换为对象?

来自分类Dev

如何将python表达式转换为android?

来自分类Dev

如何将特定的Java表达式转换为Javascript表达式?

来自分类Dev

如何将 $ 表达式转换为“正则”表达式

来自分类Dev

Matlab:如何将多变量符号表达式转换为fminsearch可以使用的函数?

来自分类Dev

是否可以仅使用lambda表达式将字符串转换为int []?

来自分类Dev

方案:是否可以将S表达式列表转换为原子列表?

来自分类Dev

如何将Java正则表达式转换为javascript正则表达式

来自分类Dev

如何以编程方式将循环转换为单个表达式?

来自分类Dev

如何以编程方式将数学表达式转换为因子总和?

来自分类Dev

如何将简单表达式附加到IQueryable

来自分类Dev

如何将此Lambda表达式转换为linq

来自分类Dev

如何将此表达式从C ++转换为Java

来自分类Dev

如何将此表达式转换为 MATLAB 代码

来自分类Dev

如何将字符串转换为lambda表达式?

来自分类Dev

如何将foreach循环转换为lambda表达式

来自分类Dev

如何将正则表达式转换为String文字并再次返回?

来自分类Dev

如何将SQL标量子查询转换为SQLAlchemy表达式

来自分类Dev

如何将PHP正则表达式转换为JS

来自分类Dev

如何将Lambda表达式转换为代码(文本)?

来自分类Dev

如何将Ruby正则表达式转换为PCRE

来自分类Dev

如何将语言集符号转换为正则表达式?

来自分类Dev

我如何将ac#样式正则表达式转换为c ++样式

来自分类Dev

MySQL多对多设置-如何将布尔表达式转换为MySQL?

来自分类Dev

如何将字符串转换为正则表达式

来自分类Dev

如何将Java赋值表达式转换为Kotlin

来自分类Dev

如何将布尔表达式转换为汇编代码

Related 相关文章

  1. 1

    如何将Foreach语句转换为linq表达式?

  2. 2

    如何将SQL语句转换为正确的SQLAlchemy表达式

  3. 3

    如何将lambda表达式转换为对象?

  4. 4

    如何将python表达式转换为android?

  5. 5

    如何将特定的Java表达式转换为Javascript表达式?

  6. 6

    如何将 $ 表达式转换为“正则”表达式

  7. 7

    Matlab:如何将多变量符号表达式转换为fminsearch可以使用的函数?

  8. 8

    是否可以仅使用lambda表达式将字符串转换为int []?

  9. 9

    方案:是否可以将S表达式列表转换为原子列表?

  10. 10

    如何将Java正则表达式转换为javascript正则表达式

  11. 11

    如何以编程方式将循环转换为单个表达式?

  12. 12

    如何以编程方式将数学表达式转换为因子总和?

  13. 13

    如何将简单表达式附加到IQueryable

  14. 14

    如何将此Lambda表达式转换为linq

  15. 15

    如何将此表达式从C ++转换为Java

  16. 16

    如何将此表达式转换为 MATLAB 代码

  17. 17

    如何将字符串转换为lambda表达式?

  18. 18

    如何将foreach循环转换为lambda表达式

  19. 19

    如何将正则表达式转换为String文字并再次返回?

  20. 20

    如何将SQL标量子查询转换为SQLAlchemy表达式

  21. 21

    如何将PHP正则表达式转换为JS

  22. 22

    如何将Lambda表达式转换为代码(文本)?

  23. 23

    如何将Ruby正则表达式转换为PCRE

  24. 24

    如何将语言集符号转换为正则表达式?

  25. 25

    我如何将ac#样式正则表达式转换为c ++样式

  26. 26

    MySQL多对多设置-如何将布尔表达式转换为MySQL?

  27. 27

    如何将字符串转换为正则表达式

  28. 28

    如何将Java赋值表达式转换为Kotlin

  29. 29

    如何将布尔表达式转换为汇编代码

热门标签

归档