2016-01-24 1 views
0

Я пытаюсь напечатать верхнюю половину бриллианта с двумя вспомогательными функциями и основной. это мой код:Пытается напечатать две функции, начиная с той же строки

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

Я просто хочу добавить, что сказал @TomKarzes. Имейте в виду, что ваши петли фактически индексируются по-разному. Таким образом, вам нужно запустить цикл в 1 и убедиться, что ваша первая строка только печатает его один раз. –

+0

У них есть два разных диапазона, поэтому, когда я их совмещаю, как я могу сохранить эти различия? извините, я очень новичок в программировании haha ​​ – AaronTrip

ответ

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

Вы можете, но зачем вам это нужно? – holdenweb

+0

Большое вам спасибо, вы, ребята, так помогли и быстро сделали это! – AaronTrip

0

Это может быть более сложный ответ, чем вы ищете, - но вы можете сделать очень простую модификацию к вашему коду, чтобы он работал с генераторами python.

Вы должны сделать это, чтобы превратить каждую функцию в генератор, который возвращает строку, которую вы хотите распечатать (вместо прямого вызова печати). Затем вы меняете 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 решение, так что это может сработать для вас.

+0

Большое вам спасибо, вы, ребята, так полезны и быстры! – AaronTrip

0

Не совсем уверен, чего вы пытаетесь достичь, но вот пример того, как это можно сделать. Я предполагаю, что первый 1 должен быть в верхней части, верно?

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 
+0

да, это именно то, что я пытаюсь сделать! Я не был уверен, что сделать все это в одном заявлении на печать было самым простым способом или нет. – AaronTrip

+1

Рад помочь. В коде есть намного больше, что можно сделать, чтобы сделать его более чистым, более эффективным, менее повторяющимся и более питоническим. Я бы посоветовал вам продолжать экспериментировать. – zebralove79

0

Вы найти его трудно структурировать свое решение, потому что вы разложили его таким образом, что не соответствует структуре вашей требуемой мощности очень хорошо.

Я предполагаю, благодаря структуре вашей продукции, что вы никогда бы не называть full_diamond с четным аргументом, и интересно, почему вы не назвали бы его с аргументом 8 производить вывод, который вы хотите, а не 17, и производить полные строки за раз, а две половинки.

Если, однако, решение двух половин - это то, что вы действительно хотите, а длина последней строки - это аргумент, который вы действительно хотите, тогда у вас есть несколько вариантов. Тот, который наиболее легко приходит на ум, состоит в том, чтобы создать полутреугольники в виде списков строк, а не распечатывать полуфиналы по мере их создания. Затем вы можете запустить цикл, чтобы распечатать левые половины, за которыми следуют правые половины в одной строке.

Это будет выглядеть примерно так:

def top_right(size): 
    line = '' 
    nsize = size // 2 + 1 
    out = [""] 
    line = "" 
    for num in range(nsize): 
     line = str(num+1) + line 
     out.append(line) 
    return out 

def top_left(size): 
    line = '' 
    nsize = size // 2 
    out = [] 
    line = "" 
    for num in range(nsize): 
     line += str(num+1) 
     out.append((nsize-len(line))*' ' + line) 
    return out 

def full_diamond(size): 
    tl, tr = top_left(size), top_right(size) 
    for left, right in zip(tl, tr): 
     print(left+right) 

full_diamond(17) 
Смежные вопросы