Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

Популярность Питона

Автор Devorator linguarum, сентября 27, 2020, 20:03

0 Пользователи и 1 гость просматривают эту тему.

rounin

Цитата: Python от октября  1, 2020, 16:05
Если на входе нумпаевский массив, то увеличь его, сделав повторы элементов, невозможно — только преобразовав его в питоновский список, умножив и обрезав, и затем преобразовав обратно?

Не обязательно. Можно так:

np.array([1, 2, 3]).reshape(1, 3).repeat(5, axis=0).reshape((3*5,))


Цитата: Hellerick от октября  1, 2020, 16:07
Можно их как-нибудь красивше присвоить? Без ручного набора?
Да, в принципе, и так красиво.

Но вообще, не нужно стараться сделать всё одной строкой, это плохая привычка. 
Не стесняйтесь функций:


def char_seq(arg, restype=list):
    '''
    Returns list of successive chars
    Examples:
    az = char_seq('a..z')
    az = char_seq('a..z', restype=str)
    az = char_seq('a..z', restype=set)
    '''
    try:
        range_chars = arg.split('..')
        first_char = range_chars[0]
        last_char = range_chars[1]
        i0 = ord(first_char)
        i1 = ord(last_char)
    except:
        raise Exception("char_seq: argument should be string like 'a..z'")       
   
    reslist = [chr(i) for i in range(i0, i1+1)]

    if restype is list:
        return reslist
    elif restype is str:
        return ''.join(reslist)
    else:
        return restype(reslist)
        #raise TypeError("char_seq: Unsupported restype")

Hellerick

Fresca  :yes: Ma on no va pote entra la alfabeta rusce (per causa de la letera Ё).

Круто :yes: Но русский алфавит ввести не получится (из-за Ё).


Python

Цитата: rounin от октября  1, 2020, 17:24
Но вообще, не нужно стараться сделать всё одной строкой, это плохая привычка.
Многословность избыточна. Зачем делать хорошо задокументированную батарею кода там, где все делается простым однострочным выражением, достаточно понятным самим по себе? Да, можно написать функцию, делающую код с ней выразительнее и понятнее, но если эта функция появляется разово, то стоит ли оно того?

Я вот даже неуверен, а нужно ли выражать список цифр через выражение, если оно получается длиннее, чем сами десять цифр.

Позволю себе немного покритиковать ваш код.
Диапазон передается в красивом виде 'а..я', который затем парсится — при этом, нечто в стиле 'один..два' приведет к ошибке, как и случай, когда первый символ дипазона является точкой. Т.е., диапазон должен задаваться ровно четырьмя символами, два средних из которых — всегда точки, а первый — ни в коем случае не точка. Избыточный синтаксис и ненужное ограничение (или нужна возможность эту точку заэскейпить; либо просто брать первый и последний символ и игнорировать все, что между ними). Не проще ли передавать просто два символа (в виде двухсимвольной строки (или другой последовательности), либо как отдельные аргументы)? Впрочем, если это планируется как заготовка для более сложного синтаксиса (напр., '0..9A..F', превращающееся в '0123456789ABCDEF', или 'а..еёж..я', превращаюющееся в русский алфавит), то это имеет смысл.
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

kemerover

Цитата: rounin от октября  1, 2020, 17:24
Но вообще, не нужно стараться сделать всё одной строкой, это плохая привычка. 
Не стесняйтесь функций:


def char_seq(arg, restype=list):
    '''
    Returns list of successive chars
    Examples:
    az = char_seq('a..z')
    az = char_seq('a..z', restype=str)
    az = char_seq('a..z', restype=set)
    '''
    try:
        range_chars = arg.split('..')
        first_char = range_chars[0]
        last_char = range_chars[1]
        i0 = ord(first_char)
        i1 = ord(last_char)
    except:
        raise Exception("char_seq: argument should be string like 'a..z'")       
   
    reslist = [chr(i) for i in range(i0, i1+1)]

    if restype is list:
        return reslist
    elif restype is str:
        return ''.join(reslist)
    else:
        return restype(reslist)
        #raise TypeError("char_seq: Unsupported restype")


Напомнило FizzBuzz Enterprise Edition (там даже есть Code of Conduct, но это уже ненарочная ирония).


Есть ещё такая библиотека sre_yield, которая по регулярному выражению генерирует все возможные варианты; получается типа такого:
import sre_yield
print(list(sre_yield.AllStrings('[А-яёЁ]')))


Но это всё кажется чрезмерным. Иногда достаточно и просто готовой строки, ну или list comprehension, если боитесь случайно удалить какой-то символ.

Python

Цитата: rounin от октября  1, 2020, 17:24
Не обязательно. Можно так:
np.array([1, 2, 3]).reshape(1, 3).repeat(5, axis=0).reshape((3*5,))
Отлично!
Тогда сделаем так:

from functools import reduce

def rheshape(a, newshape):
    '''Reshape numpy array in APL rho function way'''
    l0=reduce(lambda x,y:x*y, np.shape(a))
    l1=reduce(lambda x,y:x*y, newshape)
    r=round(l1/l0+0.5)
    return np.reshape(a, (1, l0)).repeat(r, axis=0).ravel()[:l1].reshape(newshape)

Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

rounin

Цитата: Python от октября  1, 2020, 18:14
Да, можно написать функцию, делающую код с ней выразительнее и понятнее, но если эта функция появляется разово, то стоит ли оно того?

It depends. Иногда даже разовую вещь лучше сделать функцией, но чаще нет.
Но откуда же мне знать, разовая это функция или часто используемая?
Разово лучше "abcdefghijklmnopqrstuvwxyz" ничего не придумать.

Цитата: Python от октября  1, 2020, 18:14
Не проще ли передавать просто два символа (в виде двухсимвольной строки (или другой последовательности), либо как отдельные аргументы)?

Конечно проще. Так, в общем-то, и надо делать.
Но Hellerick жаждал красоты. А красота требует жертв :)

rounin

Я вспомнил. Там есть функция tile. Паттерн любой размерности повторяет по любым направлениям.

PS
l0=reduce(lambda x,y:x*y, np.shape(a)) вместо len(a) - это прекрасно.

Python

Цитата: rounin от октября  2, 2020, 12:37
l0=reduce(lambda x,y:x*y, np.shape(a)) вместо len(a) - это прекрасно.
Чего вы хотите от человека, привыкшего делать это как l0←×/⍴a
Ну и с newshape то же самое нужно провернуть — хотелось бы одинакового подхода. (Наверняка в numpy где-то зарыта своя редукция с возможностями на уровне aplовской, только я до нее не добрался).

Кстати, никогда не понимал, зачем в 3-м питоне reduce убрали в functools (хотя map и filter как были доступны без импорта, так и остались). Если язык претендует на ФПшность, то желательно иметь под рукой все три функции — зачем этот дурацкий намек на «пишите циклы»?
Пролетареві ніколи вчити європейських мов, бодай би свою знати добре і на ній принести до своєї хати світло знання (Гнат Хоткевич)
ÆC CASALI NAXI PRASQURI: AHOV CÆRU, MERTVÆRI TÆ SLAVUTÆT!
Вони просили його: «Скажи: кетум», а він говорив: «сатем», і не міг вимовити правильно.
Хотелось бы также отметить, что "Питон" - это "мышиный язык" : "пи+тон". © АБР-2

kemerover

Цитата: Python от октября  2, 2020, 16:36
Кстати, никогда не понимал, зачем в 3-м питоне reduce убрали в functools (хотя map и filter как были доступны без импорта, так и остались). Если язык претендует на ФПшность, то желательно иметь под рукой все три функции — зачем этот дурацкий намек на «пишите циклы»?
По той же причине, почему в Питоне нету goto. Чтобы людям было менее повадно писать непонятный код.

Devorator linguarum

Цитата: kemerover от октября  2, 2020, 19:04
По той же причине, почему в Питоне нету goto. Чтобы людям было менее повадно писать непонятный код.
Языки программимрования, в которых неповадно писать непонятный код, бесят. Когда ты сам для себя на коленке программу пишешь, тебе нужно не понятно, а быстро и чтобы работало. За что я и любил бейсик, пока еще писал какие-то программы.

kemerover

Цитата: Devorator linguarum от октября  2, 2020, 19:14
Языки программимрования, в которых неповадно писать непонятный код, бесят. Когда ты сам для себя на коленке программу пишешь, тебе нужно не понятно, а быстро и чтобы работало. За что я и любил бейсик, пока еще писал какие-то программы.
Нужен какой-то компромисс. Если писать очень быстро, то до стадии "чтобы работало" может и не дойти :) Поэтому различные структурные ограничения могут помочь и на стадии прототипирования.

Devorator linguarum

Цитата: kemerover от октября  2, 2020, 19:44
Нужен какой-то компромисс. Если писать очень быстро, то до стадии "чтобы работало" может и не дойти :) Поэтому различные структурные ограничения могут помочь и на стадии прототипирования.
А если структура языка позволяет писать только понятно, как в паскале, то до стадии "чтобы работало" точно не дойдет. Потому что непрофессиональный программист сдуется еще на стадии, когда будет в начале программы перечислять все планируемые к использованию переменные и другую подобную лабуду. :donno:

kemerover

Цитата: Devorator linguarum от октября  2, 2020, 20:04
А если структура языка позволяет писать только понятно, как в паскале, то до стадии "чтобы работало" точно не дойдет. Потому что непрофессиональный программист сдуется еще на стадии, когда будет в начале программы перечислять все планируемые к использованию переменные и другую подобную лабуду. :donno:
Поэтому на Паскале никто сейчас и не программирует, а на Пайтоне — куча народу, там с этим намного лучше.

Bhudh

В JS с этим так же, но тем не менее туда со всех сил тянут код-стайлы из "взрослых языков" с прописыванием всего подряд.
И синтаксис классов оттуда же.
Пиши, что думаешь, но думай, что пишешь.
MONEŌ ERGŌ MANEŌ.
Waheeba dokin ʔebi naha.
«каждый пост в интернете имеет коэффициент бреда» © Невский чукчо

Rachtyrgin

Цитата: Devorator linguarum от октября  2, 2020, 20:04
Потому что непрофессиональный программист сдуется еще на стадии, когда будет в начале программы перечислять все планируемые к использованию переменные и другую подобную лабуду. :donno:

Поверьте на слово - мне ОЧЕНЬ нравится перечислять в начале класса используемые переменные. Это такая ясность в голове!
Всякому остановленному фашисту для захвата его в плен можешь еще крикнуть:
«Хэндэ хох!» (Руки вверх!)
«Вафи хинлеги!» (Бросай оружие!)
«Абгезэсен!» (Слезай! — С машины, с лошади, с повозки.)
Если фашист не сразу исполняет твое приказание, крикни грознее и добавь:
«Бай флухтфэрзух вирт гэшози!» (Побежишь — буду стрелять!)
А. Афанасьев. В помощь партизану. Москва, 1942 г.

From_Odessa

Цитата: Devorator linguarum от октября  2, 2020, 20:04
Потому что непрофессиональный программист сдуется еще на стадии, когда будет в начале программы перечислять все планируемые к использованию переменные и другую подобную лабуду. :donno:
Почему Вы так думаете? Мне как непрофессиональную программисту, наоборот, хочется сначала все прописать, чтобы оно уже было у меня и было структурировано. Понятно, конечно, что есть переменные, которые нужны только внутри отдельных функций, но, собственно, никто не мешает объявить их в главной функции.

Петр Хрюшин

Цитата: Rachtyrgin от октября  2, 2020, 20:31
Цитата: Devorator linguarum от октября  2, 2020, 20:04
Потому что непрофессиональный программист сдуется еще на стадии, когда будет в начале программы перечислять все планируемые к использованию переменные и другую подобную лабуду. :donno:

Поверьте на слово - мне ОЧЕНЬ нравится перечислять в начале класса используемые переменные. Это такая ясность в голове!
Я совсем не понимаю классы. Зачем они нужны?

Rachtyrgin

Ваш вопрос поднимает очень большую тему. Первый ответ - классы нужны для ООП. Второй (я склоняюсь к нему) - классы позволяют структурировать мышление программиста. Так же как у историков это делает понятие Киевской Руси. В истории ее никогда реально не было, но само понятие позволяет мыслить структурировано)
Всякому остановленному фашисту для захвата его в плен можешь еще крикнуть:
«Хэндэ хох!» (Руки вверх!)
«Вафи хинлеги!» (Бросай оружие!)
«Абгезэсен!» (Слезай! — С машины, с лошади, с повозки.)
Если фашист не сразу исполняет твое приказание, крикни грознее и добавь:
«Бай флухтфэрзух вирт гэшози!» (Побежишь — буду стрелять!)
А. Афанасьев. В помощь партизану. Москва, 1942 г.

_Swetlana

Я точно знаю, чем нужно ООП.
Наша кафедра заключила первый хоздоговор с комбинатом. Я вообще-то была математиком-постановщиком, но нужно было запрограммировать свой алгоритм, т.к. эвристические алгоритмы обкатываются на реальных данных. Дальше жуткая вещь - содержание нескольких десятков техинструкций нужно было забить в константы. Ну и переменные описать, конечно. И вот я вырулила, наконец, на алгоритм, дописываю. Тут мне говорят. А вот мы сходили на комбинат и узнали кое-что. Техзаданье поменялось. Я начинаю переделывать всю программу от начала до конца. Потом оно поменялось ещё раз, и ещё раз, и ещё. Если бы у меня были классы, то я бы поменяла что мне нужно там, а не исправляла бы по всей программе.
🐇

Devorator linguarum

Цитата: From_Odessa от октября  2, 2020, 20:37
Цитата: Devorator linguarum от октября  2, 2020, 20:04
Потому что непрофессиональный программист сдуется еще на стадии, когда будет в начале программы перечислять все планируемые к использованию переменные и другую подобную лабуду. :donno:
Почему Вы так думаете? Мне как непрофессиональную программисту, наоборот, хочется сначала все прописать, чтобы оно уже было у меня и было структурировано. Понятно, конечно, что есть переменные, которые нужны только внутри отдельных функций, но, собственно, никто не мешает объявить их в главной функции.
Я не думаю, а знаю по своему опыту. Бейсик и Паскаль - два языка, которые я в свое время серьезно изучал, но потом сколько ни брался за написание для себя полезных программ на Паскале, ни одну до ума не довел. А на Бейсике доводил и успешно использовал.

Но в Паскале засада, конечно, не только в переменных. Строгий синтаксис Паскаля приводит к тому, что то, что пишется на Бейсике в 10 строк, на Паскале занимает 20. Поэтому написание программы на Паскале всегда требует бóльших трудозатрат. А уж учитывая, что на Бейсике любой кусок программы можно вырезать и почти в натуральном виде запустить отдельно, чтобы отладить, а в Паскале к каждому такому вырезанному куску перед запуском нужно приписывать много строк этих определений переменных и тому подобной служебной информации, программирование на последнем становится еще более неприятным.

From_Odessa

Цитата: Devorator linguarum от октября  2, 2020, 21:00
Я не думаю, а знаю по своему опыту
Разным людям может быть удобно разное. Мне вот удобнее то, как я сказал, а Вам, похоже, удобнее другое. Опыта одного человека тут недостаточно. Да и двух - тоже. Для широких выводов, имею в виду.

Но я не знаю, что там в Паскале и Бейсике, потому конкретно об этих языках ничего сказать не могу. Может, там у всех такая ситуация, как Вы говорите.

Петр Хрюшин

Цитата: Rachtyrgin от октября  2, 2020, 20:47
Ваш вопрос поднимает очень большую тему. Первый ответ - классы нужны для ООП. Второй (я склоняюсь к нему) - классы позволяют структурировать мышление программиста. Так же как у историков это делает понятие Киевской Руси. В истории ее никогда реально не было, но само понятие позволяет мыслить структурировано)
Цитата: _Swetlana от октября  2, 2020, 20:57
Я точно знаю, чем нужно ООП.
Наша кафедра заключила первый хоздоговор с комбинатом. Я вообще-то была математиком-постановщиком, но нужно было запрограммировать свой алгоритм, т.к. эвристические алгоритмы обкатываются на реальных данных. Дальше жуткая вещь - содержание нескольких десятков техинструкций нужно было забить в константы. Ну и переменные описать, конечно. И вот я вырулила, наконец, на алгоритм, дописываю. Тут мне говорят. А вот мы сходили на комбинат и узнали кое-что. Техзаданье поменялось. Я начинаю переделывать всю программу от начала до конца. Потом оно поменялось ещё раз, и ещё раз, и ещё. Если бы у меня были классы, то я бы поменяла что мне нужно там, а не исправляла бы по всей программе.
Спасибо! Это как бы подпрограмма получается, и эти подпрограммы как бы хранятся в библиотеке?

_Swetlana

Нет, это не подпрограмма. Читайте, что такое ООП  :)
🐇

Петр Хрюшин

Цитата: _Swetlana от октября  2, 2020, 21:06
Нет, это не подпрограмма. Читайте, что такое ООП  :)
Я не программист, ничего в языках прграммирования не понимаю :donno:

Rachtyrgin

Петр, в двух словах. Пишете класс, который, как бы это выразиться, имитирует собаку. Пишете свойства: вес, рост, порода, кличка, что-то там еще. Пишете методы: лает, кусает, ест, спит, бежит, сидит. И все это в одном флаконе, который и называется классом. В теории это называется объединением поведения и состояния. Потом Вы передаете этому классу любые переменные. Типа, математическое отображение реального объекта. Удобно!
Всякому остановленному фашисту для захвата его в плен можешь еще крикнуть:
«Хэндэ хох!» (Руки вверх!)
«Вафи хинлеги!» (Бросай оружие!)
«Абгезэсен!» (Слезай! — С машины, с лошади, с повозки.)
Если фашист не сразу исполняет твое приказание, крикни грознее и добавь:
«Бай флухтфэрзух вирт гэшози!» (Побежишь — буду стрелять!)
А. Афанасьев. В помощь партизану. Москва, 1942 г.

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр