• Как записать данные из Python в файл docx?

    @southsoutheast
    Мне интересно.
    python-docx отлично справляется, непонятно, что вам помешало это проверить, если вы его уже нагуглили.
    чтобы не было проблем с кодировкой - используйте юникод.
    # -*- coding: utf-8 -*-
    from docx import Document
    document = Document()
    str=unicode("Тест", "utf-8")
    p = document.add_paragraph(str)
    document.save('test.docx')
    Ответ написан
    1 комментарий
  • Как повысить эффективность кода? Или такое поведение программы считается нормальным?

    adugin
    @adugin Куратор тега Python
    Наиболее быстрый алгоритм:
    from random import random
    
    while True:
        try:
            total = int(raw_input('\nВведите количество бросков: '))
        except ValueError:
            print 'Введено некорректное значение: ожидается целое число.'
        else:
            # side1 = sum(random() < 0.5 for n in xrange(total))
            side1 = int(round(sum(random() for n in xrange(total))))  # эквивалент random() >= 0.5
            side2 = max(0, total) - side1
            print 'Результат: орёл - {0}, решка - {1}'.format(side1, side2)
        finally:
            if raw_input('\nПопробовать ещё раз (Y)? ').upper() != 'Y':
                break

    Ещё вариант:
    import collections, random
    
    options = ('орёл', 'решка')
    
    while True:
        stats = collections.Counter(dict.fromkeys(options, 0))
        try:
            stats.update(
                random.choice(options) for test in xrange(
                    input('\nВведите количество бросков: ')
                )
            )
        except:
            print 'Введено некорректное значение: ожидается целое число.'
        else:
            print 'Результат: {0} - {{{0}}}, {1} - {{{1}}}'.format(*options).format(**stats)
        finally:
            if raw_input('\nПопробовать ещё раз (Y)? ').upper() != 'Y':
                break

    Замеры скорости:
    >>> timeit('choice((0,1))', setup='from random import random, choice', number=10**6)
    1.4363103769230747
    >>> timeit('random() < 0.5', setup='from random import random, choice', number=10**6)
    0.18878976080804932

    0) Вас не смущает, что Вы используете заведомо равномерное (uniform) распределение, о котором говорится во вступительном абзаце к модулю random?
    1) Про русский язык уже написали. Кроме того, зачем смешивать английские слова (times) с транслитом (monetka)? Пишите всё на английском.
    2) input() уже конвертирует значение из строки. Если число нецелое (float), то int() отработает без ошибок: int(3.14) = 3
    3) Странная структура программы. Не надо делать вложенную структуру (почему цикл бросков монеты идёт под else?), используйте break и continue, чтобы код был более плоским. "Плоское лучше, чем вложенное".
    4) В цикле броско монеты операторы "count += 1" и "times -= 1" следует вынести из блока if..elif, чтобы не дублировать оди и тот же код, который всё равно должен выполниться.
    5) Если не выпал орёл, то проверять условие var == 'решка' не нужно, достаточно простого else. Там кроме решки больше ничего быть не может.
    6) Какая версия Python? 2.x или 3.x? Про целочисленное деление помните?
    7) Дальше у меня сломался моск...
    Ответ написан
    7 комментариев
  • Как повысить эффективность кода? Или такое поведение программы считается нормальным?

    Собрались тут элитарии и гопники, и те и другие набросились на человека... Фиг он ещё чего спрашивать будет. А он же старался, писал чего-то. Что - само по себе - похвально. Рефакторинг полезен, чтоб перейти от плохой программы к хорошей программе и по ходу дела понять, чем хорошая программа лучше плохой.

    Для начала.

    - Русские названия переменных не годятся. Русские слова, написанные транслитом, как названия не годятся тоже. Только английские слова.
    - Если вас заботит скорость, - зачем вы делаете сначала random.choice, а потом сравниваете результат (строку) с другой строкой? Используйте random.randint(0, 1), который выдаст вам одно из двух чисел; если нуль - орёл, единица - решка.
    Ответ написан
    4 комментария
  • Как повысить эффективность кода? Или такое поведение программы считается нормальным?

    bobrovskyserg
    @bobrovskyserg
    1. Это поведение - норма.
    Попробуй заменить
    var = random.choice(monetka)
    на
    var = 'орел'
    и ты увидишь, на что уходит время.

    2. Код не выглядит профессионально, но поскольку "продолжаю учиться программированию", забей на выливающийся тут неадекват.

    Удачи.

    UPDATE
    import random
    
    coin = ('head', 'tail') 
    heads = tails = count = 0
    
    while True:
        while True:
            try:
                times = int(input('Amount of coin toss?: '))
                break
            except ValueError:
                print('Must be integer')
    
        for i in range(times):  # +скорость +однозначность
            var = random.choice(coin)
            count += 1
            if var == 'head':  # +наглядность +скорость
                heads += 1
            else:
                tails += 1
    
        print('Current results: head count = {0} ({1:%}), tail count = '
              '{2} ({3:%})'.format(heads, heads / count, tails, tails / count))
    
        while True:
            new = input('Continue? y/n: ')
            if new in ('y', 'n'):
                break
            else:
                print('Print "y" or "n"')
    
        if new == 'n':
            break
    
    print('Final results: head count = {0} ({1:%}), tail count = '
          '{2} ({3:%})'.format(heads, heads / count, tails, tails / count))
    Ответ написан
    Комментировать