LINUX.ORG.RU
ФорумTalks

С домашкой по Python подсобите

 ,


2

2

После первой лекции на курсе получил ДЗ.

Как по мне, материал лекции слабо согласуется с ДЗ, но для более опытного наверное было бы не сложно разобраться, для меня - сложно.

Понимаю, что гугл мне в помощь, но может подскажет кто - в какой книге можно найти подобный пример? Или на словах объяснить, что скрипт должен из себя представлять (без кода). Так сказать объяснить построчно «куда копать».

Вообще буду благодарен любой подсказке.

Уровень1

Написать скрипт, который может получать не обязательный аргумент командной строки ‘-s [v4, v6, ab, n, mx]’ и выводит список компаний отсортированных по следующему признаку:

-s ab по алфавиту (домен второго уровня)

-s v4 по количеству используемых IPv4 в инфраструктуре компании

-s v6 по количеству используемых IPv6 в инфраструктуре компании

-s n по суммарному кол-ву используемых IPv4 и IPv6 адресов в инфраструктуре компании

-s mx по кол-ву мейл серверов используемых в инфраструктуре компании

В случае отсутствия аргумента s выводить список компаний с подробной информацией в таком формате: ------------------------------------------------------------------------------------ [компания1] использует всего N IP адрессов, из них: N IPv4 адресов(IP1, IP2, IP3, .. IPn) N IPv6 адресов(IP1, IP2, IP3, .. IPn) использует N мейл серверов: mail1.domain.com -> [ipv4: IP1, IP2, ,,IPn; ipv6: IP1, IP2, IP3, … IPn] mail2.domain.com -> [ipv4: IP1, IP2, ,,IPn; ipv6: IP1, IP2, IP3, … IPn] … mailN.domain.com -> [ipv4: IP1, IP2, ,,IPn; ipv6: IP1, IP2, IP3, … IPn] ------------------------------------------------------------------------------------- [компания2] использует всего N IP адрессов, из них: N IPv4 адресов (IP1, IP2, IP3, .. IPn) N IPv6 адресов (IP1, IP2, IP3, .. IPn) использует N мейл серверов: mail1.domain.com -> [ipv4: IP1, IP2, ,,IPn; ipv6: IP1, IP2, IP3, … IPn] mail2.domain.com -> [ipv4: IP1, IP2, ,,IPn; ipv6: IP1, IP2, IP3, … IPn] … mailN.domain.com -> [ipv4: IP1, IP2, ,,IPn; ipv6: IP1, IP2, IP3, … IPn] ------------------------------------------------------------------------------------- и т.д.

Входные данные программа берёт их файла, содержащего такие строки:

mail.ru has address 217.69.139.201 alt3.aspmx.l.google.com has IPv6 address 2607:f8b0:4002:c07::1a google.com has address 173.194.32.166 aspmx3.googlemail.com has IPv6 address 2607:f8b0:4001:c05::1b alt1.aspmx.l.google.com has IPv6 address 2607:f8b0:4003:c02::1b alt2.aspmx.l.google.com has IPv6 address 2607:f8b0:4001:c05::1a google.com has address 173.194.32.174 aspmx3.googlemail.com has address 74.125.193.27 alt4.aspmx.l.google.com has IPv6 address 2607:f8b0:400d:c04::1b google.com has address 173.194.32.167 aspmx2.googlemail.com has IPv6 address 2607:f8b0:4003:c02::1a yandex.ru has address 213.180.204.11 vk.com mail is handled by 10 mail.vk.com. microsoft- com.mail.protection.outlook.com has address 207.46.163.215 yandex.ru has address 93.158.134.11 alt1.aspmx.l.google.com has address 173.194.64.27 alt1.aspmx.l.google.com has address 173.194.64.27 mail.ru has address 94.100.180.199 alt2.aspmx.l.google.com has address 74.125.193.26 mx.yandex.ru has address 87.250.250.89 microsoft- com.mail.protection.outlook.com has address 207.46.163.170 microsoft- com.mail.protection.outlook.com has address 207.46.163.138 google.com mail is handled by 40 alt3.aspmx.l.google.com. google.com has address 173.194.32.169 google.com mail is handled by 20 alt1.aspmx.l.google.com. vk.com has address 87.240.131.99 mail.ru has address 94.100.180.201 google.com has address 173.194.32.165 mx.yandex.ru has address 213.180.204.89 mxs.mail.ru has address 217.69.139.150 mxs.mail.ru has address 94.100.180.150 microsoft- com.mail.protection.outlook.com has address 207.46.163.247 microsoft.com mail is handled by 10 microsoft- com.mail.protection.outlook.com. vk.com has IPv6 address 2a00:bdc0:3:103:1:0:403:905 alt4.aspmx.l.google.com has address 74.125.29.26 google.com has address 173.194.32.163 yandex.ru mail is handled by 10 mx.yandex.ru. aspmx2.googlemail.com has address 173.194.64.26 mail.ru mail is handled by 10 mxs.mail.ru. google.com has IPv6 address 2a00:1450:4010:c04::8a alt1.aspmx.l.google.com has IPv6 address 2607:f8b0:4003:c02::1b yandex.ru has address 213.180.193.11 vk.com has address 87.240.131.117 google.com has address 173.194.32.162 google.com has address 173.194.32.161 google.com mail is handled by 50 alt4.aspmx.l.google.com. google.com has address 173.194.32.164 aspmx.l.google.com has address 74.125.143.27 reddit.com mail is handled by 10 aspmx3.googlemail.com. mx.yandex.ru has IPv6 address 2a02:6b8::89 mx.yandex.ru has address 213.180.193.89 vk.com has IPv6 address 2a00:bdc0:3:103:1:0:403:906 vk.com has IPv6 address 2a00:bdc0:3:103:1:0:403:904 mail.ru has address 217.69.139.199 reddit.com mail is handled by 10 aspmx2.googlemail.com. google.com has address 173.194.32.160 alt2.aspmx.l.google.com has address 74.125.193.26 reddit.com has address 66.171.224.19 reddit.com mail is handled by 1 aspmx.l.google.com. alt3.aspmx.l.google.com has address 74.125.196.27 microsoft.com has address 65.55.58.201 reddit.com mail is handled by 5 alt1.aspmx.l.google.com. reddit.com has address 66.171.224.34 alt2.aspmx.l.google.com has IPv6 address 2607:f8b0:4001:c05::1a vk.com has address 87.240.143.241 aspmx.l.google.com has IPv6 address 2a00:1450:4010:c04::1b aspmx.l.google.com has IPv6 address 2a00:1450:4010:c04::1b mx.yandex.ru has address 77.88.21.89 google.com mail is handled by 10 aspmx.l.google.com. microsoft.com has address 64.4.11.37 google.com mail is handled by 30 alt2.aspmx.l.google.com. mail.vk.com has address 93.186.236.94 aspmx.l.google.com has address 74.125.143.27 mx.yandex.ru has address 93.158.134.89 google.com has address 173.194.32.168 reddit.com mail is handled by 5 alt2.aspmx.l.google.com.

Подсказка: загляните в документацию по Python и почитайте об open, sorted, sys.argv (его можно использовать на первых порах, когда вы ещё не знаете как использовать классы, модули, функци), также ознакомьтесь с http:// legacy.python.org/dev/peps/ pep-0263/, вам пригодиться...

Уровень 2

Усложняется задача: программа должна брать из файла список доменов и сама уметь резолвить доменное имя, обладать таким же функционалом сортировки.

Резолвить можно двумя способами: 1) выполнять команду (host или dig) в оболочке и парсить вывод, 2) использовать модули для работы с DNS (их много см. https://pypi.python.org/pypi %3Aaction=search&term=dns&submit=search ) или модуль socket из стандартной библиотеки, однако он не даёт возможности получить MX запись домена.

Подсказка: загляните в документацию по Python и почитайте об open, sorted, sys.argv (его можно использовать на первых порах, когда вы ещё не знаете как использовать классы, модули, функци), также ознакомьтесь с http:// legacy.python.org/dev/peps/ pep-0263/, вам пригодиться...

Копай в эту сторону.

Lilly ()
Ответ на: комментарий от le_legioner

может ответит кто. когда в последний раз выбирал, остановился на getopt по понятным причинам. но вдруг argp чем-то лучше? хотя, нужно было посмотреть исходники. :3

wakuwaku ★★★★ ()
Последнее исправление: wakuwaku (всего исправлений: 1)
Ответ на: комментарий от le_legioner

блин, штука долларей. нет уж, спасибо. продолжу лутца штудировать.

KJIayC ()
Ответ на: комментарий от pi11

хм, спасибо. а оно полностью совместимо между 2 и 3 ветками? использую обе, было бы неприятно столкнуться с нежданчиками.

wakuwaku ★★★★ ()
Ответ на: комментарий от wakuwaku

Не знаю точно, я третьей не пользуюсь, но вроде да.

pi11 ★★★★★ ()
Ответ на: комментарий от stevejobs

прочёл. я уже много чего прочёл. у меня прока проблема новичка - не знаю ещё как, где и что применять из знаний.

Собственно спрошу на курсе - как строится процесс создания программы. Понимаю, что профи такой скрипт в уме накидывают, но не о них речь. Как-то нужно брать лист бумаги, карандаш и всё это представлять визуально, чтобы родилось затем. Или?

le_legioner ★★ ()
Ответ на: комментарий от le_legioner

это миф)

1) вначале нужно разделить задачу на мелкие подзадачи. Если этого не делать, то можно мгновенно бесповоротно сойти с ума от стресса. У тебя мелкие задачи - сделать чтобы скрипт вообще запустился, научиться выводить строки, считать файл, вывести на экран, вывести в отсортированном виде (жестко захардкоженом в самом скрипте), считать параметры с командной строки, заменить жестко захардкоженые

2) последовательно концентрироваться на мелких задачах, пока они не будут решены. Одна задача в один момент времени. К следующей не переходить, пока не решил предыдущую. Если непонятно как решать - можно пойти посоветоваться с ЛОРом, гуглом, stackoverflow, habrahabr q&a, двачем, или еще чем-то.

3) самое главное - начать просто что-то писать в скрипте. Пусть это будешь чушь, которая даже не компилируется, но она будет. Есть такая книжка The Artist's Way («Путь художника»), и термин freewriting, есть такой термин writer's block(загуглить!). С этим надо бороться тем, что полчаса сидишь и пишешь хоть что-нибудь, а потом полезное начнет получаться само. (Заодним это решение первой подзадачи - сделать чтобы скрипт был и работал).

короче, берешь и начинаешь просто писать.

первая задача для тебя - просто прочитать строчки из файла и вывести на экран.

вначале учишься выводить на экран хоть что-нибудь. Без этого даже если ты сделаешь всё остальное задание - всё равно не увидишь результатов.

потом ищешь функции, которые умеют читать файл и трахаешься с этим, пока файл не прочтется без ошибок.

потом думаешь, как скрестить чтение файла с выводом на экран и трахаешься пока на экране не появятся строчки из файла.

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

stevejobs ★★★★☆ ()
Ответ на: комментарий от le_legioner

есть еще чит, называется «гуголь». Например, тебе нужно распечатать файл на экран. Запрос «как прочитать и распечатать файл в питоне». С русским запросом можно пройти прямиком в Спортлото, поэтому переводим на английский: «how to read and print a file in python». И тебе тут же выводится список готовых ответов.

Так можно быстро проходить курсы по языкам программирования, т.к. задачи в них обычно дальше первой страницы гугла не распространяются. Можно, но не нужно, если привыкнешь так делать вообще всё - потом разучишься думать. На учебных задачах можно воспринимать гугл как универсальный решебник и обращаться к нему только после того как прочитал официальный док и твёрдо понял, что не понимаешь как его использовать. (На реальных задачах гугл почти всегда используется первым, ибо работодатель может выдать люлей, если окажется, что ты тратишь его деньги на задачу, решение которой есть в гугле.)

stevejobs ★★★★☆ ()

Понимаю, что гугл мне в помощь, но может подскажет кто - в какой книге можно найти подобный пример?

Все уже сказано, но В Лутцевском «Изучаем питон» можно найти 3 листинга, из которых сложится такая программа.

siphonops ★★★ ()

stevejobs все верно написал. Я вот ещё рисую что-то похожее на блоксхемы, очень помогает в понимании как разделить задачу на части.

ggrn ★★★★★ ()
Ответ на: комментарий от flareguner

Ни при чём, просто разговор зашёл за парсинг аргументов, почему бы и нет.

wakuwaku ★★★★ ()
Ответ на: комментарий от le_legioner

Еще техника. Допустим, задача сложная (или язык программирования поехавший), и нельзя выделить четкую последовательность подзадач для решения. Тут уже применение чистого интеллекта для поиска «решения в один ход» не катит.

Но почти всегда можно выделить просто какие-то подзадачи без особого порядка.

Потом садимся и медетируем (отдыхаем, смотрим сериалы, занимаемся дзеном, упарываемся, еще что-то), в ожидании пока мудрое подсознание само сложит кусочки головоломки и выдаст ответ.

Но для того, чтобы выплюнуть ответ, подсознанию обычно недостаточно только самих формулировок задач, нужно еще «чем склеивать». Для того, чтобы получить клея, нужно каждый известный элемент (например, open, sorted, sys.arg) немножко поиспользовать.

Например, написать программу - любую, пусть не по теме, которая использует sys.arg. Поиграть с ней, подумать над чем она хороша или плоха, или какой трюк с ней можно сотворить.

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

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

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

На это тратится очень много времени, и работодатели обычно предпочитают людей, которые знают непосредственные ответы или непосредственные пути поиска ответа (читай - алгоритмы с расставленными подзадачами и последовательностями), чем людей умеющих в полный поиск :) Поэтому на собеседовании вначале говорим о своих достижениях (непосредственные ответы), потом о том что умеешь делать (готовые алгоритмы), и только потом о том, какой ты умный и во всём сможешь разобраться.

stevejobs ★★★★☆ ()
Ответ на: комментарий от le_legioner

Ну что бы сделал конкретно я:

1) Парсить файл придётся в любом случае, значит это должно делаться в самом начале скрипта. Либо просто будут идти соответствующие строки, либо будет вызываться заранее определённая функция, которая будет возвращать объект с распарсенными данными. Судя по задаче, рекомендую сохранять данные в следующую структуру:

{company:([],[],[])}

Ключом словаря будет название компании, а в массивах, соответственно, список IPv4-адресов, список IPv6-адресов и список почтовых серверов данной компании.

После того, как распарсили, парсим аргументы командной строки.

У тебя будет что-то типа:

if len(sys.argv) < 3:
    ...//код, выполняемый в случае отсутствия аргумента s
elif sys.argv[1] == '-s':
    if sys.argv[2] == 'ab':
        ...//по алфавиту
    elif ...:
        ....
    elif ...:
        ....

в этом коде ещё нет проверки правильности аргументов командной строки.

//P.S.: для сортировки рекомендую ознакомиться с этим: https://wiki.python.org/moin/HowTo/Sorting

Ttt ☆☆☆☆☆ ()
Последнее исправление: Ttt (всего исправлений: 1)

) выполнять команду (host или dig) в оболочке и парсить вывод, 2)

что под этим имеется ввиду ? subprocess ?

SI ★★☆☆ ()

Написать скрипт, который может получать не обязательный аргумент командной строки ‘-s [v4, v6, ab, n, mx]’ и выводит список компаний отсортированных по следующему признаку:

А тебе как надо? С использованием сторонних либ, или самостоятельно реализовать алгоритм?

Siado ★★★★★ ()

И посмотри ещё модуль re. Хотя странно, что вам такие входные данные для начала дают. Запаришься мягко говоря.

C1nde ()
Ответ на: комментарий от stevejobs

Прямо про меня написал. ☺ Потом, правда, такие конфузы бывают... Я, например, впервые попробовал использовать python для некой операции с массивами чисел. Первой подзадачей стало, как раз, чтение этих массивов из файла. О, как я был горд первым результатом! Это чувство, что ты - повелитель алгоритмов и владыка структур данных, ммм... К слову, выглядело это вот так:

control = [float(i.rstrip().replace(',', '.')) for i in open(args.control).readlines()]
Когда, спустя значительное время, я случайно узнал, что можно было сделать просто np.loadtxt(args.control), я бился головой об стол.

Axon ★★★★★ ()
Последнее исправление: Axon (всего исправлений: 1)
Ответ на: комментарий от Ttt

Судя по задаче, рекомендую сохранять данные в следующую структуру:

{company:([],[],[])}

Помнится, именно на таких данных в книжках иллюстрируют применение объектов. То есть, компания - это объект, а все данные про неё - атрибуты. Хотя, лично я бы сделал список со словарями:

[
    {
        name:   'Company1',
        domains:['name1', 'name2', ...],
        ipv4:   ['addr1', 'addr2', ...],
        ipv6:   ['addr1', 'addr2', ...],
        mx:     ['mx1', 'mx2', ...]
    },
    {
        name:   'Company2',
        domains:['name1', 'name2', ...],
        ipv4:   ['addr1', 'addr2', ...],
        ipv6:   ['addr1', 'addr2', ...],
        mx:     ['mx1', 'mx2', ...]
    },
    ...
]
Или даже словарь со словарями.

Axon ★★★★★ ()
Ответ на: комментарий от wakuwaku

пользуясь случаем, чем popt лучше getopt, и стоит ли использовать argp.h вместо них?

Лучше всего docopt.

theNamelessOne ★★★★★ ()
Ответ на: комментарий от Axon

Когда, спустя значительное время, я случайно узнал, что можно было сделать просто np.loadtxt(args.control), я бился головой об стол.

На первых этапах изучения языка/библиотеки часто изобретаешь велосипеды, поэтому очень важно хорошо изучить стандартную библиотеку языка/API библиотеки.

theNamelessOne ★★★★★ ()
Ответ на: комментарий от Lovenl

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

le_legioner ★★ ()
Ответ на: комментарий от theNamelessOne

На первых этапах изучения языка/библиотеки часто изобретаешь велосипеды, поэтому очень важно хорошо изучить стандартную библиотеку языка/API библиотеки.

Окосеешь список функций читать, да и запомнить нереально. Просто теперь я хорошо роюсь в доках на предмет готовой реализации моей задачи перед тем, как лепить свою.

Axon ★★★★★ ()

ДЗ чоткое, видимо курсы хорошие. Собственно тебе всё написали уже, самое главное для программиста - умени разбивать задачу на подзадачи.

1) вывести инфу об одной компании (структуру тебе выше накидали)

2) вывести все компании (лдя начала не из файла, а тупо их забить пару-тройку в код)

3) сортировать и выводить (сначала в коде)

4) заменить способ сортировки в коде на введенный пользователем

4a) прочитать аргумент командной строки

4б) выбрать нужный ключ для сортировки

5) заменить компании в коде на компании из файла

5a) научиться тупо вывести на экран файл

5б) распарсить файл в компании

Как-то так

Kesha_Molchanov ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.