我使用python尝试了简单的模式程序。但是我尝试将我的代码转换为列表理解代码。但是它显示了无效的语法错误。如何解决
pattera.py
# Without List Compreshion
class Apattern:
def __init__(self,row,column):
self.row = row
self.column = column
def a_pattern(self):
for i in range(self.row):
for j in range(self.column):
if i == 0 or j == 0 or j == self.column-1 or i == 2:
print("*",end=" ")
else:
# print(j,end=" ")
print(" ",end=" ")
print()
a1 = Apattern(5,5)
a1.a_pattern()
patterna.py
class Apattern:
def __init__(self,row,column):
self.row = row
self.column = column
def a_pattern(self):
data = [print("*",end=" ") print() for i in range(self.row) for j in range(self.column) if i == 0 or j == 0 or j == self.column-1 or i == 2 else print(" ",end=" ") ]
print(data)
a1 = Apattern(5,5)
a1.a_pattern()
答案 0 :(得分:3)
就像其他人说的那样,列表理解在这里不适合,它用于您想要获取列表的情况,但是在这里您只想打印出来。
但是如果您坚持这一点,我可以为您提供两个版本:
def a_pattern(self):
# generate the result list of each line
result = [' '.join(['*'] * self.column)
if i in (0, 2) else (' ' * (self.column * 2 - 3)).join('**')
for i in range(self.row)]
for line in result:
print(line)
print
,则可以尝试以下方式:def a_pattern(self):
# print logic in list comprehension
_ = [print("*", end=" ") or j == self.column - 1 and print('')
if i == 0 or j == 0 or j == self.column - 1 or i == 2
else print(" ", end=" ") or j == self.column - 1 and print('')
for i in range(self.row) for j in range(self.column)]
我会在这里解释:
关键和最困难的部分是我们必须print('')
每行之后j == self.column - 1
时。
在这里,我使用and/or
中的惰性求值:
j == self.column - 1 and print('')
如果j
不是最后一个索引,则不会调用print('')
,否则它将调用print('')
注意:这只是对列表理解和惰性评估的研究,请勿在代码中使用。
借助一些技巧,我们甚至可以创建变量或在列表理解中添加
break
逻辑,但这只是出于娱乐目的。 :)