Войти
Портал компьютерных советов - Hiper-ru
  • Как восстановить ранее удаленную страницу вконтакте
  • Несколько способов узнать марку и модель материнской платы на компьютере или ноутбуке
  • Программы для шифрования папок и файлов
  • Как запустить службу аудио на виндовс 8
  • Особенности использования Bluetooth-гарнитур с Android-смартфонами Hsp не включается
  • Esp файл. esp Расширение файла. Объединение двух файлов в один
  • Задания для начинающих программистов python. Подготовка к собеседованию на позицию Python-разработчика. Что такое итератор

    Задания для начинающих программистов python. Подготовка к собеседованию на позицию Python-разработчика. Что такое итератор

    Python 3 - это современный язык, на котором просто и приятно писать программы.

    Для печати значений в Питоне есть функция print(). Внутри круглых скобок через запятую мы пишем то, что хотим вывести. Вот программа, которая делает несколько вычислений:

    Print(5 + 10) print(3 * 7, (17 - 2) * 8) print(2 ** 16) # две звёздочки означают возведение в степень print(37 / 3) # один слэш - это деление с ответом-дробью print(37 // 3) # два слэша считают частное от деления нацело # это как операция div в других языках print(37 % 3) # процент считает остаток от деления нацело # это как операция mod в других языках

    Для ввода данных в программу мы используем функцию input() . Она считывает одну строку.

    Вот программа, которая считывает имя пользователя и приветствует его:

    Пётр print("Как вас зовут?") name = input() # считываем строку и кладём её в переменную name print("Здравствуйте, " + name + "!")

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

    Попробуем написать программу, которая считывает два числа и выводит их сумму. Для этого считаем два числа и сохраним их в переменные a и b , пользуясь оператором присваивания = . Слева от оператора присваивания в программах на Питоне ставится имя переменной - например, строка из латинских букв. Справа от оператора присваивания ставится любое выражение. Имя станет указывать на результат вычисления выражения. Проиграйте эту программу и посмотрите на результаты её работы:

    5 7 a = input() b = input() s = a + b print(s)

    Мы видим, что программа выводит 57 , хотя в реальной жизни 5 + 7 будет 12 . Это произошло потому, что Питон в третьей строчке «сложил» две строки, а не два числа. В Питоне две строки складываются так: к первой строке приписывается вторая.

    Обратите внимание, что в визуализаторе содержимое переменных a и b заключено в кавычки. Это означает, что в a и b лежат строки, а не числа.

    В Питоне все данные называются объектами. Число 2 представляется объектом «число 2», строка "hello" – это объект «строка "hello" ».

    Каждый объект относится к какому-то типу. Строки хранятся в объектах типа str , целые числа хранятся в объектах типа int , дробные числа (вещественные числа) - в объектах типа float . Тип объекта определяет, какие действия можно делать с объектами этого типа. Например, если в переменных first и second лежат объекты типа int , то их можно перемножить, а если в них лежат объекты типа str , то их перемножить нельзя:

    First = 5 second = 7 print(first * second) first = "5" second = "7" print(first * second)

    Чтобы преобразовать строку из цифр в целое число, воспользуемся функцией int() . Например, int("23") вернет число 23 .

    Вот пример правильной программы, которая считывает два числа и выводит их сумму:

    5 7 a = int(input()) b = int(input()) s = a + b print(s)

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

    В обучении программированию действует тот же принцип. Конечно, на GeekBrains вы получите практические задания и помощь преподавателей. Однако и после завершения курсов вы наверняка захотите размять руки, а также повысить свой уровень путем решения всевозможных задач. Чтобы помочь вам в этом, мы отобрали несколько ресурсов с упражнениями.

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

    Целевая аудитория сайта – начинающие web-разработчики. Именно им предназначено солидное количество задач по HTML, PHP, Python, JavaScript, на решение которых можно потратить не один день и даже неделю. Ни регистрации, ни дополнительного инструментария портал не требует: удобство пользования обеспечивает встроенный редактор, а также ссылки на правильные ответы, если решение задачи все же поставило вас в тупик.

    Coding Bat

    Схожей стратегии придерживается и Coding Bat. Создатели ресурса также предпочли узкую направленность, сконцентрировавшись на упражнениях по Java и Python. Малое разнообразие упражнений с лихвой компенсирует количество и качество задач, а также удобство пользования. Разумеется, опять же, встроенный редактор и ответы. Кроме того, портал подойдет как для начинающих, так и опытных разработчиков.

    Code Abbey

    Успех любого обучения кроется в правильной мотивации, которая, без сомнения, присутствует в Code Abbey. Так, любой пользователь, решивший 125 задач, может получить соответствующий сертификат. Разумеется, бесплатно. Еще один плюс ресурса – возможность выполнения заданий на практически любом распространенном языке (от C до Julia).

    Top Coder

    Впрочем, даже такая мотивация не столь действенна, как денежное вознаграждение. Так на Top Coder вы сможете не только повысить свой уровень, но и подзаработать: по факту ресурс представляет из себя список соревнований, победитель которых получит пусть и не поражающую воображение, но приятную награду. Наиболее же успешные участники вдобавок имеют шансы "засветиться". Мастодонты индустрии вроде Microsoft, Facebook или IBM периодически мониторят портал в поисках новых талантов.

    Programmr

    На данном портале в свое время также можно было участвовать в соревнованиях. Однако к текущему моменту все они потеряли актуальность. Тем не менее, ресурс по-прежнему являет собой богатую площадку для развития навыков. В первую очередь – за счет многочисленных задач по Java, C++, PHP, C#, Ruby, Python и Objective-C. В каждой из них нужно дописать большую часть кода. Как правило, на выполнение задания отводится 30 минут.

    Programming Skills

    Тем же, кто устал от написания кодов и хочет привнести большего разнообразия в учебный процесс, подойдет портал Programming Skills. На нем можно найти серии тестов из 20 вопросов по C, HTML, C#, Java и другим языкам. На выполнение каждого дается 25 минут. Помимо них, на ресурсе содержится богатый перечень вопросов, с которыми вам, возможно, доведется столкнуться на собеседовании.

    SQL-EX.RU

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

    Единственный, но временами досаждающий минус – отсутствие альтернативных путей. Иными словами: правильность выполнения упражнения определяется не ответом, а методом решения. В результате порой возникают парадоксы, в которых фактически правильный ответ не засчитывается как верный.

    Тем, кто только начинает свой путь в кодинге, рекомендуем бесплатный курс по .

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

    Из этой статьи вы узнаете:

    Привет, привет! На связи Гридин Семён. Наконец — то, я добрался до основной тематики этого блога, программирование интеллектуальных систем с помощью языка Python. Я долго шёл к этому, готовился. И вот, я готов писать вам интересные статьи и изучать глубоко эту тему.

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

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

    Тогда начну свою повесть))...

    Возможности языка программирования Python

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

    Чем же может быть полезен Python?

    1. Работа с xml/html файлами
    2. Работа с http запросами
    3. GUI (графический интерфейс)
    4. Создание веб-сценариев
    5. Работа с FTP
    6. Работа с изображениями, аудио и видео файлами
    7. Робототехника (применение одноплатных компьютеров)
    8. Программирование математических и научных вычислений

    И тому подобное. Python способен выполнять львиную долю рутинных задач.

    На Питоне можно собрать и резервное копирование, и работу с электронными письмами, и простейший калькулятор, и скрипт для сайта. Язык ничем не ограничен. Что самое интересное, используется в таких IT-гигантах, как Google и Yandex.

    В этой статье мы рассмотрим с вами программирование Python с нуля.

    Для того чтобы у вас работала программа на определённом устройстве, неважно какая ОС — windows, linux, RaspbianOS, MacOS. Важно, чтобы у вас находился интерпретатор, который будет понимать команды и выполнять.

    Делаем следующим образом, скачиваем IDE python c официального источника .

    Знакомство с интерпретатором

    Итак интерпретатор обрабатывает текстовый код программы. Существует интерактивный режим среды разработки. Можно запустить несколькими способами:

    1. Из обычной командной строки сmd — введите команду python ;
    2. C рабочего стола (ярлык);
    3. С помощью меню Пуск — Python IDLE;

    Вам откроется это окошечко:

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

    Для Arduino тоже есть своя программная оболочка . Почитайте.

    С чего начать обучение python? Давайте попробуем написать первую программу?

    Создание первой программы

    Программа на языке Python — это обычный текстовый файл с написанным кодом. Расширение этого файла.py. Запустить программу можно, указав соответствующее имя в командной строке. Напишем с вами простейшую стандартную программу «Hello world!».

    Задача такая — вывести на экран "Hello world!". Запускаем NotePad.

    Пишем следующий код:

    Python

    print ("Hello world!!!")

    print ("Hello world!!!" )

    И сохраняем в папку соблюдая путь C:\MyScripts . Рекомендую все проекты скидывать в эту папку.

    Для того, чтобы нам запустить скрипт, выберите командную строку и введите путь к вашему файлу:

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

    Лучшая книга по python для начинающих по праву считается самоучитель Майка МакГрата. Исчерпывающее руководство по составлению кода на языке Питон.

    Извините за качество фото, по другому не получается. Остальные книги пока не рекомендую покупать, так как они на самом деле громоздкие и объёмные. Для базиса достаточно будет и МакГрата.

    Ребят, на этом у меня всё, если у вас есть какие-то вопросы, вы всегда можете мне написать. Подписывайтесь на новости блога. Рассылайте друзьям. Спасибо за внимание.

    С уважением, Гридин Семён

    • Цель 1 - помочь ссылками, материалами, тем, кто соберется изучать программирование и первым языком возьмет Python. Показать, что это не так сложно, как кажется.
    • Цель 2 - собрать в комментариях ссылки на полезные и интересные материалы по этой теме.

    0. А получится ли у меня?

    С самого начала я сомневался в том, что у меня получится сделать что-то большее чем Hello World. Мне казалось, что программирование это сверх сложно и сверх магия. К тому же есть работа, хобби, семья, что будет отвлекаться от полноценного изучения.

    Зря боялся и вам не советую. Программирование наверное никогда не станет моей основной профессией, но это отличный способ творческой реализации. Это шахматы и Civilization в одном флаконе.

    Все проще чем кажется и гораздо интереснее.

    1. Литература

    Марк Лутц “Программирование на Python” - его советуют читать на многих форумах и курсах. Мне он показался излишне подробным и нагруженным для новичка. Читать много, программировать мало. Гораздо полезнее его читать после овладевания Python минимума.

    Марк Саммерфилд “Программирование на Python 3” - динамично, с отличными примерами и заданиями. Без излишнего углубления, которое только все усложняет в начале. Я рекомендую начать именно с этой книги, она поможет быстро вникнуть, не пугая сложностями.

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

    2. Что читать в интернете

    http://pythonworld.ru/ - простым и понятным языком рассказывается об азах языка, часто использовал, как шпаргалку.

    Еще через два месяца я смог создать свое первое приложение на Django. Но главное, что теперь у меня достаточно знания для самостоятельного развития и обучения. Самое трудное - это добраться до этой точки.

    Еще через месяц я подключился к двум проектам на GitHub и принимаю в них участие. Задачи решаю конечно пока простые, но взамен получаю советы и обучение.

    Теги: обучение python, обучение программированию

    Подготовка к собеседованию на позицию Python-разработчика

    При подготовке использовались материалы: The Vital Guide to Python Interviewing , Must Have Python Interview Questions , 15 Essential Python Interview Questions , Python Interview Questions and Answers

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

    Работа со списками

    Лямбда-выражения, генераторы списков и выражения-генераторы

    Лямбда-выражения - сокращённый метод создания однолинейных анонимных функций. Их простота часто (но не всегда) делает код более стройным и читабельным, чем классическое объявление функций. С другой стороны, та же простота ограничивает возможности и зоны применения лямбда-выражений.

    Генераторы списков обеспечивают краткий синтаксис для создания списков. Они используются для составления списков, в которых каждый элемент - результат некоторой операции (операций) с элементами другой последовательности или итератором. Генераторы списков могут использоваться для создания подпоследовательности тех элементов, члены которых удовлетворяют определённому условию. Генераторы списков в Python - своеобразная альтернатива встроенным функциям map() и filter() .

    Лямбда-выражения с функциями map() и filter() и генераторы списков схожи, поэтому выбор одного из этих инструментов субъективен и зависит от случая. Но следует отметить, что генераторы списков выполняются несколько быстрее - вызов лямбда-функции создаёт новый стековый кадр .

    Выражения-генераторы синтаксически и функционально похожи на генераторы списков, но есть важные различия между их механизмами работы и областями применения. Итерация при наложении выражения-генератора или генератора списка будет делать всё то же самое, но генератор списков сначала создаст целый список в памяти, в то время как выражение-генератор будет создавать элементы на ходу по мере необходимости. Выражения-генераторы могут быть использованы в большом или даже бесконечном количестве последовательностей. А генерирование значений по требованию обеспечивает повышение производительности и снижение использования памяти. Однако следует отметить, что стандартные методы списков list в Python могут применяться на результатах выполнения генератора, но не на самом генераторе.

    В чём разница между списком и кортежем?

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

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

    Отладка кода и тестирование

    Какой подход вы используете для модульного тестирования в Python?

    Фундаментальный ответ на этот вопрос относится к использованию фреймворка Python - unittest .

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

    Вас могут попросить описать ключевые элементы структуры unittest, а именно:

    • испытательный стенд (test fixture);
    • тестовый случай (test case);
    • набор тестов (test suite);
    • исполнитель тестов (test runner).

    Итераторы

    Что такое итератор?

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

    В чём разница между итератором и генератором?

    Эти термины тесно связаны (любой генератор - это итератор), их довольно часто путают, что иногда приводит к недопониманию. Итератор - более общая концепция. Это объект, у которого определены два метода: __next__ и __iter__ . С другой стороны, генератор - это итератор. Но не наоборот. Генератор может получаться использованием ключевого слова yield в теле функции.

    Def squares(start, stop): for i in range(start, stop): yield i * i generator = squares(a, b)

    GIL

    Концепция GIL заключается в том, что в каждый момент времени только один поток может исполняться процессором. Это сделано для того, чтобы между потоками не было борьбы за отдельные переменные. Исполняемый поток получает доступ ко всему окружению. Такая особенность реализации потоков в Python значительно упрощает работу с потоками и дает определенную потокобезопасность (thread safety).

    Передача аргументов

    Как передаются неизменяемые объекты?

    Неизменяемые объекты передаются «по значению». Такие объекты, как целые числа и строки, передаются в виде ссылок на объекты, а не в виде копий объектов.

    Как передаются изменяемые объекты?

    Изменяемые объекты передаются «по указателю». Такие объекты, как списки и словари, также передаются в виде ссылок на объекты, что очень похоже на то, как в языке C передаются указатели на массивы – изменяемые объекты допускают возможность непосредственного изменения внутри функции так же, как и массивы в языке C.

    >>> def f(a): # Имени a присваивается переданный объект... a = 99 # Изменяется только локальная переменная... >>> b = 88 >>> f(b)# Первоначально имена a и b ссылаются на одно и то же число 88 >>> print(b) # Переменная b не изменилась 88

    В этом фрагменте в момент вызова функции f(b) переменной a присваивается объект 88 , но переменная a существует только внутри вызванной функции. Изменение переменной a внутри функции не оказывает влияния на окружение, откуда была вызвана функция, – просто в момент вызова создается совершенно новый объект a .

    Что будет выведено после второго вызова append() в коде ниже?

    >>> def append(list=): ... # добавление длины списка в список... list.append(len(list)) ... return list ... >>> append(["a","b"]) ["a", "b", 2] >>> >>> append() # вызов без аргумента использует значение list по умолчанию >>> >>> append() # Но что произойдёт при повторном вызове append без аргумента?

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

    >>> append() # при первом вызове без аргумента используется значение по умолчанию >>> append() # но затем... >>> append() # последовательные вызовы расширяют список по умолчанию >>> append() # и так продолжается...

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

    Есть альтернативная реализация метода append , которая решит проблему:

    >>> def append(list=None): ... if list is None: list = # Увеличивает длину списка... list.append(len(list)) return list ... >>> append() >>> append()

    Вопросы вне определённых категорий

    Как можно поменять местами значения двух переменных внутри строки в Python?

    Рассмотрим простой пример:

    >>> x = "X" >>> y = "Y"

    Во многих других языках программирования при замене значений X и Y требуется выполнить что-то вроде этого:

    >>> tmp = x >>> x = y >>> y = tmp >>> x, y ("Y", "X")

    Но в Python существует возможность сделать это с помощью одной строки кода следующим образом:

    >>> x,y = y,x >>> x,y ("Y", "X")

    Что будет выведено последним оператором ниже?

    >>> flist = >>> for i in range(3): ... flist.append(lambda: i) ... >>> # что будет выведено?

    В любом замыкании в Python переменные связываются по имени. Таким образом, в приведённой выше строке кода будет выведено следующее:

    >>> flist = >>> for i in range(3): ... flist.append(lambda i = i: i) ... >>>

    Для чего служит ключевое слово «self»?

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

    Class User: def __init__(self): self.name = "Ivan Ivanov" self.age = 16 user_obj = User() user_obj.name # self.name содержит "Ivan Ivanov" в качестве значения

    Для чего служит ключевое слово «yield»?

    Ключевое слово yield может обратить любую функцию в генератор. Оно работает подобно оператору return , с той разницей, что ключевое слово будет возвращать объект-генератор. Также функция может совершать несколько вызовов ключевого слова yield .

    Def testgen(index): weekdays = ["sun","mon","tue","wed","thu","fri","sat"] yield weekdays yield weekdays day = testgen(0) print next(day), next(day) #output: sun mon

    Что такое __init__.py? Как импортировать класс из другого каталога?

    Init__.py в основном используется для инициализации пакетов Python.

    Файл __init__.py в каталоге lstm_m указывает интерпретатору Python, что этот каталог должен обрабатываться как пакет Python.

    Как импортировать класс из другого каталога?

    Обычно __init__.py является пустым файлом. А если нам нужно использовать lstm.py в файле run.py , то его нужно импортировать следующим образом:

    From lstm_m import lstm

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

    Какие встроенные типы существуют в Python?

    Существуют изменяемые и неизменяемые встроенные типы Python.

    Изменяемые:

    • списки;
    • множества;
    • словари.

    Неизменяемые:

    • строки;
    • кортежи;
    • числа.

    Следует помнить, что выше перечислены только основные типы. На самом деле их больше шести.

    Что такое docstring в Python?

    Строка документации в Python (docstring) - способ документирования функций, модулей и классов. Стандарты оформления - на официальном сайте .

    Как можно конвертировать число в строку?

    Для преобразования числа в строку, как правило, используют встроенную функцию str() , хотя есть и другие способы, такие как "{0:d}".format(число) и "%d"%число. Если вы хотите преобразовать десятичное число в восьмеричное (oct - octal) или шестнадцатеричное (hex - hexadecimal), используйте встроенную функцию oct() или hex() соответственно.

    В чём разница между Xrange и range?

    Функция xrange() возвращает объект xrange , в то время как range() возвращает список и использует то же количество памяти, независимо от размера функции.

    Как увидеть методы или атрибуты объекта?

    Команда dir(x) возвращает отсортированный список имен атрибутов для любого переданного в нее объекта. Если ни один объект не указан, dir() возвращает имена в текущей области видимости.

    Дополнительно

    Если вы владеете английским языком, то рекомендуем пройти онлайн-тесты и проверить свои знания перед собеседованием.

    Подборки материалов для изучения Python от нас: , . Короткие , а также . Не забудьте порешать задачи: вот , где это можно сделать.

    Заключение

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