我正在做的练习是由一本接受字典参数的书进行的,该书要求我给出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 iterable
:f(element)
对于element
迭代中的每一个,它执行任何操作。
dictionary.values()
,它返回(此处为)中的所有值(但不包括键)。在这种情况下,这些是字符串。dictionary
'wking', 'wpawn', ...
piece
是我们为理解的每个“迭代”分配的每个元素。它将运行piece = 'wking'
,然后运行piece = 'wpawn'
,等等。piece.startswith('b') or piece.startswith('w')
是我们为每个人执行的功能piece
。根据是否满足条件,输出True
或False
。[]
以将其输出为常规列表。但是,如果您将理解作为函数的参数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
如果任一侧的元素数量不匹配,例如,如果键只有一个字符或只有三个字符,则这将生成一个。这方面的一个副产品是,row
并col
保证是只有一个字符的长字符串,如果错误不会发生。row
在1到8之间,以及a是否col
在A和H之间。再次返回True
或False
。
int()
的东西,并不代表整数会也抛出ValueError
。try
/except
块保留在您的代码块中,因为它们可以正常工作。Python围绕着某种文化,以“高效编写”代码为荣。就是说,看起来尽可能花哨的代码并遵循函数式编程范例。内涵,以及all()
和any()
,是其中一个重要组成部分,因此他们很可能对任何问题的“正确”的解决方案,他们是一个解决方案(如果它们可以简洁地写)。
同样,该代码段
if condition:
return True
else:
return False
几乎总是可以凝结为
return condition
(或return bool(condition)
,在condition
处理具有真实性但不是布尔值的值(例如None
或空列表或字符串)的情况下)。如果适用,这是个好习惯(但同样,并不总是适用)。
最重要的事情,不过,是你的代码的工作,你希望它的方式,这很明显足以让你回来给它几个月的路线,并找出什么,你在做什么,以及为什么你在做这样。在某些情况下,事物可以写为理解,但这会使它们变得极其复杂且难以阅读-在这些情况下,最好不要将它们写为理解,并且以更冗长的方式进行。在继续发展时,请记住这一点,您会做得很好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句