使用打印功能缩进的逻辑

Logic with indentation using print function

我希望将 'wave' 模式打印到控制台,例如:

   /\
  /  \
 /    

或:

   /\
  /  \
      \
       \

最后,显示为一个大的多波:

   /\  /\
  /  \/  \
 /        \
           \

基于描述 up/forward 或 down/backward direction/slashes 中斜杠数量的整数列表。 我定义了两个函数,一个用于波的左侧最长,反之亦然:

from itertools import zip_longest


def left_wave(water_l, water_r):
    """When left side of wave is largest"""
    l_str = " " * water_l + "/"
    if water_r == 1:
        r_str = "\"
    elif water_r:
        r_str = " " * (water_r * 2 - 2) + "\"
    else:
        r_str = ""
    line = l_str + r_str
    print(line)


def right_wave(water_l, water_r):
    """When right side of wave is largest"""
    if water_l:
        l_str = " " * water_l + "/"
        factor_r = water_r * 2 - 2
    else:
        l_str = " "
        factor_r = water_r * 2 - 2
    r_str = " " * factor_r + "\"
    line = l_str + r_str
    print(line)

我从print_sequence()中调用定义如下:

def print_sequence(args):
    """Show all waves."""
    for wave_height_l, wave_height_r in zip_longest(args[0::2], args[1::2], fillvalue=0):
        for water_l, water_r in zip_longest(reversed(range(1, wave_height_l + 1)),
                                            range(1, wave_height_r + 1),
                                            fillvalue=0):

            if wave_height_l > wave_height_r:
                left_wave(water_l, water_r)
            else:
                right_wave(water_l, water_r)

运行 如下:

args = [11, 2,
        5, 7,
        # 4
        ]
print_sequence(args)

目前返回:

           /\
          /  \
         /
        /
       /
      /
     /
    /
   /
  /
 /
     /\
    /  \
   /    \
  /      \
 /        \
           \
             \

我现在遇到的主要问题是:我在 right_wave 函数中犯的逻辑错误是什么? (缩进是错误的)。 此外,我将如何开始在同一行上打印 2 个波浪?也许在打印函数调用中使用 end="" 作为参数?

当它是python 2x 很简单,就是最后一个简单的逗号完成的魔术 例如。 打印(“一个”), 打印(“b”) 输出: 一个b 如果 python 3x

你不得不用。 end=" " 控制下一个打印函数

之间的space

如果 list 是您的选择,这里有一个打印波形的简单方法:

def print_wave(args):
    total_cols = sum(args)
    total_rows = args[0]  # init total rows by first arg
    matrix = [[' ' for _ in range(total_cols)] for _ in range(total_rows)]

    curr_col = 0
    curr_row = total_rows - 1
    down = True

    for num in args:
        down = not down
        char = '\' if down else '/'
        # update total rows and current row if need
        if down:
            diff = curr_row + num - total_rows
            if diff > 0:
                for _ in range(diff):
                    matrix.append([' ' for _ in range(total_cols)])
                total_rows += diff
        else:
            diff = num - 1 - curr_row
            if diff > 0:
                for _ in range(diff):
                    matrix.insert(0, [' ' for _ in range(total_cols)])
                total_rows += diff
                curr_row += diff
        for i in range(num):
            matrix[curr_row][curr_col] = char
            # for conjection not update curr row for the last loop
            if i != num - 1:
                if down:
                    curr_row += 1
                else:
                    curr_row -= 1
            curr_col += 1

    for row in matrix:
        for col in row:
            print(col, end='')
        print()

args=[3, 5, 4, 11, 2, 5, 7]的简单测试:

  /\
 /  \      /\
/    \    /  \
      \  /    \
       \/      \
                \
                 \
                  \
                   \                /
                    \              /
                     \  /\        /
                      \/  \      /
                           \    /
                            \  /
                             \/

希望对您有所帮助。