尝试从同一行开始打印两个函数

时间:2016-01-24 20:00:20

标签: python image loops

我正在尝试使用两个辅助函数和一个主要打印钻石的上半部分。这是我的代码:

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

如何让这两个三角形打印出同一条线,就像钻石的上半部分一样?

4 个答案:

答案 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