我正在尝试使用两个辅助函数和一个主要打印钻石的上半部分。这是我的代码:
def top_right(size):
line = ''
nsize = size // 2 + 1
spaces = nsize - 1
for num in range(1, nsize + 1):
line += str(num)
print(spaces * ' ' + line)
def top_left(size):
line = ''
nsize = size // 2 + 1
print()
for num in range(2, nsize + 1):
spaces = nsize - num
line += str(num)
print(spaces * ' ' + line[::-1])
def full_diamond(size):
top_left(size), top_right(size)
完整的钻石功能出来了:
full_diamond(17)
2
32
432
5432
65432
765432
8765432
98765432
1
12
123
1234
12345
123456
1234567
12345678
123456789
如何让这两个三角形打印出同一条线,就像钻石的上半部分一样?
答案 0 :(得分:0)
您可以使用asyncio:
import asyncio
async def top_right(size):
line = ''
nsize = size//2+1
spaces = nsize-1
for num in range(1, nsize+1, 1):
line+=str(num)
print(spaces* ' '+line)
await asyncio.sleep(0.001)
async def top_left(size):
line = ''
nsize = size//2+1
print()
for num in range(2, nsize+1, 1):
spaces = nsize - num
line+=str(num)
print(spaces*' '+line[::-1], end='')
await asyncio.sleep(0.001)
def full_diamond(size):
loop = asyncio.get_event_loop()
tasks = [top_left(size), top_right(size)]
loop.run_until_complete(asyncio.wait(tasks))
此代码仅适用于Python 3.5或更高版本
答案 1 :(得分:0)
这可能是一个比你想要的更复杂的答案 - 但你可以对你的代码进行一个非常简单的修改,使其适用于python生成器。
你这样做的方法是将每个函数变成一个生成器,返回你想要打印的字符串(而不是直接调用print)。然后,您更改full_diamond
以迭代生成器。最后一项更改是您必须移动您在top_right
打印的额外空格。
这是最终的代码:
def top_right(size):
line = ''
nsize = size//2+1
spaces = nsize-1
for num in range(1, nsize+1, 1):
line+=str(num)
yield(line)
def top_left(size):
line = ''
nsize = size//2+1
for num in range(2, nsize+1, 1):
spaces = nsize - num
line+=str(num)
yield(spaces*' '+line[::-1])
def full_diamond(size):
for i, j in zip(top_left(size), top_right(size)):
print(i + j)
full_diamond(16)
输出:
21
3212
432123
54321234
6543212345
765432123456
87654321234567
9876543212345678
同样,您可能会发现在一个函数中将两个循环连接在一起更简单。但是,我发现以上是一个非常pythonic的解决方案,所以它可能适合你。
答案 2 :(得分:0)
不太确定您要实现的目标,但这里有一个如何完成的示例。我假设第一个必须在v顶部,对吧?
def top_right(size):
line = ''
nsize = size // 2 + 1
spaces = nsize - 1
output = list()
for num in range(1, nsize + 1):
line += str(num)
output.append(line + '\n')
return output
def top_left(size):
line = ''
nsize = size // 2 + 1
output = [(nsize - 1) * ' ']
for num in range(2, nsize + 1):
spaces = nsize - num
line += str(num)
output.append(spaces * ' ' + line[::-1])
return output
def full_diamond(size):
for i, j in zip (top_left(size), top_right(size)):
print (i+j)
full_diamond(17)
的输出:
1
212
32123
4321234
543212345
65432123456
7654321234567
876543212345678
98765432123456789
答案 3 :(得分:0)
您发现难以构建解决方案,因为您已经以与所需输出结构不匹配的方式对其进行了分解。
由于输出的结构,我假设您永远不会使用偶数参数调用MATCH p = (:Readable{name:'book'})-[:owns*0..3]-(:Readable)-[:readBy]-(s:Student)
WITH LENGTH(p) AS len, COLLECT(s) AS students
RETURN {length: len, students: students};
,并且想知道为什么不使用参数full_diamond
调用它来生成输出你想要的而不是8
,并且一次产生完整的行而不是两半。
但是,如果两半解决方案是你真正想要的,并且最后一行的长度是你真正想要的参数,那么你确实有很多选择。最容易引起思考的是将半三角形作为字符串列表,而不是在生成它们时打印出半行。然后你可以运行一个循环来打印左半部分,然后在同一行上打印右半部分。
它看起来像这样:
17