<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:yandex="http://news.yandex.ru" xmlns:media="http://search.yahoo.com/mrss/" xmlns:turbo="http://turbo.yandex.ru" version="2.0">
	<channel>
		<title>Языки программирования</title>
		<link>https://www.easyitway.com</link>
		<description>Видео и статьи категории "Языки программирования"</description>
		<language>ru</language>
		<item turbo="true">
			<title>Краткая история PHP</title>
			<link>https://www.easyitway.com/tpost/alm9ign5j1-kratkaya-istoriya-php</link>
			<amplink>https://www.easyitway.com/tpost/alm9ign5j1-kratkaya-istoriya-php?amp=true</amplink>
			<pubDate>Wed, 15 Nov 2023 00:00:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>PHP начал зарождаться осенью 1994 года. В то время программист Расмус Лердорф начал писать на языке Perl простенький движок, который подсчитывал количество посетителей сайта Расмуса.</description>
			<turbo:content>
<![CDATA[<header><h1>Краткая история PHP</h1></header><div class="t-redactor__text">PHP начал зарождаться осенью 1994 года. В то время программист Расмус Лердорф начал писать на языке Perl простенький движок, который подсчитывал количество посетителей сайта Расмуса. Этот движок назвали в честь Расмуса — PHPT, а в 1997 году было дано более короткое название PHP (Hypertext Preprocessor). Расмус при разработке стал делать упор на популярный язык С. Также в те времена были добавлены популярные базы данных, что сделало PHP ещё более популярным и универсальным.</div><div class="t-redactor__text">PHP известен, как серверный язык программирования. Это означает, что он работает на веб сервере. За долгие годы своего существования язык PHP зарекомендовал себя как великолепное решение для создания динамических веб-сайтов. Теперь перейдем к истории развития PHP:</div><h3  class="t-redactor__h3">PHP3</h3><div class="t-redactor__text">PHP 3.0 была первой версией, напоминающей PHP, каким мы знаем его сегодня. В 1997 году Энди Гутманс (Andi Gutmans) и Зив Сураски (Zeev Suraski) переписали код с начала. Одной из сильнейших сторон PHP 3.0 была возможность расширения ядра. В последствии интерфейс написания расширений привлек к PHP множество сторонних разработчиков, работающих над своими модулями, что дало PHP возможность работать с огромным количеством баз данных, протоколов, поддерживать большое число API. Фактически, это и был главный ключ к успеху, но стоит добавить, что немаловажным шагом оказалась разработка нового, намного более мощного и полного синтаксиса с поддержкой ООП. PHP 3.0 был официально выпущен в июне 1998 года после 9 месяцев публичного тестирования.</div><h3  class="t-redactor__h3">PHP4</h3><div class="t-redactor__text">К зиме 1998 года, практически сразу после официального выхода PHP 3.0, Энди Гутманс и Зив Сураски начали переработку ядра PHP. В задачи входило увеличение производительности сложных приложений и улучшение модульности базиса кода PHP. Расширения дали PHP 3.0 возможность успешно работать с набором баз данных и поддерживать большое количество различных API и протоколов, но PHP 3.0 не имел качественной поддержки модулей и приложения работали не эффективно.</div><div class="t-redactor__text">В дополнение к улучшению производительности, PHP 4.0 имел несколько ключевых нововведений, таких как поддержка сессий, буферизация вывода, более безопасные способы обработки вводимой пользователем информации и несколько новых языковых конструкций.</div><h3  class="t-redactor__h3">PHP5</h3><div class="t-redactor__text">В PHP5 объектная модель была значительно переработана. При этом было добавлено много новых возможностей, благодаря которым PHP5 получил некоторые черты таких объектно-ориентированных языков, как C++ и Java. Изменения коснулись производительности встроенных стандартных функций PHP. По некоторым оценкам, скорость работы стандартных функций в PHP5 увеличилась на 40% и более. Поддержка XML в версии PHP5 стала полной, поддерживаются новые расширения DOM и XML.</div><h3  class="t-redactor__h3">PHP7</h3><div class="t-redactor__text">Разработчики PHP решили пропустить цифру «6» поэтому новая версия называется PHP7. В PHP 7 расширили ранее существовавшее объявление параметров в методах (классах, интерфейсах и массивах) путем добавления четырех скалярных типов — целого (int), с плавающей запятой (float), логического (bool) и строкового (string) в качестве возможного типа параметра. Кроме того, опционально мы можем указать тип результата, возвращаемого функцией или методом. Поддерживаются типы bool, int, float, string, array, callable, имя класса или интерфейса и parent (для методов класса).</div><div class="t-redactor__text">На данный момент самая новая версия PHP под номером 8.1. Но разработчики не стоят на месте и может в ближайшем будущем вы увидем новую версию PHP.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Введение в .NET Framework</title>
			<link>https://www.easyitway.com/tpost/vtc0rvpms1-vvedenie-v-net-framework</link>
			<amplink>https://www.easyitway.com/tpost/vtc0rvpms1-vvedenie-v-net-framework?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 14:11:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Платформа .NET Framework — это технология, поддерживающая создание и выполнение нового поколения приложений и веб-служб. </description>
			<turbo:content>
<![CDATA[<header><h1>Введение в .NET Framework</h1></header><div class="t-redactor__text">Приветствую тебя друг! Я очень благодарен тебе за посещение моего сайта. Ты попал на первую статью самоучителя по языку C#. Если тебя заинтересовал данный язык, тогда ты на правильном сайте и сегодня ты можешь начать его изучать. Уроки будут появляться со временем и для начала давай изучим что такое .NET Framework и почему я начинаю именно с него.</div><div class="t-redactor__text">Платформа .NET Framework — это технология, поддерживающая создание и выполнение нового поколения приложений и веб-служб. Считается, что платформа .NET Framework явилась ответом компании <a href="https://www.microsoft.com/ru-ru" target="_blank" rel="noreferrer noopener">Microsoft</a> на набравшую к тому времени большую популярность платформу Java компании Sun Microsystems (ныне принадлежит <a href="https://www.oracle.com/ru/index.html" target="_blank" rel="noreferrer noopener">Oracle</a>). Язык программирования C# был разработан компанией Microsoft чтобы создавать приложения для операционной системы Windows с помощью технологии .NET Framework.</div><div class="t-redactor__text">Платформа .NET Framework состоит из общеязыковой среды выполнения (среды CLR или Common Language Runtime) и библиотеки классов .NET Framework. Основа платформы — это среда CLR. Её можно считать агентом, управляющим кодом во время выполнения и предоставляющим основные службы, такие как управление памятью, потоками и удаленное взаимодействие.</div><div class="t-redactor__text">При разработке платформы .NET Framework учитывались цели:</div><div class="t-redactor__text"><ul><li>Обеспечение среды выполнения кода. Минимизация конфликтов при развертывании программного обеспечения и управлениями версиями;</li><li>Обеспечение объектно-ориентированной среды программирования для локального сохранения и выполнения объектного кода;</li><li>Разработка взаимодействия на основе промышленных стандартов, что позволяет интегрировать код платформы .NET Framework с любым другим кодом;</li><li>Обеспечение среды выполнения кода, которая бы исключала проблемы с производительностью сред выполнения сценариев или интерпретируемого кода;</li><li>Предоставление единиц принципов разработки для разных типов приложения, таких как приложения Windows и веб-приложения;</li><li>Предоставление среды выполнения кода, гарантирующей безопасное выполнение кода, включая код, созданный неизвестным или не полностью доверенным сторонним разработчиком.</li></ul></div><div class="t-redactor__text">Одной из основных идей Microsoft .NET является совместимость программных частей, написанных на разных языках. Например, служба, написанная на C++ для Microsoft .NET, может обратиться к методу класса из библиотеки, написанной на Delphi; на C# можно написать класс, наследованный от класса, написанного на Visual Basic .NET, а исключение, созданное методом, написанным на C#, может быть перехвачено и обработано в Delphi.</div><div class="t-redactor__text">Каждая библиотека (сборка) в .NET имеет сведения о своей версии, что позволяет устранить возможные конфликты между разными версиями сборок.</div><h4  class="t-redactor__h4">История .NET</h4><div class="t-redactor__text">Разработка платформы началась в 1999 году. Первая бета-версия .NET Framework SDK Beta 1 была опубликована на сайте Microsoft 12 ноября 2000 года, однако она была настолько «сырой», что Microsoft рекомендовала её устанавливать только на компьютеры, предназначенные для тестирования. Первая версия .NET появилась лишь два года спустя — 1 мая 2002 года.</div><div class="t-redactor__text">На момент написания этой статьи последняя версия платформы имеет номер — 4.7.1 и поставляется вместе с <a href="https://visualstudio.microsoft.com/ru/downloads/?rr=https%3A%2F%2Fwww.google.ru%2F" target="_blank" rel="noreferrer noopener">Visual Studio 2017</a>.</div><h4  class="t-redactor__h4">Основные функции .NET</h4><div class="t-redactor__text">Кратко про платформу .NET Framework я рассказал, но а теперь давайте узнаем какие же у неё основные функции:</div><div class="t-redactor__text"><ul><li>Богатая функциональность. Платформа содержит сотни классов, которые предоставляют функциональность, готовую к использованию в ваших приложениях;</li><li>Простая разработка веб-приложений. ASP.NET — это технология, доступная на платформе .NET для разработки динамических веб-приложений;</li><li>Поддержка ООП. Платформа .NET предоставляет полностью объектно-ориентированное окружение;</li><li>Поддержка многоязычности. Платформа .NET позволяет человеку писать на том языке, к которому он привык;</li><li>Автоматическое управление памятью;</li><li>Совместимость с COM и COM+;</li><li>Поддержка XML. Платформа .NET предоставляет XML веб-сервисы, которые основаны на стандартах HTTP, XML и SOPA;</li><li>Простое развертывание и настройка;</li><li>Улучшенная безопасность платформы .NET.</li></ul></div><div class="t-redactor__text"><strong>COM</strong> (Component Object Model — модель компонентного объекта) — это технологический стандарт от компании Microsoft, предназначенный для создания программного обеспечения на основе взаимодействующих компонентов объекта, каждый из которых может использоваться во многих программах одновременно. Стандарт воплощает в себе идеи полиморфизма и инкапсуляции объектно-ориентированного программирования.</div><div class="t-redactor__text"><strong>COM+</strong> — это совокупность программных средств, обеспечивающих разработку, распространение и функционирование распределенных приложений для сетей Интернет.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Основные компоненты в .NET Framework</title>
			<link>https://www.easyitway.com/tpost/uhc0toj5r1-osnovnie-komponenti-v-net-framework</link>
			<amplink>https://www.easyitway.com/tpost/uhc0toj5r1-osnovnie-komponenti-v-net-framework?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 14:13:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>В .NET Framework есть три основных компонента: CLR, CTS и CLS. В этой статье рассмотри их подробнее.</description>
			<turbo:content>
<![CDATA[<header><h1>Основные компоненты в .NET Framework</h1></header><div class="t-redactor__text">В .NET Framework есть три основных компонента: CLR, CTS и CLS. В этой статье рассмотри их подробнее.</div><h4  class="t-redactor__h4">CLR</h4><div class="t-redactor__text">Основная задача CLR — автоматическое обнаружение, загрузка и управление типами .NET. В данном случае типами управляет .NET, а не программист. Также среда CLR заботится о ряде низкоуровневых деталей — управление памятью, обработка потоков, выполнение разных проверок, связанных с безопасностью.</div><h4  class="t-redactor__h4">CTS</h4><div class="t-redactor__text">Общая система типов (Common Type System) или система CTS предоставляет полное описание всех возможных типов данных и программных конструкций, которые поддерживаются исполняющей средой, а также способов, как все эти сущности могут взаимодействовать друг с другом. Нужно помнить, что любая возможность CTS может не поддерживаться в отдельно взятом языке, совместимом с .NET Framework.</div><div class="t-redactor__text">CTS представляет собой формальную спецификацию, в которой описано то, как должны быть определены типы для того, чтобы они могли обслуживаться в CLR-среде. Существует пять типов CTS. Рассмотрим их подробнее:</div><h4  class="t-redactor__h4">Типы классов</h4><div class="t-redactor__text">В каждом совместимом с .NET языке поддерживается, как минимум, понятие типа класса (class type), которое играет центральную роль в объектно-ориентированном программировании. В C#, как и в других языках программирования, для объявления класса используется ключевое слово class:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Car
{
  public int Run()
  { return 1; }
}</code></pre><h4  class="t-redactor__h4">Типы интерфейсов</h4><div class="t-redactor__text">Интерфейсы представляют собой именованную коллекцию определений абстрактных членов, которые могут поддерживаться в данном классе или структуре. Пример определения интерфейса в C#:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">public interface IDrive
{
  void Press();
}</code></pre><h4  class="t-redactor__h4">Типы структур</h4><div class="t-redactor__text">Структура — это тип значения, неявно производный от типа System.ValueType, который, в свою очередь, является производным от типа System.Object.</div><div class="t-redactor__text">Структуры весьма полезны для представления значений с небольшими требованиями к памяти и для передачи параметров по значению в методы со строгой типизацией параметров. В .NET все типы-примитивы (Boolean, Byte, Char, DateTime, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32 и UInt64) определяются как структуры.</div><h4  class="t-redactor__h4">Типы перечислений</h4><div class="t-redactor__text">Перечисления (enumeration) — удобная программная конструкция, позволяющая сгруппировать данные в пары «имя-значение». Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">public enum eNums
{
 A =1,
 B =2,
 C = 3
}</code></pre><h4  class="t-redactor__h4">Типы делегатов</h4><div class="t-redactor__text">Делегаты (delegate) — являются .NET-эквивалентом безопасных в отношении типов указателей функций в стиле <a href="https://it-black.ru/category/rubriki/samouchitel-po-yazyku-si/" target="_blank" rel="noreferrer noopener">С</a>. Основное отличие заключается в том, что делегат в .NET представляет собой класс, который наследуется от System.MulticastDelegate, а не просто указатель на какой-то конкретный адрес в памяти. Пример объявления делегата:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">public delegate int AddOp(int x, int y);</code></pre><div class="t-redactor__text">Делегаты удобно использовать, когда нужно обеспечивать одну сущность возможностью перенаправлять вызов другой сущности и образовывать основу для архитектуры обработки событий .NET Framework.</div><h4  class="t-redactor__h4">CLS</h4><div class="t-redactor__text">Третий компонент (Common Language Specification) или спецификация CLS. В ней описано лишь то подмножество общих типов и программных конструкций, каковое способны воспринимать все .NET языки.</div><div class="t-redactor__text">CLS можно считать просто подмножеством всех функциональных возможностей, определенных в CTS. CLS является набором правил, которые должны придерживаться создатели компиляторов, если они хотят чтобы их продукты могли без особых проблем функционировать в мире .NET Framework.</div><div class="t-redactor__text">Кроме среды CLR и спецификаций CTS и CLS, в составе платформы .NET существует библиотека базовых классов. В этой библиотеке содержатся определения примитивов (потоки, файловые I/O, системы графической визуализации, механизмы для взаимодействия с разными внешними устройствами), предоставляет поддержку ряда служб, которые нужны в большинстве реальных приложений.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>История языка C#</title>
			<link>https://www.easyitway.com/tpost/mtociia401-istoriya-yazika-c</link>
			<amplink>https://www.easyitway.com/tpost/mtociia401-istoriya-yazika-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 14:15:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>C# (произносится си-шарп) — язык программирования, сочетающий объектно-ориентированные и контекстно-ориентированные концепции.</description>
			<turbo:content>
<![CDATA[<header><h1>История языка C#</h1></header><div class="t-redactor__text">C# (произносится си-шарп) — язык программирования, сочетающий объектно-ориентированные и контекстно-ориентированные концепции. Разработан в 1998—2001 годах группой инженеров под руководством Андерсa Хейлсбергa в компании Microsoft как основной язык разработки приложений для платформы Microsoft .NET.</div><div class="t-redactor__text">Сторонники C# называют его самым мультипарадигменным, универсальным, продвинутым и удобным в использовании языком программирования.</div><div class="t-redactor__text">C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет строгую статическую типизацию, поддерживает полиморфизм, перегрузку операторов, указатели на функции-члены классов, атрибуты, события, свойства, исключения, комментарии в формате XML.</div><div class="t-redactor__text">Переняв многое от своих предшественников — языков C++, Delphi, Modula и Smalltalk — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем: так, C# не поддерживает множественное наследование классов (в отличие от C++) или вывода типов (в отличие от Haskell).</div><h4  class="t-redactor__h4">Особенности С#</h4><div class="t-redactor__text"><ul><li>Возможность использования С# для написания динамических web-страниц ASP.NET;</li><li>Поддержка свойств и событий в стиле VB;</li><li>Полная поддержка классов и объектно-ориентированного программирования, включая наследование интерфейсов и реализаций, виртуальных функций и перегрузки операторов;</li><li>Полный и хорошо определенный набор основных типов;</li><li>Встроенная поддержка автоматической генерации XML-документации;</li><li>Автоматическое освобождение динамически распределенной памяти;</li><li>Возможность отметки классов и методов атрибутами, определяемыми пользователем;</li><li>Полный доступ к библиотеке базовых классов .NET, а также легкий доступ к Windows API;</li><li>Указатели и прямой доступ к памяти, если они необходимы. Однако язык разработан таким образом, что практически во всех случаях можно обойтись и без этого;</li><li>Простое изменение ключей компиляции. Позволяет получать исполняемые файлы или библиотеки компонентов .NET, которые могут быть вызваны другим кодом так же, как элементы управления ActiveX (компоненты СОМ).</li></ul></div><h4  class="t-redactor__h4">Пространство имен</h4><div class="t-redactor__text">Пространство имён (англ. namespace) — некоторое множество, под которым подразумевается модель, абстрактное хранилище или окружение, созданное для логической группировки уникальных идентификаторов (то есть имён).</div><div class="t-redactor__text">Пространство имен — это не более чем группа типов данных, но дающая тот эффект, что имена всех типов данных в пределах пространства имен автоматически снабжаются префиксом — названием пространства имен. Пространства имен можно вкладывать друг в друга.</div><div class="t-redactor__text">Основное пространство имен, с которого нужно начинать знакомство с пространствами называется System. В нем содержится набор ключевых типов, с которыми любой разработчик .NET будет использовать. Создание функционального приложения на C# невозможно без добавления ссылки хотя бы на пространство имен System, поскольку все основные типы данных (System.Int32, System.BooleanBoolean) определены именно в нём.</div><div class="t-redactor__text">Для подключения пространства имен в C# используется ключевое слово using, например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.Drawing;
using System.Windows.Forms;</code></pre><img src="https://static.tildacdn.com/tild6665-3866-4666-b436-353739303934/2023-11-21_14-17.png"><img src="https://static.tildacdn.com/tild3161-3036-4232-b061-343534663965/2023-11-21_14-17_1.png"><img src="https://static.tildacdn.com/tild3631-3235-4830-b866-306163333864/2023-11-21_14-18.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Развертывание .NET и первая программа</title>
			<link>https://www.easyitway.com/tpost/72hpjnzln1-razvertivanie-net-i-pervaya-programma</link>
			<amplink>https://www.easyitway.com/tpost/72hpjnzln1-razvertivanie-net-i-pervaya-programma?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 14:19:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Это бесплатная полнофункциональная интегрированная среда разработки для учащихся, разработчиков открытого ПО и отдельных разработчиков. Скачать с официального сайта Microsoft и установить данную программу не занимает большого труда.</description>
			<turbo:content>
<![CDATA[<header><h1>Развертывание .NET и первая программа</h1></header><div class="t-redactor__text">Чтобы начать разрабатывать программы на языке C# надо установить на свой компьютер среду <a href="https://visualstudio.microsoft.com/ru/downloads/" target="_blank" rel="noreferrer noopener">Visual Studio Community</a>.<br /><br />Это бесплатная полнофункциональная интегрированная среда разработки для учащихся, разработчиков открытого ПО и отдельных разработчиков. Скачать с официального сайта Microsoft и установить данную программу не занимает большого труда.<br /><br />Скачайте дистрибутив программы. Запустите и после небольшой загрузки откроется окно установки. Для начальной работы вы можете выбрать «Разработка классических приложений .NET».<br /><br />Это минимум для написания программ на языке C#. Остальное на ваш выбор. Установка может занимать от десятков минут до пары часов. Все зависит от вашего персонального компьютера.</div><img src="https://static.tildacdn.com/tild3862-3034-4562-a436-633438376664/vs_1-1024x316.jpg"><div class="t-redactor__text">При первом запуске среда предложит вам подключиться к сервисам для разработчиков — вы можете получить собственный Git-репозитарий (систем управления версиями), синхронизировать свои настройки и другие возможности.</div><div class="t-redactor__text">Зарегистрироваться можно в любое время. Затем система предложит выбрать тему и запустит среду.</div><h4  class="t-redactor__h4">Первая программа</h4><div class="t-redactor__text">Приступим к созданию нашей первой программы на языке C#. Для создания нового проекта выберите команду меню «Файл-Создать-Проект…».</div><div class="t-redactor__text">В окне «Создание проекта» выберите тип приложения. Конечно, чтобы создать обычные приложения с графическим интерфейсом выбирают «Windows Forms Application».</div><div class="t-redactor__text">Для первого приложения выберите «Консольное приложение (.NET Framework)». Придумайте ему имя (обязательно на латинице) и выберите папку для установки файлов приложения. Жмите «ОК».</div><div class="t-redactor__text">Среда подготовит основной код для нашего консольного приложения.</div><img src="https://static.tildacdn.com/tild3539-6266-4830-b366-346366306434/vs_2-1024x711.jpg"><img src="https://static.tildacdn.com/tild3162-6239-4330-b561-373238666637/vs_3-1024x587.jpg"><div class="t-redactor__text">Измените код так, как показано в листинге. Не изменяя традициям программирования, я добавил в код строчку для вывода сообщения «Hello, world!» и еще одну строчку для того, чтобы консоль не закрывалась после компиляции проекта (пока не закроете самостоятельно).</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(&quot;Hello, world!&quot;);
            Console.ReadKey();
        }
    }
}</code></pre><div class="t-redactor__text">Для запуска проекта нужно нажать кнопку «Пуск» на панели инструментов или F5. Результат выполнения программы:</div><img src="https://static.tildacdn.com/tild6536-6135-4231-b530-363035666638/vs_4-1024x251.jpg"><div class="t-redactor__text">Как вы уже заметили наше небольшое приложение выводит в консоль наше приветствие и если у вас все получилось, тогда я Вас поздравляю с созданием вашей первой программы.<br /><br />Теперь вы можете дальше изучать язык C# и .NET Framework, чтобы создавать более сложные и интересные приложения. Если будут вопросы пишите в комментариях.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Переменные в C#</title>
			<link>https://www.easyitway.com/tpost/6otc0a9j51-peremennie-v-c</link>
			<amplink>https://www.easyitway.com/tpost/6otc0a9j51-peremennie-v-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 14:22:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Для хранения данных в программе применяются переменные. Переменная представляет именованную область памяти, в которой хранится значение определенного типа.</description>
			<turbo:content>
<![CDATA[<header><h1>Переменные в C#</h1></header><div class="t-redactor__text">Для хранения данных в программе применяются переменные. Переменная представляет именованную область памяти, в которой хранится значение определенного типа. Переменная имеет тип, имя и значение. Тип определяет, какого рода информацию может хранить переменная.</div><div class="t-redactor__text">Подробнее про переменные вы можете прочитать в моей прошлой статье для рубрики «<a href="https://it-black.ru/category/rubriki/osnovy-programmirovaniya/" target="_blank" rel="noreferrer noopener">Основы программирования</a>«.</div><h4  class="t-redactor__h4">Объявление переменных</h4><div class="t-redactor__text">Объявление переменной осуществляется так же, как и в С: сначала нужно указать тип переменной, а затем её имя:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int x;</code></pre><div class="t-redactor__text">После объявления переменной её нужно инициализировать (присвоить значение) — до первого использования:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">x = 0;</code></pre><div class="t-redactor__text">В случае использования локальной переменной до присвоения ей начального значения компилятор сообщит об ошибке. Инициализировать переменную можно при объявлении:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int x = 0;</code></pre><div class="t-redactor__text">При желании можно в одной строке объявить и инициализировать сразу несколько переменных:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int x = 1; y = 0;
int a, b, c;</code></pre><div class="t-redactor__text">В качестве имени переменной может выступать любое произвольное название, которое удовлетворяет следующим требованиям:<br /><br /><ul><li>имя должно содержать не более 255 символов;</li><li>имя может содержать любые цифры, буквы и символ подчеркивания, при этом первый символ в имени должен быть буквой или символом подчеркивания;</li><li>в имени не должно быть знаков пунктуации и пробелов;</li><li>имя не может быть ключевым словом языка C#. Таких слов не так много, и при работе в Visual Studio среда разработки подсвечивает ключевые слова синим цветом.</li></ul><br />Отличительной чертой переменных является то, что в программе можно многократно менять их значение. Например, создадим небольшую программу, в которой определим переменную, поменяем её значение и выведем его на консоль. В примере используется тип <strong>string</strong>. то есть переменная представляет строку.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;

namespace Hello_Proga
{
    class Program
    {
        static void Main(string[] args)
        {
            string name = &quot;Max&quot;;  // определяем переменную и инициализируем её
 
            Console.WriteLine(name);    // Max
 
            name = &quot;Tommy&quot;;       // меняем значение переменной
            Console.WriteLine(name);    // Tommy
 
            Console.Read();
        }
    }
}</code></pre><div class="t-redactor__text">Для закрепления материала рекомендую самостоятельно потренироваться в объявлении переменных на Visual Studio.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Области видимости переменных в C#</title>
			<link>https://www.easyitway.com/tpost/3drbr2acr1-oblasti-vidimosti-peremennih-v-c</link>
			<amplink>https://www.easyitway.com/tpost/3drbr2acr1-oblasti-vidimosti-peremennih-v-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 14:24:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Область видимости переменной (её ещё называют контекстом переменной) — это фрагмент кода, в пределах которого будет доступна данная переменная.</description>
			<turbo:content>
<![CDATA[<header><h1>Области видимости переменных в C#</h1></header><div class="t-redactor__text">Область видимости переменной (её ещё называют контекстом переменной) — это фрагмент кода, в пределах которого будет доступна данная переменная. Область видимости в C# определяются следующими правилами:<br /><br /><ul><li>Поле или переменная — член класса находится в области видимости до тех пор, пока в этой области находится содержащий это поле класс;</li><li>Локальная переменная находится в области видимости до тех пор, пока закрывающая фигурная скобка не укажет конец блока операторов или метода, в котором она объявлена;</li><li>Локальная переменная, объявленная в операторах цикла for, while или подобных им, видима в пределах тела цикла.</li></ul><br />Рассмотрим несколько примеров:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">for (int i = 0; i &lt; 6; i++)
{
  Console.Write(&quot; {0}&quot;, i);
}       // здесь заканчивается область видимости i
int k = 6 * i;  // оператор не будет выполнен</code></pre><div class="t-redactor__text">После закрывающей скобки цикла for переменная i больше не будет "видна", следовательно, последний оператор не будет выполнен. Рассмотрим еще один пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">public static int Main()
{
int n = 15;
for (int i = 0; i &lt; 5; i++)
{
int n = 10;  // ошибка
Console.WriteLine(n + i);
}
return 0;
}</code></pre><div class="t-redactor__text">Переменная n, определённая перед началом цикла for, будет находиться в области видимости до тех пор, пока не завершится метод Main(). Вторая переменная n якобы объявлена в контексте цикла, но он является вложенным в контекст метода Main(), поэтому компилятор не может различить эти две переменные и не допустит объявления второй переменной с именем n.<br /><br />В некоторых случаях два идентификатора с одинаковыми именами и одинаковой областью видимости можно различить, при этом компилятор допустит объявление второй переменной.<br /><br />Язык C# делает различие между переменными, объявленными на уровне поля и переменными, объявленные в методах (локальными переменными). В качестве примера рассмотрим следующий код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
namespace ConsoleApplication
{
  class Program
   {
     static string name = &quot;Max&quot;;

     public static void Main()
     {
      string name = &quot;Bob&quot;;
      Console.WriteLine(name);
      return;
     }
   }
}</code></pre><div class="t-redactor__text">Когда вы запустите этот код, вы увидите строку "Bob". Приоритет у локальных переменных выше, чем у членов класса.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Константы в C#</title>
			<link>https://www.easyitway.com/tpost/m7eomzco91-konstanti-v-c</link>
			<amplink>https://www.easyitway.com/tpost/m7eomzco91-konstanti-v-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 14:26:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Константы — это переменные, значение которых нельзя изменить во время выполнения программы. Константа объявляется с помощью служебного слова const, после которого следует тип константы:</description>
			<turbo:content>
<![CDATA[<header><h1>Константы в C#</h1></header><div class="t-redactor__text"><strong>Константы</strong> — это переменные, значение которых нельзя изменить во время выполнения программы. Константа объявляется с помощью служебного слова <strong>const</strong>, после которого следует тип константы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">const int j = 130;</code></pre><div class="t-redactor__text">Основные характеристики констант:<br /><br /><ul><li>Они должны инициализироваться при объявлении, и однажды присвоенные им значения никогда не могут быть изменены;</li><li>Значение константы должно быть вычислено во время компиляции. Таким образом, инициализировать константу значением, взятым из другой переменной, нельзя. Если все-таки нужно это сделать, используйте поля только для чтения;</li><li>Константы всегда являются неявно статическими. Однако вы не должны (и фактически не можете) включать модификатор static в объявление константы.</li></ul><br />Преимущества констант в программах:<br /><br /><ul><li>Константы облегчают чтение программ, заменяя «магические» числа и строки читаемыми именами, назначение которых легко понять.</li><li>Константы облегчают модификацию программ.</li><li>Константы позволяют избежать ошибок в программах. Если попытаться присвоить новое значение константе где-то в другом месте программы, а не там, где она объявлена, компилятор выдаст сообщение об ошибке.</li></ul></div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Типы данных в C#</title>
			<link>https://www.easyitway.com/tpost/kes3esv4f1-tipi-dannih-v-c</link>
			<amplink>https://www.easyitway.com/tpost/kes3esv4f1-tipi-dannih-v-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 14:27:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>В C# есть своя система типов данных, которая используется для создания переменных.</description>
			<turbo:content>
<![CDATA[<header><h1>Типы данных в C#</h1></header><div class="t-redactor__text">В C# есть своя система типов данных, которая используется для создания переменных. Тип данных определяет внутреннее представление данных, множество значений, которые может принимать объект, а также допустимые действия, которые можно применять над объектом.</div><div class="t-redactor__text">В этой статье вы можете познакомиться с примитивными типами данных в C#:</div><h4  class="t-redactor__h4">bool</h4><div class="t-redactor__text">Bool хранит значение <strong>true</strong> или <strong>false</strong> (логические литералы). Представлен системным типом System.Boolean.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">bool alivel = true;
bool Deads = false;</code></pre><h4  class="t-redactor__h4">byte</h4><div class="t-redactor__text">Byte хранит целое число от 0 до 255 и занимает 1 байт. Представлен системным типом System.Byte.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">byte bit1 = 1;
byte bit2 = 102;</code></pre><h4  class="t-redactor__h4">sbyte</h4><div class="t-redactor__text">Sbyte хранит целое число от -128 до 127 и занимает 1 байт. Представлен системным типом System.SByte.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">sbyte bit1 = -101;
sbyte bit2 = 102;</code></pre><h4  class="t-redactor__h4">short</h4><div class="t-redactor__text">Short хранит целое число от -32768 до 32767 и занимает 2 байта. Представлен системным типом System.Int16.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">short n1 = 1;
short n2 = 105;</code></pre><h4  class="t-redactor__h4">ushort</h4><div class="t-redactor__text">Ushort хранит целое число от 0 до 65535 и занимает 2 байта. Представлен системным типом System.UInt16.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ushort n1 = 1;
ushort n2 = 105;</code></pre><h4  class="t-redactor__h4">int</h4><div class="t-redactor__text">int хранит целое число от -2147483648 до 2147483647 и занимает 4 байта. Представлен системным типом System.Int32. Все целочисленные литералы по умолчанию представляют значения типа int:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int a = 20;
int b = 0b101;  // бинарная форма b = 5
int c = 0xFF;   // шестнадцатеричная форма c = 255</code></pre><h4  class="t-redactor__h4">uint</h4><div class="t-redactor__text">uint хранит целое число от 0 до 4294967295 и занимает 4 байта. Представлен системным типом System.UInt32.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">uint a = 20;
uint b = 0b101;
uint c = 0xFF;</code></pre><h4  class="t-redactor__h4">long</h4><div class="t-redactor__text">long хранит целое число от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 и занимает 8 байт. Представлен системным типом System.Int64.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">long a = -25;
long b = 0b101;
long c = 0xFF;</code></pre><h4  class="t-redactor__h4">ulong</h4><div class="t-redactor__text">ulong хранит целое число от 0 до 18 446 744 073 709 551 615 и занимает 8 байт. Представлен системным типом System.UInt64.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ulong a = 20;
ulong b = 0b101;
ulong c = 0xFF;</code></pre><h4  class="t-redactor__h4">float</h4><div class="t-redactor__text">float хранит число с плавающей точкой от -3.4*1038 до 3.4*1038 и занимает 4 байта. Представлен системным типом System.Single.</div><div class="t-redactor__text">По умолчанию фактический численный литерал в правой части оператора назначения обрабатывается как тип double. Следовательно, для инициализации переменной типа с плавающей точкой нужно использовать суффикс f или F:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">float x = 4.5F;</code></pre><h4  class="t-redactor__h4">double</h4><div class="t-redactor__text">double хранит число с плавающей точкой от ±5.0*10-324 до ±1.7*10308 и занимает 8 байтов. Представлен системным типом System.Double. Если необходимо, чтобы целое число обрабатывалось как тип double, следует использовать суффикс d или D:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">double x = 4D;</code></pre><h4  class="t-redactor__h4">decimal</h4><div class="t-redactor__text">decimal хранит десятичное дробное число. Если употребляется без десятичной запятой, имеет значение от 0 до +/–79 228 162 514 264 337 593 543 950 335; если с запятой, то от 0 до +/–7,9228162514264337593543950335 с 28 разрядами после запятой и занимает 16 байт.</div><div class="t-redactor__text">Представлен системным типом System.Decimal. Если требуется, чтобы числовой действительный литерал рассматривался как decimal, следует использовать суффикс m или M:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">decimal myMoney = 300.5m;</code></pre><h4  class="t-redactor__h4">char</h4><div class="t-redactor__text">Char хранит одиночный символ в кодировке Unicode и занимает 2 байта. Представлен системным типом System.Char. Этому типу соответствуют символьные литералы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">char a = &#039;A&#039;;
char b = &#039;\x5A&#039;;
char c = &#039;\u0420&#039;;</code></pre><h4  class="t-redactor__h4">string</h4><div class="t-redactor__text">String хранит набор символов Unicode. Представлен системным типом System.String. Этому типу соответствуют символьные литералы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">string hello = &quot;Hello&quot;;
string word = &quot;Max&quot;;</code></pre><h4  class="t-redactor__h4">object</h4><div class="t-redactor__text">Object может хранить значение любого типа данных и занимает 4 байта на 32-разрядной платформе и 8 байт на 64-разрядной платформе. Представлен системным типом System.Object, который является базовым для всех других типов и классов .NET.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">object a = 22;
object b = 3.14;
object c = &quot;hello code&quot;;</code></pre><div class="t-redactor__text">Для примера, определим несколько переменных разных типов и выведем их значения на консоль:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
 
namespace HelloWorldApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string name = &quot;Max&quot;;
            int age = 18;
            bool Employed = false;
            double weight = 94.69;
             
            Console.WriteLine($&quot;Имя: {name}&quot;);
            Console.WriteLine($&quot;Возраст: {age}&quot;);
            Console.WriteLine($&quot;Вес: {weight}&quot;);
            Console.WriteLine($&quot;Работает: {Employed}&quot;);
        }
    }
}</code></pre><div class="t-redactor__text">Для вывода данных на консоль здесь применяется интерполяция: перед строкой ставится знак $ и после этого можно вводить в строку в фигурных скобках значения переменных.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Преобразование типов данных в C#</title>
			<link>https://www.easyitway.com/tpost/a8kblhxn81-preobrazovanie-tipov-dannih-v-c</link>
			<amplink>https://www.easyitway.com/tpost/a8kblhxn81-preobrazovanie-tipov-dannih-v-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 14:31:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<turbo:content>
<![CDATA[<header><h1>Преобразование типов данных в C#</h1></header><div class="t-redactor__text">В языке C# допускается преобразование <a href="https://it-black.ru/tipy-dannykh-v-si-charp/" target="_blank" rel="noreferrer noopener">типов данных</a> с их автоматическим сужением и расширением. Рассмотрим следующий пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;

namespace HelloWorld
{
   class Program
   {
       static void Main (string[] args)
       {
          short a = 2000, b = 4000;
          int c = Add(a, b);
          Console.WriteLine(&quot;c = {0}&quot;, c);
          Console.ReadLine();
       }
       static int Add(int a, int b)
       {
            return a + b;
       }
   }
}</code></pre><div class="t-redactor__text">В данном примере в метод Add() мы передаём два значения типа short, хотя метод подразумевает приём параметров типа int. Тип short поглощается типом int. Расширение всегда происходит без потери данных, поэтому вы увидите правильный результат:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">c = 6000</code></pre><div class="t-redactor__text">Рассмотрим этот же пример, но немного его изменим. Попытка скомпилировать его приведет к ошибке компиляции.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;

namespace HelloWorld
{
   class Program
   {
       static void Main (string[] args)
       {
          short a = 20000, b = 20000;
          short c = Add(a, b);
          Console.WriteLine(&quot;c = {0}&quot;, c);
          Console.ReadLine();
       }
       static int Add(int a, int b)
       {
            return a + b;
       }
   }
}</code></pre><div class="t-redactor__text">Во-первых, мы увеличили значения переменных a и b. Во-вторых, переменная c теперь типа short, а не int. Переменные типа short передаются в качестве параметров методу Add(). Компилятор может выполнить расширение до типа int, как было отмечено ранее, но ему приходится возвращать ответ типа int, который нужно поместить в переменную типа short.<br /><br />Выполнить сужение типа без потери данных в этом случае невозможно. Результат будет 40000, а максимальное значение для short 32767. Поэтому компилятор выдаст ошибку.<br /><br />Чтобы заставить компилятор выполнить сужение типа с потерей данных, нужно использовать <strong>операцию явного приведения типов</strong>. В C# данная операция обозначается с помощью скобок (), внутри которых приводится имя типа, к которому нужно привести значение:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">short c = (short)Add(a, b);</code></pre><div class="t-redactor__text">Программа будет выполнена, но результат будет неправильным:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">c = -25536</code></pre><div class="t-redactor__text">Во многих приложениях, особенно финансовых, такие потери данных недопустимы. Поэтому в C# предлагаются ключевые слова checked и unchecked, гарантирующие, что потеря данных окажется незамеченной.<br /><br />Если оператор или блок оператора заключена в контекст checked, то компилятор сгенерирует дополнительные CIL-инструкции, обеспечивающие проверку на предмет условий перевыполнения, которые могут возникать в результате сложения, умножения, вычитания или деления двух числовых типов данных.<br /><br />В случае возникновения условия переполнения во время выполнения будет генерироваться исключение System.OverflowException. Обработать исключение можно с помощью try/catch:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">try
{ 
  short c = checked((short)Add(a, b));
  Console.WriteLine(&quot;c = {0}&quot;, c);
}
catch (OverflowException ex)
{
  Console.WriteLine(ex.Message);
}</code></pre><div class="t-redactor__text">Из-за того, что действие флага checked распространяется на всю арифметическую логику, в C# предусмотрено ключевое слово unсhecked, которое позволяет отключить выдачу связанного с переполнением исключения в отдельных случаях.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">unchecked 
{
   short c = (short)Add(a, b);
   Console.WriteLine(&quot;c = {0}&quot;, c);
}</code></pre><div class="t-redactor__text">Использовать ключевое слово unchecked можно только в тех случаях, где переполнение является допустимым.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Операторы в C#</title>
			<link>https://www.easyitway.com/tpost/0esg6cytx1-operatori-v-c</link>
			<amplink>https://www.easyitway.com/tpost/0esg6cytx1-operatori-v-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 16:17:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>В языке C# оператор — это элемент программы, который применяется для одного или нескольких операндов в выражении или инструкции.</description>
			<turbo:content>
<![CDATA[<header><h1>Операторы в C#</h1></header><div class="t-redactor__text">В языке C# оператор — это элемент программы, который применяется для одного или нескольких операндов в выражении или инструкции. Рассмотрим основные операторы.</div><h4  class="t-redactor__h4">Арифметические операторы</h4><img src="https://static.tildacdn.com/tild3864-6563-4233-a530-386438656336/2023-11-21_16-17.png"><div class="t-redactor__text">Эти операторы всем знакомы из курса математики. Но, в C# есть небольшие нюансы. Когда оператор / применяется к целому числу, то любой остаток от деления отбрасывается.</div><div class="t-redactor__text">Остаток от этого деления можно получить с помощью оператора деления по модулю (%), который иначе называется оператором вычисления остатка. В C# этот оператор можно применять как к целочисленным типам данных, так и к типам с плавающей точкой.</div><h4  class="t-redactor__h4">Операторы сравнения и логические операторы</h4><div class="t-redactor__text">Данные типы операторов обычно используются в условном операторе if/else. Результатом операторов является значение типа bool — или true, или false.</div><div class="t-redactor__text">Операторы сравнения:</div><img src="https://static.tildacdn.com/tild3264-3565-4337-b261-306232306266/2023-11-21_16-18.png"><div class="t-redactor__text">Логические операторы:</div><img src="https://static.tildacdn.com/tild3936-3966-4638-b634-323335623939/123.png"><h4  class="t-redactor__h4">Оператор присваивания</h4><div class="t-redactor__text">Оператор присваивания обозначается как знак равенства (=) и обычно имеет форму:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">имя_переменной = выражение</code></pre><div class="t-redactor__text">Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">x = 7;
b = true;</code></pre><h4  class="t-redactor__h4">Поразрядные операторы</h4><div class="t-redactor__text">Эти операторы называются поразрядными, поскольку они служат для проверки, установки или сдвига двоичных разрядов, составляющих целое значение.</div><div class="t-redactor__text">Также поразрядные операторы применяются для решения самых разных задач программирования на уровне системы, включая, например, анализ информации состояния устройства. Все доступные в C# поразрядные операторы приведены ниже:</div><img src="https://static.tildacdn.com/tild6635-3361-4664-a261-393262613863/1234.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Циклы в языке C#</title>
			<link>https://www.easyitway.com/tpost/7m9f4g2181-tsikli-v-yazike-c</link>
			<amplink>https://www.easyitway.com/tpost/7m9f4g2181-tsikli-v-yazike-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 16:20:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>В любом языке программирования имеются итерационные конструкции (управляющие конструкции), использующиеся для повторения блоков кода до тех пор, пока не будет выполнено какое-то условие завершения.</description>
			<turbo:content>
<![CDATA[<header><h1>Циклы в языке C#</h1></header><div class="t-redactor__text">В любом языке программирования имеются итерационные конструкции (управляющие конструкции), использующиеся для повторения блоков кода до тех пор, пока не будет выполнено какое-то условие завершения. В языке C# поддерживаются четыре таких конструкции: for, foreach, while и do/while. Приступим к их изучению.</div><h4  class="t-redactor__h4">Цикл for</h4><div class="t-redactor__text">Данный цикл хорошо подойдёт, если нужно выполнить какой-то блок кода фиксированное количество раз. Оператор for позволяет указать, сколько раз должен повторяться блок кода и задать условие завершения цикла. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">for ([инициализация счетчика]; [условие]; [изменение счетчика])
{
    // действия
}</code></pre><div class="t-redactor__text">Рассмотрим небольшой пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">for (int i = 0; i &lt; 9; i++)
{
    Console.Write(&quot;{0}&quot;, i);
}
Console.ReadKey();

// Будет выведена строка: 012345678.</code></pre><div class="t-redactor__text">Первая часть объявления цикла - int i = 0 - создает и инициализирует счетчик i. Счетчик необязательно должен представлять тип int. Это может быть и другой числовой тип. И перед выполнением цикла его значение будет равно 0. В данном случае это то же самое, что и объявление переменной.<br /><br />Вторая часть - условие, при котором будет выполняться цикл. Пока условное выражение возвращает true, будет выполняться цикл. В данном случае цикл будет выполняться, пока счетчик i не достигнет 9. И третья часть - приращение счетчика на единицу. Также счётчик можно и уменьшить (i--).</div><h4  class="t-redactor__h4">Цикл foreach</h4><div class="t-redactor__text">Цикл foreach удобно использовать при проходе по всем элементам массива или коллекции без проверки верхнего предела. Рассмотрим пример прохода по массиву целых чисел с использованием цикла foreach:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int[] digits = { 1, 2, 3, 4};
foreach (int i in digits)
   Console.WriteLine(i);</code></pre><div class="t-redactor__text">Сначала в foreach указывается переменная, которая должна быть такого же типа, что и элементы массива. В эту переменную будет получен элемент массива для его дальнейшей обработки (в данном случае обработка заключается в выводе на консоль). После ключевого слова in задается название переменной массива.</div><h4  class="t-redactor__h4">Цикл while</h4><div class="t-redactor__text">Цикл while (цикл с предусловием) проверяет истинность некоторого условия, и если условие истинно, то код цикла выполняется. Синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">while (логическое выражение)
  оператор;</code></pre><div class="t-redactor__text">Сначала цикл вычисляет значение логического выражения. Если оно истинно, происходит итерация цикла (выполняется тело цикла), иначе происходит выход из цикла и выполнение следующего за циклом оператора. Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int i=0;
while(i++ &lt; 10) Console.Write(&quot;{0}&quot;, i);
Console.ReadKey();

// Будет выведена строка: 12345678910</code></pre><h4  class="t-redactor__h4">Цикл do/while</h4><div class="t-redactor__text">В отличии от цикла while в форме цикла do/while сначала выполняются операторы (тело цикла), а затем уже проверяется условие. Если условие истинно, то начинается следующая итерация. Тело цикла будет выполнено как минимум один раз. Синтаксис цикла:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">do
 {
 // тело цикла
 }
while (условие);</code></pre><div class="t-redactor__text">Рассмотрим предыдущий пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int i = 1;
do
 Console.Write(i);
while (i++ &lt; 10);
Console.ReadKey();

// Будет выведена строка: 12345678910</code></pre><h4  class="t-redactor__h4">Операторы continue и break</h4><div class="t-redactor__text">Иногда возникает ситуация, когда требуется выйти из цикла, не дожидаясь его завершения. В этом случае можно воспользоваться оператором <strong>break</strong>. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">for (int i = 0; i &lt; 10; i++)
{
    if (i == 5)
        break;
    Console.WriteLine(i);
}
Console.ReadKey();</code></pre><div class="t-redactor__text">В условии цикла сказано, что цикл будет выполняться, пока счетчик i не достигнет значения 10, в реальности цикл сработает 5 раз. Так как при достижении счетчиком i значения 5, сработает оператор break, и цикл завершится.<br /><br />Если нужно, чтобы при проверке цикл не завершался, а просто пропускал текущую итерацию, тогда можно воспользоваться оператором <strong>continue</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">for (int i = 0; i &lt; 10; i++)
{
    if (i == 5)
        continue;
    Console.WriteLine(i);
}
Console.ReadKey();</code></pre><div class="t-redactor__text">В этом случае цикл, когда дойдет до числа 5, которое не удовлетворяет условию проверки, просто пропустит это число и перейдет к следующей итерации.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Конструкции принятия решений в C#</title>
			<link>https://www.easyitway.com/tpost/rjki9osm81-konstruktsii-prinyatiya-reshenii-v-c</link>
			<amplink>https://www.easyitway.com/tpost/rjki9osm81-konstruktsii-prinyatiya-reshenii-v-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 16:23:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>В С#, кроме циклов есть две конструкции — операторы принятия решений (if/else и switch).</description>
			<turbo:content>
<![CDATA[<header><h1>Конструкции принятия решений в C#</h1></header><div class="t-redactor__text">В С#, кроме циклов есть две конструкции — операторы принятия решений (if/else и switch). Рассмотрим их подробнее:</div><h4  class="t-redactor__h4">if/else</h4><div class="t-redactor__text">Конструкция if/else проверяет истинность некоторого условия и в зависимости от результатов проверки выполняет определенный код.</div><div class="t-redactor__text">В C# оператор может работать только с булевскими выражениями, но не с произвольными значениями вроде -1 и 0. Учитывая этот факт, в операторе if/else можно использовать следующие операции сравнения:</div><div class="t-redactor__text"><ul><li>== — возвращает true, если выражения одинаковые, например, if(page == 5);</li><li>!= — возвращает true, если выражения не равны: if(page !=5);</li><li>&lt;(&lt;=) - возвращает true, если выражение слева меньше или равно, чем выражение справа: if(price &gt; 100);</li><li>&gt;(&gt;=) — возвращает true, если выражение слева больше или равно, чем выражение справа, if(price &gt; 200).</li></ul></div><div class="t-redactor__text">Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">if (условие)
  оператор (операторы)
else
  оператор (операторы)</code></pre><div class="t-redactor__text">Пример работы оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test
{
    class Program
    {
        private static int page = 3; //объявляем переменную page и присваиваем значение

        static void Main(string[] args)
        {
            if (page == 1) // если переменная равна 1, тогда будет выполнен эта часть кода
            {
                Console.WriteLine(&quot;Первая страница&quot;);
            }
            else // иначе будет выполнена данная часть
            {
                Console.WriteLine(&quot;Страница: {0}&quot;, page);
            }
            Console.ReadKey();

        }
    }
}</code></pre><h4  class="t-redactor__h4">switch</h4><div class="t-redactor__text">Вторым оператором выбора в C# является оператор switch, который обеспечивает многонаправленное ветвление программы. Следовательно, этот оператор позволяет сделать выбор среди нескольких альтернативных вариантов дальнейшего выполнения программы.</div><div class="t-redactor__text">Этот оператор действует следующим образом. Значение выражения последовательно сравнивается с константами выбора из заданного списка. Как только будет обнаружено совпадение с одним из условий выбора, выполняется последовательность операторов, связанных с этим условием. Ниже приведена общая форма оператора switch:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">switch(выражение) {
case константа1:
последовательность операторов
break;
case константа2:
последовательность операторов
break;
case константаЗ:
последовательность операторов
break;

...

default:
последовательность операторов
break;
}</code></pre><div class="t-redactor__text">У оператора switch в C# есть одна особенность: помимо числовых данных он также позволяет производить вычисления и со строковыми данными. Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Console.Write(&quot;Введите название ОС: &quot;);
string OS = Console.ReadLine();
switch (OS)
{
  case &quot;Windows&quot;:  Console.WriteLine(&quot;Хороший выбор!&quot;);
  break;
  case &quot;MacOS&quot;:  Console.WriteLine(&quot;Отличный выбор!&quot;);
  break;
  case &quot;Linux&quot;:  Console.WriteLine(&quot;OpenSource!&quot;);
  break;
  default: Console.WriteLine(&quot;Я не знаю такую систему!!&quot;);
  break;
}
Console.ReadKey();</code></pre><div class="t-redactor__text">Здесь всё очень просто! Запустив данный код и написав в консоле название любой ОС оператор выдаст ответ по заданным условиям. Рекомендую самостоятельно потренироваться с операторами для лучшего понимания этой темы.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Массивы в C#</title>
			<link>https://www.easyitway.com/tpost/3ke0485a31-massivi-v-c</link>
			<amplink>https://www.easyitway.com/tpost/3ke0485a31-massivi-v-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 16:25:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Массив — это структура данных, содержащая несколько переменных, доступ к которым осуществляется по вычисляемым индексам.</description>
			<turbo:content>
<![CDATA[<header><h1>Массивы в C#</h1></header><div class="t-redactor__text">Массив — это структура данных, содержащая несколько переменных, доступ к которым осуществляется по вычисляемым индексам. Содержащиеся в массиве переменные именуются элементами этого массива. Все они имеют одинаковый тип, который называется типом элементов массива. В C# массивы могут быть как одномерными, так и многомерными.</div><h4  class="t-redactor__h4">Одномерные массивы</h4><div class="t-redactor__text">Массивы в C# можно использовать почти так же, как и в других языках программирования, но у них есть одна особенность — они реализованы в виде объектов. Чтобы воспользоваться массивом в программе, необходимо сначала объявить переменную, которая может обращаться к массиву, а после — создать экземпляр массива, используя оператор new.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Объявление массива 
&lt;тип&gt;[] &lt;имя&gt;;</code></pre><div class="t-redactor__text">Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int[] digits;  // массив целых чисел
string[] strs; // массив строк
bool[] bools;  // массив булевых значений</code></pre><div class="t-redactor__text">После объявления массива необходимо установить его размер с помощью ключевого слова new. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ints = new int[6];</code></pre><div class="t-redactor__text">Установить размер можно и при объявлении массива:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int[] ints = new int[6];</code></pre><div class="t-redactor__text">Инициализировать массив можно двумя способами: можно заполнить его поэлементно, а можно использовать фигурные скобки. При ручном заполнении помните, что нумерация начинается с 0.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ints[0] = 12;
ints[1] = 16;
ints[2] = 20;
ints[3] = 6;
ints[4] = 124;</code></pre><h4  class="t-redactor__h4">Двумерные массивы</h4><div class="t-redactor__text">Многомерный массив содержит два или больше измерений, причем доступ к каждому элементу такого массива осуществляется с помощью определенной комбинации двух или более индексов.</div><div class="t-redactor__text">Местоположение любого элемента в двумерном массиве обозначается двумя индексами. Такой массив можно представить в виде таблицы, на строки которой указывает один индекс, а на столбцы — другой.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int[] nums1 = new int[] { 0, 1, 2, 3, 4, 5 };

int[,] nums2 = { { 0, 1, 2 }, { 3, 4, 5 } };</code></pre><div class="t-redactor__text">Все возможные способы определения двухмерных массивов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int[,] nums1;
int[,] nums2 = new int[2, 3];
int[,] nums3 = new int[2, 3] { { 0, 1, 2 }, { 3, 4, 5 } };
int[,] nums4 = new int[,] { { 0, 1, 2 }, { 3, 4, 5 } };
int[,] nums5 = new [,]{ { 0, 1, 2 }, { 3, 4, 5 } };
int[,] nums6 = { { 0, 1, 2 }, { 3, 4, 5 } };</code></pre><h4  class="t-redactor__h4">Ступенчатые массивы</h4><div class="t-redactor__text">Ступенчатый массив — это массив массивов, в котором длина каждого массива может быть разной. Ступенчатый массивы объявляются с помощью ряда квадратных скобок, в которых указывается их размерность. Например, для объявления двумерного ступенчатого массива служит следующая общая форма:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">тип [][] имя массива = new тип[размер] [];</code></pre><div class="t-redactor__text">Здесь размер обозначает число строк в массиве, а память для самих строк распределяется индивидуально, и поэтому длина строк может быть разной. Рассмотрим пример работы со ступенчатым массивом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> int i = 0;
            // Объявляем ступенчатый массив
            // В нем будет три массива длиной, соответственно,
            // 3, 5 и 4 элемента
            int[][] myArr = new int[3][];
            myArr[0] = new int[3];
            myArr[1] = new int[5];
            myArr[2] = new int[4];

            // Инициализируем ступенчатый массив
            for (; i &lt; 3; i++)
            {
                myArr[0][i] = i;
                Console.Write(&quot;{0}\t&quot;, myArr[0][i]);
            }

            Console.WriteLine();
            for (i = 0; i &lt; 5; i++)
            {
                myArr[1][i] = i;
                Console.Write(&quot;{0}\t&quot;, myArr[1][i]);
            }
            Console.WriteLine();
            for (i = 0; i &lt; 4; i++)
            {
                myArr[2][i] = i;
                Console.Write(&quot;{0}\t&quot;, myArr[2][i]);
            }</code></pre><h4  class="t-redactor__h4">Класс Array. Сортировка массивов</h4><div class="t-redactor__text">Для создания массива можно еще использовать класс Array. Этот класс является абстрактным, поэтому создать массив с использованием какого-либо конструктора нельзя.</div><div class="t-redactor__text">Но вместо применения синтаксиса C# для создания экземпляров массивов также возможно создавать их с помощью статического метода CreateInstance(). Это удобно, когда заранее неизвестен тип элементов массива.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Создаем массив типа string, длиной 3
Array strs = Array.CreateInstance(typeof(string), 3);

// Инициализируем первые два поля массива
strs.SetValue(&quot;Brand&quot;, 0);
strs.SetValue(&quot;Model&quot;, 1);

// Считываем данные из массива
string s = (string)strs.GetValue(1);</code></pre><div class="t-redactor__text">С помощью разных вариантов метода Sort() можно отсортировать массив полностью или в заданных пределах либо отсортировать два массива, содержащих соответствующие пары "ключ-значение". Сортировка массива необходима, чтобы можно было осуществить эффективный поиск, используя разные варианты метода BinarySearch(). Пример сортировки массива:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] myArr = { -5, 8, -12, 122, 34, -1, 0, 39};
            
            Console.WriteLine(&quot;До сортировки: &quot;);
            foreach (int i in myArr)
            Console.Write(&quot;\t{0}&quot;, i);
            
            Array.Sort(myArr);

            Console.WriteLine(&quot;\nПосле сортировки:&quot;);
            foreach (int i in myArr)
            Console.Write(&quot;\t{0}&quot;, i);
            Console.ReadKey();
        }
    }
}</code></pre><h4  class="t-redactor__h4">Копирование массивов</h4><div class="t-redactor__text">Поскольку массивы — это ссылочные типы, присваивание переменной типа массива другой переменной создает две переменных, ссылающихся на один и тот же массив. Для копирования массивов предусмотрена реализация массивами интерфейса ICloneable.</div><div class="t-redactor__text">Метод Clone(), определенный в этом интерфейсе, создает неглубокую копию массива. Если элементы массива относятся к типу значений, то все они копируются, если массив содержит элементы ссылочных типов, то сами эти элементы не копируются, а копируются лишь ссылки на них.</div><div class="t-redactor__text">Вместо метода Clone() можно также применять метод Array.Сору(), тоже создающий поверхностную копию. Но между Clone() и Сору() есть одно важное отличие: Clone() создает новый массив, а Сору() требует наличия существующего массива той же размерности с достаточным количеством элементов.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] arr2 = new string[5];
            // Создаем массив типа string, длиной 5
            Array myArr = Array.CreateInstance(typeof(string),5);

            // Инициализируем первые три поля массива
            myArr.SetValue(&quot;Name&quot;,0);
            myArr.SetValue(&quot;Age&quot;,1);
            myArr.SetValue(&quot;Adress&quot;,2);

            // Копируем массив с помощью метода Clone()
            string[] arr1 = (string[])myArr.Clone();

            foreach (string s in arr1)
                Console.Write(&quot;\t&quot;+s);

            // Копируем с помощью метода Copy()
            Console.WriteLine();
            Array.Copy(myArr, arr2, myArr.Length);
            foreach (string s in arr2)
                Console.Write(&quot;\t&quot;+s);

            Console.ReadLine();
        }
    }
}</code></pre><h4  class="t-redactor__h4">Перебор массивов. Цикл foreach</h4><div class="t-redactor__text">Цикл foreach предназначен для перебора элементов в контейнерах, в том числе в массивах. Формальное объявление цикла foreach:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">foreach (тип_данных название_переменной in контейнер)
{
    // действия
}</code></pre><div class="t-redactor__text">Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int[] numbers = new int[] { 1, 2, 3, 4, 5 };
foreach (int i in numbers)
{
    Console.WriteLine(i);
}</code></pre><div class="t-redactor__text">Здесь в качестве контейнера выступает массив данных типа int. Поэтому мы объявляем переменную с типом int.</div><h4  class="t-redactor__h4">Массив - как параметр</h4><div class="t-redactor__text">Массив может выступать как параметр метода. Также метод может возвращать целый массив. Рассмотрим небольшой пример описания метода, принимающего массив в качестве параметра и возвращающего также массив:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">static Array arrChange(Array Arr)
{
  // делаем что-то с массивом Arr
  return Arr;
}</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Кортежи в C#</title>
			<link>https://www.easyitway.com/tpost/oxhh0tcxf1-kortezhi-v-c</link>
			<amplink>https://www.easyitway.com/tpost/oxhh0tcxf1-kortezhi-v-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 16:30:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Кортежи предоставляют удобный способ для работы с набором значений, который был добавлен в версии C# 7.0.</description>
			<turbo:content>
<![CDATA[<header><h1>Кортежи в C#</h1></header><div class="t-redactor__text">Кортежи предоставляют удобный способ для работы с набором значений, который был добавлен в версии C# 7.0. Кортеж представляет набор значений, заключенных в круглые скобки:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">var tuple = (5, 10);</code></pre><div class="t-redactor__text">В отличие от массивов (которые содержат объекты одного типа), кортежи могут содержат объекты самых разных типов. В .NET 4 определены восемь обобщённых классов Tuple и один статический класс Tuple, который служит «фабрикой» кортежей.<br /><br />Существуют разные обобщённые классы Tuple для поддержки различного количества элементов, например, Tuple&lt;T1&gt; содержит один элемент, Tuple&lt;T1, T2&gt; — два элемента и т.д.<br /><br />Элементы кортежа доступны через свойства Item1, Item2. Если имеется более восьми элементов, которые нужно включить в кортеж, можно использовать определение класса Tuple с восемью параметрами.<br /><br />Последний параметр называется TRest, в котором должен передаваться сам кортеж. Поэтому есть возможность создать кортежи с любым количеством параметров. Рассмотрим пример использования кортежей:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        // Данный метод возвращает кортеж с 4-мя
        // разными значениями
        static Tuple Corteg(int a, string name)
        {
            int sqr = a * a;
            float sqrt = (float)(Math.Sqrt(a));
            string s = &quot;Привет, &quot; + name;
            char ch = (char)(name[0]);

            return Tuple.Create(sqr, sqrt, s, ch);
        }

        static void Main(string[] args)
        {
            var myTuple = Corteg(35, &quot;Viktor&quot;);
            Console.WriteLine(&quot;{0}\n35 в квадрате: {1}\nКвадратный корень из 35: &quot;
                + &quot;{2}\nПервый символ в имени: {3}\n&quot;, myTuple.Item3, myTuple.Item1, myTuple.Item2, myTuple.Item4);
            Console.ReadLine();
        }

    }
    
}</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Как подсчитать количество слов в тексте?</title>
			<link>https://www.easyitway.com/tpost/rzfmfbyej1-kak-podschitat-kolichestvo-slov-v-tekste</link>
			<amplink>https://www.easyitway.com/tpost/rzfmfbyej1-kak-podschitat-kolichestvo-slov-v-tekste?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 16:31:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Бывают случаи, когда нам надо подсчитать количество слов в большом тексте, а сидеть и нудно высчитывать не очень удобно.</description>
			<turbo:content>
<![CDATA[<header><h1>Как подсчитать количество слов в тексте?</h1></header><div class="t-redactor__text">Бывают случаи, когда нам надо подсчитать количество слов в большом тексте, а сидеть и нудно высчитывать не очень удобно. Именно поэтому в этой статье я хочу показать пример кода на языке C#, который автоматически подсчитает все слова в вашем тексте. Полный код этого приложения:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.Collections.Generic;
using System.Ling;
using System.Text;
using System.Threading.Tasks;

namespace proga_text // имя приложения
{
   class Program
    {
      static void Main (string[] args)
      {
          Console.OutputEncoding = Encoding.GetEncoding(866);
          Console.InputEncoding = Encoding.GetEncoding(866);
 
          Console.WriteLine(&quot;Введите текст:&quot;);
          string[] tArr;
          string text = Console.ReadLine();
          tArr = text.Split(&#039; &#039;);
          Console.WriteLine(&quot;Количество слов:&quot;);
          Console.WriteLine(tArr.Length);
          Console.ReadLine();
 
          Console.ReadLine();
       }
    }
}         </code></pre><div class="t-redactor__text">Здесь мы создали массив строк tArr и простую строковую переменную text. В переменную text считывается введенный пользователем текст, а в массив tArr добавляются элементы из строки text, расчлененные пробелом при помощи метода Split. Каждый элемент данного массива — это как раз одно слово, заключенное в тексте между пробелов.<br /><br />Для проверки данного приложения откройте свою Visual Studio и создайте консольное приложение используя код. И не забудьте поменять имя приложения. Удачи вам в обучении!</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Делаем консольный калькулятор</title>
			<link>https://www.easyitway.com/tpost/to1nke5td1-delaem-konsolnii-kalkulyator</link>
			<amplink>https://www.easyitway.com/tpost/to1nke5td1-delaem-konsolnii-kalkulyator?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 16:34:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>На этом уроке мы напишем простенький консольный калькулятор на языке С#. Программа будет работать так: пользователь вводит операнды и оператор, а программа сообщает результат.</description>
			<turbo:content>
<![CDATA[<header><h1>Делаем консольный калькулятор</h1></header><div class="t-redactor__text">На этом уроке мы напишем простенький консольный калькулятор на языке С#. Программа будет работать так: пользователь вводит операнды и оператор, а программа сообщает результат.<br /><br />Калькулятор будет поддерживать только базовые операторы (+, -, *, /). Вместо обработки исключения деления на 0 мы произведем проверку ввода — если второй оператор будет равен 0, мы просто не будем производить вычисление.<br /><br />Данный калькулятор абсолютно элементарен и требует минимальных знаний языка. Создаём проект (“Файл” -&gt;”Создать”-&gt;”Проект”-&gt;”Консольное приложение”) и объявляем наши переменные:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">double a;
double b;
double res = 0;
char oper;</code></pre><div class="t-redactor__text"><strong>Double</strong> – это тип переменной с плавающей запятой, иными словами, тип, в который можно записать десятичные числа. В него поместится как значение 5, так и значение 5,45, и даже значение 5,4571601695, также в нём можно использовать и отрицательные числа.<br /><br />В переменную <strong>a</strong> мы внесём первое число, которое запишет пользователь. В переменную <strong>b</strong> – второе число. А переменная res будет выводить результат математических операций с переменными а и b.<br /><br /><strong>Char</strong> – это тип переменной в виде какого-либо символа, будь то буква, цифра или какой-нибудь знак. В переменную oper мы будем заносить знак математической операции над числами.<br /><br />Итак, переменные объявлены, теперь нам надо узнать, что конкретно нужно посчитать пользователю, а для этого придётся считывать данные, которые он будет вводить:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Console.Write(&quot;Введите первое число:&quot;);
a = Convert.ToDouble(Console.ReadLine());

Console.Write(&quot;\nВведите оператор:&quot;);
oper = Convert.ToChar(Console.ReadLine());

Console.Write(&quot;\nВведите второе число:&quot;);
b = Convert.ToDouble(Console.ReadLine());</code></pre><div class="t-redactor__text">Сначала мы выводим на консоль надпись о том, чтобы пользователь ввёл первое число.<br /><br />В следующей строке мы присваиваем переменной a введенное пользователем число, но при этом не забываем, что введенные пользователем данные всегда имеют строковой формат string, а так как у нашей переменной тип double, то надо отконвертировать string в double соответствующим методом Convert.<br /><br />То же самое проделываем с переменной oper, но конвертируем string уже не в double, а в char, потому что переменная oper имеет такой тип данных. Точно то же самое, что было с переменной a проделываем и с переменной b, так как они одинакового типа.<br /><br />Числа получены. Но пока неизвестно, как ими оперировать, так как главное для нас – узнать что за знак скрывается в переменной oper, и уже исходя из этого, производить операции над числами:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">if (oper == &#039;+&#039;)
{
res = a + b;
}

else if (oper == &#039;-&#039;)
{
res = a - b;
}
            
else if (oper == &#039;*&#039;)
{
res = a * b;
}

else if (oper == &#039;/&#039;)
{
if (b != 0)
res = a / b;
else Console.WriteLine(&quot;На 0 делить нельзя!&quot;);
}
else
{
Console.WriteLine(&quot;Неизвестный оператор.&quot;);
}</code></pre><div class="t-redactor__text">Для этого мы используем оператор условия if (если). Первая строка звучит примерно так: если в переменной oper записан знак “+”, то.. мы присваиваем переменной res сумму переменных a и b и выводим ответ на экран. Рассмотрим код программы полностью:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Console_Calck
{
    class Program
    {

        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.GetEncoding(866);
            Console.InputEncoding = Encoding.GetEncoding(866);

            double a;
            double b;
            double res = 0;
            char oper;

            Console.Write(&quot;Введите первое число:&quot;);
            a = Convert.ToDouble(Console.ReadLine());

            Console.Write(&quot;\nВведите оператор:&quot;);
            oper = Convert.ToChar(Console.ReadLine());

            Console.Write(&quot;\nВведите второе число:&quot;);
            b = Convert.ToDouble(Console.ReadLine());

            if (oper == &#039;+&#039;)
            {
                res = a + b;
            }

            else if (oper == &#039;-&#039;)
            {
                res = a - b;
            }
            
            else if (oper == &#039;*&#039;)
            {
                res = a * b;
            }

            else if (oper == &#039;/&#039;)
            {
                if (b != 0)
                    res = a / b;
                else Console.WriteLine(&quot;На 0 делить нельзя!&quot;);
            }
            else
            {
                Console.WriteLine(&quot;Неизвестный оператор.&quot;);
            }

            Console.WriteLine(&quot;\nРезультат: {0}&quot;, res);
            Console.ReadLine();
        }
    }
}</code></pre><div class="t-redactor__text">После написания кода откомпилируем ее и получим результат:</div><img src="https://static.tildacdn.com/tild3637-3761-4261-b664-306465633039/console_calck-1024x2.jpg"><div class="t-redactor__text">Для закрепления материала рекомендую самостоятельно записать каждую строчку кода в свой созданный проект и изучить ход выполнения программы.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Создание мини игры на C#. Угадай число</title>
			<link>https://www.easyitway.com/tpost/h6iunp5gb1-sozdanie-mini-igri-na-c-ugadai-chislo</link>
			<amplink>https://www.easyitway.com/tpost/h6iunp5gb1-sozdanie-mini-igri-na-c-ugadai-chislo?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 16:36:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>На данном уроке мы разработаем простую мини игру «Угадай число» на языке C#. Суть игры простой: компьютер загадывает число от 0 до 100, выдаст подсказку — больше ли это число 50 или нет, затем сравнит введенное пользователем число с загаданным. </description>
			<turbo:content>
<![CDATA[<header><h1>Создание мини игры на C#. Угадай число</h1></header><div class="t-redactor__text">На данном уроке мы разработаем простую мини игру «Угадай число» на языке C#. Суть игры простой: компьютер загадывает число от 0 до 100, выдаст подсказку — больше ли это число 50 или нет, затем сравнит введенное пользователем число с загаданным. Загадывание числа будет реализовано с помощью генератора случайных чисел:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Random rand = new Random();
int i = rand.Next(100);</code></pre><div class="t-redactor__text">Число «100» можно поменять. Если задать число «50», тогда компьютер будет загадывать от 0 до 50. Чтобы создать игру зайдите в Visual Studio, создайте проект «Консольное приложение (.NET Framework)» на языке C# и перепишите код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ugaday_chislo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.GetEncoding(866);
            Console.InputEncoding = Encoding.GetEncoding(866);

            char again = &#039;y&#039;;
            Random rand = new Random();

            while (again == &#039;y&#039;)
            {
                int i = rand.Next(100);

                Console.WriteLine(&quot;Компьютер загадал число от 0 до 100&quot;);

                if (i &lt; 50) Console.WriteLine(&quot;Число меньше 50&quot;);
                else Console.WriteLine(&quot;Число больше или равно 50&quot;);

                int x = Convert.ToInt32(Console.ReadLine());

                if (i == x) Console.WriteLine(&quot;Поздравляем! Вы победили свой компьютер!&quot;);
                else Console.WriteLine(&quot;Вы проиграли! Компьютер загадал число {0}&quot;, i);

                Console.WriteLine(&quot;Попробовать еще? (y = Да, n = Нет)&quot;);
                again = Convert.ToChar(Console.ReadLine());

            }
        }
    }
}</code></pre><div class="t-redactor__text">Результат программы:</div><img src="https://static.tildacdn.com/tild3433-3633-4137-a534-623863306662/ugad_chislo_3-768x43.jpg"><div class="t-redactor__text">Внимательно изучите код и попробуйте усовершенствовать его.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Введение в пространство имён System.IO</title>
			<link>https://www.easyitway.com/tpost/ltznvebmy1-vvedenie-v-prostranstvo-imyon-systemio</link>
			<amplink>https://www.easyitway.com/tpost/ltznvebmy1-vvedenie-v-prostranstvo-imyon-systemio?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 16:39:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Всё, что связано с вводом/выводом хранится в пространстве имён System.IO. В .NET это пространство имён посвящено службам файлового ввода-вывода, ввода-вывода из памяти.</description>
			<turbo:content>
<![CDATA[<header><h1>Введение в пространство имён System.IO</h1></header><div class="t-redactor__text">В статье «История языка C#» я уже затрагивал тему «Пространство имён». Советую изучить её и обязательно вернуться назад. На этом уроке вы познакомитесь с основными классами пространства имён System.IO.</div><div class="t-redactor__text">Всё, что связано с вводом/выводом хранится в пространстве имён System.IO. В .NET это пространство имён посвящено службам файлового ввода-вывода, ввода-вывода из памяти. В этом пространстве определён набор классов, интерфейсов, перечислений, структур и делегатов.</div><div class="t-redactor__text">Основные классы из пространства имён System.IO:</div><h4  class="t-redactor__h4">BinaryReader, BinaryWriter</h4><div class="t-redactor__text">Позволяют читать и записывать элементарные типы данных (целочисленные, булевские, строковые и т.п.) в двоичном виде.</div><h4  class="t-redactor__h4">BufferedStream</h4><div class="t-redactor__text">Предоставляет временное хранилище для потока байтов, которые могут затем быть перенесены в постоянные хранилища.</div><h4  class="t-redactor__h4">Directory, DirectoryInfo</h4><div class="t-redactor__text">Используется для манипуляций с каталогами.</div><h4  class="t-redactor__h4">DriveInfo</h4><div class="t-redactor__text">Предоставляет подробную информацию о дисковых устройствах.</div><h4  class="t-redactor__h4">File, FileInfo</h4><div class="t-redactor__text">Используется для манипуляций с файлами.</div><h4  class="t-redactor__h4">FileStream</h4><div class="t-redactor__text">Обеспечивает произвольный доступ к файлу с данными, представленными в виде потока байт.</div><h4  class="t-redactor__h4">MemoryStream</h4><div class="t-redactor__text">Обеспечивает произвольный доступ к данным, хранящимся в памяти, а не в физическом файле.</div><h4  class="t-redactor__h4">Path</h4><div class="t-redactor__text">Предоставляет информацию о пути к файлу/каталогу.</div><h4  class="t-redactor__h4">StreamReader, StreamWriter</h4><div class="t-redactor__text">Используется для чтения и записи текстовой информации из файла. Не поддерживают произвольного доступа к файлу.</div><h4  class="t-redactor__h4">StringReader, StringWriter</h4><div class="t-redactor__text">Также используется для чтения и записи текстовой информации из файла. Однако в качестве хранилища они используют строковый буфер, а не физический файл.</div><h4  class="t-redactor__h4">Пример</h4><div class="t-redactor__text">В этом примере текстовый файл открывается с помощью средства чтения потока (StreamReader), содержимое копируется в строку, а строка выводится на консоль.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.IO;

class Test_File
{
    public static void Main()
    {
        try
        {   // Открываем текстовый файл с помощью средства чтения потока 
            using (StreamReader sr = new StreamReader(&quot;Test_File.txt&quot;))
            {
	        // Содержимое текстового файла копируется в строку, а строка выводится на консоль
                String line = sr.ReadToEnd();
                Console.WriteLine(line);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(&quot;Файл не может быть прочитан:&quot;);
            Console.WriteLine(e.Message);
        }
    }
}</code></pre><div class="t-redactor__text">Для закрепления материала советую подробно изучить данный пример и отработать его на практике. Также рассмотрите и остальные классы пространства имён System.IO, а свои примеры пишите в комментариях.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Классы для манипуляции с файлами и каталогами</title>
			<link>https://www.easyitway.com/tpost/rh2kso9cx1-klassi-dlya-manipulyatsii-s-failami-i-ka</link>
			<amplink>https://www.easyitway.com/tpost/rh2kso9cx1-klassi-dlya-manipulyatsii-s-failami-i-ka?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 16:41:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>В System.IO определено четыре класса для манипуляции с файлами и каталогами — File, FileInfo, Directory, DirectoryInfo. Классы Directory и File используются для создания, удаления, копирования и перемещения каталогов и файлов соответственно.</description>
			<turbo:content>
<![CDATA[<header><h1>Классы для манипуляции с файлами и каталогами</h1></header><div class="t-redactor__text">В System.IO определено четыре класса для манипуляции с файлами и каталогами — File, FileInfo, Directory, DirectoryInfo. Классы Directory и File используются для создания, удаления, копирования и перемещения каталогов и файлов соответственно.</div><div class="t-redactor__text">Классы DirectoryInfo и FileInfo также используется для манипуляции с каталогами и файлами, но предлагают свою функциональность в виде методов уровня экземпляра — они должны размещаться в памяти с помощью ключевого слова new.</div><h4  class="t-redactor__h4">DirectoryInfo</h4><div class="t-redactor__text">Для работы с каталогами удобнее всего использовать класс DirectoryInfo. Рассмотрим основные члены это класса:</div><div class="t-redactor__text"><ul><li>Create(), CreateSubdirectory() — создает каталог или дерево каталогов по заданному имени;</li><li>Delete() — удаляет каталог вместе со всем содержим. Обратите внимание, в отличие от некоторых системных функций, удаляющих только пустой каталог, этот метод удаляет непустой каталог, что очень удобно — не нужно извлекать обход дерева каталогов.</li><li>GetDirectory() — возвращает в себе массив объектов DirectoryInfo, представляющий собой все подкаталоги заданного (текущего) каталога;</li><li>GetFiles() — извлекает массив объектов FileInfo, представляющий собой все файлы из текущего каталога;</li><li>CopyTo() — копирует каталог со всем содержим;</li><li>MoveTo() — перемещает весь каталог (с файлами и подкаталогами);</li><li>Parent — содержит родительский каталог;</li><li>Root — содержит корневой каталог.</li></ul></div><div class="t-redactor__text">Чтобы начать работу с DirectoryInfo, нужно создать новый объект этого типа, указав каталог, с которым вы будете работать:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DirectoryInfo d = new DirectoryInfo (&quot;C:\Files&quot;);</code></pre><div class="t-redactor__text">Указать можете, как существующий, так и несуществующий каталог. Если вы пытаетесь привязаться к несуществующему каталогу, то будет сгенерировано исключение System.IO.DirectoryNotFoundException. Если нужно создать несуществующий каталог, то укажите перед его именем знак @, например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DirectoryInfo d = new DirectoryInfo(@&quot;C:\Files\Den&quot;);
d.Create();   //создаем новый каталог</code></pre><h4  class="t-redactor__h4">Классы Directory и DriveInfo</h4><div class="t-redactor__text">Члены этого класса обычно возвращают строковые данные, а не типизированные объекты типов FilesInfo/DirectorInfo — в этом основная разница этими двумя классами.</div><div class="t-redactor__text">Рассмотри пример (выведем список дисков вашего компьютера):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Console.WriteLine(&quot;Ваши диски:&quot;);
string[] drives = Directory.GetLogicalDrives();
foreach (string s in drives)
   Console.WriteLine(&quot;{0}&quot;, s);</code></pre><div class="t-redactor__text">Метод GetLogicalDrivers() возращает массив строк, а не массив объектов DirectoryInfo. Также метод вызывается без предварительного создания объекта оператором new. Данный метод сообщает буквы логических дисков, при этом невозможно понять, где и какой диск.<br /><br />Если нужно получить больше информации о дисках, нужно использовать тип DriveInfo:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.IO;

namespace MyDriveInfo
{
    class Program
    {
       static void Main (string[] args)
       {
     //Изменяем кодировку консоли для вывода текста
        Console.OutputEncoding = Encoding.GetEncoding(866);
        Console.WriteLine(&quot;Ваши диски:&quot;);
        string[] drives = Directory.GetLogicalDrives();
        foreach (string s in drives)
           Console.WriteLine(&quot;{0}&quot;, s);

        DriveInfo[] drvs = DriveInfo.GetDrives();
        
        foreach (DriveInfo d in drvs)
        {
     Console.WriteLine(&quot;Диск: {0} Тип {1}&quot;, d.Name, d.DriveType);
            if (d.IsReady)
            {
     Console.WriteLine(&quot;Свободно: {0}&quot;, d.TotalFreeSpace);
     Console.WriteLine(&quot;Файловая система: {0}&quot;, d.DriveFormat);
     Console.WriteLine(&quot;Метка: {0}&quot;, d.VolumeLabel);
     Console.WriteLine();
            }
        }
        Console.ReadeLine();
            }
      }
}</code></pre><h4  class="t-redactor__h4">FileInfo</h4><div class="t-redactor__text">Класс FileInfo используется для манипуляции с файлами.Рассмотрим его основные члены(методы):</div><h4  class="t-redactor__h4">Create()</h4><div class="t-redactor__text">Создает новый файл и возвращает объект FileStream, который используется для взаимодействия с созданным файлом.</div><h4  class="t-redactor__h4">CreateText()</h4><div class="t-redactor__text">Создает объект StreamWriter, который используется для создания текстового файла.</div><h4  class="t-redactor__h4">CopyTo()</h4><div class="t-redactor__text">Копирует существующий файл в другой файл.</div><h4  class="t-redactor__h4">AppendText()</h4><div class="t-redactor__text">Создает объект StreamWriter для добавления текста в файл.</div><h4  class="t-redactor__h4">Delete()</h4><div class="t-redactor__text">Удаляет файл, связанный с экземпляром FileInfo</div><h4  class="t-redactor__h4">Directory</h4><div class="t-redactor__text">Используется для получения экземпляра родительского каталога</div><h4  class="t-redactor__h4">DirectoryName</h4><div class="t-redactor__text">Содержит полный путь к родительскому каталогу</div><h4  class="t-redactor__h4">Length</h4><div class="t-redactor__text">Получает размер текущего файла или каталога.</div><h4  class="t-redactor__h4">MoveTo()</h4><div class="t-redactor__text">Используется для перемещения файла.</div><h4  class="t-redactor__h4">Name</h4><div class="t-redactor__text">Содержит имя файла.</div><h4  class="t-redactor__h4">Open()</h4><div class="t-redactor__text">Открывает файл с различными разрешениями чтения/записи.</div><h4  class="t-redactor__h4">OpenRead()</h4><div class="t-redactor__text">Создает доступный только для чтения объект FileStream.</div><h4  class="t-redactor__h4">OpenText()</h4><div class="t-redactor__text">Создает объект StreamReader для чтения информации из текстового файла.</div><h4  class="t-redactor__h4">OpenWrite()</h4><div class="t-redactor__text">Создает объект FileStream, доступный только для записи</div><div class="t-redactor__text">Примеры использования класса FileInfo:</div><div class="t-redactor__text">Использование метода Create():</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">FileInfo myFile = new FileInfo(@&quot;C:\temp\file.vdd&quot;);
FileStream fs = myFile.Create();
// производим какие-либо операции с fs
// закрываем поток
fs.Close();</code></pre><div class="t-redactor__text">Тут создаётся поток FileStream, позволяющий производить манипуляции с содержимым файла, например, читать из него данные, записывать в него данные.</div><h4  class="t-redactor__h4">File</h4><div class="t-redactor__text">Тип File поддерживает несколько полезных методов, которые пригодятся при работе с текстовыми файлами. Например, метод ReadAllLines() позволяет открыть указанный файл и прочитать из него все строки — в результате будет возвращен массив строк. После того, как все данные из файла прочитаны, файл будет закрыт.</div><div class="t-redactor__text">Аналогично, метод ReadAllBytes() читает все байты из файла, возвращает массив байтов и закрывает файл.</div><div class="t-redactor__text">Метод ReadAllText() читает все содержимое текстового файла в одну строку и возвращает её. Как обычно, файл после чтения будет закрыт.</div><div class="t-redactor__text">Существует и аналогичные методы записи WriteAllBytes(), WriteAllLines() и WriteAlltext(), которые записывают в файл, соответственно, массив байтов, массив строк и строку. После записи файл закрывается. Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">string[] myFriends = {&quot;Jane&quot;, &quot;Max&quot;, &quot;John&quot;};

// Записать все данные в файл
File.WriteAllLines(@&quot;C:\temp\friends.txt&quot;, myFriends);

// Прочитать все обратно и вывести
foreach (string friend in File.ReadAllLines(@&quot;C:\temp\friends.txt&quot;))
{
  Console.WriteLine(&quot;{0}&quot;, friend);
}</code></pre><h4  class="t-redactor__h4">Stream</h4><div class="t-redactor__text">В абстрактном классе System.IO.Stream определен набор членов, которые обеспечивают поддержку синхронного и асинхронного взаимодействия с хранилищем (например, файлом или областью памяти). Члены абстрактного класса:</div><h4  class="t-redactor__h4">CanRead, CarWrite, CanSeek</h4><div class="t-redactor__text">Определяют, поддерживает ли поток чтение, запись и поиск.</div><h4  class="t-redactor__h4">Close()</h4><div class="t-redactor__text">Метод закрывает поток и освобождает все ресурсы.</div><h4  class="t-redactor__h4">Flush()</h4><div class="t-redactor__text">Метод обновляет лежащий в основе источник данных. Напимер, позволяет перечитать источник.</div><h4  class="t-redactor__h4">Length</h4><div class="t-redactor__text">Возвращает длину потока в байтах.</div><h4  class="t-redactor__h4">Position</h4><div class="t-redactor__text">Определяет текущую позицию в потоке.</div><h4  class="t-redactor__h4">Read(), ReadByte()</h4><div class="t-redactor__text">Читает последовательность байт или один байт соответственно из текущего потока и перемещает позицию потока на количество прочитанных байтов.</div><h4  class="t-redactor__h4">Seek()</h4><div class="t-redactor__text">Устанавливает позицию в текущем потоке.</div><h4  class="t-redactor__h4">SetLength()</h4><div class="t-redactor__text">Устанавливает длину текущего потока.</div><h4  class="t-redactor__h4">Write(), WriteByte()</h4><div class="t-redactor__text">Записывает последовательность байтов или одиночный байт в текущий поток и перемещает текущую позицию на количество записанных байтов.</div><h4  class="t-redactor__h4">FileStream</h4><div class="t-redactor__text">Класс FileStream предоставляет реализацию абстрактного члена Stream для потоковой работы с файлами. Это элементарный поток, и он может записывать или читать только один байт или массив байтов.</div><h4  class="t-redactor__h4">Классы StreamWriter и StreamReader</h4><div class="t-redactor__text">Данные классы удобно использовать во всех случаях, когда нужно читать или записывать символьные данные. Оба типа работают по умолчанию с символами Unicode, но кодировку можно изменить предоставлением правильно сконфигурированной ссылки на объект System.Text.Encoding. Пример записи в файл с использованием StreamWriter:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using (StreamWriter writer = File.CreateText(&quot;friends.txt&quot;))
{
  writer.WriteLine(&quot;Виктор&quot;);
  writer.WriteLine(&quot;Максим&quot;);
  writer.WriteLine(&quot;Евгений&quot;);
}</code></pre><div class="t-redactor__text">Пример чтения информации из текстового файла с помощью StreamReader:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using (StreamReader reader1 = File.OpenText(&quot;friends.txt&quot;))
{
  string s = null;
  while ((s = reader1.ReadLine()) != null)
  {
    Console.WriteLine(s);
  }
}</code></pre><h4  class="t-redactor__h4">Классы BinaryWriter и BinaryReader</h4><div class="t-redactor__text">Для работы с двоичными (не текстовыми) данными используются классы BinaryWriter и BinaryReader. Оба эти класса унаследованы от System.Object и позволяют читать и записывать данные в потоки в двоичном формате. Для записи у BinaryWriter используется метод Write(), а для чтения — метод Read() у BinaryReader. Метод Close (закрыть поток) есть у обоих классов.</div><div class="t-redactor__text">Метод Flush() у BinaryWriter позволяет сбросить буфер двоичного потока на носитель. Пример использования:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">FileInfo f = new FileInfo(@&quot;file.dat&quot;);
using(BinaryWriter bw = new BinaryWriter(f.OpenWrite()))
{
// Данные для записи
double a = 1234.56;
int b = 123456;
string s = &quot;123456&quot;;
// Записать данные.
bw.Write(a);
bw.Write(b);
bw.Write(s);
}
...
// читаем данные
using(BinaryReader br = new BinaryReader(f.OpenRead()) )
{
  Console.WriteLine(br.ReadDouble());
  Console.WriteLine(br.Readlnt32());
  Console.WriteLine(br.ReadString());
}</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Сериализация объектов</title>
			<link>https://www.easyitway.com/tpost/nmzx361cb1-serializatsiya-obektov</link>
			<amplink>https://www.easyitway.com/tpost/nmzx361cb1-serializatsiya-obektov?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 16:44:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Сериализация — это представление объекта в виде потока байтов. Десериализация — это восстановление объекта и его данных из потока байтов. Потоком может выступать память, файл или сетевое соединение.</description>
			<turbo:content>
<![CDATA[<header><h1>Сериализация объектов</h1></header><div class="t-redactor__text">В данной статье я бы хотел поговорить о том, что такое сериализация в C# и для чего она нужна.</div><div class="t-redactor__text"><strong>Сериализация</strong> — это представление объекта в виде потока байтов. <strong>Десериализация</strong> — это восстановление объекта и его данных из потока байтов. Потоком может выступать память, файл или сетевое соединение.</div><div class="t-redactor__text">С помощью сериализации, программист может сохранить большие объемы разных данных с минимальными усилиями.</div><h4  class="t-redactor__h4">Форматы сериализации</h4><div class="t-redactor__text">1. <strong>Бинарная.</strong> В данном случае данные объекта представляются в бинарной форме. Это наиболее оптимальный вариант сериализации с точки зрения скорости и размера.</div><div class="t-redactor__text">Недостаток данного вида заключается в его привязке к платформе. Допустим: вы передали данные другому программисту, у которого такая же платформа .NET и такая же версия этой платформы. В этом случае он сможет десериализовать данные, в противном случае — нет.</div><div class="t-redactor__text">2. <strong>JSON — JavaScript Object Notation.</strong> Данный вид сериализации особенно удобен для передачи данных межу веб-приложениями. Если посмотреть json-формат данных, то мы увидим, что они представляют из себя javascript-объекты. Можно взять скопировать и вставить в Javascript-код, и это всё будет работать.</div><div class="t-redactor__text">3. <strong>XML</strong> (eXtensible Markup Language — расширяемый язык разметки). Данный тип сериализации представляет объект в формате XML.</div><div class="t-redactor__text">4. Можно написать свой собственный сериализатор, который будет представлять объекты в том виде, в котором вам нужно.</div><div class="t-redactor__text">Минимальные действия, которые необходимо сделать, чтобы объекты класса были сериализуемы — это повесить на класс атрибут Serializable. По умолчанию, при создании класса, он не считается сериализуемым. При попытке сериализовать объект такого класса вылетит «Exception».</div><h4  class="t-redactor__h4">Процесс сериализации объектов</h4><div class="t-redactor__text">Представим, что у нас есть класс UserSettings, содержащий параметры, установленные пользователем. Чтобы этот класс можно было сериализовать, его нужно снабдить атрибутом Serializable:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">[Serializable]
{
   public string WorkDir = &quot;C:\temp&quot;;
   public int TimeOut = 2000;
}</code></pre><div class="t-redactor__text">Теперь давайте посмотрим, как сериализовать этот класс. Нужно создать объект класса:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">UserSettings currentSettings = new UserSettings();
currentSettings.TimeOut = 1000; // устанавливаем конкретное значение</code></pre><div class="t-redactor__text">Для сериализации нужно создать объект типа BinaryFormatter:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System.Runtime;
...
BinaryFormatter bf = new BinaryFormatter();
using (Stream fs = new FileStream(&quot;settings.dat&quot;, FileMode.Open.
Create, FileAccess.Write, FileShare.None))
{
  bf.Serialize(fs, currentSettings);
}</code></pre><div class="t-redactor__text">Для десериализации нужно выполнить метод Deserialize():</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">FileStream fs = new FileStream(&quot;settings.dat&quot;, FileMode.Open);
try
{
  BinaryFormatter bf = new BinarryFormatter();
  currentSettings = (UserSettings)bf.Deserialize(fs);
}
catch (SerializationException e)
{
  Console.WriteLine(&quot;Ошибка. Причина: &quot; + e.Message);
  throw;
}
finally
{
  fs.Close();
}</code></pre><div class="t-redactor__text">Для десериализации объекта первым делом мы открываем файл для чтения. Далее создаем новый объект класса BinaryFormatter и дериализируем поток fs. Если в результате возникнет исключение, то мы выводим об этом сообщение. Блок finally позволяет в любом случае закрыть поток fs и освободить ресурсы.</div><h4  class="t-redactor__h4">Рассмотрим пример</h4><div class="t-redactor__text">Для бинарной сериализации применяется класс <strong>BinaryFormatter</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace Serialization
{
    [Serializable]
    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }
    }
 class Program
    {
        static void Main(string[] args)
        {
            // объект для сериализации
            Person person = new Person(&quot;Tom&quot;, 29);
            Console.WriteLine(&quot;Объект создан&quot;);

            // создаем объект BinaryFormatter
            BinaryFormatter formatter = new BinaryFormatter();
            // получаем поток, куда будем записывать сериализованный объект
            using (FileStream fs = new FileStream(&quot;people.dat&quot;, FileMode.OpenOrCreate))
            {
                formatter.Serialize(fs, person);

                Console.WriteLine(&quot;Объект сериализован&quot;);
            }
 // десериализация из файла people.dat
            using (FileStream fs = new FileStream(&quot;people.dat&quot;, FileMode.OpenOrCreate))
            {
                Person newPerson = (Person)formatter.Deserialize(fs);

                Console.WriteLine(&quot;Объект десериализован&quot;);
                Console.WriteLine(&quot;Имя: {0} --- Возраст: {1}&quot;, newPerson.Name, newPerson.Age);
            }

            Console.ReadLine();
        }
    }
}</code></pre><div class="t-redactor__text">В нашем примере мы проводим сериализацию с помощью класса BinaryFormatter (создаем файл people.dat и заносим в него объект) и затем проводим десериализацию из файла people.dat.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Вычисляем значение функции в C#</title>
			<link>https://www.easyitway.com/tpost/aoz6cghl31-vichislyaem-znachenie-funktsii-v-c</link>
			<amplink>https://www.easyitway.com/tpost/aoz6cghl31-vichislyaem-znachenie-funktsii-v-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 16:46:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Представим, что нам нужно вычислить сумму значений, возвращаемых функцией f() от 1 до x. Функция будет такой:</description>
			<turbo:content>
<![CDATA[<header><h1>Вычисляем значение функции в C#</h1></header><div class="t-redactor__text">Представим, что нам нужно вычислить сумму значений, возвращаемых функцией f() от 1 до x. Функция будет такой:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">3x2 – 2x3</code></pre><div class="t-redactor__text">Рассмотри полный листинг программы вычисления функции с подробными комментариями:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static double f (double x) // создаем функцию f с типом double
        {
            return 3 * Math.Pow(x, 2) - 2 * Math.Pow(x, 3); // используя функцию Pow возвращаем значение типа double
        }

        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.GetEncoding(866); //кодировка
            Console.InputEncoding = Encoding.GetEncoding(866); //кодировка

            Console.WriteLine(&quot;Введите X:&quot;); // Вводим x
            string t = Console.ReadLine(); // переносим значение пользователя в переменную t

            int x = Convert.ToInt32(t); // преобразовыем в целое число
            int i;
            double sum = 0;

            for (i = 1; i &lt;= x; i++) sum = sum + f(i); // Проходим с помощью цикла от 1 до x и считаем сумму

            Console.WriteLine(&quot;Результат: {0}&quot;, sum); // выводим результат
            Console.ReadLine();
        }

    }
    
}</code></pre><div class="t-redactor__text">Недостаток такой программы - если пользователь введет строку, которую нельзя будет преобразовать в целое число, возникает исключение.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Работа с XML-файлами в C#</title>
			<link>https://www.easyitway.com/tpost/z01ohj7fx1-rabota-s-xml-failami-v-c</link>
			<amplink>https://www.easyitway.com/tpost/z01ohj7fx1-rabota-s-xml-failami-v-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 18:32:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>XML является одним из наиболее распространенных стандартов документов, который позволяет в удобной форме сохранять сложные по структуре данные.</description>
			<turbo:content>
<![CDATA[<header><h1>Работа с XML-файлами в C#</h1></header><div class="t-redactor__text"><strong>XML</strong> является одним из наиболее распространенных стандартов документов, который позволяет в удобной форме сохранять сложные по структуре данные. Поэтому разработчики платформы .NET включили в фреймворк широкие возможности для работы с XML.<br /><br />XML (eXtensible Markup Language) — расширяемый язык разметки. XML разрабатывался как язык с простым формальным синтаксисом, удобный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком, с подчёркиванием нацеленности на использование в Интернете.<br /><br />Рассмотрим, что представляет собой xml-документ и как он может хранить объекты, используемые в программе на C#. Есть следующий класс:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class User
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Company { get; set; }
}</code></pre><div class="t-redactor__text">В программе на C# можно создать список объектов класса User:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">User user1 = new User { Name = &quot;Bill Gates&quot;, Age = 48, Company = &quot;Microsoft&quot; };
User user2 = new User { Name = &quot;Larry Page&quot;, Age = 42, Company = &quot;Google&quot; };
List users = new List { user1, user2 };</code></pre><div class="t-redactor__text">Чтобы сохранить список в формате xml можно использовать следующий xml-файл:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;users&gt;
  &lt;user name=&quot;Bill Gates&quot;&gt;
    &lt;company&gt;Microsoft&lt;/company&gt;
    &lt;age&gt;48&lt;/age&gt;
  &lt;/user&gt;
  &lt;user name=&quot;Larry Page&quot;&gt;
    &lt;company&gt;Google&lt;/company&gt;
    &lt;age&gt;48&lt;/age&gt;
  &lt;/user&gt;
&lt;/users&gt;</code></pre><div class="t-redactor__text">XML-документ объявляет строка &lt;?xml version=»1.0″ encoding=»utf-8″ ?&gt;. Она задает версию (1.0) и кодировку (utf-8) xml. Далее идет собственно содержимое документа.<br /><br />XML-документ должен иметь один единственный корневой элемент, внутрь которого помещаются все остальные элементы. В данном случае таким элементом является элемент &lt;users&gt;. Внутри корневого элемента задан набор элементов &lt;user&gt;. Вне корневого элемента нельзя разместить элементы user.<br /><br />Каждый элемент определяется с помощью открывающего и закрывающего тегов, например, &lt;user&gt; и &lt;/user&gt;, внутри которых помещается значение или содержимое элементов. Также элемент может иметь сокращенное объявление: &lt;user /&gt; — в конце элемента помещается слеш.<br /><br />Элемент может иметь вложенные элементы и атрибуты. В данном случае каждый элемент user имеет два вложенных элемента company и age и атрибут name.<br /><br />Названия элементов являются регистрозависимыми, поэтому &lt;company&gt; и &lt;COMPANY&gt; будут представлять разные элементы.<br /><br />Для работы с XML в C# можно использовать несколько подходов. В первых версиях фреймворка основной функционал работы с XML предоставляло пространство имен System.Xml. В нем определен ряд классов, которые позволяют манипулировать xml-документом:<br /><br /><ul><li>XmlNode: представляет узел xml. В качестве узла может использоваться весь документ, так и отдельный элемент;</li><li>XmlDocument: представляет весь xml-документ;</li><li>XmlElement: представляет отдельный элемент. Наследуется от класса XmlNode;</li><li>XmlAttribute: представляет атрибут элемента;</li><li>XmlText: представляет значение элемента в виде текста, то есть тот текст, который находится в элементе между его открывающим и закрывающим тегами;</li><li>XmlComment: представляет комментарий в xml;</li><li>XmlNodeList: используется для работы со списком узлов.</li></ul><br />Ключевым классом, который позволяет манипулировать содержимым xml, является <strong>XmlNode</strong>, его основные методы и свойства:<br /><br /><ul><li>Свойство Attributes возвращает объект XmlAttributeCollection, который представляет коллекцию атрибутов;</li><li>Свойство ChildNodes возвращает коллекцию дочерних узлов для данного узла;</li><li>Свойство HasChildNodes возвращает true, если текущий узел имеет дочерние узлы;</li><li>Свойство FirstChild возвращает первый дочерний узел;</li><li>Свойство LastChild возвращает последний дочерний узел;</li><li>Свойство InnerText возвращает текстовое значение узла;</li><li>Свойство InnerXml возвращает всю внутреннюю разметку xml узла;</li><li>Свойство Name возвращает название узла. Например, &lt;user&gt; — значение свойства Name равно «user»;</li><li>Свойство ParentNode возвращает родительский узел у текущего узла.</li></ul><br />Применим эти классы и их функционал. И вначале для работы с xml создаем новый файл. Называем его <strong>users.xml</strong> и определим в нем следующее содержание:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;users&gt;
  &lt;user name=&quot;Bill Gates&quot;&gt;
    &lt;company&gt;Microsoft&lt;/company&gt;
    &lt;age&gt;48&lt;/age&gt;
  &lt;/user&gt;
  &lt;user name=&quot;Larry Page&quot;&gt;
    &lt;company&gt;Google&lt;/company&gt;
    &lt;age&gt;42&lt;/age&gt;
  &lt;/user&gt;
&lt;/users&gt;</code></pre><div class="t-redactor__text">Пройдемся по этому документу и выведем его данные на консоль:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System.Xml;
class Program
{
    static void Main(string[] args)
    {
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load(&quot;users.xml&quot;);
        // получим корневой элемент
        XmlElement xRoot = xDoc.DocumentElement;
        // обход всех узлов в корневом элементе
        foreach(XmlNode xnode in xRoot)
        {
            // получаем атрибут name
            if(xnode.Attributes.Count&gt;0)
            {
                XmlNode attr = xnode.Attributes.GetNamedItem(&quot;name&quot;);
                if (attr!=null)
                    Console.WriteLine(attr.Value);
            }
              // обходим все дочерние узлы элемента user
            foreach(XmlNode childnode in xnode.ChildNodes)
            {
                // если узел - company
                if(childnode.Name==&quot;company&quot;)
                {
                    Console.WriteLine(&quot;Компания: {0}&quot;, childnode.InnerText);
                }
                // если узел age
                if (childnode.Name == &quot;age&quot;)
                {
                    Console.WriteLine(&quot;Возраст: {0}&quot;, childnode.InnerText);
                }
            }
            Console.WriteLine();
        }
        Console.Read();
    }
}</code></pre><div class="t-redactor__text">Для редактирования xml-документа (изменения, добавления, удаления элементов) можно воспользоваться методами класса <strong>XmlNode</strong>:<br /><br /><ul><li>AppendChild: добавляет в конец текущего узла новый дочерний узел;</li><li>InsertAfter: добавляет новый узел после определенного узла;</li><li>InsertBefore: добавляет новый узел до определенного узла;</li><li>RemoveAll: удаляет все дочерние узлы текущего узла;</li><li>RemoveChild: удаляет у текущего узла один дочерний узел и возвращает его.</li></ul><br />Класс <strong>XmlElement</strong>, унаследованный от <strong>XmlNode</strong>, добавляет еще ряд методов, которые позволяют создавать новые узлы:<br /><br /><ul><li>CreateNode: создает узел любого типа;</li><li>CreateElement: создает узел типа XmlDocument;</li><li>CreateAttribute: создает узел типа XmlAttribute;</li><li>CreateTextNode: создает узел типа XmlTextNode;</li><li>CreateComment: создает комментарий.</li></ul><br />Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">XmlDocument xDoc = new XmlDocument();
xDoc.Load(&quot;users.xml&quot;);
XmlElement xRoot = xDoc.DocumentElement;

// создаем новый элемент user
XmlElement userElem = xDoc.CreateElement(&quot;user&quot;);

// создаем атрибут name
XmlAttribute nameAttr = xDoc.CreateAttribute(&quot;name&quot;);

// создаем элементы company и age
XmlElement companyElem = xDoc.CreateElement(&quot;company&quot;);
XmlElement ageElem = xDoc.CreateElement(&quot;age&quot;);

// создаем текстовые значения для элементов и атрибута
XmlText nameText = xDoc.CreateTextNode(&quot;Mark Zuckerberg&quot;);
XmlText companyText = xDoc.CreateTextNode(&quot;Facebook&quot;);
XmlText ageText = xDoc.CreateTextNode(&quot;30&quot;);</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Обработка исключений в C#</title>
			<link>https://www.easyitway.com/tpost/a9jp098pj1-obrabotka-isklyuchenii-v-c</link>
			<amplink>https://www.easyitway.com/tpost/a9jp098pj1-obrabotka-isklyuchenii-v-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 18:34:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Исключения (Exceptions) это тип ошибки, которая происходит при выполнении приложения. Ошибки обычно означают появление неожиданных проблем.</description>
			<turbo:content>
<![CDATA[<header><h1>Обработка исключений в C#</h1></header><div class="t-redactor__text"><strong>Исключения</strong> (Exceptions) это тип ошибки, которая происходит при выполнении приложения. Ошибки обычно означают появление неожиданных проблем. Тогда как исключения, обработка которых организована в коде, являются ожидаемыми, они происходят в коде приложений по различным причинам.</div><div class="t-redactor__text">Исключения позволяют передать управление из одной части кода в другую часть. Когда срабатывает/выбрасывается исключение (exception thrown), текущий поток выполнения кода секции try прерывается, и запускается выполнение секции catch.</div><div class="t-redactor__text">Обработка исключений C# осуществляется следующими ключевыми словами: <strong>try</strong>, <strong>catch</strong>, <strong>finally</strong> и <strong>throw</strong>.</div><div class="t-redactor__text"><strong>try</strong> — блок try инкапсулирует проверяемый на исключение регион кода. Если любая строка кода в этом блоке вызывает срабатывание исключения, то исключение будет обработано соответствующим блоком <strong>catch</strong>.</div><div class="t-redactor__text"><strong>catch</strong> — когда происходит исключение, запускается блок кода catch. Это то место, где можно обработать исключения и предпринять адекватные для него действия, например записать событие ошибки в лог, прервать работу программы, или может просто игнорировать исключение (когда блок catch пустой).</div><div class="t-redactor__text"><strong>finally</strong> — блок finally позволяет выполнить какой-то определенный код приложения, если исключение сработало, или если оно не сработало.</div><div class="t-redactor__text">Часто блок finally опускается, когда обработка исключения подразумевает нормальное дальнейшее выполнение программы — потому блок finally может быть просто заменен обычным кодом, который следует за блоками try и catch.</div><div class="t-redactor__text"><strong>throw</strong> — ключевое слово throw используется для реального создания нового исключения, в результате чего выполнение кода попадет в соответствующие блоки catch и finally.</div><h4  class="t-redactor__h4">Пример обработки деления на ноль</h4><div class="t-redactor__text">Если нужный блок catch не найден, то при возникновении исключения программа аварийно завершает свое выполнение. Рассмотрим код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int x = 5;
int y = 0;
int z = x / y;
Console.WriteLine($&quot;Результат: {z}&quot;);
Console.WriteLine(&quot;Конец программы&quot;);
Console.Read();</code></pre><div class="t-redactor__text">Чтобы избежать аварийного завершения программы, следует использовать для обработки исключений конструкцию try…catch:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">            try
            {
                int x = 5;
                int y = 0;
                int z = x / y;
                Console.WriteLine($&quot;Результат: {z}&quot;);
            }
            catch
            {
                Console.WriteLine(&quot;Возникло исключение!&quot;);
            }
            
            Console.WriteLine(&quot;Конец программы&quot;);
            Console.Read();</code></pre><div class="t-redactor__text">На языке C# ключевые слова try и catch используются для определения блока проверяемого кода (блок try catch). Блок try catch помещается вокруг кода, который потенциально может выбросить исключение.</div><div class="t-redactor__text">Если произошло исключение, то этот блок try catch обработает исключение, гарантируя тем самым, что приложение не выдаст ошибку необработанного исключения (unhandled exception), ошибки пользователя, и эта ошибка не разрушит процесс выполнения приложения.</div><h4  class="t-redactor__h4">Обработка исключений и условные конструкции</h4><div class="t-redactor__text">Ряд исключительных ситуаций может быть предвиден разработчиком. Например, пусть программа предусматривает ввод числа и вывод его квадрата:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">    Console.WriteLine(«Введите число»);
    int x = Int32.Parse(Console.ReadLine());
 
    x *= x;
    Console.WriteLine(«Квадрат числа: » + x);
    Console.Read();</code></pre><div class="t-redactor__text">Если пользователь введет не число, а строку, какие-то другие символы, то программа выпадет в ошибку.<br /><br />С одной стороны, здесь как раз та ситуация, когда можно применить блок try..catch, чтобы обработать возможную ошибку. Однако гораздо оптимальнее было бы проверить допустимость преобразования:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">            Console.WriteLine(&quot;Введите число&quot;);
            int x;
            string input = Console.ReadLine();
            if (Int32.TryParse(input, out x))
            {
                x *= x;
                Console.WriteLine(&quot;Квадрат числа: &quot; + x);
            }
            else
            {
                Console.WriteLine(&quot;Некорректный ввод&quot;);
            }
            Console.Read();</code></pre><div class="t-redactor__text">Метод Int32.TryParse() возвращает true, если преобразование можно осуществить, и false — если нельзя.</div><h4  class="t-redactor__h4">Фильтры исключений</h4><div class="t-redactor__text">Фильтры исключений позволяют обрабатывать исключения в зависимости от определенных условий. Для их применения после выражения <strong>catch</strong> идет выражение <strong>when</strong>, после которого в скобках указывается условие:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">catch when(условие)
{
     
}</code></pre><div class="t-redactor__text">В этом случае обработка исключения в блоке <strong>catch</strong> производится только в том случае, если условие в выражении <strong>when</strong> истинно. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">            int x = 1;
            int y = 0;

            try
            {
                int result = x / y;
            }
            catch (DivideByZeroException) when (y == 0 &amp;&amp; x == 0)
            {
                Console.WriteLine(&quot;y не должен быть равен 0&quot;);
            }
            catch (DivideByZeroException ex)
            {
                Console.WriteLine(ex.Message);
            }</code></pre><div class="t-redactor__text">В данном случае будет выброшено исключение, так как y=0. Здесь два блока catch, и оба они обрабатывают исключения типа <strong>DivideByZeroException</strong>, то есть по сути все исключения, генерируемые при делении на ноль.</div><div class="t-redactor__text">Но поскольку для первого блока указано условие <strong>y == 0 &amp;&amp; x == 0</strong>, то оно не будет обрабатывать исключение — условие, указанное после оператора when возвращает false.</div><div class="t-redactor__text">Поэтому CLR будет дальше искать соответствующие блоки catch далее и для обработки исключения выберет второй блок catch. В итоге если мы уберем второй блок catch, то исключение вообще не будет обрабатываться.</div><h4  class="t-redactor__h4">Класс Exception</h4><div class="t-redactor__text">Базовым для всех типов исключений является тип <strong>Exception</strong>. Этот тип определяет ряд свойств, с помощью которых можно получить информацию об исключении.</div><div class="t-redactor__text"><ul><li>InnerException: хранит информацию об исключении, которое послужило причиной текущего исключения;</li><li>Message: хранит сообщение об исключении, текст ошибки;</li><li>Source: хранит имя объекта или сборки, которое вызвало исключение;</li><li>StackTrace: возвращает строковое представление стека вызовов, которые привели к возникновению исключения;</li><li>TargetSite: возвращает метод, в котором и было вызвано исключение.</li></ul></div><div class="t-redactor__text">Например, обработаем исключения типа Exception:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">            try
            {
                int x = 5;
                int y = x / 0;
                Console.WriteLine($&quot;Результат: {y}&quot;);
            }
            catch (Exception ex)
            {
                Console.WriteLine($&quot;Исключение: {ex.Message}&quot;);
                Console.WriteLine($&quot;Метод: {ex.TargetSite}&quot;);
                Console.WriteLine($&quot;Трассировка стека: {ex.StackTrace}&quot;);
            }

            Console.Read();</code></pre><img src="https://static.tildacdn.com/tild3237-6235-4138-b435-323861326565/si-sharp_obrabotka_i.png"><h4  class="t-redactor__h4">Ключевое слово finally</h4><div class="t-redactor__text">Если нужно определить код, который будет выполняться после выхода из блока try/catch, тогда нужно использовать блок finally. Использование этого блока гарантирует, что некоторый набор операторов будет выполняться всегда, независимо от того, возникло исключение (любого типа) или нет.</div><div class="t-redactor__text">Блок finally выполняется и в том случае, если любой код в блоке try или в связанном с ним блоках catch приводит к возврату их метода. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">            int x = 10, y = 0, z;
            try
            {
                z = x / y;
            }
            catch (DivideByZeroException)
            {
                Console.WriteLine(&quot;Деление на 0&quot;);
            }
            finally
            {
                Console.WriteLine(&quot;Конец программы&quot;);
            }</code></pre><h4  class="t-redactor__h4">Генерация исключения и оператор throw</h4><div class="t-redactor__text">Язык C# позволяет генерировать исключения вручную с помощью оператора <strong>throw</strong>. То есть с помощью этого оператора можно создать исключение и вызвать его в процессе выполнения.</div><div class="t-redactor__text">Например, в нашей программе происходит ввод строки, и мы хотим, чтобы, если длина строки будет больше 8 символов, возникало исключение:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">            try
            {
                Console.Write(&quot;Введите строку: &quot;);
                string message = Console.ReadLine();
                if (message.Length &gt; 8)
                {
                    throw new Exception(&quot;Длина строки больше 8 символов&quot;);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine($&quot;Ошибка: {e.Message}&quot;);
            }
            Console.Read();</code></pre><div class="t-redactor__text">Подобным образом можно генерировать исключения в любом месте программы. Но существует также и другая форма использования оператора throw, когда после данного оператора не указывается объект исключения. В подобном виде оператор throw может использоваться только в блоке catch.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">            try
            {
                try
                {
                    Console.Write(&quot;Введите строку: &quot;);
                    string message = Console.ReadLine();
                    if (message.Length &gt; 8)
                    {
                        throw new Exception(&quot;Длина строки больше 8 символов&quot;);
                    }
                }
                catch
                {
                    Console.WriteLine(&quot;Возникло исключение&quot;);
                    throw;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Основы ООП в языке C#</title>
			<link>https://www.easyitway.com/tpost/hiky15mp31-osnovi-oop-v-yazike-c</link>
			<amplink>https://www.easyitway.com/tpost/hiky15mp31-osnovi-oop-v-yazike-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 18:38:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Класс можно считать шаблоном, по которому определяется форма объекта. В этом шаблоне указываются данные и код, который будет работать с этими данными – поля и методы.</description>
			<turbo:content>
<![CDATA[<header><h1>Основы ООП в языке C#</h1></header><div class="t-redactor__text">В статье «Основы ООП» мы уже рассказывали что такое объектно-ориентированное программирование. Если вы новичок, тогда советуем изучить эту статью. В этой же статье пойдет разговор об основах ООП в языке C#.</div><h4  class="t-redactor__h4">Класс</h4><div class="t-redactor__text">Класс можно считать шаблоном, по которому определяется форма объекта. В этом шаблоне указываются данные и код, который будет работать с этими данными – поля и методы.</div><div class="t-redactor__text">В C# используется спецификация класса для построения объектов, которые являются экземплярами класса.</div><div class="t-redactor__text">Для объявления класса используется ключевое слово <strong>class:</strong></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class имя_класса {
    // Объявление переменных экземпляра.
    access type var1; // задает тип доступа, например, public
    access type var2;
    //…
    access type varN;

    // Объявление методов.
    access return_type method1 ([args]) {
          // тело метода
     }
     access return_type method2 ([args]) {
           // тело метода
     }
//….
access return_type method([args]) {
          // тело метода
     }
}</code></pre><h4  class="t-redactor__h4">Конструкторы</h4><div class="t-redactor__text">Основная задача конструктора – инициализировать объект при его создании. Общая форма определения конструктора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">access имя_класса(args) {
 // тело цикла 
} </code></pre><div class="t-redactor__text">Спецификатор доступа (access) обычно указывается public, поскольку конструкторы зачастую вызываются в классе, а вот список параметров args может быть ка пустым, так и состоящим из одного или нескольких параметров. Имя конструктора должно совпадать с именем класса.<br /><br />Конструктор может принимать один или несколько параметров. В конструктор параметры вводятся таким же образом, как и в метод. Для этого достаточно объявить их в скобках после имени конструктора. Пример применения конструктора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Human
        {
            public string Name;
            public byte Age;

            // Устанавливаем параметры
            public Human(string n, byte a)
            {
                Name = n;
                Age = a;
            }

            public void GetInfo()
            {

                Console.WriteLine(&quot;Name: {0}\nAge: {1}&quot;, Name, Age);
            }

            // Создаем объект
            class Program
            {
                static void Main(string[] args)
                {
                    Human ex = new Human(&quot;Viktor&quot;, 25);
                    ex.GetInfo();

                    Console.ReadLine();
                }
            }
        }</code></pre><h4  class="t-redactor__h4">Деструкторы</h4><div class="t-redactor__text">В языке C# имеется возможность определить метод, который будет вызываться непосредственно перед окончательным уничтожением объекта системой «сборки мусора». Такой метод называется деструктором и может использоваться в ряде особых случаев, чтобы гарантировать четкое окончание срока действия объекта.</div><div class="t-redactor__text">Например, деструктор может быть использован для гарантированного освобождения системного ресурса, задействованного освобождаемым объектом.</div><div class="t-redactor__text">Синтаксис определения деструктора такой же, как и конструктора, но именем класса указывается <strong>~</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">access ~имя_класса(args) {
 // тело конструктора
}</code></pre><div class="t-redactor__text">Обычно деструкторы не нужны, поскольку все используемые объектом ресурсы автоматически освобождаются при его уничтожении.<br /><br />Пример использования деструкторов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> class Human
    {
        int k;

        public Human(int i)
        {
            k = i;
        }

        // Деструктор
        ~Human()
        {
            Console.WriteLine(&quot;Объект {0} уничтожен&quot;, k);
        }

        // Метод создающий и тут же уничтожающий объект
        public void objectGenerator(int i)
        {
            Human ob = new Human(i);
        }
    }
 class Program
    {
        static void Main()
        {
            int i = 1;
            Human obj = new Human(0);

            for (; i &lt; 120000; i++)
            {
                obj.objectGenerator(i);
            }

            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(&quot;\nКонец&quot;);

            Console.ReadLine();
        }
    }</code></pre><h4  class="t-redactor__h4">Ключевое слово this</h4><div class="t-redactor__text">В языке C# имеется ключевое слово this, которое обеспечивает доступ к текущему экземпляру класса. Одно из возможных применений ключевого слова this состоит в том, чтобы разрешать неоднозначность контекста, которая может возникнуть, когда входящий параметр назван так же, как поле данных данного типа.</div><div class="t-redactor__text">Конечно, чтобы такой неоднозначности не было, лучше придерживаться правил именования переменных, параметров, полей и т.д.</div><div class="t-redactor__text">Чтобы продемонстрировать наглядное применение ключевого слова this, давайте рассмотрим следующий пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> class Human
    {
        public char ch;

        // 2 метода использующие входной параметр ch, при
        // этом во втором методе используется ключевое слово this
        public void Method1(char ch)
        {
            ch = ch;
        }

        public void Method2(char ch)
        {
            this.ch = ch;
        }
    }
 class Program
    {
        static void Main()
        {
            char myCH = &#039;A&#039;;
            Console.WriteLine(&quot;Исходный символ {0}&quot;, myCH);

            Human obj = new Human();

            obj.Method1(myCH);
            Console.WriteLine(&quot;Использование метода без ключевого слова this: {0}&quot;, obj.ch);
            obj.Method2(myCH);
            Console.WriteLine(&quot;Использование метода c ключевым словом this: {0}&quot;, obj.ch);
            Console.ReadLine();
        }
    }</code></pre><h4  class="t-redactor__h4">Доступ к членам класса</h4><div class="t-redactor__text">Существует два типа членов класса – публичные (<strong>public</strong>) и приватные (<strong>private</strong>). Доступ к открытому члену возможен из кода, существующего за пределами класса. А доступ к приватному члену возможен только методам, которые определены в самом классе. Приватные члены позволяют организовать управление доступом.</div><div class="t-redactor__text">Кроме известных спецификаторов (модификаторов) доступа <strong>public</strong> и <strong>private</strong>, в C# поддерживаются еще два модификатора – <strong>protected</strong> и <strong>internal</strong>.</div><div class="t-redactor__text">Спецификатор <strong>protected</strong> означает член класса, доступ к которому открыт в пределах иерархии классов. Спецификатор <strong>internal</strong> используется в основном для сборок и начинающим программистам он не нужен.</div><h4  class="t-redactor__h4">Модификаторы параметров</h4><img src="https://static.tildacdn.com/tild6364-3638-4139-b031-613937306131/osnovy_oop_v_si-char.png"><h4  class="t-redactor__h4">Модификатор out</h4><div class="t-redactor__text">Модификатор служит только для передачи значения за пределы метода. Поэтому переменной, используемой в качестве параметра <strong>out</strong>, не нужно (да и бесполезно) присваивать какое-то значение. Более того, в методе параметр out считается неинициализированным, т.е. предполагается, что у него отсутствует первоначальное значение.</div><div class="t-redactor__text">Это означает, что значение должно быть присвоено данному параметру в методе до его завершения. Следовательно, после вызова метода параметр out будет содержать некоторое значение. Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> class Program
    {
        // Метод возвращающий целую и дробную части
        // числа, квадрат и корень числа
        static int TrNumber(double d, out double dr, out double sqr, out double sqrt)
        {
            int i = (int)d;
            dr = d - i;
            sqr = d * d;
            sqrt = Math.Sqrt(d);

            return i;
        }

        static void Main()
        {
            int i;
            double myDr, mySqr, mySqrt, myD = 13.987;
            i = TrNumber(myD, out myDr, out mySqr, out mySqrt);

            Console.WriteLine(&quot;Исходное число: {0}\nЦелая часть числа: {1}\nДробная часть числа: {2}\nКвадрат числа: {3}\nКвадратный корень числа: {4}&quot;, myD, i, myDr, mySqr, mySqrt);

            Console.ReadLine();
        }
    }</code></pre><h4  class="t-redactor__h4">Модификатор ref</h4><div class="t-redactor__text">Модификатор параметра <strong>ref</strong> принудительно организует вызов по ссылке, а не по значению. Этот модификатор указывается как при объявлении, так и при вызове метода.</div><div class="t-redactor__text">Параметры, сопровождаемые таким модификатором, называются ссылочными и применяются, когда нужно позволить методу выполнять операции и обычно также изменять значения различных элементов данных, объявляемых в вызывающем коде (например, в процедуре сортировки или обмена).</div><h4  class="t-redactor__h4">Модификатор params</h4><div class="t-redactor__text">В C# поддерживается использование массивов параметров за счет применения ключевого слова <strong>params</strong>. Ключевое слово <strong>params</strong> позволяет передавать методу переменное количество аргументов одного типа в виде единственного логического параметра.</div><div class="t-redactor__text">Аргументы, помеченные ключевым словом <strong>params</strong>, могут обрабатываться, если вызывающий код на их месте передает строго типизированный массив или разделенный запятыми список элементов.</div><h4  class="t-redactor__h4">Рекурсия</h4><div class="t-redactor__text">В C# допускается, чтобы метод вызывал самого себя. Этот процесс называется рекурсией, а метод, вызывающий самого себя, — рекурсивным. Вообще, рекурсия представляет собой процесс, в ходе которого нечто определяет само себя.</div><div class="t-redactor__text">Рекурсивный метод отличается главным образом тем, что он содержит оператор, в котором этот метод вызывает самого себя. Рекурсия является эффективным механизмом управления программой.</div><div class="t-redactor__text">Классическим примером рекурсии служит вычисление факториала числа:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Program
    {
        // Рекурсивный метод
        static int factorial(int i)
        {
            int result;

            if (i == 1)
                return 1;
            result = factorial(i - 1) * i;
            return result;
        }
 static void Main(string[] args)
        {
        label1:
            Console.WriteLine(&quot;Введите число: &quot;);
            try
            {
                int i = int.Parse(Console.ReadLine());
                Console.WriteLine(&quot;{0}! = {1}&quot;, i, factorial(i));
            }
            catch (FormatException)
            {
                Console.WriteLine(&quot;Некорректное число&quot;);
                goto label1;
            }

            Console.ReadLine();
        }
    }</code></pre><div class="t-redactor__text">Главное преимущество рекурсии заключается в том, что она позволяет реализовать некоторые алгоритмы яснее и проще, чем итерационным способом.</div><h4  class="t-redactor__h4">Ключевое слово static</h4><div class="t-redactor__text">Если член класса объявляется как <strong>static</strong>, то он становится доступным до создания любых объектов своего класса и без ссылки на какой-нибудь объект. С помощью ключевого слова static можно объявлять как переменные, так и методы.</div><div class="t-redactor__text">Наиболее характерным примером члена типа <strong>static</strong> служит метод <strong>Main()</strong>, который объявляется таковым потому, что он должен вызываться операционной системой в самом начале выполняемой программы.</div><div class="t-redactor__text">Для того чтобы воспользоваться членом типа <strong>static</strong> за пределами класса, достаточно указать имя этого класса с оператором-точкой. Но создавать объект для этого не нужно. В действительности член типа <strong>static</strong> оказывается доступным не по ссылке на объект, а по имени своего класса.</div><div class="t-redactor__text">Переменные, объявляемые как <strong>static</strong>, являются глобальными. Когда же объекты объявляются в своем классе, то копия переменной типа <strong>static</strong> не создается. Вместо этого все экземпляры класса совместно пользуются одной и той же переменной типа <strong>static</strong>.</div><h4  class="t-redactor__h4">Индексаторы</h4><div class="t-redactor__text">В C# имеется возможность проектировать специальные классы и структуры, которые могут быть индексированы подобно стандартному массиву, посредством определения индексатора.</div><div class="t-redactor__text">Это конкретное языковое средство наиболее полезно при создании специальных типов коллекций (обобщенных и необобщенных). Индексаторы могут быть одно- или многомерными. Многомерные используются редко.</div><h4  class="t-redactor__h4">Одномерные индексаторы</h4><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> тип_элемента this[int индекс]
    {
        // Аксессор для получения данных,
        get
        {
            // Возврат значения, которое определяет индекс.
        }
        // Аксессор для установки данных,
        set
        {
            // Установка значения, которое определяет индекс.
        }
    }</code></pre><div class="t-redactor__text">1. тип_элемента обозначает конкретный тип элемента индексатора. Следовательно, у каждого элемента, доступного с помощью индексатора, должен быть определенный тип_элемента. Этот тип соответствует типу элемента массива.<br /><br />2. Параметр индекс получает конкретный индекс элемента, к которому осуществляется доступ. Формально этот параметр совсем не обязательно должен иметь тип int, но поскольку индексаторы, как правило, применяются для индексирования массивов, то чаще всего используется целочисленный тип данного параметра.<br /><br />Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class MyArr
    {
        int[] arr;
        public int Length;

        public MyArr(int Size)
        {
            arr = new int[Size];
            Length = Size;
        }

        // Создаем простейший индексатор
        public int this[int index]
        {
            set
            {
                arr[index] = value;
            }

            get
            {
                return arr[index];
            }
        }
    }
 class Program
    {
        static void Main()
        {
            MyArr arr1 = new MyArr(Size: 5);
            Random ran = new Random();

            // Инициализируем каждый индекс экземпляра класса arr1
            for (int i = 0; i &lt; arr1.Length; i++)
            {
                arr1[i] = ran.Next(1, 100);
                Console.Write(&quot;{0}\t&quot;, arr1[i]);
            }

            Console.ReadLine();
        }
    }</code></pre><h4  class="t-redactor__h4">Свойства</h4><div class="t-redactor__text">Свойства очень похожи на индексаторы. В частности, свойство состоит из имени и аксессоров <strong>get</strong> и <strong>set</strong>. Аксессоры служат для получения и установки значения переменной.</div><div class="t-redactor__text">Главное преимущество свойства заключается в том, что его имя может быть использовано в выражениях и операторах присваивания аналогично имени обычной переменной, но в действительности при обращении к свойству по имени автоматически вызываются его аксессоры get и set. Синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> тип имя
    {
        get
        {
            // код аксессора для чтения из поля
        }

        set
        {
            // код аксессора для записи в поле
        }
    }</code></pre><div class="t-redactor__text">где тип обозначает конкретный тип свойства, например int, а имя — присваиваемое свойству имя. Как только свойство будет определено, любое обращение к свойству по имени приведет к автоматическому вызову соответствующего аксессора. Кроме того, аксессор set принимает неявный параметр value, который содержит значение, присваиваемое свойству.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Создание графического калькулятора</title>
			<link>https://www.easyitway.com/tpost/xhj002b391-sozdanie-graficheskogo-kalkulyatora</link>
			<amplink>https://www.easyitway.com/tpost/xhj002b391-sozdanie-graficheskogo-kalkulyatora?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 20:02:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>В статье «Делаем консольный калькулятор.» мы создавали небольшой калькулятор, который работает в консоли. В этой статье пришло время научиться создавать графический калькулятор на языке C# с помощью Windows Forms.</description>
			<turbo:content>
<![CDATA[<header><h1>Создание графического калькулятора</h1></header><div class="t-redactor__text">В статье «Делаем консольный калькулятор.» мы создавали небольшой калькулятор, который работает в консоли. В этой статье пришло время научиться создавать графический калькулятор на языке C# с помощью Windows Forms.<br /><br />Сам по себе калькулятор довольно прост, но если вы совсем новичок в создании подобных приложений, тогда будет посложнее. Разработку калькулятора начнем с разработки формы (Windows Forms) приложения. Запускаем Visual Studio и создаем проект:</div><img src="https://static.tildacdn.com/tild3561-3565-4237-b839-366337386463/graf_calc_c-sharp_2.png"><div class="t-redactor__text">Интерфейс созданного проекта должен выглядеть так:</div><img src="https://static.tildacdn.com/tild3330-6161-4039-a539-313962646336/graf_calc_c-sharp_3-.png"><div class="t-redactor__text">На интерфейсе мы видим: слева панель элементов для нашей формы, справа обозреватель решений и свойства выбранной формы/элемента и по середине виден сам конструктор с формой (по умолчанию он имеет имя «Form1»).<br /><br />На форму нужно поместить кнопки, текстовое поле, а также надпись. Надпись нужна, чтобы пользователь видел первый операнд. Когда введет нужную цифру, нажмет кнопку, например «+», надпись будет содержать введенное значение.<br /><br />Все нужные элементы можно найти слева в панели элементов. Чтобы найти текстовое поле просто введите в поиске <strong>«textBox»</strong> и с помощью мышки перенесите его на свою форму. Для добавления кнопок просто введите в поиске <strong>«Button»</strong> и перенесите нужное количество кнопок на свою форму. Также добавьте на <strong>«ListBox»</strong> один пустой <strong>«Label»</strong>:</div><img src="https://static.tildacdn.com/tild3530-6266-4265-b666-383634316438/graf_calc_c-sharp_4.png"><div class="t-redactor__text">Изменять свойства формы можно с помощью окна <strong>«Свойства»</strong> справа внизу. Для этого нажмите на нужную форму, например <strong>«Button1»</strong> и поменяйте ему свойство <strong>«text»</strong> на <strong>«С»</strong>:</div><img src="https://static.tildacdn.com/tild6566-3231-4232-b230-323761326133/graf_calc_c-sharp_5.png"><div class="t-redactor__text">Добавьте все нужные кнопки. Измените свойство <strong>«Font»</strong> для элементов TextBox и Label. Цвет кнопок и имя программы меняйте на свое усмотрение.</div><img src="https://static.tildacdn.com/tild3663-6337-4332-b636-306237653435/graf_calc_c-sharp_6.png"><div class="t-redactor__text">С помощью <strong>«MultiLine»</strong> измените ширину элемента TextBox:</div><img src="https://static.tildacdn.com/tild3365-3139-4931-a330-353766343365/graf_calc_c-sharp_7.png"><div class="t-redactor__text">В итоге у нас получилось 19 кнопок Button, 1 TextBox и ещё 1 пустой Label:</div><img src="https://static.tildacdn.com/tild6365-3466-4038-b064-633066613430/graf_calc_c-sharp_8.png"><div class="t-redactor__text">Теперь посмотрим, как работает калькулятор. Мы используем четыре члена класса. Напишем их в самое начало программы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">    float a, b;
    int oper;
    bool znak = true;</code></pre><div class="t-redactor__text">Первые два — это наши операнды, a и b. Третий — это выбранный пользователем оператор. Четвертый — признак знака. Запрограммируем обработчик кнопки <strong>«+/-«</strong>, изменяющий знак числа. Для этого в форме нажмите на нужную кнопку два раза. Visual Studio переведет вас в нужную секцию кода:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">        private void button3_Click(object sender, EventArgs e)
        {

        }</code></pre><div class="t-redactor__text">В фигурных скобках пишем код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">            if (znak == true)
            {
                textBox1.Text = &quot;-&quot; + textBox1.Text;
                znak = false;
            }
            else if (znak==false)
            {
                textBox1.Text = textBox1.Text.Replace(&quot;-&quot;, &quot;&quot;);
                znak = true;
            }</code></pre><div class="t-redactor__text">Если znak=true, мы меняем знак операнда в textBox1, а если false, то знак числа удаляется из текстового поля.<br /><br />Для каждой цифровой кнопки обработчик будет следующий:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Обработчик цифровой кнопки &quot;0&quot;

textBox1.Text = textBox1.Text + 0;</code></pre><div class="t-redactor__text">На основе этого кода повесьте на цифровые кнопки от 0 до 9 обработчик событий. Нажмите на нужную цифровую кнопку и впишите код.<br /><br />Обработчик кнопки операторов «+, -, *, /». Нажмите на нужную кнопку с оператором и впишите код.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">            // Обработчик оператора &quot;+&quot;

            a = float.Parse(textBox1.Text);
            textBox1.Clear();
            oper = 1;
            label1.Text = a.ToString() + &quot;+&quot;;
            znak = true;</code></pre><div class="t-redactor__text">В данном коде мы в переменную <strong>«a»</strong> записываем значение из текстового поля, попутно преобразовав его в float посредством вызова метода float.Parse(). Далее мы очищаем текстовое поле, чтобы можно было вводить второй операнд. oper = 1 означает присвоение номера оператора (для + — это 1 и так далее по увеличению). Далее заносим в надпись информацию об операнде и операторе.<br /><br />Обработчик кнопки <strong>«,»</strong> добавляет запятую в текстовое поле:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">textBox1.Text = textBox1.Text + &quot;,&quot;;</code></pre><div class="t-redactor__text">Далее нам понадобится создать функцию, которая будет применять нужные нам математические операции к числам. Назовём её calculate. Но перед этим мы кликнем дважды на кнопку <strong>«=»</strong> на форме и в коде к ней мы запишем:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// вызов функции
calculate();
label1.Text = &quot;&quot;;</code></pre><div class="t-redactor__text">При нажатии пользователем на кнопку <strong>«=»</strong> выполнится функция подсчёта calculate, и, заодно, очистится Label, так как результат мы в будущем коде выведем в TextBox.<br /><br />Функция calculate:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">        private void calculate()
        {
            switch (oper)
            {
                case 1:
                    b = a + float.Parse(textBox1.Text);
                    textBox1.Text = b.ToString();
                    break;
                case 2:
                    b = a - float.Parse(textBox1.Text);
                    textBox1.Text = b.ToString();
                    break;
                case 3:
                    b = a * float.Parse(textBox1.Text);
                    textBox1.Text = b.ToString();
                    break;
                case 4:

                    if (float.Parse(textBox1.Text) == 0)
                    { textBox1.Text = &quot;Делить на 0 нельзя!&quot;; }
                    else
                    {
                        b = a / float.Parse(textBox1.Text);
                        textBox1.Text = b.ToString();
                    }
                    break;
                default:
                    break;
            }

        }</code></pre><div class="t-redactor__text">Здесь мы используем конструкцию <a href="https://it-black.ru/konstruktsii-prinyatiya-resheniy-v-si-charp/" target="_blank" rel="noreferrer noopener">switch-case</a>. Нам осталось обработать две кнопки:<br /><br />Обработчик кнопки <strong>«С»</strong>. Данная кнопка будет очищать все записи из TextBox’a и Label’a. Код кнопки:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">textBox1.Text = &quot;&quot;;
label1.Text = &quot;&quot;;</code></pre><div class="t-redactor__text">Кнопка <strong>«&lt;–"</strong> будет удалять последнюю цифру записанного в TextBox’e числа. Код кнопки:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">            int lenght = textBox1.Text.Length - 1;
            string text = textBox1.Text;
            textBox1.Clear();
            for (int i = 0; i &lt; lenght; i++)
            {
                textBox1.Text = textBox1.Text + text[i];
            }</code></pre><div class="t-redactor__text">Мы вводим новую переменную <strong>lenght</strong> целочисленного типа и записываем в неё количество символов в <strong>TextBox’e</strong> минус один символ.<br /><br />Также мы вводим новую переменную <strong>text</strong>, в которую полностью заносим текст из <strong>TextBox’а</strong>. Затем мы очищаем TextBox и вводим цикл <strong>for</strong>, через который записываем в <strong>TextBox</strong> строку <strong>text</strong>, но уже на символ короче.<br /><br />Теперь наш графический калькулятор готов к работе. Скомпилируйте программу, нажав на <strong>«Пуск»</strong>. Если все заработало и калькулятор делает вычисления, тогда вы все правильно сделали и теперь можете пользоваться свомим личным графическим калькулятором.</div><img src="https://static.tildacdn.com/tild6437-3538-4835-b030-616434646266/graf_calc_c-sharp_9.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Разработка программы «Конвертер валют»</title>
			<link>https://www.easyitway.com/tpost/jsbz36ujo1-razrabotka-programmi-konverter-valyut</link>
			<amplink>https://www.easyitway.com/tpost/jsbz36ujo1-razrabotka-programmi-konverter-valyut?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 20:08:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Разработку приложения начнем с разработки формы (Windows Forms) приложения. Запускаем Visual Studio и создаем проект:</description>
			<turbo:content>
<![CDATA[<header><h1>Разработка программы «Конвертер валют»</h1></header><div class="t-redactor__text">В этой статье мы хотим написать реальное приложение «Конвертер валют», который будет получать курсы валют у <a href="https://www.google.com/" target="_blank" rel="noreferrer noopener">Google</a>.<br /><br />Разработку приложения начнем с разработки формы (Windows Forms) приложения. Запускаем <a href="https://it-black.ru/razvertyvaniye-net-i-pervaya-programma/" target="_blank" rel="noreferrer noopener">Visual Studio</a> и создаем проект:</div><img src="https://static.tildacdn.com/tild3739-6637-4863-b466-656132616161/convert_valyte_si_ch.png"><div class="t-redactor__text">В статье «Создание графического калькулятора.» мы подробно рассматривали интерфейс созданного проекта. Советую зайти, изучить и продолжить разработку нашего приложения.<br /><br />На форму мы поместим 1 <strong>TextBox</strong>, 3 <strong>Label’a</strong>, 2 <strong>ListBox’a</strong>, 1 <strong>Button</strong> в верхней части формы. Также мы добавили <strong>WebBrowser</strong>. Он позволяет получить содержимое любой web-страницы. Используя его метод Navigate(), можно загружать любую страницу. И в нижней части у нас имеется Panel. Итоговая форма приложения:</div><img src="https://static.tildacdn.com/tild3232-6162-4963-b438-356635613432/convert_valyte_si_ch.png"><div class="t-redactor__text">В оба <strong>ListBox’a</strong> мы заносим названия валют. Для этого мы нажимаем на стрелочку в правом углу ListBox’a и в появившейся панели нажимаем «Изменить элементы…»:</div><img src="https://static.tildacdn.com/tild6661-6632-4337-a439-303332633934/convert_valyte_si_ch.png"><div class="t-redactor__text">В остальных элементах просто меняем свойство «text» на нужное. Например:</div><img src="https://static.tildacdn.com/tild6333-3564-4730-b639-326634333932/convert_valyte_si_ch.png"><div class="t-redactor__text">Форматирование текста произведите на свое усмотрение.<br /><br />В TextBox’e, обозначаемом количеством переводимой валюты, мы заменили свойство Text, вписали туда цифру <strong>«1»</strong>. При запуске программы у нас в нём автоматически будет стоять единица для удобства пользователя, чтобы он лишний раз не заполнял эту графу, если ему захочется узнать цену одной единицы валюты относительно другой или внести свою цифру.<br /><br />Panel нам нужна чтобы скрыть что находится выше и ниже её на странице поисковика. Для этого нужно отрегулировать WebBrowser.<br /><br />Регулировать положение WebBrowser’a надо будет до тех пор, пока при запросе в Panel не будут получаться примерно такие виды, чтобы не было верха и не было низа от поисковика:</div><img src="https://static.tildacdn.com/tild3664-6466-4532-b632-376663386439/convert_valyte_si_ch.png"><img src="https://static.tildacdn.com/tild3030-3364-4331-b533-613338326139/convert_valyte_si_ch.png"><div class="t-redactor__text">В свойствах WebBrowser отключаем полосы прокрутки (скроллбары), чтобы пользователь не мог «листать» содержимое нашего WebBrowser’a вверх и вниз:</div><img src="https://static.tildacdn.com/tild6434-3063-4533-b535-613765383161/convert_valyte_si_ch.png"><div class="t-redactor__text">На этом внешняя оболочка готова. Теперь приступаем к коду. Щёлкаем по Button’у дважды и переносимся в тело кода. Для начала поднимемся чуть выше в тело под наименованием public Form1(). Внутри него мы напишем следующее:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">        public Form1()
        {
            InitializeComponent();
            listBox1.SelectedIndex = 0;
            listBox2.SelectedIndex = 1;
        }</code></pre><div class="t-redactor__text">Здесь мы избегаем ошибки программы, когда ни в ListBox’ах, ни в Textbox не будет ничего, так как теперь по-любому в ListBox’ах что-то будет выбрано. А во-вторых, мы облегчаем пользование программой человеку, если он решил выполнить перевод из рублей в доллары (а чаще всего так и бывает). Под индексом <strong>«0»</strong> у нас в ListBox’е записано первое значение <strong>«RUB»</strong>, под индексом <strong>«1»</strong> – второе значение <strong>«USD»</strong>.<br /><br />Далее возвращаемся к нашей кнопки <strong>«Перевести»</strong> и пишем для него обработчик событий:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">private void button1_Click(object sender, EventArgs e)
        {
            string from, to;

            from = listBox1.SelectedItem.ToString(); // выбранная валюта в 1 списке
            to = listBox2.SelectedItem.ToString(); // выбранная валюта во 2 списке

            if(from==to)
            {
                MessageBox.Show(&quot;Это одна и та же валюта!&quot;, &quot;Внимание!&quot;);
            }
            else if(textBox1.Text==&quot;&quot;)
            {
                MessageBox.Show(&quot;Введите количество валюты!&quot;, &quot;Внимание!&quot;);
            }
            else
            {
                webBrowser1.Navigate(&quot;https://www.google.ru/search?q=&quot; + textBox1.Text + &quot;&quot; + from + &quot; %D0%B2 &quot; + to);
            }
        }</code></pre><div class="t-redactor__text">Чтобы избежать ошибки программы мы предусматриваем поведение пользователя и проверяем ввод и выбор валюты.<br /><br />В последней строчке кода мы отправляем запрос на перевод валюты в Google. Метод webBrowser1.Navigate загружает ссылку, записанную в скобках, в WebBrowser.<br /><br />На этом наше приложение готово к работе. Скомпилируйте программу, нажав на “Пуск” и попробуйте перевести валюту. Итоговый интерфейс программы:</div><img src="https://static.tildacdn.com/tild3065-3363-4864-b135-373136333132/convert_valyte_si_ch.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Пространство имен System.Net</title>
			<link>https://www.easyitway.com/tpost/289fc452s1-prostranstvo-imen-systemnet</link>
			<amplink>https://www.easyitway.com/tpost/289fc452s1-prostranstvo-imen-systemnet?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 20:13:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>В этой статье коротко поговорим о пространстве имен System.Net и некоторых его классах. В последующих статьях будем рассматривать другие его классы.</description>
			<turbo:content>
<![CDATA[<header><h1>Пространство имен System.Net</h1></header><div class="t-redactor__text">В этой статье коротко поговорим о пространстве имен <strong>System.Net</strong> и некоторых его классах. В последующих статьях будем рассматривать другие его классы.<br /><br />Пространство имён <strong>System.Net</strong> содержит сетевые классы для поиска IP-адресов, сетевой аунтификации, разрешений, отправки и получения данных.</div><h4  class="t-redactor__h4">Поиск имен</h4><div class="t-redactor__text">Для преобразования IP-адресов в символьное имя и обратно используется система доменных имен (DNS). Платформа .NET содержит следующие классы для разрешения имен/IP-адресов:</div><div class="t-redactor__text"><ul><li><strong>Dns</strong> — используется для разрешения символьных имен в IP-адресах и обратно.</li><li><strong>DnsPermission</strong> — представляет разрешение, необходимое для поиска имени.</li><li><strong>DnsPermissionAttribute</strong> — позволяет отмечать сборки, классы и методы, нуждающиеся в полномочиях, определяемых классом DnsPermission.</li></ul></div><div class="t-redactor__text">Обработка IP-адресов производится в классе <strong>IPAddress</strong>. Информация о дополнительных IP-адресах и псевдонимах находится в классе <strong>IPHostEntry</strong>.</div><h4  class="t-redactor__h4">Аутентификация и авторизация</h4><div class="t-redactor__text">Для аутентификации и авторизации используется класс <strong>AuthenticationManager</strong>. Данный класс обращается к этим модулям, чтобы идентифицировать пользователя.</div><div class="t-redactor__text">Модули аутентификации получают информацию запроса и данные о личности пользователя с помощью интерфейса <strong>ICredentials</strong> и возвращают объект Authorization для авторизованных пользователей, которые могут использовать тот или иной ресурс.</div><h4  class="t-redactor__h4">Сетевые запросы</h4><div class="t-redactor__text">Для сетевых запросов используются абстрактные классы <strong>WebRequest</strong> и <strong>WebResponse</strong>. В System.Net имеется несколько специальных реализаций этих классов для HTTP и доступа к файлам: <strong>HttpWebRequest</strong>, <strong>HttpWebResponse</strong>, <strong>FileWebRequest</strong> и <strong>FileWebResponse</strong>.</div><h4  class="t-redactor__h4">Управление соединениями</h4><div class="t-redactor__text">Для управления соединениями используются классы <strong>ServicePoint</strong> и <strong>ServicePointManager</strong>. Для использования сокетов имеется класс <strong>System.Net.Sockets</strong>.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Сокеты в С#</title>
			<link>https://www.easyitway.com/tpost/zlk62gx7r1-soketi-v-s</link>
			<amplink>https://www.easyitway.com/tpost/zlk62gx7r1-soketi-v-s?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 20:14:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>Сокет — это один конец двухстороннего канала связи между двумя программами, работающими в сети. Используя два сокета, можно передавать данные между разными процессами (локальными или удаленными).</description>
			<turbo:content>
<![CDATA[<header><h1>Сокеты в С#</h1></header><div class="t-redactor__text"><strong>Сокет</strong> — это один конец двухстороннего канала связи между двумя программами, работающими в сети. Используя два сокета, можно передавать данные между разными процессами (локальными или удаленными).</div><div class="t-redactor__text">Прежде, чем использовать сокет, его нужно открыть, задав надлежащие разрешения. Как только ресурс открыт, из него можно считывать данные и/или в него можно записывать данные. После его использования нужно вызвать метод Close() для его закрытия. Существует два типа сокетов:</div><h4  class="t-redactor__h4">Потоковый сокет</h4><div class="t-redactor__text">Потоковый сокет — это сокет с установленным соединением, состоящий из потока байтов, который может быть двунаправленным, то есть через такой сокет можно передавать и принимать данные.</div><div class="t-redactor__text">Потоковый сокет гарантирует доставку передаваемых данных в целости и сохранности, он сохраняет последовательность данных. Данные сокеты используют в качестве транспортного протокола <a href="https://it-black.ru/osnovnyye-printsipy-urovnevogo-vzaimodeystviya/" target="_blank" rel="noreferrer noopener">TCP</a>, который контролирует доставку данных.</div><h4  class="t-redactor__h4">Дейтаграмные сокеты</h4><div class="t-redactor__text">Дейтаграмные сокеты не подразумевают установку соединения. Сообщение отправляется указанному сокету и на этом все. Если все хорошо, сообщение будет доставлено получателю, если нет, отправитель даже не узнает об этом.</div><h4  class="t-redactor__h4">Сырные сокеты</h4><div class="t-redactor__text">Задача таких сокетов заключается в обходе механизма, с помощью которого компьютер обрабатывает TCP/IP. Сырой сокет — это сокет, который принимает пакеты, обходит уровни TCP и UDP в стеке TCP/IP и отправляет непосредственно приложению.</div><h4  class="t-redactor__h4">Классы для работы с сокетами</h4><div class="t-redactor__text"><strong>MulticastOption</strong> — устанавливает значение IP-адреса для присоединения к IP-группе или для выхода из нее.</div><div class="t-redactor__text"><strong>NetworkStream</strong> — реализует базовый класс сетевого потока, использующего для отправки и получения данных.</div><div class="t-redactor__text"><strong>Socket</strong> — обеспечивает базовую функциональность приложения сокета.</div><div class="t-redactor__text"><strong>SocketException</strong> — задает исключения при работе с сокетами.</div><div class="t-redactor__text"><strong>TcpClient</strong> — данные класс построен на классе Socket, чтобы обеспечить TCP-обслуживание на более высоком уровне. Он предоставляет несколько методов для отправки и получения данных через сеть.</div><div class="t-redactor__text"><strong>TcpListener</strong> — построен на низкоуровневом классе Socket. Его основное назначение — серверные приложения. Он ожидает входящие запросы на соединения от клиентов и уведомляет приложение о любых соединениях.</div><div class="t-redactor__text"><strong>UdpClient</strong> — содержит методы для отправки и получения данных посредством протокола UDP.</div><div class="t-redactor__text">Основной класс — это класс Socket. Он обеспечивает базовую функциональность для работы с сокетами. На его базе построены некоторые другие классы.</div><h4  class="t-redactor__h4">Члены класса Socket</h4><div class="t-redactor__text"><strong>Accept()</strong> — создает новый сокет для обработки входящего запроса на соединение.</div><div class="t-redactor__text"><strong>AddressFamily</strong> — предоставляет семейство адресов сокета — значения из перечисления Socket.AddressFamily.</div><div class="t-redactor__text"><strong>Available</strong> — возвращает объем доступных для чтения данных.</div><div class="t-redactor__text"><strong>Bind()</strong> — связывает сокет с локальной конечной точкой для ожидания входящих запросов на соединение.</div><div class="t-redactor__text"><strong>Blocking</strong> — дает или устанавливает значение, показывающее находится ли сокет в блокирующем режиме.</div><div class="t-redactor__text"><strong>Close()</strong> — закрывает сокет.</div><div class="t-redactor__text"><strong>Connect()</strong> — устанавливает соединение с удаленным узлом.</div><div class="t-redactor__text"><strong>Connected</strong> — возвращает значение, показывающее, соединен ли сокет с удаленным узлом.</div><div class="t-redactor__text"><strong>GetSocketOption()</strong> — возвращает значение SocketOption.</div><div class="t-redactor__text"><strong>IOControl()</strong> — устанавливает для сокета низкоуровневые режимы работы.</div><div class="t-redactor__text"><strong>Listen()</strong> — помещает сокет в режим прослушивания (ожидания). Используется только на сервере.</div><div class="t-redactor__text"><strong>LocalEndPoint</strong> — сообщает локальную конечную точку.</div><div class="t-redactor__text"><strong>Poll()</strong> — определяет состояние сокета.</div><div class="t-redactor__text"><strong>ProtocolType</strong> — содержит тип протокола сокета.</div><div class="t-redactor__text"><strong>Receive()</strong> — получает данные из сокета.</div><div class="t-redactor__text"><strong>RemoteEndPoint</strong> — сообщает удаленную конечную точку сокета.</div><div class="t-redactor__text"><strong>Select()</strong> — проверяет состояние одного или нескольких сокетов.</div><div class="t-redactor__text"><strong>Send()</strong> — отправляет данные соединенному сокету.</div><div class="t-redactor__text"><strong>SetSocketOption()</strong> — устанавливают опцию сокета.</div><div class="t-redactor__text"><strong>Shutdown()</strong> — запрещает операции отправки и получения данных на сокете.</div><div class="t-redactor__text"><strong>SocketType</strong> — содержит тип сокета.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Создание сканера портов</title>
			<link>https://www.easyitway.com/tpost/0osflajm41-sozdanie-skanera-portov</link>
			<amplink>https://www.easyitway.com/tpost/0osflajm41-sozdanie-skanera-portov?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 20:15:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>В прошлой статье «Сокеты в C#» мы познакомились с сокетами и подробно рассмотрели классы для работы с ними. В этой статье мы разработаем простое приложение «Сканер портов» на языке C#.</description>
			<turbo:content>
<![CDATA[<header><h1>Создание сканера портов</h1></header><div class="t-redactor__text">В прошлой статье «Сокеты в C#» мы познакомились с сокетами и подробно рассмотрели классы для работы с ними. В этой статье мы разработаем простое приложение «Сканер портов» на языке C#.<br /><br />Для начала в Visual Studio создаем Windows Forms проект:</div><img src="https://static.tildacdn.com/tild6363-3730-4563-b165-366238623236/scaner_portov_si_sch.png"><div class="t-redactor__text">Создаем форму приложения:</div><img src="https://static.tildacdn.com/tild6232-3731-4631-a637-386362653066/scaner_portov_si_sch.png"><div class="t-redactor__text">На форму добавляем следующие объекты:<br /><br /><ul><li>1 <strong>TextBox</strong> и меняем в свойствах «Name» на <strong>«tIPAddress»</strong>;</li><li>1 <strong>NumericUpDown</strong> и меняем в свойствах «Name» на <strong>«nBeginPort»</strong>;</li><li>1 <strong>NumericUpDown</strong> и меняем в свойствах «Name» на <strong>«nEndPort»</strong>;</li><li>3 объекта <strong>Label</strong> (IP-адрес, Порты с, по);</li><li>1 <strong>listView</strong> и добавляем ему столбцы (Порт, Открыт, Закрыт):</li></ul></div><img src="https://static.tildacdn.com/tild3038-6662-4461-a536-343131626263/scaner_portov_si_sch.png"><div class="t-redactor__text"><ul><li>1 <strong>ProgressBar</strong>;</li><li>1 <strong>Button</strong> (Сканировать).</li></ul><br />После создания формы приложения нажимаем два раза на кнопку <strong>«Сканировать»</strong> и пишем код приложения:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Net.NetworkInformation;

namespace skaner_port
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        public static ManualResetEvent connectDone = new ManualResetEvent(false);

        private static void ConnectCallback(IAsyncResult ar)
        {
            try
            {
                Socket client = (Socket)ar.AsyncState;
                client.EndConnect(ar);
                connectDone.Set();
            }
            catch (Exception e)
            {

            }
        }

        public void button1_Click(object sender, EventArgs e)
        {
            int BeginPort = Convert.ToInt32(nBeginPort.Value);
            int EndPort = Convert.ToInt32(nEndPort.Value);

            int i;

            progressBar1.Maximum = EndPort - BeginPort + 1;

            progressBar1.Value = 0;
            listView1.Items.Clear();

            IPAddress addr = IPAddress.Parse(tIPAddress.Text);

            for (i = BeginPort; i &lt;= EndPort; i++)
            {
                // Создаем и инициализируем сокет
                IPEndPoint ep = new IPEndPoint(addr, i);
                Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                // Пытаемся соединиться с сервером
                IAsyncResult asyncResult = soc.BeginConnect(ep, new AsyncCallback(ConnectCallback), soc);

                if (!asyncResult.AsyncWaitHandle.WaitOne(30, false))
                {
                    soc.Close();
                    listView1.Items.Add(&quot;Порт &quot; + i.ToString());
                    listView1.Items[i - BeginPort].SubItems.Add(&quot;&quot;);
                    listView1.Items[i - BeginPort].SubItems.Add(&quot;закрыт&quot;);
                    listView1.Items[i - BeginPort].BackColor = Color.Bisque;
                    listView1.Refresh();
                    progressBar1.Value += 1;
                }
                else
                {
                    soc.Close();
                    listView1.Items.Add(&quot;Порт &quot; + i.ToString());
                    listView1.Items[i - BeginPort].SubItems.Add(&quot;открыт&quot;);
                    listView1.Items[i - BeginPort].BackColor = Color.LightGreen;
                    progressBar1.Value += 1;
                }
            }
            progressBar1.Value = 0;
        }
    }
}</code></pre><div class="t-redactor__text">Метод <strong>BeginConnect()</strong> асинхронно пытается подключиться к удаленному хосту. Ему нужно передать метод обратного вызова, который должен вызвать метод <strong>EndConnect()</strong>.<br /><br />Метод <strong>EndConnect()</strong> завершает запрос на соединение и вернет соединенный сокет.<br /><br />Если вы все сделали правильно, тогда скомпилируйте приложение и проверьте на работоспособность свое приложение. Будут вопросы пишите свои комментарии.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Работа с базой данных в C#</title>
			<link>https://www.easyitway.com/tpost/m8m1po5zh1-rabota-s-bazoi-dannih-v-c</link>
			<amplink>https://www.easyitway.com/tpost/m8m1po5zh1-rabota-s-bazoi-dannih-v-c?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 20:18:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>В данной статье мы подробно поговорим о разработке небольшого приложения с помощью Visual Studio базы данных и языка C#. Советуем поэтапно выполнять все инструкции из данной статьи и у Вас получиться разработать свое приложение.</description>
			<turbo:content>
<![CDATA[<header><h1>Работа с базой данных в C#</h1></header><div class="t-redactor__text">В данной статье мы подробно поговорим о разработке небольшого приложения с помощью Visual Studio базы данных и языка C#. Советуем поэтапно выполнять все инструкции из данной статьи и у Вас получиться разработать свое приложение.<br /><br />p.s. На проекте появились платные курсы по разным направлениям. Посмотреть курсы можно ссылке: <a href="https://it-black.ru/course#rec666274827" target="_blank" rel="noreferrer noopener" style="color: rgb(69, 27, 227);">https://it-black.ru/course</a>.</div><h4  class="t-redactor__h4">1. Создание базы данных</h4><div class="t-redactor__text">В качестве СУБД выберем программу <a href="https://officeapplications.net/microsoft-access/" target="_blank" rel="noreferrer noopener">Microsoft Access</a>. Но вы можете использовать и другую базу данных.</div><div class="t-redactor__text">Создаем базу данных в Microsoft Access и называем её <strong>«test»</strong>. В этой базе данных создаем таблицу <strong>«contacts»</strong>:</div><img src="https://static.tildacdn.com/tild6166-3630-4466-a538-306633613665/baza_dannych_si_char.jpg"><div class="t-redactor__text">Заполните базу данных данными:</div><img src="https://static.tildacdn.com/tild3464-6563-4032-a463-313562396266/baza_dannych_si_char.jpg"><div class="t-redactor__text">Базу данных вы можете и другую создать и данные в ней можете другие добавить т.к. это не принципиально, но мы будем работать с данной таблицей.</div><h4  class="t-redactor__h4">2. Создание проекта</h4><div class="t-redactor__text">В Visual Studio создаём проект:</div><img src="https://static.tildacdn.com/tild6639-3030-4737-b766-313630323431/baza_dannych_si_char.jpg"><div class="t-redactor__text">После создания проекта добавляем на форму компонент <strong>«DataGridView»</strong> (компоненты находятся слева в «Панели элементов»). Открываем область <strong>«Задачи»</strong>:</div><img src="https://static.tildacdn.com/tild3732-6361-4137-a639-323364343963/baza_dannych_si_char.jpg"><div class="t-redactor__text">Открываем список <strong>«Выберите источник данных»</strong> и нажимаем на ссылку <strong>«Добавить источник данных проекта»</strong>:</div><img src="https://static.tildacdn.com/tild3561-6335-4638-b930-663736303138/baza_dannych_si_char.jpg"><div class="t-redactor__text">Откроется <strong>«Мастер настройки источника данных»</strong>. В качестве источника выбираем <strong>«База данных»</strong> и идем далее:</div><img src="https://static.tildacdn.com/tild3031-6462-4931-b566-376362376166/baza_dannych_si_char.jpg"><div class="t-redactor__text">В следующем окне идем далее:</div><img src="https://static.tildacdn.com/tild6661-3061-4735-a530-353331333136/baza_dannych_si_char.jpg"><div class="t-redactor__text">В окне <strong>«Выбор подключения к базе данных»</strong> нажимаем на <strong>«Создать подключение»</strong>:</div><img src="https://static.tildacdn.com/tild3061-3263-4163-b462-383232363162/baza_dannych_si_char.jpg"><div class="t-redactor__text">В окне <strong>«Выбора источника»</strong> выбираем <strong>«Другое»</strong> и поставщик данных ставим <strong>«Поставщик данных .NET Framework для OLE DB»</strong>:</div><img src="https://static.tildacdn.com/tild3637-6239-4230-a636-353566333439/baza_dannych_si_char.jpg"><div class="t-redactor__text">В следующем окне <strong>«Добавить подключение»</strong> выбираем в <strong>«Поставщик OLE DB»</strong> Microsoft Office 16.0 Access Database. В <strong>«Имя сервера или файла»</strong> вписываем путь к нашему файлу базы данных Access (который создали в первом пункте). Проверяем подключение и жмем <strong>«ОК»</strong>:</div><img src="https://static.tildacdn.com/tild3865-6635-4837-a533-643535616536/baza_dannych_si_char.jpg"><div class="t-redactor__text"><strong>Update 2021:</strong> Visual Studio 2019 требует файл Access старого формата (.mdb – это старый формат баз данных Access 2002-2003):</div><img src="https://static.tildacdn.com/tild3366-6264-4337-b962-383866663337/db-2021-update.png"><div class="t-redactor__text">В следующем окне идем далее:</div><img src="https://static.tildacdn.com/tild6466-6562-4338-b133-643961366239/baza_dannych_si_char.jpg"><div class="t-redactor__text">Выйдет окно для переноса файла базы данных в Ваш проект нажимаем <strong>«Да»</strong>:</div><img src="https://static.tildacdn.com/tild3737-3938-4366-b164-323164366662/baza_dannych_si_char.jpg"><div class="t-redactor__text">В следующем окне ничего не меняем и идем далее:</div><img src="https://static.tildacdn.com/tild3936-3239-4161-a461-373335303937/baza_dannych_si_char.jpg"><div class="t-redactor__text">В следующем окне выбираем нашу таблицу <strong>«contacts»</strong> и жмем <strong>«Готово»</strong>:</div><img src="https://static.tildacdn.com/tild3537-3266-4363-a566-336466383761/baza_dannych_si_char.jpg"><div class="t-redactor__text">После всех манипуляций наша форма должна быть примерно такой:</div><img src="https://static.tildacdn.com/tild3534-3731-4863-b337-393565373863/baza_dannych_si_char.jpg"><div class="t-redactor__text">Если запустить наш проект, то можно увидать данные из нашей базы данных:</div><img src="https://static.tildacdn.com/tild6536-3235-4463-b235-613465663766/baza_dannych_si_char.jpg"><div class="t-redactor__text">Поменяйте ширину всех столбцов на <strong>«150»</strong> чтобы столбцы вместились во все окно:</div><img src="https://static.tildacdn.com/tild6334-6134-4031-b566-626438316231/baza_dannych_si_char.jpg"><div class="t-redactor__text">Вот так без единой строчки кода мы вывели данные из нашей таблицы на нужную нам форму. Переходим к 3 пункту.</div><h4  class="t-redactor__h4">3. Сохранение данных</h4><div class="t-redactor__text">Базу данных мы видим, но редактировать её невозможно и именно поэтому нам нужна кнопка <strong>«Сохранить»</strong>. Добавляем на форму кнопку и в свойствах меняем имя на <strong>«SaveButton»</strong>. После добавления кнопки нажимаем на нее два раза и пишем код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">private void SaveButton_Click(object sender, EventArgs e)
 {
   contactsTableAdapter.Update(testDataSet);
 }</code></pre><div class="t-redactor__text">Вышеуказанный код обновляет запись в нашей таблице <strong>«contacts»</strong>. <strong>TableAdapter</strong> использует команды данных для чтения и записи в базу данных. В <strong>«testDataSet»</strong> хранятся настройки подключения базы данных.</div><div class="t-redactor__text">После добавления кода запустите свое приложение и попробуйте изменить любую запись и сохранить.</div><h4  class="t-redactor__h4">4. Изменение заголовков столбцов таблицы</h4><div class="t-redactor__text">Изменим текст столбцов и скроем столбец <strong>«img»</strong>:</div><img src="https://static.tildacdn.com/tild6135-3866-4431-b939-323763326137/baza_dannych_si_char.jpg"><div class="t-redactor__text">Полезные свойства для изменения столбцов:<br /><br /><ul><li><strong>HeaderText</strong> – задает название столбца.</li><li><strong>Visible</strong> – скрывает заголовок или наоборот.</li><li><strong>Width</strong> – ширина столбца.</li><li><strong>Resizable</strong> – можно ли изменять ширину столбца.</li></ul><br />После того как скроете заголовок <strong>«img»</strong> измените ширину всех остальных заголовков:</div><img src="https://static.tildacdn.com/tild3165-3066-4335-a166-303464383065/baza_dannych_si_char.jpg"><h4  class="t-redactor__h4">5. Защита от случайного удаления</h4><div class="t-redactor__text">Чтобы пользователь случайно не удалил запись в нашей базе данных нужно сделать так чтобы перед удалением приложение спрашивало об удалении записи.</div><div class="t-redactor__text">Для этого перейдем к компоненту <strong>DataGridView</strong>, откроем список событий и установим обработчик для события <strong>UserDeletingRow</strong>. Нажмите два раза на пустую строчку возле события и перейдете к коду. Вписываем код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">private void dataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            DialogResult dr = MessageBox.Show(&quot;Удалить запись?&quot;, &quot;Удаление&quot;, MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
            if (dr == DialogResult.Cancel)
            {
                e.Cancel = true;
            }
        }</code></pre><div class="t-redactor__text">После этого проверим работоспособность данного кода. Запустим приложение и попробуем удалить запись. Должно быть вот так:</div><img src="https://static.tildacdn.com/tild3534-6539-4034-b335-623961613538/baza_dannych_si_char.jpg"><div class="t-redactor__text">Как только пользователь выделит строчку и нажмет кнопку <strong>«Delete»</strong> сработает наше событие <strong>«dataGridView1_UserDeletingRow»</strong> и выскочить окно с вопросом об удалении. Вот скриншот где находятся события выбранного компонента:</div><img src="https://static.tildacdn.com/tild6336-6364-4262-b066-653537396339/baza_dannych_si_char.jpg"><h4  class="t-redactor__h4">6. Добавление данных</h4><div class="t-redactor__text">Добавляем новую форму в проект и называем ее <strong>«AddForm»</strong>:</div><img src="https://static.tildacdn.com/tild3033-3666-4465-b238-343938636232/baza_dannych_si_char.jpg"><img src="https://static.tildacdn.com/tild3234-3064-4134-a338-353161613739/baza_dannych_si_char.jpg"><div class="t-redactor__text">Изменяем заголовок формы и добавляем на форму компоненты:<br /><br /><ul><li>1 groupBox c текстом «Добавление записи»;</li><li>4 TextBox и меняем свойство «Name» на (tbName, tbPhone, tbMail, tbPhoto);</li><li>4 label и меняем текст на (Имя, Телефон, E-mail, Фото);</li><li>1 Button и меняем свойство «Name» на «AddBtn» (Добавить);</li><li>1 Button и меняем свойство «Name» на «CloseBtn» (Закрыть).</li></ul></div><img src="https://static.tildacdn.com/tild3932-3434-4333-b662-323765636365/baza_dannych_si_char.jpg"><div class="t-redactor__text">Переходим на главную форму и добавляем кнопку <strong>«Добавить»</strong> для добавления новой записи. Дважды щелкаем на нее и пишем код для вызова нашей новой формы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> private void button1_Click(object sender, EventArgs e)
        {
            AddForm af = new AddForm();
            af.Owner = this;
            af.Show();
        }</code></pre><div class="t-redactor__text">Проверьте работоспособность приложения:</div><img src="https://static.tildacdn.com/tild6533-3633-4032-b064-396337383165/baza_dannych_si_char.jpg"><div class="t-redactor__text">Возвращаемся на форму <strong>«Добавления записи»</strong>. Пишем обработчик событий для кнопки <strong>«CloseBtn»</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">private void button2_Click(object sender, EventArgs e)
        {
            Close();
        }</code></pre><div class="t-redactor__text">Чтобы обработчик событий на кнопке <strong>«AddBtn»</strong> работал как надо нужно выполнить несколько действий. Зайти в <strong>«Form1.Designer.cs»</strong> и изменить модификаторы доступа на <strong>«public»</strong> нижеуказанных файлов:<br /><br /><ul><li>System.Windows.Forms.DataGridView dataGridView1;</li><li>testDataSet testDataSet;</li><li>System.Windows.Forms.BindingSource contactsBindingSource;</li><li>testDataSetTableAdapters.contactsTableAdapter contactsTableAdapter;</li></ul><br />Это нужно для того чтобы наша база данных была доступна для разных с ней манипуляций во всех создаваемых нами формах. Обработчик событий для кнопки <strong>«AddBtn»</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">public void AddBtn_Click(object sender, EventArgs e)
        {
            Form1 main = this.Owner as Form1;
            if (main != null)
            {
                DataRow nRow = main.testDataSet.Tables[0].NewRow();
                int rc = main.dataGridView1.RowCount + 1;
                nRow[0] = rc;
                nRow[1] = tbName.Text;
                nRow[2] = tbPhone.Text;
                nRow[3] = tbMail.Text;
                nRow[4] = tbPhoto.Text;
                main.testDataSet.Tables[0].Rows.Add(nRow);
                main.contactsTableAdapter.Update(main.testDataSet.contacts);
                main.testDataSet.Tables[0].AcceptChanges();
                main.dataGridView1.Refresh();
                tbName.Text = &quot;&quot;;
                tbPhone.Text = &quot;&quot;;
                tbMail.Text = &quot;&quot;;
                tbPhoto.Text = &quot;&quot;;
            }
        }</code></pre><div class="t-redactor__text">Проверьте работу приложения. Добавьте несколько новых записей через новую форму добавления записей.</div><h4  class="t-redactor__h4">7. Поиск данных</h4><div class="t-redactor__text">Реализуем самый простой поиск. Данный поиск используется в небольших приложениях. Создаем новую форму с именем <strong>«SearchForm»</strong> и добавляем на форму компоненты:</div><div class="t-redactor__text"><ul><li>1 GroupBox (Поиск);</li><li>1 label;</li><li>2 button (Найти и Закрыть);</li><li>1 TextBox и меняем в свойствах «Name» на «tbStr».</li></ul></div><img src="https://static.tildacdn.com/tild3562-3638-4863-b562-376334656432/baza_dannych_si_char.jpg"><div class="t-redactor__text">Переходим на главную форму и добавляем кнопку <strong>«Найти»</strong> для поиска записей. Дважды щелкаем на нее и пишем код для вызова нашей новой формы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">private void button2_Click(object sender, EventArgs e)
        {
            SearchForm sf = new SearchForm();
            sf.Owner = this;
            sf.Show();
        }</code></pre><div class="t-redactor__text">Проверяем работоспособность приложения:</div><img src="https://static.tildacdn.com/tild3762-6666-4534-b064-386636306439/baza_dannych_si_char.jpg"><div class="t-redactor__text">Возвращаемся на форму <strong>«Поиска»</strong>. Пишем обработчик событий для кнопки <strong>«Закрыть»</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">private void button2_Click(object sender, EventArgs e)
        {
            Close();
        }</code></pre><div class="t-redactor__text">Пишем обработчик событий для кнопки <strong>«Найти»</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">private void button1_Click(object sender, EventArgs e)
        {
            Form1 main = this.Owner as Form1;
            if (main != null)
            {
                for (int i = 0; i &lt; main.dataGridView1.RowCount; i++)
                {
                    main.dataGridView1.Rows[i].Selected = false;
                    for (int j = 0; j &lt; main.dataGridView1.ColumnCount; j++)
                        if (main.dataGridView1.Rows[i].Cells[j].Value != null)
                        if (main.dataGridView1.Rows[i].Cells[j].Value.ToString().Contains(tbStr.Text))
                            {
                                main.dataGridView1.Rows[i].Selected = true;
                                break;
                            }
                }
            }
        }</code></pre><div class="t-redactor__text">На главную форму добавляем кнопку <strong>«Выход»</strong> и пишем для нее код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">private void button3_Click(object sender, EventArgs e)
        {
            Close();
        }</code></pre><div class="t-redactor__text">Итоговая форма приложения:</div><img src="https://static.tildacdn.com/tild3934-3463-4162-b339-396666386263/baza_dannych_si_char.jpg"><div class="t-redactor__text">Верхнее меню на нашей форме это компонент <strong>«MenuStrip»</strong>. На этом наша разработка приложения готова. Дальше попробуйте самостоятельно улучшить свое приложение.<br /><br />Исходники готового приложения можно скачать по <a href="https://disk.yandex.ru/d/MrtyHCJKLfzX2w" target="_blank" rel="noreferrer noopener">ссылке</a>.<br /><br />Решение проблем совместимости Microsoft Access 2019 и Visual Studio 2022:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/p1rfydiu8Aw" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Entity Framework</title>
			<link>https://www.easyitway.com/tpost/92k8ojey51-entity-framework</link>
			<amplink>https://www.easyitway.com/tpost/92k8ojey51-entity-framework?amp=true</amplink>
			<pubDate>Tue, 21 Nov 2023 20:57:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по C#</category>
			<description>ADO.NET Entity Framework (EF) — объектно-ориентированная технология доступа к данным, является object-relational mapping (ORM) решением для .NET Framework от Microsoft.</description>
			<turbo:content>
<![CDATA[<header><h1>Entity Framework</h1></header><div class="t-redactor__text">ADO.NET Entity Framework (EF) — объектно-ориентированная технология доступа к данным, является object-relational mapping (ORM) решением для .NET Framework от Microsoft.</div><div class="t-redactor__text">Предоставляет возможность взаимодействия с объектами как посредством LINQ в виде LINQ to Entities, так и с использованием Entity SQL.</div><div class="t-redactor__text">Entity SQL представляет собой язык, подобный языку SQL, который позволяет выполнять запросы к концептуальным моделям в Entity Framework</div><div class="t-redactor__text">Для облегчения построения web-решений используется как ADO.NET Data Services (Astoria), так и связка из Windows Communication Foundation и Windows Presentation Foundation, позволяющая строить многоуровневые приложения, реализуя один из шаблонов проектирования MVC, MVP или MVVM.</div><div class="t-redactor__text">Релиз ADO.NET Entity Framework состоялся 11 августа 2008 года в составе .NET Framework 3.5 Service Pack 1 и Visual Studio 2008 Service Pack 1.</div><div class="t-redactor__text">В VS 2008 вошёл EDM Wizard для реверс-инжиниринга существующих баз данных и EDM Designer для редактирования сгенерированных моделей или создания их с нуля.</div><div class="t-redactor__text">Версия 6.0 была выпущена 17 октября 2013 года[3] и сейчас это проект с открытым исходным кодом под лицензией Apache License v2. В версии 6.0 был сделан ряд улучшений в поддержке метода работы Code First.</div><div class="t-redactor__text">Начиная с версии Entity Framework 4.1 предоставляется три подхода по проектированию базы данных:</div><h4  class="t-redactor__h4">Database-First</h4><div class="t-redactor__text">Подходит для проектировщиков баз данных — сначала необходимо создать базу данных с помощью различных инструментов (например, SQL Server Management Studio), а затем генерируете EDMX-модель базы данных (предоставляет удобный графический интерфейс для взаимодействия с базой данных в виде диаграмм и объектную модель в виде классов C#).</div><div class="t-redactor__text">В данном случае вам нужно работать с SQL Server и хорошо знать синтаксис T-SQL, но при этом не нужно разбираться в C#.</div><h4  class="t-redactor__h4">Model-First</h4><div class="t-redactor__text">Подходит для архитекторов — сначала создается графическая модель EDMX в Visual Studio (в фоновом режиме создаются классы C# модели), а затем генерируете на основе диаграммы EDMX базу данных.</div><div class="t-redactor__text">При данном подходе не нужно знать ни деталей T-SQL ни синтаксиса C#.</div><h4  class="t-redactor__h4">Code-First</h4><div class="t-redactor__text">Подходит для программистов — при данном подходе модель EDMX вообще не используется и необходимо вручную настраивать классы C# объектной модели (данный подход поддерживает как генерацию сущностных классов из существующей базы данных, так и создание базы данных из созданной вручную модели объектов C#).</div><div class="t-redactor__text">Данный способ подходит для программистов, хорошо знакомых с синтаксисом C#.</div><h4  class="t-redactor__h4">Установка Entity Framework</h4><div class="t-redactor__text">Подключить Entity Framework можно к любому проекту — от Xamarin до ASP.NET.</div><div class="t-redactor__text">Для начала создайте проект Console Application в Visual Studio. Затем откройте менеджер пакетов NuGet:</div><img src="https://static.tildacdn.com/tild3464-3163-4565-b637-646237663836/entity-framework_1-7.png"><img src="https://static.tildacdn.com/tild3539-3765-4432-a664-356563333236/entity-framework_2.png"><img src="https://static.tildacdn.com/tild3538-6536-4463-b530-363533323664/entity-framework_3-7.png"><div class="t-redactor__text"><strong>NuGet Manager</strong> – это инструмент, который помогает разработчику управлять сторонними библиотеками (пакетами) в своем проекте.<br /><br />Скачиваем пакет с этим фреймворком:</div><img src="https://static.tildacdn.com/tild3263-3038-4363-b535-656434653266/entity-framework_4-7.png"><div class="t-redactor__text">При установке соглашаемся с изменениями и лицензией:</div><img src="https://static.tildacdn.com/tild6264-3961-4237-a639-383635303630/entity-framework_5.png"><h4  class="t-redactor__h4">Создание первого приложения</h4><div class="t-redactor__text">Наше приложение будет создано с помощью подхода Code First.</div><div class="t-redactor__text">Когда Entity Framework установится, нужно подключиться к СУБД. Это делается с помощью файла конфигурации.</div><div class="t-redactor__text">Так как рассматривается консольное приложение, то надо создать и открыть файл App.config (нажимаем правой кнопкой мыши на файл нашего проекта):</div><img src="https://static.tildacdn.com/tild3566-3166-4761-a436-613332313764/entity-framework_6.png"><img src="https://static.tildacdn.com/tild3831-3762-4230-b637-333363633835/entity-framework_7.png"><div class="t-redactor__text">В файл App.config необходимо добавить следующий код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;configuration&gt;
  &lt;connectionStrings&gt;
    &lt;add name=&quot;DBConnection&quot; connectionString=&quot;data source=.\SQLEXPRESS;Initial Catalog=GameDB;Integrated Security=True;&quot;
  providerName=&quot;System.Data.SqlClient&quot;/&gt;
  &lt;/connectionStrings&gt;
&lt;/configuration&gt;</code></pre><div class="t-redactor__text">Все подключения к источникам данных устанавливаются в секции <strong>connectionStrings</strong>, а каждое отдельное подключение представляет элемент <strong>add</strong>.<br /><br />В конструкторе класса контекста <strong>UserContext</strong> мы передаем в качестве названия подключения строку <strong>«DbConnection»</strong>, поэтому данное название указывается в атрибуте <strong>name=»DBConnection»</strong>.<br /><br />Настройку строки подключения задает атрибут <strong>connectionString</strong>. В данном случае мы устанавливаем название базы данных, с которой будем взаимодействовать — <strong>userstore</strong>.<br /><br />В качестве СУБД мы используем MS SQL Server 2019.<br /><br />Наше приложение будет посвящено работе с пользователями. Поэтому добавим в проект новый класс <strong>User</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;
using System.Collections.Generic;
using System.Data.Entity;

namespace consol
{
    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

    class UserContext : DbContext
    {
        public UserContext()
            : base(&quot;DbConnection&quot;)
        { }

        public DbSet Users { get; set; }
    }
}</code></pre><div class="t-redactor__text">Это обычный класс, который содержит некоторое количество автосвойств. Каждое свойство будет сопоставляться с отдельным столбцом в таблице из БД.<br /><br />Основу функциональности Entity Framework составляют классы, находящиеся в пространстве имен System.Data.Entity. Среди всего набора классов этого пространства имен следует выделить следующие:<br /><br /><ul><li><strong>DbContext:</strong> определяет контекст данных, используемый для взаимодействия с базой данных.</li><li><strong>DbModelBuilder:</strong> сопоставляет классы на языке C# с сущностями в базе данных.</li><li><strong>DbSet/DbSet&lt;TEntity&gt;:</strong> представляет набор сущностей, хранящихся в базе данных.</li></ul><br />В любом приложении, работающим с БД через Entity Framework, нам нужен будет контекст (класс производный от DbContext) и набор данных DbSet, через который мы сможем взаимодействовать с таблицами из БД. В данном случае таким контекстом является класс UserContext.<br /><br />Теперь перейдем к файлу Program.cs и изменим его содержание следующим образом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">using System;

namespace consol
{
    class Program
    {
        static void Main(string[] args)
        {
            using (UserContext db = new UserContext())
            {
                // создаем два объекта User
                User user1 = new User { Name = &quot;Виктор&quot;, Age = 24 };
                User user2 = new User { Name = &quot;Максим&quot;, Age = 25 };

                // добавляем их в бд
                db.Users.Add(user1);
                db.Users.Add(user2);
                db.SaveChanges();
                Console.WriteLine(&quot;Объекты успешно сохранены&quot;);

                // получаем объекты из бд и выводим на консоль
                var users = db.Users;
                Console.WriteLine(&quot;Список объектов:&quot;);
                foreach (User u in users)
                {
                    Console.WriteLine(&quot;{0}.{1} - {2}&quot;, u.Id, u.Name, u.Age);
                }
            }
            Console.Read();
        }
    }
}</code></pre><div class="t-redactor__text">Так как класс UserContext через родительский класс DbContext реализует интерфейс IDisposable, то для работы с UserContext с автоматическим закрытием данного объекта мы можем использовать конструкцию using.<br /><br />В конструкции using создаются два объекта User и добавляются в базу данных. Для их сохранения нам достаточно использовать метод Add: db.Users.Add(user1)<br /><br />Чтобы получить список данных из бд, достаточно воспользоваться свойством Users контекста данных: db.Users<br /><br />В результате после запуска программа выведет на консоль:</div><img src="https://static.tildacdn.com/tild6339-6437-4262-b939-623761373938/entity-framework_8.png"><div class="t-redactor__text">Таким образом, Entity Framework обеспечивает простое и удобное управление объектами из базы данных. При том в данном случае нам не надо даже создавать базу данных и определять в ней таблицы.<br /><br />Entity Framework все сделает за нас на основе определения класса контекста данных и классов моделей. И если база данных уже имеется, то Entity Framework не будет повторно создавать ее.<br /><br />Проверить базу данных можно в обозревателе объектов SQL Server Management Studio:</div><img src="https://static.tildacdn.com/tild3931-6361-4436-a465-386238373466/entity-framework_9.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>История языка Python</title>
			<link>https://www.easyitway.com/tpost/d46va46051-istoriya-yazika-python</link>
			<amplink>https://www.easyitway.com/tpost/d46va46051-istoriya-yazika-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 00:49:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Python — это интерпретируемый, объектно-ориентированный язык программирования высокого уровня с динамической типизацией, автоматическим управлением памятью</description>
			<turbo:content>
<![CDATA[<header><h1>История языка Python</h1></header><div class="t-redactor__text"><strong>Python</strong> — это интерпретируемый, объектно-ориентированный язык программирования высокого уровня с динамической типизацией, автоматическим управлением памятью и удобными высокоуровневыми структурами данных, такими как словари (хэш-таблицы), списки, кортежи.</div><div class="t-redactor__text">Поддерживает классы, модули, обработку исключений, а также многопоточные вычисления. Python обладает простым и выразительным синтаксисом. Язык поддерживает несколько парадигм программирования: структурное, объектно-ориентированное, функциональное и аспектно-ориентированное.</div><div class="t-redactor__text">Python был разработан в конце 1989г. Гвидо ван Россумом (Guido van Rossum) во время рождественских каникул, когда его исследовательская лаборатория была закрыта и ему просто некуда было деваться. Он позаимствовал многие средства программирования, присущие другим языкам.</div><div class="t-redactor__text">Название языка произошло вовсе не от названия семейства пресмыкающихся. Автор назвал язык в честь популярного британского комедийного телешоу 1970-х «Летающий цирк Монти Пайтона».</div><div class="t-redactor__text">В отличие от других языков программирования, Python не только распространяется совершенно бесплатно, он не имеет абсолютно никаких ограничений в условиях применения.</div><div class="t-redactor__text">Никто не ограничивает коммерческое использование программных продуктов, написанных на этом языке, без каких-либо лицензионных отчислений. Программисты также вольны модернизировать язык, не ставя в известность автора.</div><h4  class="t-redactor__h4">Версия 1.0</h4><div class="t-redactor__text">Python 1.0 появился в январе 1994 года. Основными новыми возможностями, включенными в этот релиз, были средства функционального программирования: лямбда-исчисление, map, filter и свёртка списка.</div><div class="t-redactor__text">Ван Россум утверждал, что «Python приобрёл lambda, reduce(), filter() и map() благодаря любителю Lisp, которому их не хватало, и он предоставил патчи, реализующие эти функции».</div><div class="t-redactor__text">Последней версией, выпущенной Ван Россумом во время работы в центре математики и информатики, был Python 1.2. С 1995 года Ван Россум продолжил работу над Python-ом в корпорации национальных исследовательских инициатив в городе Рестон, штат Вирджиния, где было выпущено несколько версий языка.</div><div class="t-redactor__text">К версии 1.4 Python включал в себя множество новых функций, среди которых наиболее заметными были позаимствованные в Modula-3 именованные параметры и встроенная поддержка комплексных чисел. Также в 1.4 появилась простая форма сокрытия данных при помощи name mangling.</div><h4  class="t-redactor__h4">Версия BeOpen</h4><div class="t-redactor__text">В 2000 году ядро команды разработчиков Python перешло в BeOpen.com, сформировав команду BeOpen PythonLab. Python 2.0 был единственным релизом BeOpen.com. После него Ван Россум и остальные разработчики PythonLab присоединились к Digital Creations.</div><h4  class="t-redactor__h4">Версия 2.0</h4><div class="t-redactor__text">В версии Python 2.0 появилось списковое включение — функция, заимствованная из функциональных языков программирования SETL и Haskell.</div><div class="t-redactor__text">Синтаксис в Python для этой конструкции очень похож на Haskell, за исключением того, что в Haskell предпочли использовать символы пунктуации, а в Python — ключевые слова. Также в Python 2.0 была добавлена система сборки мусора с поддержкой циклических ссылок.</div><div class="t-redactor__text">Начиная с альфа релиза Python 2.1 весь код, техническая документация и спецификации принадлежат некоммерческой организации Python Software Foundation (PSF), созданной в 2001 году по образцу Apache Software Foundation.</div><div class="t-redactor__text">Релиз включал изменение в спецификацию языка, поддерживающее вложенные области видимости, как в языках со статической (лексической) областью видимости.</div><div class="t-redactor__text">В Python 2.2 было объединение базовых типов Python и классов, создаваемых пользователем, в одной иерархии. Это сделало Python полностью объектно-ориентированным языком.</div><h4  class="t-redactor__h4">Версия 3.0</h4><div class="t-redactor__text">Python 3.0 (называемый также «Python 3000» или «Py3K») разрабатывался с целью устранения фундаментальных изъянов в языке. Эти изменения не могли быть сделаны при условии сохранения полной обратной совместимости с 2.x версией, поэтому потребовалось изменение главного номера версии.</div><div class="t-redactor__text">Ведущим принципом разработки Python 3 было: «уменьшение дублирующейся функциональности устранением устаревших способов сделать это». Python 3.0 был выпущен 3 декабря 2008 года.</div><h4  class="t-redactor__h4">Что пишут на Python?</h4><div class="t-redactor__text"><ul><li>Системные утилиты.</li><li>Web-сайты (Django, Flask, Pyramid, Tornado, TurboGears).</li><li>Приложения для научных расчетов (NumPy, SciPy).</li><li>Прототипы.</li><li>Приложения для Desktop (tkinter, PyQt, wxPython).</li><li>Игры (Pygame).</li><li>Мобильные приложения (kivy).</li></ul></div><h4  class="t-redactor__h4">Где используется Python?</h4><div class="t-redactor__text"><ul><li>Компания Google использует Python в своей поисковой системе.</li><li>Такие компании, как Intel, Cisco, Hewlett-Packard, Seagate, Qualcomm и IBM, используют Python для тестирования аппаратного обеспечения.</li><li>Служба коллективного использования видеоматериалов YouTube в значительной степени реализована на Python.</li><li>NSA использует Python для шифрования и анализа разведданных.</li><li>Компании JPMorgan Chase, UBS, Getco и Citadel применяют Python для прогнозирования финансового рынка.</li><li>Популярная программа BitTorrent для обмена файлами в пиринговых сетях написана на языке Python.</li><li>Популярный веб-фреймворк App Engine от компании Google использует Python в качестве прикладного языка программирования.</li><li>NASA, Los Alamos, JPL и Fermilab используют Python для научных вычислений.</li></ul></div><div class="t-redactor__text">Видео по истории Python:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/A3KRMl71g6Y" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe><div class="t-redactor__text">Видео по установке Python:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/PcIyj5VjmD4" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Первая программа на Python</title>
			<link>https://www.easyitway.com/tpost/chlzmcinl1-pervaya-programma-na-python</link>
			<amplink>https://www.easyitway.com/tpost/chlzmcinl1-pervaya-programma-na-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 00:51:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Вот и пришло время написать нашу первую программу на языке Python.</description>
			<turbo:content>
<![CDATA[<header><h1>Первая программа на Python</h1></header><div class="t-redactor__text">Вот и пришло время написать нашу первую программу на языке Python. На предыдущем уроке мы установили интерпретатор и проверили его работоспособность, а сегодня с его помощью мы выведем результат нашей первой программы.<br /><br />Запускаем наш интерпретатор, после чего можно начинать писать первую программу в интерактивном режиме. Нашей первой программой будет вывод приветствия: «Hello world». И понадобится нам только одна строка кода:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(&quot;Hello world!&quot;)</code></pre><div class="t-redactor__text">После ввода строки нажимаем Enter и происходит вывод результата программы:</div><img src="https://static.tildacdn.com/tild3130-3132-4234-b365-383130303730/pervaya_proga_python.jpg"><div class="t-redactor__text">Поздравляю вы написали первую программу на Python!<br /><br />Интерактивный режим, конечно, удобен, но лучше всего создавать программы в файле чтобы потом можно было запускать через файл и не терять наработанные программы.<br /><br />Поэтому давайте создадим текстовый документ, откроем его в любом редакторе кода, например Notepad++ и «Сохраним как» наш документ. Обязательно! пропишем расширение: «<strong>py</strong>«. Это расширение Python файлов.</div><img src="https://static.tildacdn.com/tild6236-3836-4033-b863-313566313735/pervaya_proga_python.jpg"><div class="t-redactor__text">После всех манипуляций открываем наш Python файл и для закрепления материала усовершенствуем нашу небольшую программу.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(&quot;Привет, программист!&quot;)
name = input(&quot;Как тебя зовут? &quot;)
print(name, &quot;, добро пожаловать в мир Python!&quot;)
input()</code></pre><div class="t-redactor__text"><ul><li>Первая строка печатает приветствие на экран с помощью функции print.</li><li>Вторая строка печатает вопрос («Как тебя зовут? «), ожидает, пока пользователь напечатаем что-нибудь и нажмёт Enter и сохраняет введённое значение в переменной <strong>name</strong>.</li><li>В третьей строке мы используем функцию print для вывода текста на экран, в данном случае для вывода «, добро пожаловать в мир Python!» и того, что хранится в переменной <strong>name</strong>.</li><li>Последняя строка не дает программе завершится пока пользователь не нажмёт на Enter.</li></ul></div><img src="https://static.tildacdn.com/tild3139-3638-4163-a439-333636303462/pervaya_proga_python.jpg"><div class="t-redactor__text">Поздравляю! Вы научились писать простейшую программу. На этом наш урок окончен, желаю удачи!<br /><br />Подробное видео по созданию первой программы:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/MghxexOnrTM" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Синтаксис языка Python</title>
			<link>https://www.easyitway.com/tpost/elff23b3i1-sintaksis-yazika-python</link>
			<amplink>https://www.easyitway.com/tpost/elff23b3i1-sintaksis-yazika-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 00:53:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Сегодня поговорим о синтаксисе в языке программирования Python. Сразу скажу он очень прост, как и сам язык.</description>
			<turbo:content>
<![CDATA[<header><h1>Синтаксис языка Python</h1></header><div class="t-redactor__text">Сегодня поговорим о синтаксисе в языке программирования Python. Сразу скажу он очень прост, как и сам язык.</div><div class="t-redactor__text">Во первых стоит отметить интересную особенность Python. Он не содержит операторных скобок (begin..end в pascal или {..}в Си), вместо этого блоки выделяются отступами: пробелами или табуляцией, а вход в блок из операторов осуществляется двоеточием.</div><div class="t-redactor__text"><ul><li>Конец строки является концом инструкции (точка с запятой не требуется).</li><li>Вложенные инструкции объединяются в блоки по величине отступов. Отступ может быть любым, главное, чтобы в пределах одного вложенного блока отступ был одинаков.</li><li>Вложенные инструкции в Python записываются в соответствии с одним и тем же шаблоном, когда основная инструкция завершается двоеточием, вслед за которым располагается вложенный блок кода, обычно с отступом под строкой основной инструкции.</li></ul></div><h4  class="t-redactor__h4">Несколько специальных случаев</h4><div class="t-redactor__text">Иногда возможно записать несколько инструкций в одной строке, разделяя их точкой с запятой:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = 3; b = 5; print(a, b)</code></pre><div class="t-redactor__text">Допустимо записывать одну инструкцию в нескольких строках. Достаточно ее заключить в пару круглых, квадратных или фигурных скобок:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">if (a == 1 and b == 2 and
    c == 3 and d == 4):  # Не забываем про двоеточие
      print(&#039;spam&#039; * 3)</code></pre><div class="t-redactor__text">Тело составной инструкции может располагаться в той же строке, что и тело основной, если тело составной инструкции не содержит составных инструкций. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">if x &gt; y: print(x)</code></pre><h4  class="t-redactor__h4">Комментирование в Python</h4><div class="t-redactor__text">Символ решетки (#) в Python обозначает начало комментария. Любые символы после решетки и до конца строки считаются комментариями и игнорируются интерпретатором. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># Это комментарий
print &quot;Hello, Python&quot; # И это комментарий</code></pre><h4  class="t-redactor__h4">Кавычки в Python</h4><div class="t-redactor__text">В Python можно использовать одинарные ( ‘ ), двойные («) и тройные (»’ или «»») кавычки чтобы обозначить строчный тип данных, при этом начинаться и заканчиваться строка должна одинаковыми кавычками. Строка занимающая несколько строк кода должна быть обрамлена тройными кавычками. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">name = &#039;wasd&#039;
description = &quot;Some text&quot;
biography = &quot;&quot;&quot; Some long text for few 
                      lines of code &quot;&quot;&quot;</code></pre><h4  class="t-redactor__h4">Многострочные выражения</h4><div class="t-redactor__text">Выражения в Python, как правило, заканчиваются новой строкой. Однако, существует специальный символ переноса строки (\), показывающий, что с окончанием строки не заканчивается код. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">total = item1 + \
          item2 + \
          item3</code></pre><h4  class="t-redactor__h4">Идентификаторы в Python</h4><div class="t-redactor__text">Идентификаторы в Python это имена используемые для обозначения переменной, функции, класса, модуля или другого объекта. Идентификатор должен начинаться с буквы (от a до Z) или со знака подчеркивания (_), после которых может идти произвольное количество букв, знаков подчеркивания и чисел (от 0 до 9).</div><div class="t-redactor__text">В Python недопустимо использование знаков препинания или специальных символов, таких как @, $ или % в качестве идентификаторов. Кроме того, Python чувствителен к регистру, то есть cat и Cat это два разных имени. В Python существует следующая договоренность для названия идентификаторов:</div><div class="t-redactor__text"><ul><li>Имена классов начинаются с большой буквы, все остальные идентификаторы с маленькой.</li><li>Использования знака подчеркивания в качестве первого символа идентификатора означает, что данный идентификатор является частным (закрытым от использования вне класса).</li><li>Если идентификатор начинается и заканчивается двумя знаками подчеркивания (например, __init__ ) это означает, что он является специальным именем, определенным внутри языка.</li></ul></div><div class="t-redactor__text">На этом урок окончен. Я постарался выделить главные аспекты синтаксиса. Понимание синтаксиса языка придет с практикой. Чем больше будете писать на Python, тем быстрее поймете и привыкните к его синтаксису.</div><div class="t-redactor__text">Также советую почитать PEP 8 — руководство по написанию кода на Python. Данное руководство писали сами разработчики языка и оно обязательно к изучению для программиста на Python.</div><div class="t-redactor__text">Видео по синтаксису в Python:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/7J1kLOE56jE" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Циклы в Python</title>
			<link>https://www.easyitway.com/tpost/tepo7aotd1-tsikli-v-python</link>
			<amplink>https://www.easyitway.com/tpost/tepo7aotd1-tsikli-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 00:57:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Часто возникают ситуации, в которых необходимо выполнить блок кода несколько раз. Как правило, команды выполняются одна вслед за другой, но существуют способы зациклить код.</description>
			<turbo:content>
<![CDATA[<header><h1>Циклы в Python</h1></header><div class="t-redactor__text">Часто возникают ситуации, в которых необходимо выполнить блок кода несколько раз. Как правило, команды выполняются одна вслед за другой, но существуют способы зациклить код. Во многих языках программирования для этой цели используются инструкции циклов.</div><div class="t-redactor__text">Сегодня мы рассмотрим циклы в языке Python, а именно циклы for и while, операторах break и continue, а также слово else, которое, будучи употребленное с циклом, может сделать программный код несколько более понятным.</div><h4  class="t-redactor__h4">Цикл со счетчиком for</h4><div class="t-redactor__text">Этот цикл проходится по любому итерируемому объекту (например строке или списку), и во время каждого прохода выполняет тело цикла.</div><div class="t-redactor__text">Как правило, цикл for используются либо для повторения какой-либо последовательности действий заданное число раз, либо для изменения значения переменной в цикле от некоторого начального значения до некоторого конечного. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">for i in &#039;hello world&#039;:
     print(i * 2, end=&#039;&#039;)

#выведет
hheelllloo  wwoorrlldd</code></pre><div class="t-redactor__text">Рассмотри пример — вывод чисел определенного диапазона:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">for i in range(10):
    print(i, end=&quot; &quot;)

print()
# Выведет: 0 1 2 3 4 5 6 7 8 9

for i in range(0, 50, 5):
    print(i, end=&quot; &quot;)

print()
# Выведет: 0 5 10 15 20 25 30 35 40 45

for i in range(10, 0, -1):
    print(i, end=&quot; &quot;)

print()
# Выведет: 10 9 8 7 6 5 4 3 2 1

input(&quot;Нажмите Enter для выхода&quot;)</code></pre><div class="t-redactor__text">Первый цикл for выводит значения от 0 до 9. Указываем только верхнюю границу. Если нижняя граница не указана, то подразумевается, что это 0.<br /><br />Второй цикл for работает от 0 до 50, а увеличение счетчика происходит сразу на 5 единиц.<br /><br />Третий цикл работает от 10 до 0, уменьшение счетчика происходит на единицу (-1). Поэтому числа будут выведены в обратном порядке.<br /><br />Функция range() возвращает последовательность цифр.</div><h4  class="t-redactor__h4">Цикл while</h4><div class="t-redactor__text">While — один из самых универсальных циклов в Python, поэтому довольно медленный. Он выполняет тело цикла до тех пор, пока условие цикла истинно. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">i = 5
while i &lt; 15:
     print(i)
     i = i + 2

# выведет
5
7
9
11
13</code></pre><div class="t-redactor__text">Напишем небольшую программу с помощью цикла while. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(&quot;Угадай лучший автомобиль&quot;)
print(&quot;Название автомобиля нужно вводить строчными буквами&quot;)

response = &quot;&quot;
while response != &quot;toyota&quot;:
  response = input(&quot;Какой авто самый лучший? &quot;)
  
print(&quot;Ура! Правильно!&quot;)

input()</code></pre><div class="t-redactor__text">Вывод программы:</div><img src="https://static.tildacdn.com/tild6262-3666-4039-b761-613534363438/cikly_python_auto.jpg"><div class="t-redactor__text">В коде мы создаем переменную «response». Цикл while будет выполняться до тех пор, пока значение нашей переменной не будет равно «toyota».</div><div class="t-redactor__text">Как и в случае с оператором <a href="https://it-black.ru/uslovnyj-operator-if/" target="_blank" rel="noreferrer noopener">if</a>, тело цикла может состоять из нескольких операторов, заключенных в один блок. Блоком считаются строки, следующие друг за другом, с одинаковым отступом.</div><div class="t-redactor__text">С помощью оператора if вы можете улучшить нашу программу или придумать свою. Пишите в комментариях свои примеры программ с циклом while.</div><h4  class="t-redactor__h4">Бесконечный цикл</h4><div class="t-redactor__text">Неправильно составленное условие может привести к бесконечному циклу. Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">k = 10
while k &gt; 5:
    print(k)
    k = k + 1</code></pre><div class="t-redactor__text">Цикл будет выполняться, пока k больше 5. Изначально k больше 5, далее значение k только увеличивается, поэтому получается бесконечный цикл.</div><h4  class="t-redactor__h4">Оператор continue</h4><div class="t-redactor__text">Оператор continue начинает следующий проход цикла, минуя оставшееся тело цикла (for или while). Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">for i in &#039;hello world&#039;:
    if i == &#039;o&#039;:
       continue
     print(i * 2, end=&#039;&#039;)

# выведет
hheellll  wwrrlldd</code></pre><h4  class="t-redactor__h4">Оператор break</h4><div class="t-redactor__text">Оператор break досрочно прерывает цикл. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">for i in &#039;hello world&#039;:
     if i == &#039;o&#039;:
         break
     print(i * 2, end=&#039;&#039;)

# выведет
hheellll</code></pre><h4  class="t-redactor__h4">else</h4><div class="t-redactor__text">else, примененное в цикле for или while, проверяет, был ли произведен выход из цикла инструкцией break, или же «естественным» образом.</div><div class="t-redactor__text">Блок инструкций внутри else выполнится только в том случае, если выход из цикла произошел без помощи break. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">for i in &#039;hello world&#039;:
   if i == &#039;a&#039;:
      print(&#039;Буква существует!&#039;)
      break
   else:
      print(&#039;Буквы a в строке нет&#039;)
      break
input()

#выведет
Буквы a в строке нету</code></pre><h4  class="t-redactor__h4">Программа «Уровень доступа»</h4><div class="t-redactor__text">Создадим небольшую программу используя логические операторы. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">level = 0

login = &quot;&quot;
while not login:
   login = input(&quot;Логин: &quot;)

password = &quot;&quot;
while not password:
   password = input(&quot;Пароль: &quot;)

if login == &quot;root&quot; and password == &quot;qwerty&quot;:
   level = &quot;Бог&quot;
elif login == &quot;max&quot; and password == &quot;max&quot;:
   level = &quot;Ламер&quot;
   
if level:
   print(&quot;Привет, &quot;, login)
   print(&quot;Твой уровень доступа: &quot;, level)
else:
   print(&quot;Хакерам здесь не рады!&quot;)
   
input()</code></pre><div class="t-redactor__text">По умолчанию уровень доступа равен 0. Если это так, то доступ закрыт. Если уровень отличается от 0, то программа выводит приветствие и сообщает уровень доступа.<br /><br />В начале мы в двух циклах while запрашиваем логин и пароль. Благодаря наличию not мы будем запрашивать логин и пароль до тех пор, пока они не будут введены.<br /><br />Далее мы сравниваем введенные значения с определенными константами и определяем уровень доступа.<br /><br />Вывод программы:</div><img src="https://static.tildacdn.com/tild3831-3831-4264-a433-633932306561/cikly_python_dostup.jpg"><div class="t-redactor__text">Цикл For:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/pzf3lVqcC5Y" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe><div class="t-redactor__text">Цикл While:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/h4SmR3TAV1Q" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Числа в Python</title>
			<link>https://www.easyitway.com/tpost/r04gg7ugn1-chisla-v-python</link>
			<amplink>https://www.easyitway.com/tpost/r04gg7ugn1-chisla-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 01:02:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Сегодня я расскажу о числах в python, а также о их операциях. В Python существует 4 вида чисел:</description>
			<turbo:content>
<![CDATA[<header><h1>Числа в Python</h1></header><div class="t-redactor__text">Сегодня я расскажу о числах в python, а также о их операциях. В Python существует 4 вида чисел:<br /><br /><ul><li>Целые числа (int)</li><li>Вещественные числа (float)</li><li>Комплексные числа (complex)</li><li>Десятичные дроби (decimal)</li></ul><br />Приоритет выполнения операций:</div><img src="https://static.tildacdn.com/tild3266-3866-4936-b966-623561663231/prioritet-python.jpg"><h4  class="t-redactor__h4">Целые числа (int)</h4><div class="t-redactor__text">Целые числа в Python ничем не отличаются от обычных чисел. Они поддерживают набор самых обычных математических операций:</div><img src="https://static.tildacdn.com/tild3165-3961-4430-b432-376664363166/1.png"><h4  class="t-redactor__h4">Битовые операции</h4><div class="t-redactor__text">Над целыми числами также можно производить битовые операции.</div><img src="https://static.tildacdn.com/tild6337-3139-4233-a530-313632613136/2.png"><h4  class="t-redactor__h4">Методы</h4><div class="t-redactor__text">int.bit_length() — количество бит, необходимых для представления числа в двоичном виде, без учёта знака и лидирующих нулей. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">n = -37
bin(n)
# Выведет: &#039;-0b100101&#039;

n.bit_length()
# Выведет: 6</code></pre><div class="t-redactor__text">int.to_bytes(length, byteorder, *, signed=False) — возвращает строку байтов, представляющих это число. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">(1024).to_bytes(2, byteorder=&#039;big&#039;)
# Выведет: b&#039;\x04\x00&#039;

(1024).to_bytes(10, byteorder=&#039;big&#039;)
# Выведет: b&#039;\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00&#039;

(-1024).to_bytes(10, byteorder=&#039;big&#039;, signed=True)
# Выведет: b&#039;\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00&#039;

x = 1000
x.to_bytes((x.bit_length() // 8) + 1, byteorder=&#039;little&#039;)
# Выведет: b&#039;\xe8\x03&#039;</code></pre><div class="t-redactor__text">classmethod int.from_bytes(bytes, byteorder, *, signed=False) — возвращает число из данной строки байтов. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int.from_bytes(b&#039;\x00\x10&#039;, byteorder=&#039;big&#039;)
# Выведет: 16

int.from_bytes(b&#039;\x00\x10&#039;, byteorder=&#039;little&#039;)
# Выведет: 4096

int.from_bytes(b&#039;\xfc\x00&#039;, byteorder=&#039;big&#039;, signed=True)
# Выведет: -1024

int.from_bytes(b&#039;\xfc\x00&#039;, byteorder=&#039;big&#039;, signed=False)
# Выведет: 64512

int.from_bytes([255, 0, 0], byteorder=&#039;big&#039;)
# Выведет: 16711680</code></pre><h4  class="t-redactor__h4">Вещественные числа (float)</h4><div class="t-redactor__text">Вещественные числа поддерживают те же операции, что и целые. Но вещественные числа неточны, и это может привести к ошибкам:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1
# Выведет: 0.9999999999999999</code></pre><div class="t-redactor__text">Вещественные числа не поддерживают длинную арифметику:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = 3 ** 1000
a + 0.1
# Выведет: Traceback (most recent call last):
  File &quot;&quot;, line 1, in
OverflowError: int too large to convert to float</code></pre><h4  class="t-redactor__h4">Методы</h4><div class="t-redactor__text"><ul><li>float.as_integer_ratio() — пара целых чисел, их отношение равно этому числу.</li></ul></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = float.is_integer_ratio(4.0) 
print (a)
Выведет: 4, 1</code></pre><div class="t-redactor__text"><ul><li>float.is_integer() — является ли значение целым числом.</li></ul></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = float.is_integer(4.0) 
print (a)
Выведет: True

a = float.is_integer(4.1) 
print (a)
Выведет: False</code></pre><div class="t-redactor__text"><ul><li>float.hex() — переводит float в hex (шестнадцатеричную систему счисления).</li></ul></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = float.hex(4.0)
print(a)
Выведет: 0x1.0000000000000p+2</code></pre><div class="t-redactor__text"><ul><li>float.fromhex(s) — float из шестнадцатеричной строки.</li></ul></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = float.fromhex(&quot;0x1.0000000000000p+2&quot;)
print(a)
Выведет: 4.0</code></pre><div class="t-redactor__text">Также для работы с числами в Python есть несколько полезных модулей.<br /><br />Модуль <strong>math</strong> предоставляет более сложные математические функции. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import math
math.pi
# Выведет: 3.141592653589793

math.sqrt(85)
# Выведет: 9.219544457292887</code></pre><div class="t-redactor__text">Модуль <strong>random</strong> реализует генератор случайных чисел и функции случайного выбора. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import random
random.random()
# Выведет: 0.15651968855132303

import random
a = random.randint(1,100)
print(a)</code></pre><h4  class="t-redactor__h4">Комплексные числа (complex)</h4><div class="t-redactor__text">Примеры работы комплексных чисел в Python:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">x = complex(1, 2)
print(x)
# Выведет: (1+2j)

y = complex(3, 4)
print(y)
# Выведет: (3+4j)

z = x + y
print(x)
# Выведет: (1+2j)

print(z)
# Выведет: (4+6j)

z = x * y
print(z)
# Выведет: (-5+10j)

z = x / y
print(z)
# Выведет: (0.44+0.08j)

print(x.conjugate())  # Сопряжённое число
# Выведет: (1-2j)

print(x.imag)  # Мнимая часть
# Выведет: 2.0

print(x.real)  # Действительная часть
# Выведет: 1.0

print(x &gt; y)  # Комплексные числа нельзя сравнить
# Выведет: Traceback (most recent call last):
  File &quot;&quot;, line 1, in
TypeError: unorderable types: complex() &gt; complex()

print(x == y)  # Но можно проверить на равенство
# Выведет: False

abs(3 + 4j)  # Модуль комплексного числа
# Выведет: 5.0

pow(3 + 4j, 2)  # Возведение в степень
# Выведет: (-7+24j)</code></pre><div class="t-redactor__text">Также в Python существует интересный модуль под назанием <strong>cmath</strong>. Данный модуль предоставляет функции для работы с комплексными числами:</div><div class="t-redactor__text"><ul><li>cmath.phase(x) — возвращает фазу комплексного числа</li><li>cmath.polar(x) — преобразование к полярным координатам. Возвращает пару (r, phi).</li><li>cmath.rect(r, phi) — преобразование из полярных координат.</li><li>cmath.exp(x) — e<sup>x</sup>.</li><li>cmath.log(x[, base]) — логарифм x по основанию base. Если base не указан, возвращается натуральный логарифм.</li><li>cmath.log10(x) — десятичный логарифм.</li><li>cmath.sqrt(x) — квадратный корень из x.</li><li>cmath.acos(x) — арккосинус x.</li><li>cmath.asin(x) — арксинус x.</li><li>cmath.atan(x) — арктангенс x.</li><li>cmath.cos(x) — косинус x.</li><li>cmath.sin(x) — синус x.</li><li>cmath.tan(x) — тангенс x.</li><li>cmath.acosh(x) — гиперболический арккосинус x.</li><li>cmath.asinh(x) — гиперболический арксинус x.</li><li>cmath.atanh(x) — гиперболический арктангенс x.</li><li>cmath.cosh(x) — гиперболический косинус x.</li><li>cmath.sinh(x) — гиперболический синус x.</li><li>cmath.tanh(x) — гиперболический тангенс x.</li><li>cmath.isfinite(x) — True, если действительная и мнимая части конечны.</li><li>cmath.isinf(x) — True, если либо действительная, либо мнимая часть бесконечна.</li><li>cmath.isnan(x) — True, если либо действительная, либо мнимая часть NaN.</li><li>cmath.pi — π.</li><li>cmath.e — e.</li></ul></div><h4  class="t-redactor__h4">Десятичные дроби</h4><div class="t-redactor__text">Числа данного типа позволяют производить вычисления над десятичными дробями с заданной точностью. Примеры:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from decimal import *
getcontext().prec = 10 # число знаков после запятой
a = Decimal(13) / Decimal(17)
print(a) # выведет: 0.7647058824</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># квадратный корень из 3
from decimal import *
getcontext().prec = 10
a = Decimal(3).sqrt() 
print(a)
input()</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># корень 7-й степени 
from decimal import *
getcontext().prec = 10
a = Decimal(3)**Decimal(1/7)
print(a)
input()</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># натуральный логарифм 
from decimal import *
getcontext().prec = 10
a = Decimal(3).ln()
print(a)
input()</code></pre><div class="t-redactor__text">Видео по уроку:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/WCnIQ5_0ECU" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Списки. Методы списков</title>
			<link>https://www.easyitway.com/tpost/9jeyou8bi1-spiski-metodi-spiskov</link>
			<amplink>https://www.easyitway.com/tpost/9jeyou8bi1-spiski-metodi-spiskov?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 01:07:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>В Python списки — это упорядоченные изменяемые коллекции объектов произвольных типов (в большинстве языков программирования используется другой термин «массив»).</description>
			<turbo:content>
<![CDATA[<header><h1>Списки. Методы списков</h1></header><div class="t-redactor__text">В Python <strong>списки</strong> — это упорядоченные изменяемые коллекции объектов произвольных типов (в большинстве языков программирования используется другой термин «массив»). Список представляет собой последовательность элементов, пронумерованных от 0, как символы в строке.<br /><br />Чтобы использовать списки, их нужно создать. Создать список можно несколькими способами.<br /><br />Создать список можно точно также, как и кортеж, но вместо круглых скобок применяются квадратные:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cars = [&quot;audi&quot;, &quot;vw&quot;, &quot;lexus&quot;]
print(&quot;Посмотрим, что у нас в гараже: &quot;)
for item in cars:
    print(item)
input()</code></pre><div class="t-redactor__text">Вывод программы:</div><img src="https://static.tildacdn.com/tild3039-3636-4439-a631-623738333335/spisky_python.jpg"><div class="t-redactor__text">Также список можно создать и при помощи литерала:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">s = []  # Пустой список
l = [&#039;s&#039;, &#039;p&#039;, [&#039;isok&#039;], 2]
print(s)
# выведет: []

print(l)
# выведет: [&#039;s&#039;, &#039;p&#039;, [&#039;isok&#039;], 2]

input()</code></pre><div class="t-redactor__text">Список может содержать любое количество любых объектов (в том числе и вложенные списки), или не содержать ничего. И еще один способ создать список — это генераторы списков.<br /><br />Генератор списков — способ построить новый список, применяя выражение к каждому элементу последовательности. Генераторы списков очень похожи на цикл for. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">c = [c * 3 for c in &#039;list&#039;]
print(c)
input()

# выведет: [&#039;lll&#039;, &#039;iii&#039;, &#039;sss&#039;, &#039;ttt&#039;]</code></pre><h4  class="t-redactor__h4">Функция len()</h4><div class="t-redactor__text">К списку можно применять функцию len():</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cars = [&quot;audi&quot;, &quot;vw&quot;, &quot;lexus&quot;, &quot;gtr&quot;, &quot;m5&quot;]
print(&quot;В гараже &quot;, len(cars), &quot; автомобилей&quot;)
input()

# выведет: В гараже  5  автомобилей</code></pre><h4  class="t-redactor__h4">Оператор in</h4><div class="t-redactor__text">Оператор in можно использовать для поиска по списку. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cars = [&quot;audi&quot;, &quot;vw&quot;, &quot;lexus&quot;, &quot;gtr&quot;, &quot;m5&quot;]
car = input(&quot;Введите искомый автомобиль: &quot;)
if car in cars:
    print(&quot;У вас есть такой автомобиль!&quot;)
else:
    print(&quot;У вас нет такого автомобиля :(&quot;)
input()</code></pre><h4  class="t-redactor__h4">Индексация списков</h4><div class="t-redactor__text">Списки индексируются. Индексация начинается с 0, поддерживаются положительные и отрицательные индексы. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cars = [&quot;audi&quot;, &quot;vw&quot;, &quot;lexus&quot;, &quot;gtr&quot;, &quot;m5&quot;]

start = -len(cars)
end = len(cars)

for i in range(start, end, 1):
    print(&quot;cars[&quot;, i, &quot;] = &quot;, cars[i])
input()

# будет выведено:
cars[ -5 ] =  audi
cars[ -4 ] =  vw
cars[ -3 ] =  lexus
cars[ -2 ] =  gtr
cars[ -1 ] =  m5
cars[ 0 ] =  audi
cars[ 1 ] =  vw
cars[ 2 ] =  lexus
cars[ 3 ] =  gtr
cars[ 4 ] =  m5</code></pre><div class="t-redactor__text">Сначала мы получаем начало (-len()) и конец (len()) диапазона. Потом проходимся по списку и указываем в качестве индекса переменную i, которая изменяется от start до end с приростом в 1.</div><h4  class="t-redactor__h4">Срезы списков</h4><div class="t-redactor__text">Списки поддерживают срезы. Принцип такой же, как и с кортежами: в квадратных скобках указываются начальный и конечный индексы среза:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cars = [&quot;audi&quot;, &quot;vw&quot;, &quot;lexus&quot;, &quot;gtr&quot;, &quot;m5&quot;]
start = int(input(&quot;Начальный индекс среза: &quot;))
end = int(input(&quot;Конечный индекс среза: &quot;))
print(cars[start:end])
input()

# вывод:
Начальный индекс среза: 2
Конечный индекс среза: 3
[&#039;lexus&#039;]</code></pre><h4  class="t-redactor__h4">Сцепление списков</h4><div class="t-redactor__text">Списки поддерживают сцепление. Для сцепления списков используется оператор «+». Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cars = [&quot;audi&quot;, &quot;vw&quot;, &quot;lexus&quot;, &quot;gtr&quot;, &quot;m5&quot;]
japan_cars = [&quot;toyota&quot;, &quot;nissan&quot;]

cars = cars + japan_cars
print(cars)
input()

# выведет: [&#039;audi&#039;, &#039;vw&#039;, &#039;lexus&#039;, &#039;gtr&#039;, &#039;m5&#039;, &#039;toyota&#039;, &#039;nissan&#039;]</code></pre><h4  class="t-redactor__h4">Удаление элементов списка</h4><div class="t-redactor__text">Списки поддерживают удаление элементов, и даже удаление целых срезов. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cars = [&quot;audi&quot;, &quot;vw&quot;, &quot;lexus&quot;, &quot;gtr&quot;, &quot;m5&quot;]
del cars[0]
print(cars)
del cars[:2]
print(cars)
input()

# вывод:
[&#039;vw&#039;, &#039;lexus&#039;, &#039;gtr&#039;, &#039;m5&#039;]
[&#039;gtr&#039;, &#039;m5&#039;]</code></pre><h4  class="t-redactor__h4">Методы списков</h4><div class="t-redactor__text">Для списков доступны основные встроенные функции, а также методы списков.</div><img src="https://static.tildacdn.com/tild6462-6438-4461-b431-383938323531/3.png"><h4  class="t-redactor__h4">Стек и очереди</h4><div class="t-redactor__text">Список можно использовать как стек — когда последний добавленный элемент извлекается первым (LIFO, last-in, first-out). Для извлечения элемента с вершины стека есть метод pop():</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">stack = [1,2,3,4,5]  
stack.append(6)
stack.append(7)
stack.pop()
print(stack)
input()

# вывод: [1, 2, 3, 4, 5, 6]</code></pre><div class="t-redactor__text">Список можно использовать как очередь — элементы извлекаются в том же порядке, в котором они добавлялись (FIFO, first-in, first-out). Для извлечения элемента используется метод pop() с индексом 0:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">queue = [&#039;rock&#039;,&#039;in&#039;,&#039;roll&#039;]  
queue.append(&#039;alive&#039;)
queue.pop(0)
print(queue)
input()

# вывод: [&#039;in&#039;, &#039;roll&#039;, &#039;alive&#039;]</code></pre><h4  class="t-redactor__h4">Программа «Гараж»</h4><div class="t-redactor__text">Для закрепления материала создадим программу «Гараж». Данная программа демонстрирует все операции над списком.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cars = []

print(&quot;*&quot; * 10, &quot; Гараж &quot;, &quot;*&quot; * 10)

responce = 1
while responce:
    print(&quot;&quot;&quot;Выберите действие:
            1 - Добавить автомобиль
            2 - Удалить автомобиль
            3 - Вывести список автомобилей
            4 - Найти автомобиль
            5 - Отсортировать гараж
            0 - Выйти&quot;&quot;&quot;)
    responce = int(input(&quot;&gt;&gt; &quot;))
    if responce == 1:
       car = input(&quot;Введите название авто: &quot;)
       cars.append(car)
    elif responce == 2:
       car = input(&quot;Введите название авто: &quot;)
       cars.remove(car)
    elif responce == 3:
       if len(cars) &gt; 0:
        for car in cars:
         print(car)
       else:
         print(&quot;В гараже нет авто!&quot;)
    elif responce == 4:
       car = input(&quot;Введите название авто: &quot;)
       if car in cars:
          print(&quot;Такой автомобиль есть в гараже!&quot;)
       else:
          print(&quot;Такого автомобиля нет в гараже!&quot;)
    elif responce == 5:
          cars.sort()
          print(&quot;Сортировка выполнена!&quot;)
    else:
          print(&quot;До скорых встреч!&quot;)
input()</code></pre><div class="t-redactor__text">Разберем нашу программу. В цикле мы выводим подсказку-меню. Пользователь вводит свой выбор, программа выполняет действия в зависимости от введенного номера действия.<br /><br />Самостоятельно напишите программу и проверьте её работоспособность. Если будут проблемы пишите в комментариях.<br /><br />Списки в Python:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/5LGtjJfggG4" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Условный оператор IF</title>
			<link>https://www.easyitway.com/tpost/pljsrf1u71-uslovnii-operator-if</link>
			<amplink>https://www.easyitway.com/tpost/pljsrf1u71-uslovnii-operator-if?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 01:14:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Условная инструкция (оператор) if-elif-else (её также называют оператором ветвления) — основной инструмент выбора в Python.</description>
			<turbo:content>
<![CDATA[<header><h1>Условный оператор IF</h1></header><div class="t-redactor__text">Условная инструкция (оператор) <strong>if-elif-else</strong> (её также называют оператором ветвления) — основной инструмент выбора в Python. Она выбирает, какое действие следует выполнить, в зависимости от значения переменных в момент проверки условия.</div><h4  class="t-redactor__h4">IF</h4><div class="t-redactor__text">Обязательная часть инструкции, должна предшествовать другим частям. Эта часть проверяет выражение справа от себя на истинность. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">if a:
   print(u&#039;a — истина&#039;)</code></pre><div class="t-redactor__text">Мини программа «Сколько тебе лет?». Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(&quot;*&quot; * 5, &quot;Добро пожаловать!&quot;, &quot;*&quot; * 5)
age = int(input(&quot;Сколько тебе лет? &quot;))
if age &lt; 18:
    print(&quot;Извини, тебе нельзя использовать эту программу!&quot;)
    print(&quot;Когда тебе исполнится 18, будем рады тебя видеть!&quot;)
input() # пока пользователь не нажмет не выходить из программы
# int необходим т.к. пользователь вводит числовые данные</code></pre><div class="t-redactor__text">В данном примере пользователь вводит свой возраст. Далее программа сравнивает возраст (age) c 18. Если возраст меньше 18, то выводим сообщение о том, что использовать эту программу нельзя.</div><div class="t-redactor__text">Операторы сравнения в Python:</div><div class="t-redactor__text"><ul><li>&lt; - Меньше</li><li>&gt; - Больше</li><li>&lt;= - Меньше или равно</li><li>&gt;= - Больше или равно</li><li>== - Равно</li><li>!= - Не равно</li></ul></div><div class="t-redactor__text">Условные операторы могут сравнивать не только числа, но и строки, например audi &lt; bmw, поскольку audi находится по алфавиту раньше, чем bmw.</div><h4  class="t-redactor__h4">elif</h4><div class="t-redactor__text">Необязательная часть инструкции. Должна следовать за if, либо другой elif. Позволяет указать альтернативное условие, которое требуется проверить.</div><h4  class="t-redactor__h4">else</h4><div class="t-redactor__text">Необязательная заключительная часть инструкции. Должна следовать за if, либо elif.</div><div class="t-redactor__text">Позволяет указать ветвь исполнения, которая должна быть активирована, если не подошли условия, указанные в предшествующих if и elif. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">if x &lt; 0:
        print(u&#039;Отрицательное число&#039;)
    elif x == 0:
        print(u&#039;Нуль&#039;)
    elif x == 1:
        print(u&#039;Единица&#039;)
    else:
        print(u&#039;Другое положительное число&#039;)</code></pre><div class="t-redactor__text">Отредактируем нашу мини программу "Сколько тебе лет?". Если пользователю есть 18, тогда откроем ему доступ с помощью else. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(&quot;*&quot; * 5, &quot;Добро пожаловать!&quot;, &quot;*&quot; * 5)
age = int(input(&quot;Сколько тебе лет? &quot;))
if age &lt; 18:
    print(&quot;Извини, тебе нельзя использовать эту программу!&quot;)
    print(&quot;Когда тебе исполнится 18, будем рады тебя видеть!&quot;)
else:
    print(&quot;Доступ открыт!&quot;)
input()</code></pre><div class="t-redactor__text">Отступы в Python очень важный элемент. Отступ превращает код в блок. Блок - это одна или несколько идущих подряд строк с одинаковым отступом. Блок - единая конструкция.<br /><br />На языке программирования php код выглядел бы так:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$age = 16;
if ($age &lt; 18) {
    echo &quot;Извини, тебе нельзя использовать эту программу!&quot;;
    echo &quot;Когда тебе исполнится 18, будем рады тебя видеть!&quot;;
}
else {
    echo &quot;Доступ открыт!&quot;;
}</code></pre><div class="t-redactor__text">В других языках программирования в скобках какие-либо отступы соблюдать не нужно, операторы разделяются точкой с запятой, а написать можно хоть в одну строчку (главное чтобы они были в фигурных скобках).<br /><br />В Python нужно обязательно следить за отступами.<br /><br />Общая форма оператора if выглядит так:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">if условие:
  блок_который_будет_выполнен_если_условие_истинно
else:
  блок_который_будет_выполнен_если_условие_ложно</code></pre><h4  class="t-redactor__h4">Несколько условий</h4><div class="t-redactor__text">Совместим все вышесказанное в одну программу:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = int(input(&quot;Какую оценку ты получил по математике?&quot;))

if a == 5:
   print(&quot;Молодец!&quot;)
elif a == 4:
   print(&quot;Хорошо!&quot;)
elif a == 3:
   print(&quot;Нужно лучше стараться!&quot;)
elif a &lt;= 2:
   print(&quot;Неудачник!&quot;)
else:
   print(&quot;Такой оценки не существует!&quot;)
print(&quot;Удачи!&quot;)
input(&quot;Нажмите Enter для выхода&quot;)</code></pre><div class="t-redactor__text">В данном коде мы спрашиваем пользователя про его оценку по математике и отвечаем ему, исходя из ответа.</div><div class="t-redactor__text">else можно использовать, не смотря на наличие elif. Главное, чтобы else шла последней. Блок после else будет выполнен, только если не сработали другие условия и не были выполнены другие блоки кода.</div><h4  class="t-redactor__h4">Проверка истинности</h4><div class="t-redactor__text"><ul><li>Любое число, не равное 0, или непустой объект - истина;</li><li>Числа, равные 0, пустые объекты и значение None - ложь;</li><li>Операции сравнения применяются к структурам данных рекурсивно;</li><li>Операции сравнения возвращают True или False;</li><li>Логические операторы and и or возвращают истинный или ложный объект-операнд.</li></ul></div><div class="t-redactor__text">Логические операторы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">X and Y

Истина, если оба значения X и Y истинны.</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}">X or Y

Истина, если хотя бы одно из значений X или Y истинно.</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}">not X

Истина, если X ложно.</code></pre><h4  class="t-redactor__h4">Программа "Тесты"</h4><div class="t-redactor__text">Напишем простую программу с использованием оператора IF. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = 0 # Оценка

# Выводим сообщение пользователю
print(&quot;&quot;&quot;
      Сколько бит в одном байте
      1) 8
      2) 6
      3) 4
      4) 2
      &quot;&quot;&quot;)
# Просим дать ответ
b = int(input(&quot;Ваш ответ: &quot;))

# Если ответ равен одному, тогда к переменной a прибавить 1
if b == 1:
    a = a + 1

print(&quot;&quot;&quot;
      Сколько байт в одном килобайте
      1) 1000
      2) 1024
      3) 1048
      4) 256
      &quot;&quot;&quot;)
b = int(input(&quot;Ваш ответ: &quot;))

if b == 2:
    a = a + 1

print(&quot;&quot;&quot;
      Компания-разработчик Windows
      1) Apple
      2) Melkosoft
      3) Cybersoft
      4) Microsoft
      &quot;&quot;&quot;)
b = int(input(&quot;Ваш ответ: &quot;))

if b == 4:
    a = a + 1

print(&quot;&quot;&quot;
      Компания-разработчик MacOS
      1) Apple
      2) Microsoft
      3) Fredd
      4) google
      &quot;&quot;&quot;)
b = int(input(&quot;Ваш ответ: &quot;))

if b == 1:
    a = a + 1

print(&quot;&quot;&quot;
      Символом какой операционной системы является пингвин
      1) Linux
      2) FreeBSD
      3) MacOS
      4) Windows
      &quot;&quot;&quot;)
b = int(input(&quot;Ваш ответ: &quot;))

if b == 1:
    a = a + 1

# Вывести ответ пользователю из переменной a (максимальное значение 5)
print(&quot;Ваша оценка: &quot;, a)

input(&quot;Нажмите Enter для выхода&quot;)</code></pre><div class="t-redactor__text">В программе отсутствует обработка исключение и поэтому если ввести не цифру, а строку, тогда будет ошибка и программа прекратит свою работу.<br /><br />Вывод программы будет такой:</div><img src="https://static.tildacdn.com/tild6132-3638-4036-b463-623630636434/if_python.jpg"><div class="t-redactor__text">В комментариях напишите улучшенный вариант данной программы.<br /><br />Видео по уроку:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/AgIQy3kafq8" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Работа со строками в Python</title>
			<link>https://www.easyitway.com/tpost/etrzcp0v61-rabota-so-strokami-v-python</link>
			<amplink>https://www.easyitway.com/tpost/etrzcp0v61-rabota-so-strokami-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 01:18:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Строки в Python — это упорядоченные последовательности символов, используемые для хранения и представления текстовой информации, поэтому с помощью строк можно работать со всем, что может быть представлено в текстовой форме.</description>
			<turbo:content>
<![CDATA[<header><h1>Работа со строками в Python</h1></header><div class="t-redactor__text"><strong>Строки в Python</strong> — это упорядоченные последовательности символов, используемые для хранения и представления текстовой информации, поэтому с помощью строк можно работать со всем, что может быть представлено в текстовой форме.</div><div class="t-redactor__text">Строки невозможно изменить – в этом случае говорят, что это <strong>immutable</strong> тип. Попытка изменить символ в определенной позиции или подстроку вызовет ошибку.</div><h4  class="t-redactor__h4">Литералы строк</h4><div class="t-redactor__text"><em>Строковые литералы обычно представляют собой строку символов, заключённую в кавычки или скобки. В некоторых языках программирования выделяют символьные литералы, включающие один символ.</em></div><h4  class="t-redactor__h4">Строки в апострофах и в кавычках</h4><pre class="t-redactor__highlightcode"><code data-lang="{$la}">S = &#039;spam&quot;s&#039;
S = &quot;spam&#039;s&quot;</code></pre><div class="t-redactor__text">Строки в апострофах и в кавычках — одно и то же. Причина наличия двух вариантов в том, чтобы позволить вставлять в литералы строк символы кавычек или апострофов, не используя экранирование.</div><h4  class="t-redactor__h4">Экранированные последовательности</h4><div class="t-redactor__text">Экранированные последовательности позволяют вставить символы, которые сложно ввести с клавиатуры.</div><img src="https://static.tildacdn.com/tild6232-6637-4330-b037-343564336533/1.png"><div class="t-redactor__text">Если перед открывающей кавычкой стоит символ ‘r’ (в любом регистре), то механизм экранирования отключается. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">S = r&#039;C:\newt.txt&#039;</code></pre><h4  class="t-redactor__h4">Строки в тройных апострофах или кавычках</h4><div class="t-redactor__text">Строки в тройных апострофах или кавычках используют для записи многострочных блоков текста. Внутри такой строки возможно присутствие кавычек и апострофов, главное, чтобы не было трех кавычек подряд. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">c = &#039;&#039;&#039;это очень большая
строка, многострочный
блок текста&#039;&quot;
print(c)
# Выведет: это очень большая
строка, многострочный
блок текста</code></pre><h4  class="t-redactor__h4">Функции и методы строк</h4><div class="t-redactor__text"><strong>Конкатенация (сложение)</strong></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">S1 = &#039;При&#039;
S2 = &#039;вет&#039;
print(S1 + S2)
# Будет выведено: &#039;Привет&#039;</code></pre><div class="t-redactor__text"><strong>Дублирование строки</strong></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(&#039;Привет&#039; * 3)
# Выведет: ПриветПриветПривет</code></pre><div class="t-redactor__text"><strong>Длина строки (функция len)</strong></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">len(&#039;Привет&#039;)
# Выведет: 6</code></pre><div class="t-redactor__text"><strong>Доступ по индексу</strong></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">S = &#039;Привет&#039;
S[0]
# Выведет: &#039;П&#039;
S[2]
# Выведет: &#039;и&#039;
S[-2] #Доступ к отрицательному индексу
# Выведет: &#039;е&#039;</code></pre><div class="t-redactor__text">В Python возможен и доступ по отрицательному индексу, при этом отсчет идет от конца строки.<br /><br /><strong>Извлечение среза</strong><br /><br />Оператор извлечения среза: [X:Y]. X – начало среза, а Y – окончание. Cимвол с номером Y в срез не входит. По умолчанию первый индекс равен 0, а второй — длине строки.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">s = &#039;spameggs&#039;
s[3:5]
# Выведет: &#039;me&#039;
s[2:-2]
# Выведет: &#039;ameg&#039;
s[:6]
# Выведет: &#039;spameg&#039;
s[1:]
# Выведет: &#039;pameggs&#039;
s[:]
# Выведет: &#039;spameggs&#039;</code></pre><h4  class="t-redactor__h4">Форматирование строк</h4><div class="t-redactor__text">Иногда бывает нужно сделать строку, подставив в неё некоторые данные, полученные в процессе выполнения программы. Подстановку данных можно сделать с помощью форматирования строк. Форматирование можно сделать с помощью оператора <strong>%</strong>, либо с помощью метода <strong>format</strong>.</div><div class="t-redactor__text">Если для подстановки требуется только один аргумент, то значение — сам аргумент. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&#039;Hello, {}!&#039;.format(&#039;Vasya&#039;)
# Будет выведено: &#039;Hello, Vasya!&#039;</code></pre><div class="t-redactor__text">А если несколько, то значениями будут являться все аргументы со строками подстановки (обычных или именованных):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&#039;{0}, {1}, {2}&#039;.format(&#039;a&#039;, &#039;b&#039;, &#039;c&#039;)
# Будет выведено: &#039;a, b, c&#039;

&#039;{}, {}, {}&#039;.format(&#039;a&#039;, &#039;b&#039;, &#039;c&#039;)
# Будет выведено: &#039;a, b, c&#039;

&#039;{2}, {1}, {0}&#039;.format(&#039;a&#039;, &#039;b&#039;, &#039;c&#039;)
# Будет выведено: &#039;c, b, a&#039;

&#039;{2}, {1}, {0}&#039;.format(*&#039;abc&#039;)
# Будет выведено: &#039;c, b, a&#039;

&#039;{0}{1}{0}&#039;.format(&#039;abra&#039;, &#039;cad&#039;)
# Будет выведено: &#039;abracadabra&#039;

&#039;Coordinates: {latitude}, {longitude}&#039;.format(latitude=&#039;37.24N&#039;, longitude=&#039;-115.81W&#039;)
# Будет выведено: &#039;Coordinates: 37.24N, -115.81W&#039;

coord = {&#039;latitude&#039;: &#039;37.24N&#039;, &#039;longitude&#039;: &#039;-115.81W&#039;}
&#039;Coordinates: {latitude}, {longitude}&#039;.format(**coord)
# Будет выведено: &#039;Coordinates: 37.24N, -115.81W&#039;</code></pre><div class="t-redactor__text">Видео по строкам в Python:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/R0Oe0eNJ0Ao" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Индексы и срезы</title>
			<link>https://www.easyitway.com/tpost/lhob0bz931-indeksi-i-srezi</link>
			<amplink>https://www.easyitway.com/tpost/lhob0bz931-indeksi-i-srezi?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 01:23:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Каждому символу в строке соответствует индексный номер, начиная с 0. При попытке доступа к несуществующему индексу возникает исключение IndexError.</description>
			<turbo:content>
<![CDATA[<header><h1>Индексы и срезы</h1></header><div class="t-redactor__text">Сегодня мы поговорим об операциях взятия индекса и среза. Номера символов в строке (а также в других структурах данных: списках, кортежах) называются индексом.<br /><br />Каждому символу в строке соответствует индексный номер, начиная с 0. При попытке доступа к несуществующему индексу возникает исключение <strong>IndexError</strong>. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = [1, 3, 8, 7]
a[0]
#выведет 1

a[3]
#выведет 7

a[4]
Traceback (most recent call last):
  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;
IndexError: list index out of range</code></pre><div class="t-redactor__text">В Python также поддерживаются отрицательные индексы, при этом нумерация идёт с конца, например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = [1, 3, 8, 7]
a[-1]
#выведет 7

a[-4]
#выведет 1

a[-5]
Traceback (most recent call last):
  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;
IndexError: list index out of range</code></pre><h4  class="t-redactor__h4">Прямой доступ к строке</h4><div class="t-redactor__text">При использовании прямого доступа к строке, тогда нумерация начинается с нуля. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">word = &quot;привет&quot;
print(word[1])

#выведет р</code></pre><div class="t-redactor__text">В качестве примера прямого доступа к элементам строки напишем программу доступа к случайному символу строки. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import random

word = input(&quot;Введите слово: &quot;)

max = len(word)
min = -len(word)

for i in range(10):
    position = random.randrange(min, max)
    print(&quot;word[&quot;, position, &quot;] = &quot;, word[position])
    
input()</code></pre><h4  class="t-redactor__h4">Позиции с положительными и отрицательными номерами</h4><div class="t-redactor__text">Напомним, что позиция, то есть индекс строки, может быть как положительный, так и отрицательный.</div><div class="t-redactor__text">Как уже было отмечено, нумерация начинается с 0, поэтому у первого символа строки будет индекс 0, у второго -1 и т.д.</div><div class="t-redactor__text">Рассмотрим пример с положительными и отрицательными индексами:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">word = input(&quot;Введите слово: &quot;)

max = len(word)
min = -len(word)

for i in range(min,max,1):
    print(&quot;word[&quot;, i, &quot;] = &quot;, word[i])
    
input()</code></pre><div class="t-redactor__text">Пользователь вводит слово. Далее мы вычисляем минимум и максимум. Максимум равен длине введенного слова, минимум — отрицательной длине.<br /><br />Вывод будет таким:</div><img src="https://static.tildacdn.com/tild3037-3661-4465-b839-353937303435/python_index_srezy.jpg"><h4  class="t-redactor__h4">Неизменяемость строк</h4><div class="t-redactor__text">Все последовательности делятся на изменяемые и неизменяемые. Элементы неизменяемой последовательности можно модифицировать.</div><div class="t-redactor__text">Элементы неизменяемой последовательности изменить нельзя. Строки в Python — это пример неизменяемой последовательности. Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">message = &quot;Привет&quot;
print(message)
# выведет: Привет

message = &quot;Пока&quot;
print(message)
# выведет: Пока</code></pre><div class="t-redactor__text">На первый взгляд кажется, что мы изменили строку, но на самом деле Python создал строку «Пока» и присвоил это значение переменной message.<br /><br />Неизменяемость строк в Python означает одну неприятную вещь: вы не можете присвоить новое значение символу строки, обращаясь к нему по индексу, как это можно сделать в других языках программирования. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">message = &quot;Hello&quot;
print(message[1])
e
message[1] = &quot;a&quot;
Traceback (most recent call last):
  File &quot;&quot;, line 1, in 
    message[1] = &quot;a&quot;
TypeError: &#039;str&#039; object does not support item assignment</code></pre><div class="t-redactor__text">В данном примере мы создали строку message. Мы можем обратиться к message[1] и прочитать это значение. Но нельзя присвоить message[1] новое значение. Интерпретатор сообщает что тип <strong>str</strong> не поддерживает поэлементное назначение.</div><h4  class="t-redactor__h4">Срезы</h4><div class="t-redactor__text">Срез (slice) — это извлечение из данной строки одного символа или некоторого фрагмента подстроки или подпоследовательности. Есть три формы срезов.</div><div class="t-redactor__text">Самая простая форма среза: взятие одного символа строки, а именно, S[i] — это срез, состоящий из одного символа, который имеет номер i, при этом считая, что нумерация начинается с числа 0.</div><div class="t-redactor__text">Исходя из вышесказанного если S=’Hello’, то S[0]==’H’, S[1]==’e’, S[2]==’l’, S[3]==’l’, S[4]==’o’.</div><div class="t-redactor__text">Срез с двумя параметрами: S[a:b] возвращает подстроку из b-a символов, начиная с символа c индексом a, то есть до символа с индексом b, не включая его. Например, S[1:4]==’ell’, то же самое получится если написать S[-4:-1].</div><div class="t-redactor__text">Можно использовать как положительные, так и отрицательные индексы в одном срезе, например, S[1:-1] — это строка без первого и последнего символа. При использовании такой формы среза ошибки IndexError никогда не возникает.</div><div class="t-redactor__text">Если задать срез с тремя параметрами S[a:b:d], то третий параметр задает шаг, то есть будут взяты символы с индексами a, a+d, a+2*d и т.д.</div><div class="t-redactor__text">При задании значения третьего параметра, равному 2, в срез попадет кажый второй символ, а если взять значение среза, равное -1, то символы будут идти в обратном порядке.</div><div class="t-redactor__text">Также с помощью срезов можно не только извлекать элементы, но и добавлять и удалять элементы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = [1, 3, 8, 7]
a[1:3] = [0, 0, 0]
a
[1, 0, 0, 0, 7]
del a[:-3]
a
[0, 0, 7]</code></pre><h4  class="t-redactor__h4">Демо-программа «Срезы»</h4><div class="t-redactor__text">Создадим небольшую программу для демонстрации «Срезов». Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">word = &quot;Привет&quot;
print(&quot;Демо-программа Срезы&quot;)
print(&quot;Введите начальный и конечный индексы для среза слова &#039;Привет&#039;&quot;)

begin = None
while begin != &quot;&quot;:
    begin = input(&quot;начальная позиция: &quot;)
    if begin:
        begin = int(begin)
        end = int(input(&quot;Конечная позиция: &quot;))
        print(word[begin:end])
        
input()</code></pre><div class="t-redactor__text">Первым делом мы присваиваем начальной позиции значение <strong>None</strong>. Данное ключевое слово в Python представляет пустое значение. Означает только одно — значение еще не присвоено.<br /><br />В цикле пользователь вводит начальную и конечную позицию. Как и при индексировании, можно использовать отрицательные номера.<br /><br />Если вызвать невозможный срез, в котором начальная позиция имеет большой номер, чем конечная или же заданы несуществующие индексы, то интерпретатор не выдаст ошибку, а просто вернет пустую последовательность.<br /><br />Вывод нашей программы:</div><img src="https://static.tildacdn.com/tild3531-3066-4236-a431-643632353035/neizm_strok_python_1.jpg">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Кортежи в Python</title>
			<link>https://www.easyitway.com/tpost/mzykhduzm1-kortezhi-v-python</link>
			<amplink>https://www.easyitway.com/tpost/mzykhduzm1-kortezhi-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 01:30:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Кортеж (tuple) – это последовательность неизменяемых объектов. Кортежи очень схожи со списками, разница их в том что элементы кортежа не могут быть изменены и используют обычные скобки, вместо квадратных, как в списках.</description>
			<turbo:content>
<![CDATA[<header><h1>Кортежи в Python</h1></header><div class="t-redactor__text"><strong>Кортеж (tuple)</strong> – это последовательность неизменяемых объектов. Кортежи очень схожи со списками, разница их в том что элементы кортежа не могут быть изменены и используют обычные скобки, вместо квадратных, как в списках.<br /><br />Они используются для представления неизменяемой последовательности разнородных объектов. Кортежи хорошо защищены от изменений, как намеренных (что плохо), так и случайных (что хорошо).<br /><br />Кортеж создаётся простым присваиванием элементов, разделённых запятыми. Также – их можно указывать в скобках. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cor1 =(&#039;physics&#039;, &#039;chemistry&#039;, 1997, 2000)
cor2 =(1,2,3,4,5)
cor3 =&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;</code></pre><div class="t-redactor__text">Пустой кортеж создаётся указанием пустых скобок или с помощью функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cor1 = ()     # С помощью указания пустых скобок
cor2 = tuple() # С помощью встроенной функции tuple()</code></pre><div class="t-redactor__text">Чтобы создать кортеж, содержащий только один элемент необходимо добавлять запятую:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cor1 =(50,)
print(cor1[0])
# выведет 50</code></pre><h4  class="t-redactor__h4">Получение данных из кортежа</h4><div class="t-redactor__text">Чтобы получить какой-то элемент из кортежа – надо использовать квадратные скобки с указанием индекса или индексов. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cor1 = (&#039;physics&#039;, &#039;chemistry&#039;, 1997, 2000)
cor2 = (1, 2, 3, 4, 5, 6, 7 )

print(&quot;cor1[0]: &quot;, cor1[0])
print(&quot;cor2[1:5]: &quot;, cor2[1:5])
input()

#выведет: cor1[0]:  physics
#выведет: cor2[1:5]:  (2, 3, 4, 5)</code></pre><h4  class="t-redactor__h4">Обновление кортежей</h4><div class="t-redactor__text">Кортежи являются <strong>неизменяемыми</strong> последовательностями в Python, т.е. нельзя просто изменить элемент, присвоив ему новое значение. Однако – можно взять часть имеющегося кортежа и создать новый. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cor1 = (12, 34.56)
cor2 = (&#039;abc&#039;, &#039;xyz&#039;)

# Создадим новый кортеж следующим образом
cor3 = cor1 + cor2
print(cor3)

input()

#выведет: (12, 34.56, &#039;abc&#039;, &#039;xyz&#039;)</code></pre><h4  class="t-redactor__h4">Удаление элементов кортежа</h4><div class="t-redactor__text">Чтобы удалить кортеж полностью – используется оператор <strong>del</strong>. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cor = (&#039;physics&#039;, &#039;chemistry&#039;, 1997, 2000)
print(cor)

del cor
print(&quot;After deleting cor : &quot;)
print(cor)

# будет выведено
Traceback (most recent call last):
(&#039;physics&#039;, &#039;chemistry&#039;, 1997, 2000)
  File &quot;C:/Users/root/Desktop/untitled/index.py&quot;, line 8, in 
After deleting cor : 
    print(cor)
NameError: name &#039;cor&#039; is not defined</code></pre><h4  class="t-redactor__h4">Базовые операторы кортежей</h4><div class="t-redactor__text">Кортежи работают с операторами + и * также, как и строки или списки – они используются для конкатенации и повторения, за исключением того – что в результате получится новый кортеж, а не список или строка. Фактически, кортежи поддерживают те же операции с последовательностями, как и строки.</div><h4  class="t-redactor__h4">Перебор кортежей</h4><div class="t-redactor__text">Для перебора кортежа можно использовать стандартные циклы <strong>for</strong> и <strong>while</strong>. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># С помощью цикла for:
user = (&quot;Tom&quot;, 22, False)
for item in user:
    print(item)
input()
# будет выведено:
Tom
22
False

# С помощью цикла while:
user = (&quot;Tom&quot;, 22, False)
 
i = 0
while i &lt; len(user):
    print(user[i])
    i += 1
input()
# будет выведено:
Tom
22
False</code></pre><h4  class="t-redactor__h4">Функция len() и оператор in</h4><div class="t-redactor__text">К кортежам может применяться функция len(), возвращающая число элементов кортежа:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cars = (&quot;Nissan&quot;, &quot;Audi&quot;)
print(&quot;Сейчас у вас &quot;, len(cars), &quot; автомобилей&quot;)

input()
# выведет: Сейчас у вас  2  автомобилей</code></pre><div class="t-redactor__text">Проверить существование элемента кортежа можно так:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">cars = (&quot;Nissan&quot;, &quot;Audi&quot;)
if &quot;Nissan&quot; in cars:
    print(&quot;В вашем гараже есть Nissan&quot;)

input()
# выведет: В вашем гараже есть Nissan</code></pre><h4  class="t-redactor__h4">Сложные кортежи</h4><div class="t-redactor__text">Один кортеж может содержать другие кортежи в виде элементов. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">countries = (
    (&quot;Germany&quot;, 80.2, ((&quot;Berlin&quot;,3.326), (&quot;Hamburg&quot;, 1.718))),
    (&quot;France&quot;, 66, ((&quot;Paris&quot;, 2.2),(&quot;Marsel&quot;, 1.6)))
)
 
for country in countries:
    countryName, countryPopulation, cities = country
    print(&quot;\nCountry: {}  population: {}&quot;.format(countryName, countryPopulation))
    for city in cities:
        cityName, cityPopulation = city
        print(&quot;City: {}  population: {}&quot;.format(cityName, cityPopulation))
input()

# будет выведено:
Country: Germany  population: 80.2
City: Berlin  population: 3.326
City: Hamburg  population: 1.718

Country: France  population: 66
City: Paris  population: 2.2
City: Marsel  population: 1.6</code></pre><div class="t-redactor__text">Здесь кортеж <strong>countries</strong>, который представляет страны, состоит из кортежей, каждый из которых - отдельная страна.<br /><br />Вложенные кортежи имеют три элемента: название страны, численность ее населения и города. Города представляют отдельный кортеж, где каждый отдельный город - это вложенный кортеж, содержащий название города и численность его населения.<br /><br />Видео по уроку:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/18vVLDQqbdA" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Словари</title>
			<link>https://www.easyitway.com/tpost/egeone13r1-slovari</link>
			<amplink>https://www.easyitway.com/tpost/egeone13r1-slovari?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 01:34:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Словарь (dict) в Python — это ассоциативный массив или хеш. Это неупорядоченное множество пар ключ: значение с требованием уникальности ключей.</description>
			<turbo:content>
<![CDATA[<header><h1>Словари</h1></header><div class="t-redactor__text"><strong>Словарь (dict)</strong> в Python — это ассоциативный массив или хеш. Это неупорядоченное множество пар ключ: значение с требованием уникальности ключей.<br /><br />В отличие от последовательностей, доступ к элементам словаря производится по ключу, а не по индексу, ключ может быть любого типа, ключ не допускает изменений. Основные особенности словарей:<br /><br /><ul><li>Доступ осуществляется по ключу, а не по индексу. По аналогии со списком, в словаре можно получить доступ к элементам в цикле по ключам;</li><li>Значения словаря хранятся в неотсортированном порядке, более того, ключи могут храниться не в том порядке, в котором они добавляются;</li><li>По аналогии со списками, словарь может хранить вложенные словари. Словарь может хранить в качестве значений объекты любого типа (heterogeneous). Ключ в словаре — immutable тип, может быть строкой, целым числом, float либо кортежем, состоящим из указанных типов.</li><li>Словари реализованы как хеш-таблицы с быстрым доступом.</li><li>Словари, так же как и списки, хранят ссылки на объекты, а не сами объекты.</li></ul><br />Чтобы работать со словарём, его нужно создать. Создать его можно несколькими способами:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">#1.C помощью литерала:
d = {}
print(d)
input()
#выведет: {}

d = {&#039;dict&#039;: 1, &#039;dictionary&#039;: 2}
print(d)
input()
#выведет: {&#039;dict&#039;: 1, &#039;dictionary&#039;: 2}

#2.C помощью функции dict:
d = dict(short=&#039;dict&#039;, long=&#039;dictionary&#039;)
print(d)
input()
#выведет: {&#039;short&#039;: &#039;dict&#039;, &#039;long&#039;: &#039;dictionary&#039;}

d = dict([(2, 1), (5, 6)])
print(d)
input()
#выведет: {2: 1, 5: 6}

#3.C помощью метода fromkeys:
d = dict.fromkeys([&#039;a&#039;, &#039;b&#039;])
print(d)
input()
#выведет: {&#039;a&#039;: None, &#039;b&#039;: None}

d = dict.fromkeys([&#039;a&#039;, &#039;b&#039;], 100)
print(d)
input()
#выведет: {&#039;a&#039;: 100, &#039;b&#039;: 100}

#4.C помощью генераторов словарей
d = {a: a ** 2 for a in range(7)}
print(d)
input()
#выведет:{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36}</code></pre><h4  class="t-redactor__h4">Функции/методы словаря</h4><div class="t-redactor__text"><strong>dict()</strong> — создание словаря;</div><div class="t-redactor__text"><strong>len()</strong> — возвращает число пар;</div><div class="t-redactor__text"><strong>clear()</strong> — удаляет все значения из словаря;</div><div class="t-redactor__text"><strong>copy()</strong> — создает псевдокопию словаря;</div><div class="t-redactor__text"><strong>deepcopy()</strong> — создает полную копию словаря;</div><div class="t-redactor__text"><strong>fromkeys()</strong> — создание словаря;</div><div class="t-redactor__text"><strong>get()</strong> — получить значение по ключу;</div><div class="t-redactor__text"><strong>has_key()</strong> — проверка значения по ключу;</div><div class="t-redactor__text"><strong>items()</strong> — возвращает список значений;</div><div class="t-redactor__text"><strong>iteriyems()</strong> — возвращает итератор;</div><div class="t-redactor__text"><strong>keys()</strong> — возвращает список ключей;</div><div class="t-redactor__text"><strong>iterkeys()</strong> — возвращает итератор ключей;</div><div class="t-redactor__text"><strong>pop()</strong> — извлекает значение по ключу;</div><div class="t-redactor__text"><strong>popitem()</strong> — извлекает произвольное значение;</div><div class="t-redactor__text"><strong>update()</strong> — изменяет словарь;</div><div class="t-redactor__text"><strong>values()</strong> — возвращает список значений;</div><div class="t-redactor__text"><strong>itervalues()</strong> — возвращает итератор на список значений.</div><div class="t-redactor__text"><strong>in</strong> — оператор, проверяет наличие значения по ключу;</div><div class="t-redactor__text"><strong>del</strong> — оператор, удаляет пару по ключу;</div><div class="t-redactor__text"><strong>dict()</strong> — конструирует словарь с помощью последовательности.</div><h4  class="t-redactor__h4">Доступ к значениям словаря</h4><div class="t-redactor__text">Пример вывода значения определенного ключа словаря:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">dict = {
    &quot;apple&quot; : &quot;яблоко&quot;,
    &quot;bold&quot; : &quot;жирный&quot;,
    &quot;bus&quot; : &quot;автобус&quot;,
    &quot;cat&quot; : &quot;кошка&quot;,
    &quot;car&quot; : &quot;автомобиль&quot;}
print(dict[&quot;bus&quot;])
input()
# выведет: автобус</code></pre><div class="t-redactor__text">Выведем все ключи и значения словаря в более или менее удобном для пользователя формате:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">dict = {
    &quot;apple&quot; : &quot;яблоко&quot;,
    &quot;bold&quot; : &quot;жирный&quot;,
    &quot;bus&quot; : &quot;автобус&quot;,
    &quot;cat&quot; : &quot;кошка&quot;,
    &quot;car&quot; : &quot;автомобиль&quot;}
for item in dict:
    print(item, &quot; =&gt; &quot;, dict[item])
input()

# выведет:
apple  =&gt;  яблоко
bold  =&gt;  жирный
bus  =&gt;  автобус
cat  =&gt;  кошка
car  =&gt;  автомобиль</code></pre><div class="t-redactor__text">Доступ к значениям словаря похож на индексирование, только здесь мы вместо индекса используем ключ, а не номер элемента.<br /><br />Если обратиться к ключу, которого нет в словаре, то будет сгенерировано сообщение об ошибке.<br /><br />Словари в Python:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/z0C9zw8A_xc" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Множества в Python</title>
			<link>https://www.easyitway.com/tpost/b5he58mpj1-mnozhestva-v-python</link>
			<amplink>https://www.easyitway.com/tpost/b5he58mpj1-mnozhestva-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 01:35:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Множество — это «мешок», содержащий неупорядоченные уникальные значения. Одно множество может содержать значения любых типов.</description>
			<turbo:content>
<![CDATA[<header><h1>Множества в Python</h1></header><div class="t-redactor__text"><strong>Множество</strong> — это «мешок», содержащий неупорядоченные уникальные значения. Одно множество может содержать значения любых типов. Если у вас есть два множества, вы можете совершать над ними любые стандартные операции, например, объединение, пересечение и разность.</div><h4  class="t-redactor__h4">СОЗДАНИЕ МНОЖЕСТВА</h4><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a_set = {1}    # создание множества с одним значением
print(a_set)
input()

# выведет: {1}

a_set = {1}
print(type(a_set)) # создание множества реализующиеся как классы
input()

# выведет: 

a_set = {1, 2}   # создание множества с несколькими значениями
print(a_set)
input()

# выведет: {1, 2}</code></pre><h4  class="t-redactor__h4">ИЗМЕНЕНИЕ МНОЖЕСТВА</h4><div class="t-redactor__text">Есть два способа добавить элементы в существующее множество: метод <strong>add()</strong> и метод <strong>update()</strong>.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># метод add()
a_set = {1, 2}
a_set.add(4)      #(1)
print(a_set)
input() 

# выведет: {1, 2, 4}

a_set = {1, 2}
a_set.add(4) 
print(len(a_set)) #(2)
input() 

# выведет: 3

a_set = {1, 2}
a_set.add(4) 
a_set.add(1)     #(3)
print(a_set)
input()

# выведет: {1, 2, 4}

a_set = {1, 2}
a_set.add(4) 
a_set.add(1)     
print(len(a_set)) #(4)
input()

# выведет: 3</code></pre><div class="t-redactor__text"><ol><li>Метод add() принимает один аргумент, который может быть любого типа, и добавляет данное значение в множество.</li><li>Теперь множество содержит 3 элемента.</li><li>Множества — мешки уникальных значений. Если попытаться добавить значение, которое уже присутствует в множестве, ничего не произойдет. Это не приведет в возникновению ошибки; просто нулевое действие.</li><li>Это множество все ещё состоит из 3 элементов.</li></ol></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># метод update()
a_set = {1, 2, 3}
print(a_set)
input()

# выведет: {1, 2, 3}

a_set.update({2, 4, 6})               #(1)
print(a_set)   
input()                               #(2)

# выведет: {1, 2, 3, 4, 6}

a_set.update({3, 6, 9}, {1, 2, 3, 5, 8, 13})  #(3)
print(a_set)
input()

# выведет: {1, 2, 3, 4, 5, 6, 8, 9, 13}

a_set.update([10, 20, 30])                    #(4)
print(a_set)
input()

# выведет: {1, 2, 3, 4, 5, 6, 8, 9, 10, 13, 20, 30}</code></pre><div class="t-redactor__text"><ol><li>Метод update() принимает один аргумент — множество, и добавляет все его элементы к исходному множеству.</li><li>Повторяющиеся значения игнорируются, поскольку множество не может содержать дубликаты.</li><li>Можно вызвать метод update() с любым количеством параметров. Когда он вызывается с двумя множествами, метод update() добавляет все элементы обоих множеств в исходное множество (пропуская повторяющиеся).</li><li>Метод update() может принимать объекты различных типов, включая списки. Когда ему передается список, он добавляет все его элементы в исходное множество.</li></ol></div><h4  class="t-redactor__h4">Удаление элементов</h4><div class="t-redactor__text">Для удаления одного элемента вызывается метод <strong>remove()</strong>, в который передается удаляемый элемент. Но следует учитывать, что если такого элемента не окажется в множестве, то будет сгенерирована ошибка.</div><div class="t-redactor__text">Поэтому перед удалением следует проверять на наличие элемента с помощью оператора in:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">users = {&quot;Tom&quot;, &quot;Bob&quot;, &quot;Alice&quot;}
 
user = &quot;Tom&quot;
if user in users: 
    users.remove(user)
print(users) 
input()

# выведет: {&#039;Alice&#039;, &#039;Bob&#039;}</code></pre><h4  class="t-redactor__h4">Перебор множества</h4><div class="t-redactor__text">Для перебора элементов можно использовать цикл for.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">users = {&quot;Tom&quot;,&quot;Bob&quot;,&quot;Alice&quot;}
 
for user in users:
    print(user)
input()

# выведет:
Alice
Tom
Bob

# При переборе каждый элемент помещается в переменную user.</code></pre><h4  class="t-redactor__h4">Операции с множествами</h4><div class="t-redactor__text">С помощью метода <strong>copy()</strong> можно скопировать содержимое одного множества в другую переменную:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">users = {&quot;Tom&quot;,&quot;Bob&quot;,&quot;Alice&quot;}
users3 = users.copy()</code></pre><div class="t-redactor__text">Метод <strong>union()</strong> объединяет два множества и возвращает новое множество:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">users = {&quot;Tom&quot;,&quot;Bob&quot;,&quot;Alice&quot;}
users2 = {&quot;Sam&quot;,&quot;Kate&quot;, &quot;Bob&quot;}
 
users3 = users.union(users2)
print(users3)   
input()

# выведет: {&quot;Bob&quot;, &quot;Alice&quot;, &quot;Sam&quot;, &quot;Kate&quot;, &quot;Tom&quot;}</code></pre><div class="t-redactor__text">Метод <strong>intersection()</strong> производит операцию пересечения множеств и возвращает новое множество:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">users = {&quot;Tom&quot;,&quot;Bob&quot;,&quot;Alice&quot;}
users2 = {&quot;Sam&quot;,&quot;Kate&quot;, &quot;Bob&quot;}
 
users3 = users.intersection(users2)
print(users3)  
input()

# выведет: {&quot;Bob&quot;}</code></pre><div class="t-redactor__text">Еще одна операция — разность множеств возвращает те элементы, которые есть в первом множестве, но отсутствуют во втором. Для получения разности множеств можно использовать метод <strong>difference</strong> или операцию вычитания:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">users = {&quot;Tom&quot;,&quot;Bob&quot;,&quot;Alice&quot;}
users2 = {&quot;Sam&quot;,&quot;Kate&quot;, &quot;Bob&quot;}
 
users3 = users.difference(users2)
print(users3)           # {&quot;Tom&quot;, &quot;Alice&quot;}
print(users - users2)   # {&quot;Tom&quot;, &quot;Alice&quot;}
input()</code></pre><h4  class="t-redactor__h4">frozen set</h4><div class="t-redactor__text">Тип frozen set является видом множеств, которое не может быть изменено. Для его создания используется функция frozenset:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">users = frozenset({&quot;Tom&quot;, &quot;Bob&quot;, &quot;Alice&quot;})</code></pre><div class="t-redactor__text">В функцию frozenset передается набор элементов — список, кортеж, другое множество.<br /><br />Видео по уроку:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/pvZZF0HINE8" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Функции в Python</title>
			<link>https://www.easyitway.com/tpost/yo3y92pti1-funktsii-v-python</link>
			<amplink>https://www.easyitway.com/tpost/yo3y92pti1-funktsii-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 13:22:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Функция в Python — это объект, принимающий аргументы и возвращающий значение. Объявление функции начинается с ключевого слова def, что является сокращением от define. После него идет имя функции.</description>
			<turbo:content>
<![CDATA[<header><h1>Функции в Python</h1></header><div class="t-redactor__text"><strong>Функция в Python</strong> — это объект, принимающий аргументы и возвращающий значение. Объявление функции начинается с ключевого слова <strong>def</strong>, что является сокращением от <strong>define</strong>. После него идет имя функции.<br /><br />После имени в круглых скобках задается список параметров. Пример простой функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def help():
    print(&quot;&quot;&quot;Доступные команды:
          -h - справка
          -a - добавить
          -d - удалить
          -p - вывести&quot;&quot;&quot;)

print(&quot;Эта строка будет отображена раньше&quot;)

help()
input()</code></pre><div class="t-redactor__text">Тело функции пишется с отступом со следующей строки. Мы объявили функцию help(), выводящую справку по использованию программы.<br /><br />Интерпретатор при объявлении функции не выполняет ее, а выполнение функции начинается, когда будет встречен оператор её вызова (help()).<br /><br />Функция может быть любой сложности и возвращать любые объекты (списки, кортежи, и даже функции):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def newfunc(n):
    def myfunc(x):
        return x + n
    return myfunc

new = newfunc(100)  # new - это функция
print(new(200))
input()

# выведет: 300</code></pre><h4  class="t-redactor__h4">Аргументы функции</h4><div class="t-redactor__text">Функция может принимать произвольное количество аргументов или не принимать их вообще.</div><div class="t-redactor__text">Напишем функцию sum(), которая принимает два параметра и возвращает сумму этих параметров. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def sum(a, b):
    res = a + b
    return res

print(sum(2,2))
input()

# выведет: 4</code></pre><div class="t-redactor__text">Оператор <strong>return</strong> может возвращать, как результат вычисления выражения, так и значение переменной.<br /><br />Рассмотрим еще один пример. Напишем код, который будет запрашивать у пользователя определенный ввод и он будет запрашивать до тех пор, пока пользователь не введет y или n. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def yn(message):
    resp = None
    while resp not in (&quot;y&quot;, &quot;n&quot;):
        resp = input(message).lower()
    return resp

answer = yn(&quot;Форматировать диск? [y/n]&quot;)
print(&quot;Ваш выбор: &quot;, answer)
input()</code></pre><h4  class="t-redactor__h4">Повторное использование кода</h4><div class="t-redactor__text">Основное назначение функций — это повторное использование кода. Если вам необходимо использовать один код несколько раз, тогда целесообразно оформить данный код в виде функции без параметров или с параметрами.</div><div class="t-redactor__text">Преимущества повторного использования кода:</div><div class="t-redactor__text"><ol><li>Позволяет повысить производительность труда программиста. На проект можно затратить меньше времени и усилий;</li><li>Позволяет улучшить качество программ;</li><li>Позволяет повысить эффективность ПО. если есть хороший код, который эффективно работает, то целесообразно использовать его, а не писать новый код.</li></ol></div><div class="t-redactor__text">Использовать свой код повторно можно с помощью модулей в Python. После создания модулей можно будет подключать свой код к любой Python-программе и вызывать уже существующие в нем функции вместо написания новых для каждого проекта.</div><h4  class="t-redactor__h4">Переменное число параметров</h4><div class="t-redactor__text">Представим, что нужно написать функцию принимающую любое число параметров. Для этого используется аргумент «*». Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def avg(first, *rest):
    return (first + sum(rest)) / (1 + len(rest))
print(avg(1,2))
print(avg(1,2,3,4))
input()

# выведет:
1.5
2.5</code></pre><div class="t-redactor__text">В данном случае rest-это кортеж, содержащий все дополнительно переданные аргументы. Код считает его последовательностью и работает как с последовательностью.<br /><br />Функция может принять любое число именных параметров, тогда перед именем ставится **:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def variable_len(**args):
    print(type(args))
    for x, value in args.items():
        print(x, value)
variable_len(apple = &quot;яблоко&quot;, bread = &quot;хлеб&quot;) 

input()

# Выведет apple яблоко bread хлеб</code></pre><h4  class="t-redactor__h4">Анонимные функции</h4><div class="t-redactor__text">Анонимные функции могут содержать лишь одно выражение, но и выполняются они быстрее.</div><div class="t-redactor__text">Анонимные функции создаются с помощью инструкции <strong>lambda</strong>. Кроме этого, их не обязательно присваивать переменной. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">func = lambda x, y: x + y
print(func(1, 2))
input()
# выведет: 3

add = lambda x, y: x + y
print(add(2,2))
input()

# выведет: 4</code></pre><div class="t-redactor__text">lambda функции, в отличие от обычной, не требуется инструкция return, а в остальном, ведет себя точно также:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">func = lambda *args: args
print(func(1, 2, 3, 4))
input()

# выведет: (1, 2, 3, 4)</code></pre><div class="t-redactor__text">Как правило, lambda используется в контексте некоторой другой операции, такой как сортировка или сокращение данных.</div><h4  class="t-redactor__h4">Возвращаем несколько значений</h4><div class="t-redactor__text">Иногда нужно, чтобы функция вернула несколько значений. Для этого просто возвращайте кортеж, например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def fun():
    return 1, 2, 3
a, b, c = fun()
print(a, b, c)
input()

# выведет: 1 2 3</code></pre><div class="t-redactor__text">Данная функция возвращает одно значение, но в виде кортежа.</div><h4  class="t-redactor__h4">Документирование функции</h4><div class="t-redactor__text">Определим функцию:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def sum(s,y): return x + y</code></pre><div class="t-redactor__text">Если изучить ее, обнаружатся два скрытых метода (которые начинаются с двух знаков нижнего подчеркивания), среди которых есть __doc__.<br /><br />Он нужен для настройки документации функции. Документация в Python называется docstring и может быть объединена с функцией следующим образом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def sum(x, y):
    &quot;&quot;&quot;Первая срока - заголовок

    Затем следует необязательная пустая строка и текст 
    документации.
    &quot;&quot;&quot;
    return x+y
print(sum.__doc__)
sum.__doc__ += &quot;some additional text&quot;

input()</code></pre><div class="t-redactor__text">Команда docstring должна быть первой инструкцией после объявления функции. Ее потом можно будет извлекать или дополнять.<br /><br />Видео по уроку:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/FW4Or_EjIZg" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Файлы. Работа с файлами в Python</title>
			<link>https://www.easyitway.com/tpost/aji332fxy1-faili-rabota-s-failami-v-python</link>
			<amplink>https://www.easyitway.com/tpost/aji332fxy1-faili-rabota-s-failami-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 13:26:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Дорогие друзья, пришло время научится работать с файлами в Python, то есть сохранять состояние программы в файле на жестком диске.</description>
			<turbo:content>
<![CDATA[<header><h1>Файлы. Работа с файлами в Python</h1></header><div class="t-redactor__text">Дорогие друзья, пришло время научится работать с файлами в Python, то есть сохранять состояние программы в файле на жестком диске. Прежде, чем работать с файлом, его надо открыть. С этим замечательно справится встроенная функция <strong>open:</strong></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Синтаксис функции open()

my_file = open(имя_файла [, режим_доступа][, буферизация])</code></pre><div class="t-redactor__text">При этом:</div><div class="t-redactor__text"><strong>имя_файла:</strong> строка, содержащая имя файла с расширением. Например, «my_file.txt».</div><div class="t-redactor__text"><strong>режим_доступа:</strong> строка, которой мы указываем для чего открывается файл: для чтения, записи, добавления информации, и т.д. Например, «w». По умолчанию файл открывается для чтения — «r».</div><div class="t-redactor__text"><strong>буферизация:</strong> Целое число. Если значение аргумента указано 0 — файл открывается без буферизации, 1 с построчной буферизацией, больше одного процесс буферизации выполняется с указанным размером буфера. Отрицательное число — размер буфера будет равен системному.</div><h4  class="t-redactor__h4">Список режимов доступа к файлу</h4><img src="https://static.tildacdn.com/tild3438-6334-4235-b362-633932626535/2023-12-03_13-26.png"><h4  class="t-redactor__h4">Чтение файла</h4><div class="t-redactor__text">Вот открыли мы файл, но а теперь нужно прочитать из него информацию. Для этого есть несколько способов, но большого интереса заслуживают лишь два из них.</div><div class="t-redactor__text">Первый — метод read() читает строку из открытого файла.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">my_file.read([count])</code></pre><div class="t-redactor__text">Необязательный параметр count — это количество байт, которые следует прочитать из открытого файла.<br /><br />Этот метод читает информацию с начала файла и, если параметр count не указан, до конца файла. Например, прочтем созданный файл text.txt:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">my_file = open(&quot;text.txt&quot;, encoding=&#039;utf-8&#039;)
my_string = my_file.read()
print(&quot;Было прочитано:&quot;)
print(my_string)
my_file.close()
  
input(&quot;Нажмите Enter для выхода&quot;)</code></pre><div class="t-redactor__text">Ещё один способ сделать это — прочитать файл построчно, воспользовавшись циклом for:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">f = open(&#039;text.txt&#039;, encoding=&#039;utf-8&#039;)
for line in f:
  print(line)
  
input(&quot;Нажмите Enter для выхода&quot;)</code></pre><div class="t-redactor__text">Разные способы чтения из текстового файла:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(&quot;** Открытие и закрытие файла **&quot;)
txt = open(&quot;text.txt&quot;, &quot;r&quot;, encoding=&#039;utf-8&#039;)
txt.close()

print(&quot;** Посимвольное чтение файла **&quot;)
txt = open(&quot;text.txt&quot;, &quot;r&quot;)
print(txt.read(1))
print(txt.read(2))
print(txt.read(6))
txt.close()

print(&quot;** Посимвольное чтение с указанием кодировки **&quot;)
txt = open(&quot;text.txt&quot;, &quot;r&quot;, encoding=&#039;utf-8&#039;)
print(txt.read(1))
print(txt.read(2))
print(txt.read(6))
txt.close()

print(&quot;** Чтение всего файла **&quot;)
txt = open(&quot;text.txt&quot;, &quot;r&quot;, encoding=&#039;utf-8&#039;)
content = txt.read()
print(content)
txt.close()

print(&quot;** Читаем строку из файла посимвольно **&quot;)
txt = open(&quot;text.txt&quot;, &quot;r&quot;, encoding=&#039;utf-8&#039;)
print(txt.readline(1))
print(txt.readline(5))
txt.close()

print(&quot;** Читаем строку из файла полностью **&quot;)
txt = open(&quot;text.txt&quot;, &quot;r&quot;, encoding=&#039;utf-8&#039;)
print(txt.readline())
print(txt.readline())
txt.close()

print(&quot;** Чтение всего файла в список **&quot;)
txt = open(&quot;text.txt&quot;, &quot;r&quot;, encoding=&#039;utf-8&#039;)
lines = txt.readlines()

print(lines)
print(len(lines))
for line in lines:
   print(line)
   
txt.close()

print(&quot;** Построчное чтение файла **&quot;)
txt = open(&quot;text.txt&quot;, &quot;r&quot;, encoding=&#039;utf-8&#039;)
for line in txt:
  print(line)
txt.close()

input(&quot;Нажмите Enter для выхода&quot;)</code></pre><div class="t-redactor__text">Результат выполнения программы:</div><img src="https://static.tildacdn.com/tild6266-3965-4363-a434-633861646266/file_python_1.jpg"><h4  class="t-redactor__h4">Запись файла</h4><div class="t-redactor__text">Метод write() записывает любую строку в открытый файл. Важно помнить, что строки в Python могут содержать двоичные данные, а не только текст. Метод write() не добавляет символ переноса строки (‘\n’) в конец файла.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Синтаксис метода write():
my_file.write(string);</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}">my_file = open(&quot;primer.txt&quot;, &quot;w&quot;)
my_file.write(&quot;Мне нравится Python!\nЭто классный язык!&quot;)
my_file.close()
input(&quot;Создание файла и запись завершена!&quot;)</code></pre><div class="t-redactor__text">Вышеприведенный код создаст файл primer.txt и запишет в него указанную строку.</div><h4  class="t-redactor__h4">Закрытие файла</h4><div class="t-redactor__text">Python автоматически закрывает файл если файловый объект к которому он привязан присваивается другому файлу. Однако, хорошей практикой будет вручную закрывать файл командой close(). Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">my_file = open(&quot;primer.txt&quot;)
print(&quot;Имя файла: &quot;, my_file.name)
print(&quot;Файл закрыт: &quot;, my_file.closed)
my_file.close()
print(&quot;А теперь закрыт: &quot;, my_file.closed)
input(&quot;Нажмите Enter для выхода&quot;)</code></pre><h4  class="t-redactor__h4">Консервация</h4><div class="t-redactor__text"><strong>Консервация</strong> — это долговременное хранение структурированных данных. Программист может «законсервировать» в файл, то есть сохранить в неизменном виде структуру, такую как список или словарь.</div><div class="t-redactor__text">Для поддержки консервации нужно импортировать в программу два модуля:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import pickle
import shelve</code></pre><div class="t-redactor__text">Первый модуль позволяет консервировать структуры данных и сохранять их в файлах, а второй модуль обеспечивает произвольный доступ к законсервированным объектам.<br /><br />Пример консервации:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import pickle
import shelve

first_name = [&quot;Витя&quot;, &quot;Максим&quot;, &quot;Коля&quot;]
last_name = [&quot;Сидоров&quot;, &quot;Петров&quot;, &quot;Иванов&quot;]

datafile = open(&quot;names.dat&quot;, &quot;wb&quot;)

pickle.dump(first_name, datafile)
pickle.dump(last_name, datafile)
datafile.close()

input(&quot;Файл создан&quot;)</code></pre><div class="t-redactor__text">Данный пример создает и записывает данные в файл <strong>«names.dat»</strong>. Данные будут записаны в двоичном виде.<br /><br />Пример чтения файлов из бинарного файла (законсервированного). Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import pickle
import shelve

datafile = open(&quot;names.dat&quot;, &quot;rb&quot;)
fnames = pickle.load(datafile)
lnames = pickle.load(datafile)
datafile.close()

print(fnames)
print(lnames)

input()

# Будет выведено:
[&#039;Витя&#039;, &#039;Максим&#039;, &#039;Коля&#039;]
[&#039;Сидоров&#039;, &#039;Петров&#039;, &#039;Иванов&#039;]</code></pre><h4  class="t-redactor__h4">Произвольный доступ к законсервированным данным</h4><div class="t-redactor__text">После консервации нескольких списков можно получить доступ к одному произвольному списку. В этом может помочь модуль <strong>shelve</strong>. Первым делом необходимо создать полку:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">s = shelve.open(&quot;text.dat&quot;)</code></pre><div class="t-redactor__text">Данная функция работает подобно файловой функции <strong>open()</strong>, но открывает не текстовый файл, а файл с консервированными объектами.<br /><br />Функции <strong>shelve.open()</strong> нужно передать только имя файла. Второй необязательный параметр — это режим доступа, который может быть:<br /><br /><strong>c</strong> — (используется по умолчанию) — открытие файла на чтение или запись, если файл не существует, он будет создан.<br /><br /><strong>n</strong> — создание нового файла для чтения и записи, если файл существует, он будет перезаписан.<br /><br /><strong>r</strong> — доступ только чтение, если файл не существует, вы получите сообщение об ошибке.<br /><br /><strong>w</strong> — доступ только запись, если файл не существует, вы получите сообщение об ошибке.<br /><br />Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import pickle
import shelve

s = shelve.open(&quot;text.dat&quot;)

s[&quot;first_name&quot;] = [&quot;Витя&quot;, &quot;Максим&quot;, &quot;Коля&quot;]
s[&quot;last_name&quot;] = [&quot;Сидоров&quot;, &quot;Петров&quot;, &quot;Иванов&quot;]

s.sync()
s.close()

s = shelve.open(&quot;text.dat&quot;)
print(s[&quot;last_name&quot;])
input()</code></pre><div class="t-redactor__text">В данном примере мы создаем функцию создания полки, а затем помещаем данные «на полку». Далее проверяем запись и открываем файл и прочитаем список фамилий с полки. Вывод программы:</div><img src="https://static.tildacdn.com/tild3435-3733-4632-b865-323863393332/file_python_2.jpg"><div class="t-redactor__text">Видео по уроку:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/SpohWfgb5rQ" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Встроенные функции в Python</title>
			<link>https://www.easyitway.com/tpost/v6pkkza4z1-vstroennie-funktsii-v-python</link>
			<amplink>https://www.easyitway.com/tpost/v6pkkza4z1-vstroennie-funktsii-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 13:31:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>У интерпретатора Python есть ряд встроенных в него функций и типов, которые доступны всегда. В этой статье вы можете познакомиться со списком встроенных функций Python.</description>
			<turbo:content>
<![CDATA[<header><h1>Встроенные функции в Python</h1></header><div class="t-redactor__text">У интерпретатора Python есть ряд встроенных в него функций и типов, которые доступны всегда. В этой статье вы можете познакомиться со списком встроенных функций Python.</div><h4  class="t-redactor__h4">Встроенные функции, выполняющие преобразование типов</h4><div class="t-redactor__text"><strong>bool(x)</strong> — преобразование к типу bool, использующая стандартную процедуру проверки истинности. Если х является ложным или опущен, возвращает значение False, в противном случае она возвращает True.</div><div class="t-redactor__text"><strong>bytearray([источник [, кодировка [ошибки]]])</strong> — преобразование к bytearray. Bytearray — изменяемая последовательность целых чисел в диапазоне 0≤X&lt;256. Вызванная без аргументов, возвращает пустой массив байт.</div><div class="t-redactor__text"><strong>bytes([источник [, кодировка [ошибки]]])</strong> — возвращает объект типа bytes, который является неизменяемой последовательностью целых чисел в диапазоне 0≤X&lt;256. Аргументы конструктора интерпретируются как для bytearray().</div><div class="t-redactor__text"><strong>complex([real[, imag]])</strong> — преобразование к комплексному числу.</div><div class="t-redactor__text"><strong>dict([object])</strong> — преобразование к словарю.</div><div class="t-redactor__text"><strong>float([X])</strong> — преобразование к числу с плавающей точкой. Если аргумент не указан, возвращается 0.0.</div><div class="t-redactor__text"><strong>frozenset([последовательность])</strong> — возвращает неизменяемое множество.</div><div class="t-redactor__text"><strong>int([object], [основание системы счисления])</strong> — преобразование к целому числу.</div><div class="t-redactor__text"><strong>list([object])</strong> — создает список.</div><div class="t-redactor__text"><strong>memoryview([object])</strong> — создает объект memoryview.</div><div class="t-redactor__text"><strong>object()</strong> — возвращает безликий объект, являющийся базовым для всех объектов.</div><div class="t-redactor__text"><strong>range([start=0], stop, [step=1])</strong> — арифметическая прогрессия от start до stop с шагом step.</div><div class="t-redactor__text"><strong>set([object])</strong> — создает множество.</div><div class="t-redactor__text"><strong>slice([start=0], stop, [step=1])</strong> — объект среза от start до stop с шагом step.</div><div class="t-redactor__text"><strong>str([object], [кодировка], [ошибки])</strong> — строковое представление объекта. Использует метод __str__.</div><div class="t-redactor__text"><strong>tuple(obj)</strong> — преобразование к кортежу.</div><h4  class="t-redactor__h4">Другие встроенные функции</h4><div class="t-redactor__text"><strong>abs(x)</strong> — Возвращает абсолютную величину (модуль числа).</div><div class="t-redactor__text"><strong>all(последовательность)</strong> — Возвращает True, если все элементы истинные (или, если последовательность пуста).</div><div class="t-redactor__text"><strong>any(последовательность)</strong> — Возвращает True, если хотя бы один элемент — истина. Для пустой последовательности возвращает False.</div><div class="t-redactor__text"><strong>ascii(object)</strong> — Как repr(), возвращает строку, содержащую представление объекта, но заменяет не-ASCII символы на экранированные последовательности.</div><div class="t-redactor__text"><strong>bin(x)</strong> — Преобразование целого числа в двоичную строку.</div><div class="t-redactor__text"><strong>callable(x)</strong> — Возвращает True для объекта, поддерживающего вызов (как функции).</div><div class="t-redactor__text"><strong>chr(x)</strong> — Возвращает односимвольную строку, код символа которой равен x.</div><div class="t-redactor__text"><strong>classmethod(x)</strong> — Представляет указанную функцию методом класса.</div><div class="t-redactor__text"><strong>compile(source, filename, mode, flags=0, dont_inherit=False)</strong> — Компиляция в программный код, который впоследствии может выполниться функцией eval или exec. Строка не должна содержать символов возврата каретки или нулевые байты.</div><div class="t-redactor__text"><strong>delattr(object, name)</strong> — Удаляет атрибут с именем ‘name’.</div><div class="t-redactor__text"><strong>dir([object])</strong> — Список имен объекта, а если объект не указан, список имен в текущей локальной области видимости.</div><div class="t-redactor__text"><strong>divmod(a, b)</strong> — Возвращает частное и остаток от деления a на b.</div><div class="t-redactor__text"><strong>enumerate(iterable, start=0)</strong> — Возвращает итератор, при каждом проходе предоставляющем кортеж из номера и соответствующего члена последовательности.</div><div class="t-redactor__text"><strong>eval(expression, globals=None, locals=None)</strong> — Выполняет строку программного кода.</div><div class="t-redactor__text"><strong>exec(object[, globals[, locals]])</strong> — Выполняет программный код на Python.</div><div class="t-redactor__text"><strong>filter(function, iterable)</strong> — Возвращает итератор из тех элементов, для которых function возвращает истину.</div><div class="t-redactor__text"><strong>format(value[,format_spec])</strong> — Форматирование (обычно форматирование строки).</div><div class="t-redactor__text"><strong>getattr(object, name ,[default])</strong> — извлекает атрибут объекта или default.</div><div class="t-redactor__text"><strong>globals()</strong> — Словарь глобальных имен.</div><div class="t-redactor__text"><strong>hasattr(object, name)</strong> — Имеет ли объект атрибут с именем ‘name’.</div><div class="t-redactor__text"><strong>hash(x)</strong> — Возвращает хеш указанного объекта.</div><div class="t-redactor__text"><strong>help([object])</strong> — Вызов встроенной справочной системы.</div><div class="t-redactor__text"><strong>hex(х)</strong> — Преобразование целого числа в шестнадцатеричную строку.</div><div class="t-redactor__text"><strong>id(object)</strong> — Возвращает «адрес» объекта. Это целое число, которое гарантированно будет уникальным и постоянным для данного объекта в течение срока его существования.</div><div class="t-redactor__text"><strong>input([prompt])</strong> — Возвращает введенную пользователем строку. Prompt — подсказка пользователю.</div><div class="t-redactor__text"><strong>isinstance(object, ClassInfo)</strong> — Истина, если объект является экземпляром ClassInfo или его подклассом. Если объект не является объектом данного типа, функция всегда возвращает ложь.</div><div class="t-redactor__text"><strong>issubclass(класс, ClassInfo)</strong> — Истина, если класс является подклассом ClassInfo. Класс считается подклассом себя.</div><div class="t-redactor__text"><strong>iter(x)</strong> — Возвращает объект итератора.</div><div class="t-redactor__text"><strong>len(x)</strong> — Возвращает число элементов в указанном объекте.</div><div class="t-redactor__text"><strong>locals()</strong> — Словарь локальных имен.</div><div class="t-redactor__text"><strong>map(function, iterator)</strong> — Итератор, получившийся после применения к каждому элементу последовательности функции function.</div><div class="t-redactor__text"><strong>max(iter, [args …] * [, key])</strong> — Максимальный элемент последовательности.</div><div class="t-redactor__text"><strong>min(iter, [args …] * [, key])</strong> — Минимальный элемент последовательности.</div><div class="t-redactor__text"><strong>next(x)</strong> — Возвращает следующий элемент итератора.</div><div class="t-redactor__text"><strong>oct(х)</strong> — Преобразование целого числа в восьмеричную строку.</div><div class="t-redactor__text"><strong>open(file, mode=’r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True)</strong> — Открывает файл и возвращает соответствующий поток.</div><div class="t-redactor__text"><strong>ord(с)</strong> — Код символа.</div><div class="t-redactor__text"><strong>pow(x, y[, r]) — ( x ** y ) % r</strong> — Возвращает x в степени y; если z присутствует, возвращает x в степени y, по модулю z (вычисление более эффективно, чем pow(x, y) % z).</div><div class="t-redactor__text"><strong>reversed(object)</strong> — Итератор из развернутого объекта.</div><div class="t-redactor__text"><strong>repr(obj)</strong> — Представление объекта.</div><div class="t-redactor__text"><strong>print([object, …], *, sep=» «, end=’\n’, file=sys.stdout)</strong> — Печать.</div><div class="t-redactor__text"><strong>property(fget=None, fset=None, fdel=None, doc=None)</strong> — Возвращает свойство атрибута.</div><div class="t-redactor__text"><strong>round(X [, N])</strong> — Округление до N знаков после запятой.</div><div class="t-redactor__text"><strong>setattr(объект, имя, значение)</strong> — Устанавливает атрибут объекта.</div><div class="t-redactor__text"><strong>sorted(iterable[, key][, reverse])</strong> — Отсортированный список.</div><div class="t-redactor__text"><strong>staticmethod(function)</strong> — Статический метод для функции.</div><div class="t-redactor__text"><strong>sum(iter, start=0)</strong> — Сумма членов последовательности.</div><div class="t-redactor__text"><strong>super([тип [, объект или тип]])</strong> — Доступ к родительскому классу.</div><div class="t-redactor__text"><strong>type(object)</strong> — Возвращает тип объекта.</div><div class="t-redactor__text"><strong>type(name, bases, dict)</strong> — Возвращает новый экземпляр класса name.</div><div class="t-redactor__text"><strong>vars([object])</strong> — Словарь из атрибутов объекта. По умолчанию — словарь локальных имен.</div><div class="t-redactor__text"><strong>zip(*iters)</strong> — Итератор, возвращающий кортежи, состоящие из соответствующих элементов аргументов-последовательностей.</div><div class="t-redactor__text">Видео по встроенным функциям:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/5kO21w40FvE" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>With … as — менеджеры контекста</title>
			<link>https://www.easyitway.com/tpost/cfy2cg1cn1-with-as-menedzheri-konteksta</link>
			<amplink>https://www.easyitway.com/tpost/cfy2cg1cn1-with-as-menedzheri-konteksta?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 13:49:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Конструкция with … as&nbsp;в Python используется для оборачивания выполнения блока инструкций менеджером контекста.</description>
			<turbo:content>
<![CDATA[<header><h1>With … as — менеджеры контекста</h1></header><div class="t-redactor__text">Конструкция <strong>with … as</strong> в Python используется для оборачивания выполнения блока инструкций менеджером контекста. Менеджеры контекста позволяют выделять и освобождать ресурсы строго по необходимости. Синтаксис конструкции with … as:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&quot;with&quot; expression [&quot;as&quot; target] (&quot;,&quot; expression [&quot;as&quot; target])* &quot;:&quot;
    suite</code></pre><div class="t-redactor__text">В коде выше происходит выполнение:<br /><br /><ol><li>Выполняется выражение в конструкции with … as.</li><li>Загружается специальный метод __exit__ для дальнейшего использования.</li><li>Выполняется метод __enter__. Если конструкция with включает в себя слово as, то возвращаемое методом __enter__ значение записывается в переменную.</li><li>Выполняется suite.</li><li>Вызывается метод __exit__, причём неважно, выполнилось ли suite или произошло исключение. В этот метод передаются параметры исключения, если оно произошло, или во всех аргументах значение None, если исключения не было.</li></ol></div><h4  class="t-redactor__h4">Для чего нужна конструкция with … as?</h4><div class="t-redactor__text">Самый распространённый пример использования этой конструкции — открытие файлов. Предположим, у вас есть две связанные операции, которые вы хотите исполнить в паре, поместив между ними блок кода. Менеджеры контекста позволяют сделать именно это. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">with open(&#039;some_file&#039;, &#039;w&#039;) as opened_file:
    opened_file.write(&#039;Hola!&#039;)</code></pre><div class="t-redactor__text">Код выше открывает файл, записывает в него данные и закрывает файл после этого. При возникновении ошибки при записи данных в файл менеджер контекста попробует его закрыть.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Создание и подключение модулей в Python</title>
			<link>https://www.easyitway.com/tpost/xtm9s36e61-sozdanie-i-podklyuchenie-modulei-v-pytho</link>
			<amplink>https://www.easyitway.com/tpost/xtm9s36e61-sozdanie-i-podklyuchenie-modulei-v-pytho?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 13:50:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Модулем в Python называется любой файл с программой. В этой статье мы поговорим о том, как создать модуль, и как подключить модуль, из стандартной библиотеки или написанный вами.</description>
			<turbo:content>
<![CDATA[<header><h1>Создание и подключение модулей в Python</h1></header><div class="t-redactor__text">Модулем в Python называется любой файл с программой. В этой статье мы поговорим о том, как создать модуль, и как подключить модуль, из стандартной библиотеки или написанный вами. Каждая программа может импортировать модуль и получить доступ к его классам, функциям и объектам.</div><h4  class="t-redactor__h4">Подключение модуля из стандартной библиотеки</h4><div class="t-redactor__text">Подключить модуль можно с помощью инструкции <strong>import</strong>. К примеру, подключим модуль os для получения текущей директории:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import os
os.getcwd()
&#039;C:\\Python33&#039;</code></pre><div class="t-redactor__text">После ключевого слова import указывается название модуля. Одной инструкцией можно подключить несколько модулей, хотя этого не рекомендуется делать, так как это снижает читаемость кода.<br /><br />После импортирования модуля его название становится переменной, через которую можно получить доступ к атрибутам модуля. Например, можно обратиться к константе расположенной в модуле math:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import math
math.e
2.718281828459045</code></pre><h4  class="t-redactor__h4">Использование псевдонимов</h4><div class="t-redactor__text">Если название модуля слишком длинное, то для него можно создать псевдоним, с помощью ключевого слова as.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import math as m
m.e
2.718281828459045</code></pre><div class="t-redactor__text">Теперь доступ ко всем атрибутам модуля <strong>math</strong> осуществляется только с помощью переменной m, а переменной math в этой программе уже не будет.</div><h4  class="t-redactor__h4">Инструкция from</h4><div class="t-redactor__text">Подключить определенные атрибуты модуля можно с помощью инструкции from. Она имеет несколько форматов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from &lt;Название модуля&gt; import &lt;Атрибут 1&gt; [ as &lt;Псевдоним 1&gt; ], [&lt;Атрибут 2&gt; [ as &lt;Псевдоним 2&gt; ] ...]
from &lt;Название модуля&gt; import *</code></pre><div class="t-redactor__text">Первый формат позволяет подключить из модуля только указанные вами атрибуты. Для длинных имен также можно назначить псевдоним, указав его после ключевого слова as. Второй формат инструкции from позволяет подключить все переменные из модуля.</div><h4  class="t-redactor__h4">Создание своего модуля</h4><div class="t-redactor__text">Теперь попробуем создать свой модуль. Создадим файл mymodule.py, в которой определим какие-нибудь функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def hello():
    print(&#039;Hello, world!&#039;)

def fib(n):
    a = b = 1
    for i in range(n - 2):
        a, b = b, a + b
    return b</code></pre><div class="t-redactor__text">В этой же папке создадим другой файл, например, module.py:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import mymodule

mymodule.hello()
print(mymodule.fib(10))</code></pre><div class="t-redactor__text">Выведет:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Hello, world!
55</code></pre><div class="t-redactor__text">Вот так просто создаются и подключаются модули в Python. На этом наша небольшая статья закончилась. Для понимания языка рекомендую читать данный самоучитель с первой статьи.<br /><br />Видео по уроку:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/iMVwpkKzlaY" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Объектно-ориентированное программирование в Python</title>
			<link>https://www.easyitway.com/tpost/f1gts2igk1-obektno-orientirovannoe-programmirovanie</link>
			<amplink>https://www.easyitway.com/tpost/f1gts2igk1-obektno-orientirovannoe-programmirovanie?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 13:59:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Сегодня я расскажу вам о объектно-ориентированных возможностях в Python. Ведь с самого начала Python проектировался как объектно-ориентированный язык программирования.</description>
			<turbo:content>
<![CDATA[<header><h1>Объектно-ориентированное программирование в Python</h1></header><div class="t-redactor__text">Сегодня я расскажу вам о объектно-ориентированных возможностях в Python. Ведь с самого начала Python проектировался как объектно-ориентированный язык программирования.<br /><br />Объектно-ориентированное программирование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.<br /><br /><strong>Класс</strong> — тип, описывающий устройство объектов. <strong>Объект</strong> — это экземпляр класса. Класс можно сравнить с чертежом, по которому создаются объекты.<br /><br />Python соответствует принципам объектно-ориентированного программирования. В Python всё является объектами — и строки, и списки, и словари, и всё остальное.<br /><br />Использование классов дает прежде всего преимущества абстрактного подхода в программировании.<br /><br />1. <strong>Полиморфизм:</strong> в разных объектах одна и та же операция может выполнять различные функции. Слово «полиморфизм» имеет греческую природу и означает «имеющий многие формы».<br /><br />Простым примером полиморфизма может служить функция count(), выполняющая одинаковое действие для различных типов обьектов: ‘abc’.count(‘a’) и [1, 2, ‘a’].count(‘a’). Оператор плюс полиморфичен при сложении чисел и при сложении строк.<br /><br />2. <strong>Инкапсуляция:</strong> можно скрыть ненужные внутренние подробности работы объекта от окружающего мира. Это второй основной принцип абстракции. Он основан на использовании атрибутов внутри класса.<br /><br />Атрибуты могут иметь различные состояния в промежутках между вызовами методов класса, вследствие чего сам объект данного класса также получает различные состояния — state.<br /><br />3. <strong>Наследование:</strong> можно создавать специализированные классы на основе базовых. Это позволяет избегать написания повторного кода.<br /><br />4. <strong>Композиция:</strong> объект может быть составным и включать в себя другие объекты.<br /><br />Объектно-ориентированный подход в программировании подразумевает следующий алгоритм действий.<br /><br /><ol><li>Описывается проблема с помощью обычного языка с использованием понятий, действий, прилагательных.</li><li>На основе понятий формулируются классы.</li><li>На основе действий проектируются методы.</li><li>Реализуются методы и атрибуты.</li></ol><br />Теперь приступим к написанию своих классов и объектов на Python. Попробуем определить собственный класс и объект:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># Пример создания класса и объекта:
class Cat(object):
  &quot;&quot;&quot; Виртуальная кошка &quot;&quot;&quot;
  def talk(self):
    print(&quot;Мяу&quot;)

Bagira = Cat()
Bagira.talk()
input()

# выведет: Мяу</code></pre><div class="t-redactor__text">Первым делом мы объявили класс Cat. Для создания класса используется служебное слово «class». Имя класса начинается с большой буквы. Наш класс будет создан с опорой на фундаментальный встроенный тип object, проще говоря, мы наследуем наш класс от object.<br /><br />Строка «»» Виртуальная кошка «»» документирует класс.<br /><br />Далее мы объявляем метод:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def talk(self):
    print(&quot;Мяу&quot;)</code></pre><div class="t-redactor__text">Метод talk() выводит строку «Мяу». У метода talk() есть параметр self, который мы не используем.<br /><br />Далее мы создаем объект Bagira класса Cat() и вызываем его метод talk():</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Bagira = Cat()
Bagira.talk()</code></pre><div class="t-redactor__text">Сначала создается переменная Bagira, затем используется точечная нотация для вызова метода talk(). При вызове метода talk() мы видим строку «Мяу».</div><h4  class="t-redactor__h4">Конструкторы</h4><div class="t-redactor__text">Конструкторы используются для инициализации объекта, например, для загрузки информации из базы данных. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Cat(object):
  &quot;&quot;&quot; Виртуальная кошка &quot;&quot;&quot;
  def __init__(self):
    print(&quot;Родилась новая кошка!&quot;)
  def talk(self):
    print(&quot;Мяу&quot;)
cat1 = Cat()
cat2 = Cat()
cat1.talk()
cat2.talk()
input()</code></pre><div class="t-redactor__text">Конструктор также называется методом инициализации, поэтому имя у него специфическое — __init()__. Имя конструктора нельзя изменять.</div><div class="t-redactor__text">В примере мы создаем несколько объектов класса Cat. При создании объектов будет выведено сообщение о рождении новой кошки. Затем вызываем метод talk() каждого объекта.</div><h4  class="t-redactor__h4">Атрибуты класса</h4><div class="t-redactor__text">Атрибуты класса бывают двух видов:</div><div class="t-redactor__text"><ol><li>атрибуты данных;</li><li>атрибуты-методы.</li></ol></div><div class="t-redactor__text">Атрибуты класса — это имена переменных вне функций и имена функций. Эти атрибуты наследуются всеми объектами, созданными на основе данного класса.</div><div class="t-redactor__text">Атрибуты обеспечивают свойства и поведение объекта. Объекты могут иметь атрибуты, которые создаются в теле метода, если данный метод будет вызван для конкретного объекта. Использование атрибута:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Cat(object):
  &quot;&quot;&quot; Виртуальная кошка &quot;&quot;&quot;
  def __init__(self, name):
    print(&quot;Родилась новая кошка!&quot;)
    self.name = name
  def talk(self):
    print(self.name, &quot;: Мяу&quot;)
    
cat1 = Cat(&quot;Багира&quot;)
cat2 = Cat(&quot;Василий&quot;)
cat1.talk
cat2.talk

input()</code></pre><div class="t-redactor__text">В данном примере мы добавили параметр name нашему конструктору. Теперь при создании объекта мы можем назвать наших кошек.<br /><br />Далее мы выводим (в конструкторе) строку о рождении кошки, а вот следующая за print() строка как раз создает атрибут name и присваивает ему значение параметра name.<br /><br />Также мы изменили метод talk(). Теперь он выводит имя кошки, то есть значение атрибута self.name. К атрибуту можно обратиться напрямую:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(cat1.name)

# выведет: Багира</code></pre><div class="t-redactor__text">Аргумент self — это ссылка на создаваемый в памяти компьютера объект. Параметр self автоматически становится ссылкой на объект, по отношению к которому вызван метод.</div><div class="t-redactor__text">Поэтому через метод self метод получает доступ к вызывающему объекту, к его атрибутам и методам.</div><h4  class="t-redactor__h4">Закрытые атрибуты и методы</h4><div class="t-redactor__text">По умолчанию все атрибуты и методы класса являются открытыми или публичными (public). Публичные методы можно вызывать за пределами класса, а к публичным атрибутам можно обращаться за пределами класса.</div><div class="t-redactor__text">Существуют также и закрытые или приватные (private) методы и атрибуты. Приватный метод можно вызывать только внутри класса — в других методах.</div><div class="t-redactor__text">К приватным атрибутам невозможно обратиться напрямую. В Python два знака подчеркивания означают, что атрибут будет закрытым. Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def __init__(self, name):
   print(&quot;Родилась новая кошка!&quot;)
   self.name = name
   Cat.total += 1
   self.__w = 1</code></pre><div class="t-redactor__text">Атрибут __w является закрытым. Приватный метод объявляется аналогично:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def __private_method(self):
   print(&quot;Закрытый метод&quot;)</code></pre><div class="t-redactor__text">Если атрибут предназначен для служебного использования и его неправильное изменение может привести к сбою, то лучше его сделать закрытым и изменять только внутри класса — так вы сможете контролировать процесс изменения значения.</div><h4  class="t-redactor__h4">Управление доступом к закрытому атрибуту</h4><div class="t-redactor__text">Для управления доступом к закрытому атрибуту используются свойства — объект с методами, которые позволяют обращаться к атрибутам и ограничивают косвенный доступ.</div><div class="t-redactor__text">Для создания свойства нужно написать метод, который возвращает значение. Перед таким методом нужно объявить декоратор @property.</div><div class="t-redactor__text">Создав свойство, мы приоткрываем закрытый атрибут и делаем его доступным для чтения. Но с помощью свойств можно сделать его доступным не только для чтения, но и для записи.</div><div class="t-redactor__text">Видео по уроку:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/f1_oe-IrmnQ" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe><h4  class="t-redactor__h4">Программа «Виртуальная кошка»</h4><div class="t-redactor__text">Для закрепления теоретических знаний в области ООП создадим небольшую программу «Виртуальная кошка». В данной программе можно будет покормить виртуальную кошку, а также поиграть и взвесить. Листинг программы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Cat(object):
    &quot;&quot;&quot; Виртуальная кошка &quot;&quot;&quot;
    total = 0
    @staticmethod
    def count():
        print(&quot;Всего кошек: &quot;, Cat.total)
    
    def __init__(self):
        print(&quot;Родилась новая кошка!&quot;)
        self.name = input(&quot;Как мы её назовём? &quot;)
        Cat.total += 1
        self.__w = 300
        self.hunger = 1
        
    def __str__(self):
        res = &quot;Объект класса Cat\n name: &quot; + self.name + &quot;\nBec: &quot; + str(self.__w)
        return res
        
    @property
    def weight(self):
        return self.__w
    
    def talk(self):
        print(self.name, &quot;: Мяу&quot;)
    
    def eat(self):
        if self.hunger == 5:
            print(&quot;Кошка не голодная&quot;)
        else:
            self.hunger += 1
            self.__w += 30
            print(&quot;Мур!&quot;)

    def play(self):
        self.talk()
        self.__w -= 5
        if self.hunger &gt; 0:
            self.hunger -= 1
        else:
            self.hunger = 1
    
def main():

    bagira = Cat()
    choice = None
    while choice != &quot;0&quot;:
        print \
        (&quot;&quot;&quot;
        Что будем делать?
            
        0 - Выйти
        1 - Поговорить с кошкой
        2 - Покормить
        3 - Поиграть
        4 - Взвесить
        &quot;&quot;&quot;)
            
        choice = input(&quot;&gt;&gt;: &quot;)
        print()

        # exit
        if choice == &quot;0&quot;:
            print(&quot;Пока.&quot;)
            
        # послушать
        elif choice == &quot;1&quot;:
            bagira.talk()
                
        # покормить
        elif choice == &quot;2&quot;:
            bagira.eat()
                
        # поиграть
        elif choice == &quot;3&quot;:
            bagira.play()
        elif choice == &quot;4&quot;:
            print(&quot;Вес: &quot;, bagira.weight, &quot; гр. &quot;)
            
        # неправильный ввод
        else:
            print(&quot;\nНеправильный ввод!&quot;)  
main()            
input()</code></pre><div class="t-redactor__text">Декоратор <strong>@staticmethod</strong> — это просто функция внутри класса. Вы можете вызывать их обоих как с инициализацией класса так и без создания экземпляра класса. Обычно это применяется в тех случаях, когда у вас есть функция, которая, по вашему убеждению, имеет связь с классом.<br /><br />При рождении кошки пользователю дается возможность выбрать имя кошки. Также устанавливается начальный вес в 300 грамм и уровень голода 1, что означает, что кошка голодна.<br /><br />При каждом кормлении уровень голода повышается. Когда он достигает 5, кошка считается не голодной. При каждой игре с питомцем уровень голода понижается на единицу, то есть после того, как с кошкой поиграли, ее можно покормить.<br /><br />При каждом кормлении вес кошки увеличивается на 30 граммов. При каждой игре с кошкой она теряет 5 грамм веса.<br /><br />Вывод программы:</div><img src="https://static.tildacdn.com/tild3665-6665-4634-b236-663663653564/python_oop_2.jpg"><div class="t-redactor__text">Видео по созданию программы:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/XWw6G0lcodY" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>За что все любят Python?</title>
			<link>https://www.easyitway.com/tpost/zapgph3el1-za-chto-vse-lyubyat-python</link>
			<amplink>https://www.easyitway.com/tpost/zapgph3el1-za-chto-vse-lyubyat-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 14:04:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Когда речь заходит о backend-разработке, web-разработка на PHP и Python — это два наиболее популярных решения, которые выбирают компании и разработчики.</description>
			<turbo:content>
<![CDATA[<header><h1>За что все любят Python?</h1></header><div class="t-redactor__text">Когда речь заходит о backend-разработке, web-разработка на PHP и Python — это два наиболее популярных решения, которые выбирают компании и разработчики.</div><div class="t-redactor__text">Тем не менее, какой из двух выбрать — остается под вопросом. Несмотря на то, что огромное количество web-сайтов написаны на PHP, в последнее время наблюдается резкая тенденция к росту разработки на Python. В этой статье мы рассмотрим интересующий всех вопрос: «За что все любят Python?».</div><div class="t-redactor__text">В сравнении с PHP Python изначально поддерживает парадигму ООП и имеет развитые элементы функционального программирования. По скорости работы они примерно одинаковы. Достоинств перед PHP много, но есть один недостаток. Хостингов с Python намного меньше.</div><div class="t-redactor__text">Рассмотрим все достоинства Python:</div><h4  class="t-redactor__h4">1. Продуманный дизайн, чистый и понятный синтаксис</h4><div class="t-redactor__text">Python имеет архитектуру, благодаря которой его можно назвать продуманным и надежным языком. PHP не обладает такими качествами.</div><div class="t-redactor__text">В Python, чтобы оформить любой логический блок — например, содержимое функции — просто используют отступы и пробелы. Не нужно проверять, не потерялась ли по пути лишняя скобка — всё видно сразу. Одна команда занимает одну строку, поэтому разделители команд тоже не нужны.</div><div class="t-redactor__text">Он не содержит фигурных скобок, как другие языки программирования, и его легко понять. Философия Python — читабельность кода. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a=0
print(&#039;Введите число: &#039;)
input(a)
if a==0:
  print(&#039;Вы ввели ноль&#039;)
else:
  print(&#039;Вы однозначно ввели не ноль&#039;)</code></pre><h4  class="t-redactor__h4">2. Простота программирования и классные библиотеки</h4><div class="t-redactor__text">Встроенные средства языка берут на себя большинство типовых задач.</div><div class="t-redactor__text">В какой бы области вы ни делали проект, скорее всего, для этого уже есть готовая Python-библиотека.</div><div class="t-redactor__text">Он работает в основном с Django, Pyramid, Pylons и Flask. Django обычно считается де-факто выбором web-фреймворка в Python.</div><div class="t-redactor__text">Среди фреймворков Python, Django — явный победитель. Он чрезвычайно прост в использовании, безопасен и быстр. Он очень стабилен и надежен и пригоден для использования в ряде приложений.</div><h4  class="t-redactor__h4">3. Запускается везде</h4><div class="t-redactor__text">Python можно запустить практически на любой платформе — от КПК до серверов, и на любой операционной системе.</div><div class="t-redactor__text">Существует специальная версия Python для виртуальной машины Java — Jython. С ее помощью можно выполнять код на любой системе, которая поддерживает Java.</div><h4  class="t-redactor__h4">4. В простоте обучения Python выигрывает</h4><div class="t-redactor__text">Python отвечает требованиям гораздо лучше, чем PHP, поскольку использование последнего — более сложное, и не универсальное. Python использовать проще.</div><div class="t-redactor__text">Python выигрывает у PHP не только потому, что его легко освоить, но и благодаря огромному количеству учебных пособий, доступных онлайн.</div><h4  class="t-redactor__h4">5. Более простые и легкодоступные инструменты</h4><div class="t-redactor__text">Python имеет большую экосистему для разработчиков и легко доступные инструменты отладки для языка. Использовать эти инструменты довольно просто.</div><div class="t-redactor__text">Стек предоставляет разработчикам Python Debugger (PDB), довольно мощный отладчик, который прост в использовании и настолько хорошо документирован, что даже новички могут его понять.</div><h4  class="t-redactor__h4">6. Python более универсален, чем PHP</h4><div class="t-redactor__text">Python — это универсальный язык программирования, практически бесконечный. Разработка web-сайтов на Python — это не единственное, на что способен стек.</div><div class="t-redactor__text">Машинное обучени, NLP, наука о данных, обработка изображений, а также разработка настольных и мобильных приложений — это лишь несколько примеров использования Python.</div><h4  class="t-redactor__h4">7. Третий среди лучших</h4><div class="t-redactor__text">По итогам июня 2019 года Python набрал 8,5% в рейтинге <a href="https://www.tiobe.com/tiobe-index/" target="_blank" rel="noreferrer noopener">TIOBE</a>. Это рекордный показатель за все время присутствия языка в рейтинге. За месяц язык прибавил 2,55 процентных пункта и вытеснил <a href="https://it-black.ru/category/rubriki/samouchitel-po-s/" target="_blank" rel="noreferrer noopener">С++</a> с третьей строчки.</div><div class="t-redactor__text">Растет не только процент Python в рейтинге TIOBE. Эксперты отмечают, что создатели сред и других инструментов разработки повсеместно добавляют поддержку этого языка. Например, в <a href="https://marketplace.1c-bitrix.ru/" target="_blank" rel="noreferrer noopener">маркетплейсе</a> для редактора Microsoft Visual Studio Code приложение Python вышло на первое место. Его установили 9 млн пользователей.</div><h4  class="t-redactor__h4">8. Огромная поддержка и сообщество</h4><div class="t-redactor__text">Поскольку у Python есть обширные сферы использования — как разработка, создание сценариев, научное применение и т.д., вокруг него возникло огромное сообщество, со стороны которого разработчики получают огромную поддержку.</div><div class="t-redactor__text">Кроме того, существует Python Software Foundation. Этот фонд стремится «продвигать, защищать язык программирования Python, а также поддерживать и содействовать росту международного сообщества программистов Python».</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Программы с числами в Python</title>
			<link>https://www.easyitway.com/tpost/6k32e0pjh1-programmi-s-chislami-v-python</link>
			<amplink>https://www.easyitway.com/tpost/6k32e0pjh1-programmi-s-chislami-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 14:06:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>В этой статье вы сможете научиться создавать небольшие мини-программы применяя числа Python.</description>
			<turbo:content>
<![CDATA[<header><h1>Программы с числами в Python</h1></header><div class="t-redactor__text">В статье «Числа в Python» вы могли изучить теорию работы с числами в языке программирования Python. В этой статье вы сможете научиться создавать небольшие мини-программы применяя числа Python.</div><div class="t-redactor__text">Для того, чтобы вы могли проработать все примеры на своем компьютере не забудьте установить Python.</div><h4  class="t-redactor__h4">Вычисление времени в пути</h4><div class="t-redactor__text">Программа вычисляет время автомобиля в пути. Пользователь должен ввести расстояние, которое нужно проехать, а также средняя скорость автомобиля.</div><div class="t-redactor__text">В данном примере мы работаем с целыми числами. Чтобы понять, как работает программа, читайте комментарии. Листинг программы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(&quot;*&quot; * 15, &quot;Рассчет времени в пути &quot;, &quot;*&quot; * 10)
dist = 0   # Расстояние, которое нужно проехать
speed = 0  # Средняя скорость авто, км/ч

# Просим пользователя ввести данные
dist = int(input(&quot;Расстояние, которое нужно проехать: &quot;)) 
speed = int(input(&quot;Соединяя скорость: &quot;))

time = dist * 60 / speed   # Вычисляем время движения автомобиля

print(&quot;Будет затрачено &quot;, time, &quot; минут&quot;)  # Выводим итог

input(&quot;Нажмите Enter для выхода&quot;) # Просим нажать кнопку для завершения программы</code></pre><div class="t-redactor__text">Результат работы программы:</div><img src="https://static.tildacdn.com/tild3332-3462-4134-b539-303366633333/python_chisla_proga_.png"><h4  class="t-redactor__h4">Вычисления расхода топлива</h4><div class="t-redactor__text">В данном примере будем работать с дробными числами. Программа вычисляет расход топлива. Пользователь должен ввести средний расход и расстояние.</div><div class="t-redactor__text">Принцип программы такой же, как в предыдущем примере, но здесь мы хотим получить дробное значение. Чтобы понять, как работает программа, читайте комментарии. Листинг программы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(&quot;*&quot; * 15, &quot;Расчет топлива &quot;, &quot;*&quot; * 10)
consum = 0   # Средний расход 10.5 л/100 км
dist = 0   # Расстояние, км

# Просим пользователя ввести данные
consum = float(input(&quot;Введите средний расход л./100 км: &quot;))
dist = float(input(&quot;Введите расстояние, км: &quot;))

result = consum * dist / 100 # Вычисляем расход топлива

print(&quot;Будет затрачено &quot;, result, &quot; литров&quot;) # Выводим итог

input(&quot;Нажмите Enter для выхода&quot;) # Просим нажать кнопку для завершения программы</code></pre><div class="t-redactor__text">Результат работы программы:</div><img src="https://static.tildacdn.com/tild6463-6532-4362-a563-393262316132/python_chisla_proga_.png"><div class="t-redactor__text">Обратите внимание, что в качестве разделителя целой и дробной части используется точка, а не запятая. Если вы введёте 5.5, программа будет работать, а если вы введёте 5,5, то получите сообщение:</div><img src="https://static.tildacdn.com/tild3338-6538-4237-a536-393330313536/python_chisla_proga_.png"><h4  class="t-redactor__h4">Консольный калькулятор</h4><div class="t-redactor__text">Разработаем самый простой калькулятор. Листинг программы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(&quot;*&quot; * 15, &quot;Калькулятор &quot;, &quot;*&quot; * 10)
print(&quot;Для выхода введите q в качестве знака операции&quot;)
while True:
   s = input(&quot;Знак (+,-,*,/): &quot;)
   if s == &#039;q&#039;: break
   if s in (&#039;+&#039;, &#039;-&#039;, &#039;*&#039;, &#039;/&#039;):
      x = float(input(&quot;x=&quot;))
      y = float(input(&quot;y=&quot;))
      if s == &#039;+&#039;:
         print(&quot;%.2f&quot; % (x+y))
      elif s == &#039;-&#039;:
         print(&quot;%.2f&quot; % (x-y))
      elif s == &#039;*&#039;:
         print(&quot;%.2f&quot; % (x*y))
      elif s == &#039;/&#039;:
        if y != 0:
           print(&quot;%.2f&quot; % (x/y))
        else:
           print(&quot;Деление на ноль!&quot;)
   else:
      print(&quot;Неверный знак операции!&quot;)</code></pre><div class="t-redactor__text">Калькулятор работает так:<br /><br /><ol><li>Запустим бесконечный цикл. Выход из него осуществлять с помощью оператора break, если пользователь вводит определенный символ вместо знака арифметической операции.</li><li>Если пользователь ввел знак, который не является ни знаком арифметической операции, ни символом-«прерывателем» работы программы, то вывести сообщение о некорректном вводе.</li><li>Если был введен один из четырех знаков операции, то запросить ввод двух чисел.</li><li>В зависимости от знака операции выполнить соответствующее арифметическое действие.</li><li>Если было выбрано деление, то необходимо проверить, не является ли нулем второе число. если это так, сообщить о невозможности деления.</li></ol><br />Результат работы программы:</div><img src="https://static.tildacdn.com/tild3635-6262-4464-b439-366466393863/python_chisla_proga_.png"><div class="t-redactor__text">Консольный калькулятор:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/MilldYY6WaA" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Переменные в Python</title>
			<link>https://www.easyitway.com/tpost/9ug6aovuz1-peremennie-v-python</link>
			<amplink>https://www.easyitway.com/tpost/9ug6aovuz1-peremennie-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 14:34:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Переменная – это поименованная область памяти, содержащая какое-то значение.</description>
			<turbo:content>
<![CDATA[<header><h1>Переменные в Python</h1></header><div class="t-redactor__text"><strong>Переменная</strong> – это поименованная область памяти, содержащая какое-то значение. Значения могут быть разных типов, например, строка, целое число, дробное число (float) и т.д. От типа переменной зависит, как именно она будет храниться в памяти.<br /><br />Если вы программировали на других языках, то знаете, что переменную сначала нужно объявить, а затем инициализировать.<br /><br />Отличие Python от таких языков как С/С++/С#, Pascal, Java в том, что в нем не требуется объявление переменной. Python поддерживает динамическую типизацию, это означает, что тип переменной будет определяться автоматически — при присваивании значения.<br /><br />Операция присвоения значения осуществляется с помощью оператора =, как и в других языках программирования. Пример объявления переменной:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">n = 10
print(n)
# Выведет: 10

n = &quot;Max&quot;
print(n)
# Выведет: Max</code></pre><div class="t-redactor__text">Правила написания имен переменных:<br /><br /><ol><li>Имя переменной не должно начинаться с цифры.</li><li>Имя переменной может состоять только из цифр, букв и знаков подчеркивания.</li></ol><br />Имена переменных могут быть написаны на русском языке, например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">имя = &quot;Виктор&quot;
print(имя)
# Выведет: Виктор</code></pre><div class="t-redactor__text">Никакой ошибки не будет, но настоятельно рекомендуется имена идентификаторов писать только латинскими буквами.</div><h4  class="t-redactor__h4">Использование переменных</h4><div class="t-redactor__text">Объявлять переменную можно в любом месте программы, но до ее первого использования. После того, как переменной присвоено значение, ее можно использовать. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = 10
b = 5
c = a + b
print(&quot;Результат &quot;, с) 
# Выведет: Результат  15</code></pre><h4  class="t-redactor__h4">Локальные переменные</h4><div class="t-redactor__text">По умолчанию, все переменные объявляются как локальные. Это значит, что переменная будет видна только из той же функции где была объявлена (кроме случаев когда мы объявляем переменные на верхнем уровне, тогда переменная будет видна из всего файла). Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = 5

def f():
  a = 6
  print(a)

f() # Будет выведено: 6
print(a) # Будет выведено: 5</code></pre><h4  class="t-redactor__h4">Глобальные переменные (global)</h4><div class="t-redactor__text">Переменные, которые объявлены не в рамках функций являются глобальными. Однако в Python есть механизм указать внутри функции, что мы хотим использовать глобальную переменную вместо локальной с помощью ключевого слова <strong>global</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = 4

def f():
  global a
  a = 5
  print(a)

f() # Будет выведено: 5
print(a) # Будет выведено: 5</code></pre><div class="t-redactor__text">Данный код выведет две пятерки. Это связано с тем, что функция f обновляет не локальную переменную, а глобальную.</div><h4  class="t-redactor__h4">Использование переменной внешней функции (nonlocal)</h4><div class="t-redactor__text">Также есть возможность указать что должна использоваться переменная из родительского контекста. То есть мы не объявляем новую переменную внутри функции, а используем уже существующею (при этом не обязательно глобальную). Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">a = 5
def f1():
  a = 2
  def f2():
    nonlocal a
    a = 1
    print(a) # выводит 1
  f2()
  print(a) # выводит 1

f1()
print(a) # выводит 5</code></pre><div class="t-redactor__text">Инструкция <strong>nonlocal</strong> говорит Python’у что мы должны взять внешнюю переменную, а не создавать новую.</div><h4  class="t-redactor__h4">Программа «Путевой компьютер»</h4><div class="t-redactor__text">В статье «Программы с числами в Python» мы создавали две небольшие программы, рассчитывающие время в пути, а также расход топлива. Сейчас мы на основании этих двух программ разработаем программу «Путевой компьютер».</div><div class="t-redactor__text">Программа будет учитывать не только время в пути и потребление топлива, но еще и остановки на дозаправки и плановые остановки. Полный листинг программы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">program = &quot;Путевой компьютер!&quot;

# Переменные

stars = 80         # Количество звездочек
tabs = 5           # Количество отступов

dist = 0           # Расстояние, которое нужно проехать
speed = 0          # Средняя скорость авто, км /ч
time = 0           # Время в движении (за рулем)
total_time = 0     # Общее количество времени в пути
drive_hours = 0    # Часов в движении (полных)
drive_mins = 0     # Минут (остаток)
total_hours = 0    # Часов всего (полных)
total_min = 0

tank = 0           # Размер бака
consum = 0         # Средний расход л/100 км
refuels = 0        # Количество дозаправок
refuel_time = 0    # Время дозаправки
fuel = 0           # Сколько затрачено топлива
price = 0

breaks = 0         # Количество плановых остановок
break_time = 0     # Время каждой плановой остановки

# Выводим заголовок
print(&quot;\t&quot; * tabs, program)
print(&quot;*&quot; * stars)

# Ввод данных от пользователей
dist = int(input(&quot;Введите расстояние, км: &quot;))
speed = int(input(&quot;Планируемая средняя скорость (целое число): &quot;))
consum = float(input(&quot;Введите средний расход л./100 км (вещ.число): &quot;))
tank = float(input(&quot;Объем бака, л: &quot;))
price = float(input(&quot;Стоимость 1 литра топлива, р.: &quot;))
breaks = float(input(&quot;Количество плановых остановок (без дозаправок): &quot;))
break_time = float(input(&quot;Время каждой плановой остановки, минут: &quot;))
refuel_time = float(input(&quot;Время на дозаправку, минут : &quot;))

# Производим вычисления
time = dist * 60 / speed      # Время зав рулем
fuel = consum * dist / 100    # Всего затрачено

refuels = fuel // tank
total_time = time + refuels * refuel_time + breaks * break_time

drive_hours = time // 60
drive_mins = time - drive_hours * 60

total_hours = total_time // 60
total_mins = total_time - total_hours * 60

print(&quot;*&quot; * stars)
print(&quot;\t&quot; * tabs, &quot;Результаты:&quot;)

print(&quot;Время за рулем: &quot;, int(drive_hours), &quot; ч. &quot;, int(drive_mins), &quot; м. &quot;)
print(&quot;Общее время в пути: &quot;, int(total_hours), &quot; ч. &quot;, int(total_mins), &quot; м. &quot;)
print(&quot;Количество дозаправок: &quot;, refuels)
print(&quot;Потрачено времени на дозаправку: &quot;, refuels * refuel_time, &quot; минут&quot;)
print(&quot;Израсходовано топлива, л.: &quot;, fuel)
print(&quot;Стоимость топлива, p: &quot;, fuel * price)

input(&quot;Нажмите Enter для выхода&quot;)</code></pre><div class="t-redactor__text">Обратите внимание: при вычислении количества дозаправок мы используем оператор //, а не /. Дозаправка — это целое число, она либо есть, либо ее нет. Не существует 0.5 или 0.3 дозаправки. Поэтому мы используем оператор //, чтобы получить количество целых частей.<br /><br />Результат работы программы:</div><img src="https://static.tildacdn.com/tild6563-3533-4665-a463-393833626161/peremen_python_10.jpg"><div class="t-redactor__text">Видео по уроку:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/-X0X8bOA5ts" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Библиотека Tkinter в Python</title>
			<link>https://www.easyitway.com/tpost/vb3g6ek5t1-biblioteka-tkinter-v-python</link>
			<amplink>https://www.easyitway.com/tpost/vb3g6ek5t1-biblioteka-tkinter-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 14:56:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>Tkinter – это пакет для Python, предназначенный для работы с библиотекой Tk. Библиотека Tk содержит компоненты графического интерфейса пользователя (graphical user interface – GUI), написанные на языке программирования Tcl.</description>
			<turbo:content>
<![CDATA[<header><h1>Библиотека Tkinter в Python</h1></header><div class="t-redactor__text"><strong>Tkinter</strong> – это пакет для Python, предназначенный для работы с библиотекой Tk. Библиотека Tk содержит компоненты графического интерфейса пользователя (graphical user interface – GUI), написанные на языке программирования <a href="https://ru.wikipedia.org/wiki/Tcl" target="_blank" rel="noreferrer noopener">Tcl</a>.</div><div class="t-redactor__text">Под графическим интерфейсом пользователя (GUI) подразумеваются все те окна, кнопки, текстовые поля для ввода, скроллеры, списки, радиокнопки, флажки и др., которые вы видите на экране, открывая то или иное приложение. Через них вы взаимодействуете с программой и управляете ею.</div><div class="t-redactor__text">Все эти элементы интерфейса вместе называют виджетами (widgets). В Python мы можем создать виджеты с помощью библиотеки tkinter. Этапы разработки интерфейса с GUI следующие:</div><div class="t-redactor__text"><ol><li>Импорт библиотеки;</li><li>Создание главного окна;</li><li>Создание виджетов;</li><li>Установка их свойств;</li><li>Определение событий;</li><li>Определение обработчиков событий;</li><li>Расположение виджетов на главном окне;</li><li>Отображение главного окна.</li></ol></div><h4  class="t-redactor__h4">Подключение библиотеки</h4><div class="t-redactor__text">Как и любой модуль, tkinter в Python можно импортировать двумя способами: командами import tkinter или from tkinter import * (имя модуля пишется со строчной буквы).</div><div class="t-redactor__text">Рекомендуется использовать второй способ, т.к. это позволит не указывать каждый раз имя модуля при обращении к объектам, которые в нем содержаться. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *</code></pre><h4  class="t-redactor__h4">Создание главного окна</h4><div class="t-redactor__text">Объект окна верхнего уровня создается при обращении к классу Tk модуля tkinter. Переменную, связанную с объектом-окном принято называть root (но можно назвать и другим именем). Рассмотрим пример создания главного окна:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk() # создаем переменную
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

input()</code></pre><div class="t-redactor__text">При запуске будет выведено:</div><img src="https://static.tildacdn.com/tild3061-3336-4965-a536-393761386231/tkinter_python_2.jpg"><div class="t-redactor__text">Если не установить геометрию окна, то размер окна будет подогнан под размер виджетов, содержащихся в окне.</div><h4  class="t-redactor__h4">Работа с виджетами</h4><div class="t-redactor__text">В библиотеки tkinter существует множества виджетов. Для примера рассмотрим виджет «Button».</div><div class="t-redactor__text">У класса Button есть обязательный параметр — объект, которому кнопка принадлежит (у нас это окно root). Полный список виджетов мы рассмотрим в следующих статьях. Пример создания кнопки:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">but1 = Button(root)</code></pre><div class="t-redactor__text">У кнопки есть много свойств: надпись, цвет фона, размер и т.д. Например, добавим текст нашей кнопке:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">but1[&quot;text&quot;] = &quot;Название кнопки&quot;</code></pre><div class="t-redactor__text">Чтобы наша кнопка появилась в окне программы необходимо использовать метод pack(). Добавим в наше окно кнопку:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Заголовок окна программы&quot;)
root.geometry(&quot;400x200&quot;)
but1 = Button(root)
but1[&quot;text&quot;] = &quot;Название кнопки&quot;
but1.pack()
input()</code></pre><div class="t-redactor__text">Если вы заметили, то при нажатии на кнопку ничего не происходит т.к. у нас нету события. Действия(алгоритм) часто оформляют в виде функции, а затем вызывают необходимым событием. Создадим функцию:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def hello(event):
  print(&quot;Привет, программист!&quot;)</code></pre><div class="t-redactor__text">Параметр event — это какое-либо событие. Событие нажатия левой кнопки мыши выглядит так: &lt;Button-1&gt;. Требуется связать это событие с обработчиком (функцией hello). Для связи предназначен метод bind. Синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">but1.bind(&quot;&lt;Button-1&gt;&quot;,hello)</code></pre><div class="t-redactor__text">Для закрепления теоретического материала соберем все наши примеры в одну программу. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

def hello(event):
  print(&quot;Привет, программист!&quot;)

root = Tk()
root.title(&quot;Заголовок окна программы&quot;)
root.geometry(&quot;400x200&quot;)
but1 = Button(root)
but1[&quot;text&quot;] = &quot;Название кнопки&quot;
but1.bind(&quot;&lt;Button-1&gt;&quot;,hello)

but1.pack()
root.mainloop()
input()</code></pre><div class="t-redactor__text">Если запустить данную программу и нажать на кнопку, то в консоли появится строчка «Привет, программист!».<br /><br />Строчка root.mainloop() должна быть всегда в конце скрипта. Окно не появится, пока мы не вызовим метод mainloop().<br /><br />Вывод программы:</div><img src="https://static.tildacdn.com/tild3434-3961-4639-b263-636662346639/tkinter_python_3.jpg"><div class="t-redactor__text">Знакомство с Tkinter:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/pRkqpuLyIV0" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Библиотека Tkinter: Виджеты</title>
			<link>https://www.easyitway.com/tpost/g558cxtg61-biblioteka-tkinter-vidzheti</link>
			<amplink>https://www.easyitway.com/tpost/g558cxtg61-biblioteka-tkinter-vidzheti?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 16:07:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>В библиотеки Tkinter каждый виджет имеет определенные свойства, значения которых можно задавать при их создании, а также программировать их изменение при действии пользователя и в результате выполнения программы.</description>
			<turbo:content>
<![CDATA[<header><h1>Библиотека Tkinter: Виджеты</h1></header><div class="t-redactor__text">В библиотеки Tkinter каждый виджет имеет определенные свойства, значения которых можно задавать при их создании, а также программировать их изменение при действии пользователя и в результате выполнения программы.</div><div class="t-redactor__text">Виджеты – это базовые блоки для создания графического интерфейса программы. За годы развития программирования некоторые из виджетов стали стандартными во всех языках и на всех платформах.</div><div class="t-redactor__text">В этой статье мы продолжаем работать в библиотеке Tkinter, а именно рассмотрим базовые виджеты.</div><h4  class="t-redactor__h4">Кнопки</h4><div class="t-redactor__text">Объект-кнопка создается вызовом класса <strong>Button</strong> модуля tkinter. Обязательным аргументом является родительский виджет. Другие свойства могут указываться при создании кнопки или задаваться позже. Синтаксис кнопки:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">переменная = Button (родительский виджет, [свойство=значение, ... ....])</code></pre><div class="t-redactor__text">У кнопки есть множество свойств. Рассмотрим некоторые свойства кнопки:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

but = Button(root,
        text=&quot;Это кнопка&quot;, # надпись на кнопке
        width=30, height=5,  # ширина и высота
        bg=&quot;white&quot;, fg=&quot;blue&quot;) # цвет фона и надписи

but.pack()
root.mainloop()</code></pre><div class="t-redactor__text">В данном примере мы создаем кнопку и задаем ей свойства. Параметры bg и fg — это сокращения от background(фон) и foreground(передний план). Ширина и высота измеряются в знакоместах (количество символов).<br /><br />Будет создана кнопка:</div><img src="https://static.tildacdn.com/tild6337-3032-4464-b061-666430643236/tkinter_vidgety_2.jpg"><h4  class="t-redactor__h4">Надписи (метки)</h4><div class="t-redactor__text">Надписи — это виджеты, содержащие строку (или несколько строк) текста и служащие в основном для информации пользователя. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

lab = Label(root, text=&quot;Это 1 надпись! \n Это 2 надпись!&quot;, font=&quot;Arial 14&quot;)

lab.pack()
root.mainloop()</code></pre><div class="t-redactor__text">Вывод:</div><img src="https://static.tildacdn.com/tild3664-3130-4666-b731-653531643434/tkinter_vidgety_3.jpg"><h4  class="t-redactor__h4">Поля ввода</h4><div class="t-redactor__text">Однострочное поле ввода создается с помощью класса <strong>Entry</strong>. Такое поле позволяет ввести только одну строчку кода. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

ent = Entry(root, width=20,bd=3)

ent.pack()
root.mainloop()</code></pre><div class="t-redactor__text">Параметр bd — это сокращение от borderwidth (ширина границы).<br /><br />Будет выведено:</div><img src="https://static.tildacdn.com/tild3666-6364-4038-a663-336463636264/tkinter_vidgety_4.jpg"><div class="t-redactor__text">Класс <strong>Text</strong> предназначен для создания многострочного текстового поля. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

tex = Text(root, width=20,
           font=&quot;Arial 14&quot;,
           wrap=WORD)

tex.pack()
root.mainloop()</code></pre><div class="t-redactor__text">Свойство <strong>wrap</strong> в зависимости от своего значения позволяет переносить текст, вводимый пользователем либо по символам, либо по словам, либо вообще не переносить, пока пользователь не нажмет Enter.<br /><br />Будет выведено:</div><img src="https://static.tildacdn.com/tild6236-3233-4561-b131-326630616432/tkinter_vidgety_5.jpg"><h4  class="t-redactor__h4">Переключатели и флажки</h4><div class="t-redactor__text">Переключатели используют только группами, при этом в одной группе может быть «включена» лишь одна кнопка. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

var=IntVar()
var.set(1)
rad0 = Radiobutton(root, text=&quot;Windows&quot;, variable=var, value=0)
rad1 = Radiobutton(root, text=&quot;Linux&quot;, variable=var, value=1)
rad2 = Radiobutton(root, text=&quot;macOS&quot;, variable=var, value=2)

rad0.pack()
rad1.pack()
rad2.pack()

root.mainloop()</code></pre><div class="t-redactor__text">Одна группа определяет значение одной переменной, т.е. если выбрать радиокнопку rad2, то значение переменной var будет 2. Изначально также требуется установить значение переменной (выражение var.set(1) задает значение переменной var равное 1).<br /><br />Будет выведено:</div><img src="https://static.tildacdn.com/tild6266-3439-4838-a361-646366393935/tkinter_vidgety_6.jpg"><div class="t-redactor__text">Для создания независимых переключателей (флажков) используется класс <strong>Checkbutton</strong>. В отличие от радио-кнопок, значение каждого флажка привязывается к своей переменной, значение которой определяется опциями onvalue (включено) и offvalue (выключено) в описании флажка. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

c1 = IntVar()
c2 = IntVar()
c3 = IntVar()

che1 = Checkbutton(root, text=&quot;Первый флажок&quot;, variable=c1, onvalue=1, offvalue=0)
che2 = Checkbutton(root, text=&quot;Второй флажок&quot;, variable=c2, onvalue=2, offvalue=0)
che3 = Checkbutton(root, text=&quot;Третий флажок&quot;, variable=c3, onvalue=3, offvalue=0)

che1.pack()
che2.pack()
che3.pack()

root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild6534-6335-4630-b461-656666383033/tkinter_vidgety_7.jpg"><h4  class="t-redactor__h4">Списки</h4><div class="t-redactor__text">Вызов класса <strong>Listbox</strong> создает объект, в котором пользователь может выбрать один или несколько пунктов в зависимости от значения опции selectmode. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

r = [&#039;Python&#039;, &#039;C#&#039;, &#039;Java&#039;, &#039;Pascal&#039;]
lis = Listbox(root, selectmode=SINGLE, height=4)
for i in r:
   lis.insert(END, i)

lis.pack()

root.mainloop()</code></pre><div class="t-redactor__text">В данном примере значение <strong>SINGLE</strong> позволяет выбирать лишь один пункт из списка.<br /><br />Изначально список (Listbox) пуст. С помощью цикла for в него добавляются пункты из списка <strong>r</strong>.<br /><br />Добавление происходит с помощью специального метода класса <strong>Listbox — insert</strong>. Данный метод принимает два параметра: куда добавить и что добавить.<br /><br />Будет выведено:</div><img src="https://static.tildacdn.com/tild6164-6335-4363-b163-303332616566/tkinter_vidgety_8.jpg"><h4  class="t-redactor__h4">Рамки</h4><div class="t-redactor__text">Рамки необходимы для организации других виджетов в группы внутри окна. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

fra1 = Frame(root, width=300, height=100, bg=&quot;darkred&quot;)
fra2 = Frame(root, width=200, height=50, bg=&quot;green&quot;, bd=20)
fra3 = Frame(root, width=100, height=20, bg=&quot;darkblue&quot;)

fra1.pack()
fra2.pack()
fra3.pack()

root.mainloop()</code></pre><div class="t-redactor__text">Данный пример создает три фрейма разного размера. Свойство bd (сокращение от boderwidth) определяет расстояния от края рамки до заключенных виджетов (если они есть).<br /><br />Вывод программы:</div><img src="https://static.tildacdn.com/tild6661-3438-4130-b236-366332343035/tkinter_vidgety_9.jpg"><div class="t-redactor__text">На фреймах также можно размещать виджеты как на основном окне (root). Для примера добавим текстовое поле в рамку fra2:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

fra1 = Frame(root, width=300, height=100, bg=&quot;darkred&quot;)
fra2 = Frame(root, width=200, height=50, bg=&quot;green&quot;, bd=20)
fra3 = Frame(root, width=100, height=20, bg=&quot;darkblue&quot;)

ent1 = Entry(fra2, width=20)

fra1.pack()
fra2.pack()
fra3.pack()
ent1.pack()

root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild3762-3730-4461-a536-666139386466/tkinter_vidgety_10.jpg"><h4  class="t-redactor__h4">Дочерние окна</h4><div class="t-redactor__text">С помощью класса <strong>Toplevel</strong> создаются дочерние окна, на которых также могут располагаться виджеты.</div><div class="t-redactor__text">При закрытие главного окна, окно <strong>Toplevel</strong> также закрывается. Если закрыть окно <strong>Toplevel</strong>, тогда главное окно не закроется. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

win = Toplevel(root, relief=SUNKEN, bd=10, bg=&quot;lightblue&quot;)
win.title(&quot;Дочернее окно&quot;)
win.minsize(width=300, height=150)

root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild3037-6335-4436-b564-333834636635/tkinter_vidgety_11.jpg"><div class="t-redactor__text">Метод <strong>minisize</strong> конфигурирует минимальный размер окна (есть метод maxsize, определяющий максимальный размер окна).</div><h4  class="t-redactor__h4">Шкала</h4><div class="t-redactor__text">Назначение шкалы — это представление пользователю выбора какого-то значения из определенного диапазона.</div><div class="t-redactor__text">Внешне шкала представляет собой горизонтальную или вертикальную полосу с разметкой, по которой пользователь может передвигать движок, осуществляя выбор значения. Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

fra = Frame(root, width=300, height=100, bg=&quot;darkred&quot;)

sca1 = Scale(fra, orient=HORIZONTAL, length=300, from_=0, to=100, tickinterval=10, resolution=5)
sca2 = Scale(root, orient=VERTICAL, length=400, from_=1, to=2, tickinterval=0.1, resolution=0.1)

fra.pack()
sca1.pack()
sca2.pack()

root.mainloop()</code></pre><div class="t-redactor__text">Свойства шкалы:<br /><br /><ul><li><strong>orient</strong> определяет направление шкалы;</li><li><strong>length</strong> — длина шкалы в пикселях;</li><li><strong>from_</strong> и <strong>to</strong> — с какого значения шкала начинается и каким заканчивается;</li><li><strong>tickinterval</strong> — интервал, через который отображаются метки для шкалы;</li><li><strong>resolution</strong> — минимальная длина отрезка, на которую пользователь может передвинуть движок.</li></ul><br />Вывод программы:</div><img src="https://static.tildacdn.com/tild3337-3439-4035-a234-386261316439/tkinter_vidgety_12.jpg"><h4  class="t-redactor__h4">Полоска прокрутки</h4><div class="t-redactor__text">Виджет <strong>Scrollbar</strong> позволяет прокручивать содержимое другого виджета (например, текстового поля или списка). Прокрутка может быть как по горизонтали, так и по вертикали. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

tx = Text(root, width=40, height=6, font=&#039;14&#039;)
scr = Scrollbar(root, command=tx.yview)
tx.configure(yscrollcommand=scr.set)
tx.grid(row=0, column=0)
scr.grid(row=0, column=1)

root.mainloop()</code></pre><div class="t-redactor__text">В примере сначала создается текстовое поле(tx), затем полоса прокрутки(scr), которая привязывается с помощью опции command к полю tx по вертикальной оси(yview). Далее поле tx изменяется (конфигурируется) с помощью метода configure: устанавливается значение опции yscrollcommand.<br /><br />Метод <strong>grid</strong> еще один способ расположения виджета в окне.<br /><br />Вывод программы:</div><img src="https://static.tildacdn.com/tild6464-3433-4238-b538-313434373635/tkinter_vidgety_13.jpg"><h4  class="t-redactor__h4">Меню</h4><div class="t-redactor__text">Меню — это объект, который присутствует во многих пользовательских приложениях. Находится оно под строкой заголовка и представляет собой выпадающие списки под словами.</div><div class="t-redactor__text">Каждый пункт списка представляет собой команду, запускающую какое-либо действие или открывающую диалоговое окно. Рассмотрим пример создания меню:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

# функции для обработки пунктов меню
# Пункт меню: Создать
def new_win():
  win = Toplevel(root)
  win.title(&quot;Окно создания&quot;)
  win.minsize(width=300, height=150)

# Пункт меню: Выход
def close_win():
  root.destroy()

# Пункт меню: О программе
def about():
  win = Toplevel(root)
  win.geometry(&quot;300x150&quot;)
  lab = Label(win, text=&quot;Версия программы 1.0&quot;)
  lab.pack()

# создаем главное окно программы
root = Tk()
root.title(&quot;Заголовок окна программы&quot;) #заголовок окна
root.geometry(&quot;400x200&quot;) # начальные размеры окна

# создаем объект меню на главном окне
m = Menu(root)

# окно конфигурируется с указанием меню для него
root.config(menu=m)

# создается пункт меню с размещением на основном меню (m)
fm = Menu(m)
m.add_cascade(label=&quot;Файл&quot;, menu=fm)
fm.add_command(label=&quot;Открыть...&quot;)
fm.add_command(label=&quot;Создать&quot;, command=new_win)
fm.add_command(label=&quot;Сохранить...&quot;)

# вложенное меню
nfm = Menu(fm)
fm.add_cascade(label=&quot;Import&quot;, menu=nfm)
nfm.add_command(label=&quot;Image&quot;)
nfm.add_command(label=&quot;Text&quot;)

fm.add_command(label=&quot;Выход&quot;, command=close_win)

# второй пункт меню
hm = Menu(m)
m.add_cascade(label=&quot;?&quot;, menu=hm)
hm.add_command(label=&quot;Справка&quot;)
hm.add_command(label=&quot;О программе&quot;, command=about)

root.mainloop()</code></pre><div class="t-redactor__text">Метод <strong>add_cascade</strong> добавляет новый пункт меню, который указывается как значение опции menu. Метод add_cascade помогает привязать вложенное меню.<br /><br />Метод <strong>add_command</strong> добавляет новую команду в пункт меню. Опция command в данном методе связывает данную команду с функцией обработчик.<br /><br />Вывод программы:</div><img src="https://static.tildacdn.com/tild6636-6438-4130-a536-656135663065/tkinter_vidgety_14.jpg"><div class="t-redactor__text">Видеоурок:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/rnzqzQFYMT4" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe><h4  class="t-redactor__h4">Программа «Изменение цвета окна»</h4><div class="t-redactor__text">Для закрепления теоретического материала создадим небольшую программу <strong>«Изменение цвета окна»</strong>, которая будет создавать окно со строкой меню, команды которого позволяют изменить цвет фона и размер основного окна. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

# создаем главное окно программы
root = Tk()
root.title(&quot;Заголовок окна программы&quot;)

def colorR():
    fra.config(bg=&quot;Red&quot;)

def colorG():
    fra.config(bg=&quot;Green&quot;)

def colorB():
    fra.config(bg=&quot;Blue&quot;)

def square():
    fra.config(width=640)
    fra.config(height=480)

def rectangle():
    fra.config(width=800)
    fra.config(height=600)

# Параметры по умолчанию
fra = Frame(root, width=400, height=200, bg=&quot;Black&quot;)
fra.pack()

# создаем объект меню на главном окне
m = Menu(root)
root.config(menu=m)

# первое меню
cm = Menu(m)
m.add_cascade(label=&quot;Цвет&quot;, menu=cm)
cm.add_command(label=&quot;Красный&quot;, command=colorR)
cm.add_command(label=&quot;Зеленый&quot;, command=colorG)
cm.add_command(label=&quot;Синий&quot;, command=colorB)

# второе меню
sm = Menu(m)
m.add_cascade(label=&quot;Размер&quot;, menu=sm)
sm.add_command(label=&quot;640x480&quot;, command=square)
sm.add_command(label=&quot;800x600&quot;, command=rectangle)

root.mainloop()</code></pre><div class="t-redactor__text">Вывод программы:</div><img src="https://static.tildacdn.com/tild6436-3337-4365-b035-613235353133/tkinter_vidgety_15.jpg"><div class="t-redactor__text">На этом наша статья подходит к завершению. Рекомендуется самостоятельно отработать все примеры виджетов на своем компьютере. Пишите в комментариях свои варианты графических программ.<br /><br />Видео по созданию программы:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/FYjrzTacCnQ" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Библиотека Tkinter: События</title>
			<link>https://www.easyitway.com/tpost/uod87dc411-biblioteka-tkinter-sobitiya</link>
			<amplink>https://www.easyitway.com/tpost/uod87dc411-biblioteka-tkinter-sobitiya?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 16:17:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>Метод bind() привязывает событие к какому-либо действию (нажатие кнопки мыши, нажатие клавиши на клавиатуре и т.д.). bind принимает три аргумента:</description>
			<turbo:content>
<![CDATA[<header><h1>Библиотека Tkinter: События</h1></header><div class="t-redactor__text">Метод <strong>bind()</strong> привязывает событие к какому-либо действию (нажатие кнопки мыши, нажатие клавиши на клавиатуре и т.д.). bind принимает три аргумента:<br /><br /><ul><li>название события;</li><li>функцию, которая будет вызвана при наступлении события;</li><li>третий аргумент (необязательный) — строка «+» — означает, что эта привязка добавляется к уже существующим. Если третий аргумент опущен или равен пустой строке — привязка замещает все другие привязки данного события к виджету.</li></ul><br />Синтаксис связывания:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">виджет.bind(событие, функция)</code></pre><h4  class="t-redactor__h4">Типы событий</h4><div class="t-redactor__text">При вызове метода <strong>bind()</strong> событие передается в качестве первого аргумента. Название события заключается в кавычки, а также в знаки &lt; и &gt;. Событие описывается с помощью зарезервированных последовательностей ключевых слов.</div><h4  class="t-redactor__h4">События мыши</h4><div class="t-redactor__text">К событиям мыши относятся следующие события (часто используемые):</div><div class="t-redactor__text"><ul><li><strong>&lt;Button-1&gt;</strong> — щелчок левой кнопки мыши.</li><li><strong>&lt;Button-2&gt;</strong> — щелчок средней кнопки мыши.</li><li><strong>&lt;Button-3&gt;</strong> — щелчок правой кнопки мыши.</li><li><strong>&lt;Double-Button-1&gt;</strong> — двойной клик левой кнопки мыши.</li><li><strong>&lt;Motion&gt;</strong> — движение мыши.</li></ul></div><div class="t-redactor__text">Пример программы с событиями мыши:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

def b1(event):
  root.title(&quot;Левая кнопка мыши&quot;)
  
def b3(event):
  root.title(&quot;Правая кнопка мыши&quot;)

def move(event):
  root.title(&quot;Движение мышью&quot;) 
  
# создаем главное окно программы
root = Tk()
root.title(&quot;Заголовок окна программы&quot;)
root.minsize(width=500, height=400)

root.bind(&#039;&lt;Button-1&gt;&#039;, b1)
root.bind(&#039;&lt;Button-3&gt;&#039;, b3)
root.bind(&#039;&lt;Motion&gt;&#039;, move)

root.mainloop()</code></pre><h4  class="t-redactor__h4">События клавиатуры</h4><div class="t-redactor__text">К событиям клавиатуры относят следующие:</div><div class="t-redactor__text"><ul><li>Нажатия буквенных клавиш, которые записываются без угловых скобок, например ‘A’;</li><li>Нажатия комбинаций клавиш — пишутся через тире, например, &lt;Control-Shift&gt;</li><li>Для неалфавитных клавиш есть специальные зарезервированный слова:</li><li>&lt;Return&gt; — Enter;</li><li>&lt;space&gt; — пробел;</li><li>&lt;Shift&gt; — Shift;</li><li>&lt;Alt&gt; — Alt;</li><li>&lt;Control&gt; — Ctrl;</li><li>и т.д.</li></ul></div><div class="t-redactor__text">Для примера напишем небольшую программу. В окне будет поле ввода и метка. При нажатии Enter метод <strong>caption</strong> будет устанавливать текст метки-по введенному в поле тексту.</div><div class="t-redactor__text">При нажатии <strong>Ctrl + Z</strong> будет произведен выход(вызван метод destroy() для основного окна, что означает выход из программы). Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

def exit_(event):
  root.destroy()
  
def caption(event):
  t = ent.get()
  lbl.configure(text = t)
  
root = Tk()
root.title(&quot;Заголовок окна программы&quot;)
root.minsize(width=500, height=400)

# Создаем виджеты
ent = Entry(root, width = 100)
lbl = Label(root, width = 100)

# Располагаем виджеты
ent.pack()
lbl.pack()

ent.bind(&#039;&lt;Return&gt;&#039;, caption)
root.bind(&#039;&lt;Control-z&gt;&#039;, exit_)

root.mainloop()</code></pre><div class="t-redactor__text">Вывод программы:</div><img src="https://static.tildacdn.com/tild3363-6364-4738-b437-613234646439/tkinter_bind_2.jpg"><div class="t-redactor__text">Видео по теме:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/74Pyxhay05k" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe><h4  class="t-redactor__h4">Программа «Просмотрщик файлов»</h4><div class="t-redactor__text">Для закрепления теоретического материала напишем небольшую программу, которая будет выводить содержимое текстового файла в многострочное поле для ввода текста. Программа будет состоять всего из трех виджетов:</div><div class="t-redactor__text"><ul><li>Поле ввода — в него нужно ввести имя файла;</li><li>Кнопка;</li><li>Многострочное поле ввода — в него будет загружаться содержимое файла при нажатии кнопки.</li></ul></div><div class="t-redactor__text">Листинг программы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

def output(event):
  # получаем содержимое текстового поля
  s = ent.get()
  try:
    txt = open(s, &quot;r&quot;, encoding=&quot;utf-8&quot;)
    content = txt.read()
    tex.delete(1.0, END)
    tex.insert(END, content)
  except:
    tex.delete(1.0, END)
    tex.insert(END, &quot;Файл не существует!&quot;)
    
root = Tk()
root.title(&quot;Просмотрщик файлов&quot;)
root.minsize(width=500, height=400)

# создаем виджеты
ent = Entry(root, width=20)
but = Button(root, text=&quot;Открыть&quot;)
tex = Text(root, width=80, height=30, font=&quot;Courier 14&quot;, wrap=WORD)
tex.insert(END, &quot;Введите имя текстового файла и нажмите кнопку Открыть&quot;)

# распологаем виджеты в окне программы
ent.grid(row=0, column=0)
but.grid(row=2, column=0)
tex.grid(row=1, column=0)

# устанавливаем обработчик событий
but.bind(&quot;&lt;Button-1&gt;&quot;, output)

# запускаем программу
root.mainloop()</code></pre><div class="t-redactor__text">Программа работает так:<br /><br /><ul><li>После запуска она ждет пока пользователь введет имя файла и нажмет кнопку «Открыть». Имя файла будет получено из переменной ent.</li><li>Если файл существует, его содержимое будет загружено в виджет tex.</li><li>Если файл не существует, в tex будет загружено соответствующее сообщение.</li></ul><br />Метод <strong>delete()</strong> очищает текущее содержимое.<br /><br />Метод <strong>insert()</strong> добавляет новое содержимое.<br /><br />1.0 означает первую строку и первый символ (нумерация символов начинается с 0), END — последний символ.<br /><br />Расположением виджетов в окне программы «занимается» сетка — <strong>grid</strong>.<br /><br />Вывод программы:</div><img src="https://static.tildacdn.com/tild3862-6134-4463-b264-343663643038/tkinter_bind_3.jpg"><div class="t-redactor__text">Видео по созданию программы:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/ai1yY3B3enY" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Библиотека Tkinter: Обработка переключателей</title>
			<link>https://www.easyitway.com/tpost/0y2m323jl1-biblioteka-tkinter-obrabotka-pereklyucha</link>
			<amplink>https://www.easyitway.com/tpost/0y2m323jl1-biblioteka-tkinter-obrabotka-pereklyucha?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 16:22:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>Библиотека Tkinter содержит специальные классы, объекты которых выполняют роль переменных для хранения значений о состоянии различных виджетов.</description>
			<turbo:content>
<![CDATA[<header><h1>Библиотека Tkinter: Обработка переключателей</h1></header><div class="t-redactor__text">Библиотека Tkinter содержит специальные классы, объекты которых выполняют роль переменных для хранения значений о состоянии различных виджетов.</div><div class="t-redactor__text">Как и говорилось в статье «Библиотека Tkinter: Виджеты«, от класса <strong>Radiobutton</strong> создаются радио-кнопки, от класса <strong>Checkbutton</strong> – флажки.</div><h4  class="t-redactor__h4">Обработка зависимых переключателей</h4><div class="t-redactor__text">Изменение значения такой переменной ведет к изменению и свойства виджета, и наоборот: изменение свойства виджета изменяет значение ассоциированной переменной.</div><div class="t-redactor__text">Существует несколько таких классов Tkinter, предназначенных для обработки данных разных типов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">StringVar() - для строк;
IntVar - целых чисел;
DoubleVar() - дробных чисел;
Booleanvar() - для обработки булевых значений (true и false).</code></pre><div class="t-redactor__text">Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">r_var = BooleanVar()
r_var.set(0)
r1 = Radiobutton(text=&#039;First&#039;, variable=r_var, value=0)
r2 = Radiobutton(text=&#039;Second&#039;, variable=r_var, value=1)</code></pre><div class="t-redactor__text">Здесь переменной r_var присваивается объект типа BooleanVar. С помощью метода set() он устанавливается в значение 0.<br /><br />При запуске программы включенной окажется первая радио-кнопка, так как значение ее опции value совпадает с текущим значением переменной r_var. Если кликнуть по второй радио-кнопке, то она включится, а первая выключится. При этом значение r_var станет равным 1.<br /><br />Пример работы программы с радио-кнопками:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

def sel():
  selection = &quot;Вы выбрали &quot; + str(var.get())
  label.config(text = selection)
    
root = Tk()
root.title(&quot;Пример работы радио-кнопок&quot;)
root.minsize(width=500, height=400)

# создаем радио-кнопки используя переменную-объект типа IntVar()
var = IntVar()
R1 = Radiobutton(root, text=&quot;Windows&quot;, variable=var, value=1, command=sel)
R1.pack( anchor = W )

R2 = Radiobutton(root, text=&quot;Linux&quot;, variable=var, value=2, command=sel)
R2.pack( anchor = W )

R3 = Radiobutton(root, text=&quot;MacOS&quot;, variable=var, value=3, command=sel)
R3.pack( anchor = W )

label = Label(root)
label.pack()

# запускаем программу
root.mainloop()</code></pre><div class="t-redactor__text">В данной программе мы сначала создаем радио-кнопки, а затем назначаем команду sel для каждой радио-кнопки. При выборе той или иной кнопки передается значение, указанное в value. Вывод программы:</div><img src="https://static.tildacdn.com/tild6232-6238-4932-b739-333464336536/tkinter_radio_1.jpg"><h4  class="t-redactor__h4">Обработка независимых переключателей</h4><div class="t-redactor__text">Флажки не требуют установки между собой связи, поэтому может возникнуть вопрос, а нужны ли тут переменные Tkinter?</div><div class="t-redactor__text">Они нужны, чтобы снимать сведения о состоянии флажков. По значению связанной с <strong>Checkbutton</strong> переменной можно определить, установлен ли флажок или снят, что в свою очередь повлияет на ход выполнения программы.</div><div class="t-redactor__text">Поскольку состояния флажков независимы друг от друга, то для каждого должна быть введена собственная ассоциированная переменная-объект. Рассмотрим пример программы с флажками:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
    
root = Tk()
root.title(&quot;Пример работы флажков&quot;)
root.minsize(width=500, height=400)

var0 = StringVar() # значение каждого флажка
var1 = StringVar() # хранится в собственной переменной
var2 = StringVar()

# если флажок установлен, то в ассоциированную переменную
# (var0, var1 или var2) заносится значение onvalue,
# если флажок снят, то - offvalue.

ch0 = Checkbutton(root, text=&quot;Windows&quot;, variable=var0, onvalue=&quot;Выбран Windows&quot;, offvalue=&quot;-&quot;)
ch1 = Checkbutton(root, text=&quot;Linux&quot;, variable=var1, onvalue=&quot;Выбран Linux&quot;, offvalue=&quot;-&quot;)
ch2 = Checkbutton(root, text=&quot;MacOS&quot;, variable=var2, onvalue=&quot;Выбран MacOS&quot;, offvalue=&quot;-&quot;)

lis = Listbox(root, height=3)
def result(event):
  v0 = var0.get()
  v1 = var1.get()
  v2 = var2.get()
  l = [v0, v1, v2] # значение переменных заносится в список
  lis.delete(0,2)  # предыдущее значение удаляется из Listbox
  
  for v in l:      # содержимое списка l последовательно
    lis.insert(END,v) # вставляется в Listbox
    
but = Button(root, text=&quot;Получить значения&quot;)
but.bind(&#039;&lt;Button-1&gt;&#039;, result)

ch0.deselect() # по умолчанию флажки сняты
ch1.deselect()
ch2.deselect()

ch0.pack()
ch1.pack()
ch2.pack()
but.pack()
lis.pack()

# запускаем программу
root.mainloop()</code></pre><div class="t-redactor__text">Вывод программы:</div><img src="https://static.tildacdn.com/tild3336-6661-4563-a131-366235626436/tkinter_radio_2.jpg"><div class="t-redactor__text">С помощью методов <strong>select()</strong> и <strong>deselect()</strong> флажков можно их программно включать и выключать. То же самое относится к радио-кнопкам.<br /><br />На этом мы завершаем нашу статью. Желаем Вам хорошего и чистого кода! Пишите в комментариях свои вопросы и примеры кода.<br /><br />Видео по уроку:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/tNWpnh3S2fE" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Библиотека Tkinter: Диалоговые окна</title>
			<link>https://www.easyitway.com/tpost/9glm6osz71-biblioteka-tkinter-dialogovie-okna</link>
			<amplink>https://www.easyitway.com/tpost/9glm6osz71-biblioteka-tkinter-dialogovie-okna?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 16:24:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>Библиотека Tkinter содержит несколько модулей, предоставляющих доступ к уже готовым диалоговым окнам.</description>
			<turbo:content>
<![CDATA[<header><h1>Библиотека Tkinter: Диалоговые окна</h1></header><div class="t-redactor__text">Библиотека Tkinter содержит несколько модулей, предоставляющих доступ к уже готовым диалоговым окнам. Это окна различных сообщений, выбора по принципу «да-нет», открытия и сохранения файлов.<br /><br />В этой статье мы рассмотрим примеры окон из модулей <strong>messagebox</strong> и <strong>filedialog</strong> пакета tkinter.<br /><br />Для вызова диалоговых окон открытия и сохранения файлов и работу с ними необходимо импортировать «подмодуль» Tkinter — <strong>tkinter.filedialog</strong>, в котором описаны классы для окон данного типа. Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
from tkinter.filedialog import *
    
root = Tk()
root.title(&quot;Пример работы диалоговых окон&quot;)
root.minsize(width=500, height=400)

op = askopenfilename()
sa = asksaveasfilename()

root.mainloop()</code></pre><div class="t-redactor__text">Здесь создаются два объекта (op и sa): один вызывает диалоговое окно <strong>«Открыть»</strong>, а другой <strong>«Сохранить как…»</strong>. При выполнении программы, они друг за другом выводятся на экран после появления главного окна.<br /><br />Диалоговые окна мы научились создавать, однако если мы попытаемся открыть какой-нибудь текстовый файл, то в лучшем случае ничего не произойдет. Поэтому нужен модуль, который может нам помочь.<br /><br />Метод <strong>input</strong> модуля <strong>fileinput</strong> может принимать в качестве аргумента адрес файла, читать его содержимое, формируя список строк.<br /><br />Далее с помощью цикла for можно извлекать строки последовательно и помещать их, например, в текстовое поле. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
from tkinter.filedialog import *
import fileinput
    
root = Tk()
root.title(&quot;Пример работы диалоговых окон&quot;)
root.minsize(width=500, height=400)

txt = Text(root, width=40, height=15, font=&quot;14&quot;)
txt.pack()

op = askopenfilename()

for i in fileinput.input(op):
   txt.insert(END, i)

root.mainloop()</code></pre><div class="t-redactor__text">Видео по уроку:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/KMyEp3mpWs0" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe><h4  class="t-redactor__h4">Программа «Редактор файлов»</h4><div class="t-redactor__text">Для закрепления теории создадим небольшую программу. Полный листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
from tkinter.filedialog import *
import fileinput

# открытие файла
def _open():
  op = askopenfilename()
  print(op)
  f = open(op, &quot;r&quot;, encoding=&#039;utf-8&#039;)
  content = f.read()
  txt.delete(1.0,END)
  txt.insert(END, content)

# сохранение файла  
def _save():
  sa = asksaveasfilename()
  content = txt.get(1.0,END)
  f = open(sa, &quot;w&quot;, encoding=&#039;utf-8&#039;)
  f.write(content)
  f.close()
    
root = Tk()
root.title(&quot;Текстовый редактор&quot;)
root.minsize(width=500, height=400)
m = Menu(root)
root.config(menu=m)

fm = Menu(m)
m.add_cascade(label=&quot;Файл&quot;, menu=fm)
fm.add_command(label=&quot;Открыть...&quot;, command=_open)
fm.add_command(label=&quot;Сохранить как...&quot;, command=_save)

txt = Text(root, width=40, height=15, font=&quot; Courier 14&quot;)
txt.pack()

root.mainloop()</code></pre><div class="t-redactor__text">Программа напоминает простейший редактор файлов. В программе есть небольшое меню. Загрузка и сохранение файла осуществляется с вызовом диалога открытия файла. Для открытия и сохранения мы создали две функции.<br /><br />Вывод программы:</div><img src="https://static.tildacdn.com/tild3031-3062-4735-b439-336334383761/tkinter_message_box_.jpg"><div class="t-redactor__text">Видео по созданию программы:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/B-WhbhfRS5s" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe><h4  class="t-redactor__h4">MessageBox — вывод различных сообщений</h4><div class="t-redactor__text">Еще одна группа диалоговых окон описана в модуле <strong>tkinter.messagebox</strong>. Это окна различных сообщений, выбора по принципу «да-нет». Дополним нашу программу: «Редактор файлов». Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
from tkinter.filedialog import *
from tkinter.messagebox import *
import fileinput

# открытие файла
def _open():
  op = askopenfilename()
  print(op)
  f = open(op, &quot;r&quot;, encoding=&#039;utf-8&#039;)
  content = f.read()
  txt.delete(1.0,END)
  txt.insert(END, content)

# закрытие файла  
def _save():
  sa = asksaveasfilename()
  content = txt.get(1.0,END)
  f = open(sa, &quot;w&quot;, encoding=&#039;utf-8&#039;)
  f.write(content)
  f.close()

# выход из программы  
def close_win():
  if askyesno(&quot;Выход&quot;, &quot;Вы уверены?&quot;):
    root.destroy()

# вывод справки    
def about():
  showinfo(&quot;Редактор&quot;, &quot;Простейший текстовый редактор от сайта: https://it-black.ru&quot;)
    
root = Tk()
root.title(&quot;Текстовый редактор v 2.0&quot;)
root.minsize(width=500, height=400)
m = Menu(root)
root.config(menu=m)

fm = Menu(m)
m.add_cascade(label=&quot;Файл&quot;, menu=fm)
fm.add_command(label=&quot;Открыть...&quot;, command=_open)
fm.add_command(label=&quot;Сохранить как...&quot;, command=_save)
fm.add_command(label=&quot;Выход&quot;, command=close_win)

hm = Menu(m)
m.add_cascade(label=&quot;Справка&quot;, menu=hm)
hm.add_command(label=&quot;О программе&quot;, command=about)

txt = Text(root, width=40, height=15, font=&quot; Courier 14&quot;)
txt.pack()

root.mainloop()</code></pre><div class="t-redactor__text">Мы создали две дополнительные функции и пункты меню. В функции <strong>about</strong> происходит вызов окна <strong>showinfo</strong>, позволяющее выводить сообщение для пользователя с кнопкой <strong>ОК</strong>. Первый аргумент — это то, что выведется в заголовке окна, а второй — то, что будет содержаться в теле сообщения.<br /><br />В функции <strong>close_win</strong> вызывается окно <strong>askyenso</strong>, которое позволяет получить от пользователя два ответа (true и false). При положительном ответе сработает ветка <strong>if</strong> и главное окно будет закрыто. В случае нажатия пользователем кнопки <strong>«Нет»</strong> окно просто закроется.<br /><br />Вывод программы:</div><img src="https://static.tildacdn.com/tild3264-3261-4065-b462-653433623564/tkinter_message_box_.jpg"><div class="t-redactor__text">В данной статье мы создали неплохой текстовый редактор и теперь вы можете самостоятельно его улучшать. Пишите в комментариях свои варианты нашей программы.<br /><br />Видео по созданию программы:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/ySeocrsbn_s" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Библиотека Tkinter: Графические примитивы</title>
			<link>https://www.easyitway.com/tpost/1uorbabhy1-biblioteka-tkinter-graficheskie-primitiv</link>
			<amplink>https://www.easyitway.com/tpost/1uorbabhy1-biblioteka-tkinter-graficheskie-primitiv?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 16:28:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>В этой статье мы познакомимся с графикой в библиотеке Tkinter. Начнем с графических примитив и в других статьях будем создавать сложные графические программы.</description>
			<turbo:content>
<![CDATA[<header><h1>Библиотека Tkinter: Графические примитивы</h1></header><div class="t-redactor__text">В этой статье мы познакомимся с графикой в библиотеке Tkinter. Начнем с графических примитив и в других статьях будем создавать сложные графические программы.<br /><br />При работе с двухмерной графикой базовым понятием является холст.<br /><br /><strong>Canvas (холст)</strong> — это достаточно сложный объект библиотеки tkinter. Он помогает располагать геометрические фигуры, узоры вставленные изображения и другие виджеты (например, метки, кнопки, текстовые поля).<br /><br />При создании экземпляра <strong>Canvas</strong> необходимо указать его ширину и высоту. При размещении геометрических примитивов и других объектов указываются их координаты на холсте. Точкой отсчета является верхний левый угол.<br /><br />Для того чтобы создать объект-холст необходимо вызвать соответствующий класс модуля tkinter и установить некоторые значения свойств. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
    
root = Tk()
root.title(&quot;Графические примитивы&quot;)
root.minsize(width=500, height=400)

canv = Canvas(root, width=500, height=400, bg=&#039;lightgray&#039;, cursor=&#039;pencil&#039;)

canv.pack()
root.mainloop()</code></pre><div class="t-redactor__text">В этом примере мы создаем холст с размером 500х400 пикселей и светло-серым фоном.<br /><br />Перед тем как создавать геометрические фигуры на холсте следует разобраться с координатами и единицами измерения на холсте. Нулевая точка (0,0) для объекта Canvas располагается в верхнем левом углу.<br /><br />Единицы измерения пиксели (точки экрана). У любой точки первое число — это расстояние от нулевого значения по оси X, второе — по оси Y.<br /><br />Чтобы нарисовать линию на холсте следует к объекту применить метод <strong>create_line</strong>. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
    
root = Tk()
root.title(&quot;Графические примитивы&quot;)
root.minsize(width=500, height=400)

canv = Canvas(root, width=500, height=400, bg=&#039;lightgray&#039;, cursor=&#039;pencil&#039;)

canv.create_line(200,50,300,50, width=3, fill=&quot;blue&quot;)
canv.create_line(0,0,100,100, width=2, arrow=LAST)

canv.pack()
root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild3066-3163-4234-b362-613334383333/tkinter_grafika_2.jpg"><div class="t-redactor__text">Четыре числа — это пары координат начала и конца линии. Свойство <strong>fill</strong> позволяет задавать цвет линии отличный от черного, а <strong>arrow</strong> — установить стрелку (в конце, начале или по обоим концам линии).<br /><br />Метод <strong>create_rectangle</strong> создает прямоугольник. Аналогично линии в скобках первыми аргументами прописываются четыре числа. Первые две координаты обозначают верхний левый угол прямоугольника, вторые — правый нижний.<br /><br />Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
    
root = Tk()
root.title(&quot;Графические примитивы&quot;)
root.minsize(width=500, height=400)

canv = Canvas(root, width=500, height=400, bg=&#039;lightgray&#039;, cursor=&#039;pencil&#039;)

x = 50
y = 300
canv.create_rectangle(x,y,x+80,y+50, fill=&quot;white&quot;, outline=&quot;blue&quot;)

canv.pack()
root.mainloop()</code></pre><div class="t-redactor__text">Опция <strong>outline</strong> определяет цвет границы прямоугольника.<br /><br />Будет выведено:</div><img src="https://static.tildacdn.com/tild3134-6437-4333-a431-643536303033/tkinter_grafika_3.jpg"><div class="t-redactor__text">Чтобы создать произвольный многоугольник, требуется задать пары координат для каждой его точки. В примере мы рассмотрим другой подход. Он может быть полезен, если начальные координаты объекта могут изменяться, а его размер строго регламентирован:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
    
root = Tk()
root.title(&quot;Графические примитивы&quot;)
root.minsize(width=500, height=400)

canv = Canvas(root, width=500, height=400, bg=&#039;lightgray&#039;, cursor=&#039;pencil&#039;)

canv.create_polygon([250,110],[200,150],[300,150], fill=&quot;red&quot;)

canv.pack()
root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild6533-6532-4230-a237-633139366532/tkinter_grafika_4.jpg"><div class="t-redactor__text">Квадратные скобки при задании координат используются для удобочитаемости (их можно не использовать). Свойство <strong>smooth</strong> задает сглаживание:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
    
root = Tk()
root.title(&quot;Графические примитивы&quot;)
root.minsize(width=500, height=400)

canv = Canvas(root, width=500, height=400, bg=&#039;lightgray&#039;, cursor=&#039;pencil&#039;)

canv.create_polygon([250,110],[200,150],[300,150], fill=&quot;red&quot;)
canv.create_polygon([300,80],[400,80],[450,75],[450,200],[300,180],[330,160],outline=&quot;white&quot;, smooth=1)

canv.pack()
root.mainloop()</code></pre><div class="t-redactor__text">Выведет:</div><img src="https://static.tildacdn.com/tild6364-6135-4431-b434-363831633737/tkinter_grafika_5.jpg"><div class="t-redactor__text">При создании эллипса задаются координаты гипотетического прямоугольника, описывающего данный эллипс:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
    
root = Tk()
root.title(&quot;Графические примитивы&quot;)
root.minsize(width=500, height=400)

canv = Canvas(root, width=500, height=400, bg=&#039;lightgray&#039;, cursor=&#039;pencil&#039;)

canv.create_polygon([250,110],[200,150],[300,150], fill=&quot;red&quot;)
canv.create_polygon([300,80],[400,80],[450,75],[450,200],[300,180],[330,160],outline=&quot;white&quot;, smooth=1)
canv.create_oval([20,200],[150,300], fill=&quot;gray50&quot;) # создаем эллипс

canv.pack()
root.mainloop()</code></pre><div class="t-redactor__text">Выведет:</div><img src="https://static.tildacdn.com/tild3332-3434-4332-b335-383930353165/tkinter_grafika_6.jpg"><div class="t-redactor__text">Более сложные для понимания фигуры получаются при использовании метода <strong>create_arc</strong>.<br /><br />В зависимости от значения опции <strong>style</strong> можно получить сектор (по умолчанию), сегмент (CHORD) или дугу (ARC). От опций <strong>start</strong> и <strong>extent</strong> зависит угол фигуры. Метод <strong>create.text</strong> создает текстовую надпись. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
    
root = Tk()
root.title(&quot;Графические примитивы&quot;)
root.minsize(width=500, height=400)

canv = Canvas(root, width=500, height=400, bg=&#039;lightgray&#039;, cursor=&#039;pencil&#039;)

canv.create_arc([160,230], [230,330], start=0, extent=140, fill=&quot;lightgreen&quot;)
canv.create_arc([250,230], [320,330], start=0, extent=140, style=CHORD, fill=&quot;green&quot;)
canv.create_arc([340,230], [410,330], start=0, extent=140, style=ARC, outline=&quot;darkgreen&quot;, width=2)
canv.create_text(20,330, text=&quot;Графические примитивы&quot;, font=&quot;Verdana 14&quot;, anchor=&quot;w&quot;, justify=CENTER, fill=&quot;red&quot;)

canv.pack()
root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild3235-3531-4561-b537-383339623932/tkinter_grafika_7.jpg"><div class="t-redactor__text">Если что часто требуется «нарисовать» на холсте какие-либо повторяющиеся элементы. Для того, чтобы не загружать код, используют циклы. Например, так:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">x=10
   while x &lt; 450:
   canv.create_rectangle(x,400,x+50,450)
   x = x + 60</code></pre><h4  class="t-redactor__h4">Обращение к уже существующим графическим примитивам</h4><div class="t-redactor__text">Чтобы можно было изменять свойства уже существующих объектов холста (например, геометрических фигур) в tkinter используют идентификаторы и теги, которые затем передаются другим методам.</div><div class="t-redactor__text">У любого объекта может быть как идентификатор, так и тег. Использование идентификаторов и тегов немного различается.</div><div class="t-redactor__text">Рассмотрим несколько методов изменения уже существующих объектов с использованием при этом идентификаторов. Для начала создадим холст и три объекта на нем.</div><div class="t-redactor__text">При создании объекты "возвращают" свои идентификаторы, которые можно связать с переменными (oval, rect и trial в примере ниже) и потом использовать их для обращения к конкретному объекту:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
    
root = Tk()
root.title(&quot;Графические примитивы&quot;)
root.minsize(width=500, height=400)

c = Canvas(width=460,height=460,bg=&#039;grey80&#039;)
c.pack()
oval = c.create_oval(30,10,130,80)
rect = c.create_rectangle(180,10,280,80)
trian = c.create_polygon(330,80,380,10,430,80, fill=&#039;grey80&#039;, outline=&quot;black&quot;)

root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild6634-6238-4537-a666-626537326262/tkinter_grafika_8.jpg"><div class="t-redactor__text">Далее можно использовать методы-"модификаторы" указывая в качестве первого аргумента идентификатор объекта. Метод <strong>move</strong> перемещает объект по оси X и Y на расстояние указанное в качестве второго и третьего аргументов.<br /><br />Следует понимать, что это не координаты, а смещение, т.е. в примере ниже прямоугольник опустится вниз на 150 пикселей. Метод <strong>itemconfig</strong> изменяет указанные свойства объектов, <strong>coords</strong> изменяет координаты (им можно менять и размер объекта).</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
    
root = Tk()
root.title(&quot;Графические примитивы&quot;)
root.minsize(width=500, height=400)

c = Canvas(width=460,height=460,bg=&#039;grey80&#039;)
c.pack()
oval = c.create_oval(30,10,130,80)
rect = c.create_rectangle(180,10,280,80)
trian = c.create_polygon(330,80,380,10,430,80, fill=&#039;grey80&#039;, outline=&quot;black&quot;)

c.move(rect,0,150)
c.itemconfig(trian,outline=&quot;red&quot;,width=3)
c.coords(oval,300,200,450,450)

root.mainloop()</code></pre><div class="t-redactor__text">Метод <strong>tag_bind</strong> позволяет привязать событие (например, щелчок кнопкой мыши) к определенному объекту.<br /><br />Таким образом, можно реализовать обращение к различным областям холста с помощью одного и того же события. Пример ниже это наглядно иллюстрирует: изменения на холсте зависят от того, где произведен щелчок мышью.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
    
root = Tk()
root.title(&quot;Графические примитивы&quot;)
root.minsize(width=500, height=400)

c = Canvas(width=460,height=100,bg=&#039;grey80&#039;)
c.pack()

oval = c.create_oval(30,10,130,80,fill=&quot;orange&quot;)
c.create_rectangle(180,10,280,80,tag=&quot;rect&quot;,fill=&quot;lightgreen&quot;)
trian = c.create_polygon(330,80,380,10,430,80,fill=&#039;white&#039;,outline=&quot;black&quot;)

def oval_func(event):
 c.delete(oval)

c.create_text(30,10,text=&quot;Здесь был круг&quot;,anchor=&quot;w&quot;)

def rect_func(event):
 c.delete(&quot;rect&quot;)

c.create_text(180,10,text=&quot;Здесь был\nпрямоугольник&quot;,anchor=&quot;nw&quot;)

def triangle(event):
 c.create_polygon(350,70,380,20,410,70,fill=&#039;yellow&#039;,outline=&quot;black&quot;)

c.tag_bind(oval,&#039;&lt;Button-1&gt;&#039;,oval_func)
c.tag_bind(&quot;rect&quot;,&#039;&lt;Button-1&gt;&#039;,rect_func)
c.tag_bind(trian,&#039;&lt;Button-1&gt;&#039;,triangle)

mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild6134-3661-4239-b236-653063623238/tkinter_grafika_9.jpg">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Библиотека Tkinter: Разработка программы Paint</title>
			<link>https://www.easyitway.com/tpost/pgny8txyu1-biblioteka-tkinter-razrabotka-programmi</link>
			<amplink>https://www.easyitway.com/tpost/pgny8txyu1-biblioteka-tkinter-razrabotka-programmi?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 16:34:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>В этой статье мы разработаем простую «рисовалку» на Python. Программа будет примитивная, но мы потренируемся в создании макетов компоновки в tkinter, передаче аргументов в функцию-обработчик, а также применим анонимные функции.</description>
			<turbo:content>
<![CDATA[<header><h1>Библиотека Tkinter: Разработка программы Paint</h1></header><div class="t-redactor__text">В этой статье мы разработаем простую «рисовалку» на Python. Программа будет примитивная, но мы потренируемся в создании макетов компоновки в tkinter, передаче аргументов в функцию-обработчик, а также применим анонимные функции.</div><h4  class="t-redactor__h4">Класс Paint</h4><div class="t-redactor__text">В нашей программе мы будем применять ООП и поэтому создаем класс и называем его «Paint». Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
from tkinter.messagebox import *

# класс Paint
class Paint(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent


# выход из программы  
def close_win():
  if askyesno(&quot;Выход&quot;, &quot;Вы уверены?&quot;):
    root.destroy()

# вывод справки    
def about():
  showinfo(&quot;Demo Paint&quot;, &quot;Простейшая рисовалка от сайта: https://it-black.ru&quot;)
  
# функция для создания главного окна
def main():
    global root
    root = Tk()
    root.geometry(&quot;800x600+300+300&quot;)
    app = Paint(root)
    m = Menu(root)
    root.config(menu=m)

    fm = Menu(m)
    m.add_cascade(label=&quot;Файл&quot;, menu=fm)
    fm.add_command(label=&quot;Выход&quot;, command=close_win)

    hm = Menu(m)
    m.add_cascade(label=&quot;Справка&quot;, menu=hm)
    hm.add_command(label=&quot;О программе&quot;, command=about)
    root.mainloop()

if __name__ == &quot;__main__&quot;:
    main()</code></pre><div class="t-redactor__text">Данный код создает каркас для нашей будущей программы. Далее мы создаем для нашего класса функцию <strong>setUI</strong>, в которой будем задавать расположение всех кнопок, меток и самого холста — поля для рисования. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def setUI(self):
  # Устанавливаем название окна
  self.parent.title(&quot;Demo Paint&quot;)
  # Размещаем активные элементы на родительском окне
  self.pack(fill=BOTH, expand=1)

  self.columnconfigure(6, weight=1)
  self.rowconfigure(2, weight=1)

  # Создаем холст с белым фоном
  self.canv = Canvas(self, bg=&quot;white&quot;)

  # Приклепляем канвас методом grid. Он будет находится в 3м ряду, первой колонке,
  # и будет занимать 7 колонок, задаем отступы по X и Y в 5 пикселей, и
  # заставляем растягиваться при растягивании всего окна

  self.canv.grid(row=2, column=0, columnspan=7, padx=5, pady=5, sticky=E + W + S + N)

  # создаем метку для кнопок изменения цвета кисти
  color_lab = Label(self, text=&quot;Цвет: &quot;)

  # Устанавливаем созданную метку в первый ряд и первую колонку,
  # задаем горизонтальный отступ в 6 пикселей
  color_lab.grid(row=0, column=0, padx=6)

  # создание кнопки: установка текста кнопки, задание ширины кнопки (10 символов)
  red_btn = Button(self, text=&quot;Красный&quot;, width=10)

  # устанавливаем кнопку в первый ряд, вторая колонка
  red_btn.grid(row=0, column=1)

  # по аналогии создаем остальные кнопки
  green_btn = Button(self, text=&quot;Зеленый&quot;, width=10)
  green_btn.grid(row=0, column=2)

  blue_btn = Button(self, text=&quot;Синий&quot;, width=10)
  blue_btn.grid(row=0, column=3)

  black_btn = Button(self, text=&quot;черный&quot;, width=10)
  black_btn.grid(row=0, column=4)

  white_btn = Button(self, text=&quot;Белый&quot;, width=10)
  white_btn.grid(row=0, column=5)

  # Создаем метку для кнопок изменения размера кисти
  size_lab = Label(self, text=&quot;Размер кисти: &quot;)
  size_lab.grid(row=1, column=0, padx=5)
  one_btn = Button(self, text=&quot;2x&quot;, width=10)
  one_btn.grid(row=1, column=1)

  two_btn = Button(self, text=&quot;5x&quot;, width=10)
  two_btn.grid(row=1, column=2)

  five_btn = Button(self, text=&quot;7x&quot;, width=10)
  five_btn.grid(row=1, column=3)

  seven_btn = Button(self, text=&quot;10x&quot;, width=10)
  seven_btn.grid(row=1, column=4)

  ten_btn = Button(self, text=&quot;20x&quot;, width=10)
  ten_btn.grid(row=1, column=5)

  twenty_btn = Button(self, text=&quot;50x&quot;, width=10)
  twenty_btn.grid(row=1, column=6, sticky=W)</code></pre><div class="t-redactor__text">В метод __init__ нужно добавить вызов этого метода:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">self.setUI()</code></pre><h4  class="t-redactor__h4">Разработка метода draw()</h4><div class="t-redactor__text">Разработаем метод для рисования на холсте. В метод __init__ нужно добавить параметры кисти по умолчанию:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">self.brush_size = 10
self.brush_color = &quot;red&quot;
self.color = &quot;red&quot;</code></pre><div class="t-redactor__text">Листинг метода draw():</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def draw(self, event):
        self.canv.create_oval(event.x - self.brush_size,
                              event.y - self.brush_size,
                              event.x + self.brush_size,
                              event.y + self.brush_size,
                              fill=self.color, outline=self.color)</code></pre><div class="t-redactor__text">Рисование осуществляется путем создания кругов на холсте: пользователь зажимает левую кнопку мыши и при движении мышью, по пути следования курсора будут отрисовываться круги.<br /><br />Осталось только привязать к холсту обработку только что созданного метода. Код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">self.canv.bind(&quot;&lt;B1-Motion&gt;&quot;, self.draw)</code></pre><h4  class="t-redactor__h4">Изменение цвета и размера кисти</h4><div class="t-redactor__text">Разработаем метод изменения цвета кисти:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def set_color(self, new_color):
  self.color = new_color</code></pre><div class="t-redactor__text">После этого в каждой кнопке верхнего ряда следует добавить код обработки нажатия этой кнопки по следующему шаблону:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">red_btn = Button(self, text=&quot;Красный&quot;, width=10, command=lambda: self.set_color(&quot;red&quot;))
red_btn.grid(row=0, column=1)</code></pre><div class="t-redactor__text">Код <strong>«command=lambda: self.set_color(«red»)»</strong> привязывает функцию с нужным нам аргументом к кнопке. Используем lambda-функцию т.к. без lambda функция вызовется сразу при создании кнопки, а не только при ее нажатии.<br /><br />Рассмотрим метод изменения размера кисти:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def set_brush_size(self, new_size):
  self.brush_size = new_size</code></pre><div class="t-redactor__text">Модернизируем код каждой кнопки нижнего ряда по следующему шаблону:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">one_btn = Button(self, text=&quot;2x&quot;, width=10, command=lambda: self.set_brush_size(2))</code></pre><div class="t-redactor__text">Осталось добавить кнопку «Очистить» для нашей программы. Данная кнопка будет очищать холст. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">clear_btn = Button(self, text=&quot;Очистить&quot;, width=10, command=lambda: self.canv.delete(&quot;all&quot;))
clear_btn.grid(row=0, column=6, sticky=W)</code></pre><h4  class="t-redactor__h4">Полный листинг программы</h4><div class="t-redactor__text">Разработка нашей программы закончилась. Соберем всю нашу программу в один файл и проверим на работоспособность. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
from tkinter.messagebox import *

# класс Paint
class Paint(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        # Параметры кисти по умолчанию
        self.brush_size = 10
        self.brush_color = &quot;red&quot;
        self.color = &quot;red&quot;
        # Устанавливаем компоненты UI
        self.setUI()

        # Метод рисования на холсте

    def draw(self, event):
        self.canv.create_oval(event.x - self.brush_size,
                              event.y - self.brush_size,
                              event.x + self.brush_size,
                              event.y + self.brush_size,
                              fill=self.color, outline=self.color)

        # Изменение цвета кисти

    def set_color(self, new_color):
        self.color = new_color

        # Изменение размера кисти

    def set_brush_size(self, new_size):
        self.brush_size = new_size

    def setUI(self):
        # Устанавливаем название окна
        self.parent.title(&quot;Demo Paint&quot;)
        # Размещаем активные элементы на родительском окне
        self.pack(fill=BOTH, expand=1)

        self.columnconfigure(6, weight=1)
        self.rowconfigure(2, weight=1)

        # Создаем холст с белым фоном
        self.canv = Canvas(self, bg=&quot;white&quot;)

        # Приклепляем канвас методом grid. Он будет находится в 3м ряду, первой колонке,
        # и будет занимать 7 колонок, задаем отступы по X и Y в 5 пикселей, и
        # заставляем растягиваться при растягивании всего окна

        self.canv.grid(row=2, column=0, columnspan=7, padx=5, pady=5, sticky=E + W + S + N)

        # задаем реакцию холста на нажатие левой кнопки мыши
        self.canv.bind(&quot;&lt;B1-Motion&gt;&quot;, self.draw)

        # создаем метку для кнопок изменения цвета кисти
        color_lab = Label(self, text=&quot;Цвет: &quot;)

        # Устанавливаем созданную метку в первый ряд и первую колонку,
        # задаем горизонтальный отступ в 6 пикселей
        color_lab.grid(row=0, column=0, padx=6)

        # создание кнопки: установка текста кнопки, задание ширины кнопки (10 символов)
        red_btn = Button(self, text=&quot;Красный&quot;, width=10, command=lambda: self.set_color(&quot;red&quot;))

        # устанавливаем кнопку в первый ряд, вторая колонка
        red_btn.grid(row=0, column=1)

        # по аналогии создаем остальные кнопки
        green_btn = Button(self, text=&quot;Зеленый&quot;, width=10, command=lambda: self.set_color(&quot;green&quot;))
        green_btn.grid(row=0, column=2)

        blue_btn = Button(self, text=&quot;Синий&quot;, width=10, command=lambda: self.set_color(&quot;blue&quot;))
        blue_btn.grid(row=0, column=3)

        black_btn = Button(self, text=&quot;черный&quot;, width=10, command=lambda: self.set_color(&quot;black&quot;))
        black_btn.grid(row=0, column=4)

        white_btn = Button(self, text=&quot;Белый&quot;, width=10, command=lambda: self.set_color(&quot;white&quot;))
        white_btn.grid(row=0, column=5)

        # Создаем метку для кнопок изменения размера кисти
        size_lab = Label(self, text=&quot;Размер кисти: &quot;)
        size_lab.grid(row=1, column=0, padx=5)
        one_btn = Button(self, text=&quot;2x&quot;, width=10, command=lambda: self.set_brush_size(2))
        one_btn.grid(row=1, column=1)

        two_btn = Button(self, text=&quot;5x&quot;, width=10, command=lambda: self.set_brush_size(5))
        two_btn.grid(row=1, column=2)

        five_btn = Button(self, text=&quot;7x&quot;, width=10, command=lambda: self.set_brush_size(7))
        five_btn.grid(row=1, column=3)

        seven_btn = Button(self, text=&quot;10x&quot;, width=10, command=lambda: self.set_brush_size(10))
        seven_btn.grid(row=1, column=4)

        ten_btn = Button(self, text=&quot;20x&quot;, width=10, command=lambda: self.set_brush_size(20))
        ten_btn.grid(row=1, column=5)

        twenty_btn = Button(self, text=&quot;50x&quot;, width=10, command=lambda: self.set_brush_size(50))
        twenty_btn.grid(row=1, column=6, sticky=W)

        clear_btn = Button(self, text=&quot;Очистить&quot;, width=10, command=lambda: self.canv.delete(&quot;all&quot;))
        clear_btn.grid(row=0, column=6, sticky=W)

# выход из программы  
def close_win():
  if askyesno(&quot;Выход&quot;, &quot;Вы уверены?&quot;):
    root.destroy()

# вывод справки    
def about():
  showinfo(&quot;Demo Paint&quot;, &quot;Простейшая рисовалка от сайта: https://it-black.ru&quot;)
  
# функция для создания главного окна
def main():
    global root
    root = Tk()
    root.geometry(&quot;800x600+300+300&quot;)
    app = Paint(root)
    m = Menu(root)
    root.config(menu=m)

    fm = Menu(m)
    m.add_cascade(label=&quot;Файл&quot;, menu=fm)
    fm.add_command(label=&quot;Выход&quot;, command=close_win)

    hm = Menu(m)
    m.add_cascade(label=&quot;Справка&quot;, menu=hm)
    hm.add_command(label=&quot;О программе&quot;, command=about)
    root.mainloop()

if __name__ == &quot;__main__&quot;:
    main()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild3939-6164-4966-b261-653561363935/tkinter_paint_2.jpg"><div class="t-redactor__text">Для полного понимания работы программы рекомендуется читать комментарии к коду. Программа получилась очень простая и поэтому мы рекомендуем самостоятельно доработать или переработать код данной программы. Пишите свои варианты в комментариях.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Библиотека Tkinter: Разработка игры «Змейка»</title>
			<link>https://www.easyitway.com/tpost/vnjtv4ln11-biblioteka-tkinter-razrabotka-igri-zmeik</link>
			<amplink>https://www.easyitway.com/tpost/vnjtv4ln11-biblioteka-tkinter-razrabotka-igri-zmeik?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 16:40:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>В этой статье мы напишем игру змейка на Python. Это одна из самых распространенных аркад в мире. В основе ее реализации будет три класса:</description>
			<turbo:content>
<![CDATA[<header><h1>Библиотека Tkinter: Разработка игры «Змейка»</h1></header><div class="t-redactor__text">В этой статье мы напишем игру змейка на Python. Это одна из самых распространенных аркад в мире. В основе ее реализации будет три класса:</div><div class="t-redactor__text"><ul><li>Класс сегмента (одного блока змейки).</li><li>Класс змеи (по сути собрание сегментов).</li><li>Класс подсчета очков.</li></ul></div><div class="t-redactor__text">В процессе написания змейки у нас будут следующие этапы:</div><div class="t-redactor__text"><ol><li>Создание окна приложения;</li><li>Объявление вспомогательных переменных;</li><li>Создание игрового поля;</li><li>Создание классов сегмента, змеи и очков;</li><li>Создание разных дополнительных функций;</li><li>Создание функций для начала новой игры и выхода из игры.</li></ol></div><h4  class="t-redactor__h4">Создание окна приложения</h4><div class="t-redactor__text">Первым делом нужно разработать каркас для нашего приложения — главное окно. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

# Настройка главного окна
root = Tk()
root.title(&quot;Змейка&quot;)

# запускаем окно
root.mainloop()</code></pre><h4  class="t-redactor__h4">Объявление вспомогательных переменных</h4><div class="t-redactor__text">Добавляем в нашу программу вспомогательные переменные. Их нужно добавить сразу после оператора импорта tkinter:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># Ширина экрана
WIDTH = 800

# Высота экрана
HEIGHT = 600

# Размер сегмента змеи
SEG_SIZE = 20

# Переменная, отвечающая за состояние игры
IN_GAME = True</code></pre><div class="t-redactor__text">Это глобальные переменные, которые мы будем использовать в процессе игры.</div><h4  class="t-redactor__h4">Создание игрового поля</h4><div class="t-redactor__text">Игровое поле мы реализуем с помощью <strong>Canvas</strong>. Создадим холст нужного нам размера и зальем его черным цветом. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># Создаем экземпляр класса Canvas
c = Canvas(root, width=WIDTH, height=HEIGHT, bg=&quot;#000000&quot;)
c.grid()

# Захватываем фокус для отлавливания нажатий клавиш
c.focus_set()</code></pre><h4  class="t-redactor__h4">Создание основных классов</h4><h4  class="t-redactor__h4">Класс сегмента змеи</h4><div class="t-redactor__text">Первый класс — это сегмент змейки. Визуально сегмент змейки будет представлен обычным прямоугольником, созданным при помощи метода <strong>create_rectangle</strong> класса <strong>Canvas</strong> модуля tkinter. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Segment(object):
    &quot;&quot;&quot; Сегмент змейки &quot;&quot;&quot;
    def __init__(self, x, y):
        self.instance = c.create_rectangle(x, y,
                                           x + SEG_SIZE, y + SEG_SIZE,
                                           fill=&quot;green&quot;)</code></pre><h4  class="t-redactor__h4">Класс змейки</h4><div class="t-redactor__text">Змейка у нас будет набором сегментов. У нее будут методы движения, изменения направления и добавления сегмента. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Snake(object):
    &quot;&quot;&quot; Класс змейки &quot;&quot;&quot;
    def __init__(self, segments):
        self.segments = segments

        # Варианты движения
        self.mapping = {&quot;Down&quot;: (0, 1), &quot;Right&quot;: (1, 0),
                        &quot;Up&quot;: (0, -1), &quot;Left&quot;: (-1, 0)}

        # инициируем направление движения
        self.vector = self.mapping[&quot;Right&quot;]

    def move(self):
        &quot;&quot;&quot; Двигаем змейку в заданном направлении &quot;&quot;&quot;
        for index in range(len(self.segments) - 1):
            segment = self.segments[index].instance
            x1, y1, x2, y2 = c.coords(self.segments[index + 1].instance)
            c.coords(segment, x1, y1, x2, y2)

        x1, y1, x2, y2 = c.coords(self.segments[-2].instance)
        c.coords(self.segments[-1].instance,
                 x1 + self.vector[0] * SEG_SIZE, y1 + self.vector[1] * SEG_SIZE,
                 x2 + self.vector[0] * SEG_SIZE, y2 + self.vector[1] * SEG_SIZE)

    def add_segment(self):
        &quot;&quot;&quot; Добавляем сегмент змейки &quot;&quot;&quot;
        score.increment()
        last_seg = c.coords(self.segments[0].instance)
        x = last_seg[2] - SEG_SIZE
        y = last_seg[3] - SEG_SIZE
        self.segments.insert(0, Segment(x, y))

    def change_direction(self, event):
        &quot;&quot;&quot; Изменение направления движения змейки &quot;&quot;&quot;
        if event.keysym in self.mapping:
            self.vector = self.mapping[event.keysym]

    # Функция обновления змейки при старте новой игры
    def reset_snake(self):
        for segment in self.segments:
            c.delete(segment.instance)</code></pre><div class="t-redactor__text">Конструктор (метод __init__) задает список доступных направлений движения змейки и задает направление по умолчанию — вправо.<br /><br />Метод <strong>move()</strong> двигает змейку в заданном направлении. Метод <strong>change_direction()</strong> изменяет направление движения змейки.<br /><br />За добавление нового сегмента отвечает метод <strong>add_segment()</strong>. Метод <strong>reset_snake()</strong> отвечает за обновления змейки при старте новой игры. Внимательно читайте все комментарии к коду.<br /><br />Добавим в код функцию для создания сегментов и змейки:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># Создаем сегменты и змейку
def create_snake():
    segments = [Segment(SEG_SIZE, SEG_SIZE),
                Segment(SEG_SIZE * 2, SEG_SIZE),
                Segment(SEG_SIZE * 3, SEG_SIZE)]
    return Snake(segments)</code></pre><h4  class="t-redactor__h4">Класс подсчета очков</h4><div class="t-redactor__text">Последний класс отвечает за счет очков при съедании змейкой сегмента:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># Подсчет очков
class Score(object):

    # функция отображения очков на экране
    def __init__(self):
        self.score = 0
        self.x = 55
        self.y = 15
        c.create_text(self.x, self.y, text=&quot;Счёт: {}&quot;.format(self.score), font=&quot;Arial 20&quot;,
                      fill=&quot;Yellow&quot;, tag=&quot;score&quot;, state=&#039;hidden&#039;)

    # функция счета очков и вывод на экран
    def increment(self):
        c.delete(&quot;score&quot;)
        self.score += 1
        c.create_text(self.x, self.y, text=&quot;Счёт: {}&quot;.format(self.score), font=&quot;Arial 20&quot;,
                      fill=&quot;Yellow&quot;, tag=&quot;score&quot;)

    # функция сброса очков при начале новой игры
    def reset(self):
        c.delete(&quot;score&quot;)
        self.score = 0</code></pre><div class="t-redactor__text">Конструктор (метод __init__) отображает очки на экране при поедании змейкой сегментов. Метод <strong>increment()</strong> ведет счет очков. Метод <strong>reset()</strong> обновляет очки при старте новой игры.<br /><br />Для работы нашего класса необходимо добавить строчку в основной экран нашего приложения:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># Считаем очки
score = Score()</code></pre><h4  class="t-redactor__h4">Создание разных дополнительных функций</h4><div class="t-redactor__text">Нам понадобятся две вспомогательные функции. Первая — <strong>create_block()</strong>, которая создает пищу для змейки. В нашем случае это будет яблоко — кружок зеленого цвета. Чтобы эта функция работала необходимо импортировать модуль random:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import random</code></pre><div class="t-redactor__text">Листинг функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># Вспомогательная функция
def create_block():
    &quot;&quot;&quot; Создаем еду для змейки &quot;&quot;&quot;
    global BLOCK
    posx = SEG_SIZE * random.randint(1, (WIDTH - SEG_SIZE) / SEG_SIZE)
    posy = SEG_SIZE * random.randint(1, (HEIGHT - SEG_SIZE) / SEG_SIZE)
    BLOCK = c.create_oval(posx, posy,
                          posx + SEG_SIZE, posy + SEG_SIZE,
                          fill=&quot;green&quot;)</code></pre><div class="t-redactor__text">Следующая вспомогательная функция <strong>main()</strong> будет управлять игровым процессом — именно она будет управлять тем, куда пойдет змейка, обрабатывает столкновения с границами экрана, отвечает за поедание яблок и увеличение змейки. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">def main():
    &quot;&quot;&quot; Моделируем игровой процесс &quot;&quot;&quot;
    global IN_GAME
    if IN_GAME:
        s.move()

        # Определяем координаты головы
        head_coords = c.coords(s.segments[-1].instance)
        x1, y1, x2, y2 = head_coords

        # столкновения с краями игрового поля
        if x2 &gt; WIDTH or x1 &lt; 0 or y1 &lt; 0 or y2 &gt; HEIGHT:
            IN_GAME = False

        # Поедание яблока
        elif head_coords == c.coords(BLOCK):
            s.add_segment()
            c.delete(BLOCK)
            create_block()

        # Поедание змейки
        else:
            for index in range(len(s.segments) - 1):
                if head_coords == c.coords(s.segments[index].instance):
                    IN_GAME = False

        # скорость змейки
        root.after(100, main)
    # Не IN_GAME -&gt; останавливаем игру и выводим сообщения
    else:
        set_state(restart_text, &#039;normal&#039;)
        set_state(game_over_text, &#039;normal&#039;)
        set_state(close_but, &#039;normal&#039;)</code></pre><h4  class="t-redactor__h4">Создание функций для начала новой игры и выхода из игры</h4><div class="t-redactor__text">При проигрыше в нашей игре необходимо, чтобы можно было начать новую игру без перезагрузки приложения и выхода из игры. Разработаем данные функции: Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># функция для вывода сообщения
def set_state(item, state):
    c.itemconfigure(item, state=state)
    c.itemconfigure(BLOCK, state=&#039;hidden&#039;)

# Функция для нажатия кнопки (новая игра)
def clicked(event):
    global IN_GAME
    s.reset_snake()
    IN_GAME = True
    c.delete(BLOCK)
    score.reset()
    c.itemconfigure(restart_text, state=&#039;hidden&#039;)
    c.itemconfigure(game_over_text, state=&#039;hidden&#039;)
    c.itemconfigure(close_but, state=&#039;hidden&#039;)
    start_game()

# Функция для старта игры
def start_game():
    global s
    create_block()
    s = create_snake()

    # Реагируем на нажатие клавиш
    c.bind(&quot;&lt;KeyPress&gt;&quot;, s.change_direction)
    main()

# выход из игры
def close_win(root):
    exit()</code></pre><div class="t-redactor__text">В главном окне необходимо добавить строки:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"># Текст результата игры
game_over_text = c.create_text(WIDTH / 2, HEIGHT / 2, text=&quot;Ты проиграл!&quot;,
                               font=&#039;Arial 20&#039;, fill=&#039;red&#039;,
                               state=&#039;hidden&#039;)
                               
# Текст начала новой игры после проигрыша
restart_text = c.create_text(WIDTH / 2, HEIGHT - HEIGHT / 3,
                             font=&#039;Arial 25&#039;,
                             fill=&#039;green&#039;,
                             text=&quot;Начать новую игру&quot;,
                             state=&#039;hidden&#039;)

# Текст выхода из программы после проигрыша
close_but = c.create_text(WIDTH / 2, HEIGHT - HEIGHT / 5, font=&#039;Arial 25&#039;,
                          fill=&#039;green&#039;,
                          text=&quot;Выход из игры&quot;,
                          state=&#039;hidden&#039;)

# Отработка событий при нажимания кнопок
c.tag_bind(restart_text, &quot;&lt;Button-1&gt;&quot;, clicked)
c.tag_bind(close_but, &quot;&lt;Button-1&gt;&quot;, close_win)

# Запускаем игру
start_game()</code></pre><div class="t-redactor__text">На этом наша разработка игры подошла к завершению. Если вы все правильно сделали, тогда у вас должна заработать игра. Подробнее изучите наш код и пишите в комментариях свои предложения по изменению.</div><h4  class="t-redactor__h4">Полный исходный код</h4><div class="t-redactor__text">В данном разделе мы оставим полный исходный код, чтобы вы смогли свериться с вашим вариантом. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
import random

# Создаем глобальные переменные
# Ширина экрана
WIDTH = 800

# Высота экрана
HEIGHT = 600

# Размер сегмента змеи
SEG_SIZE = 20

# Переменная, отвечающая за состояние игры
IN_GAME = True


# Вспомогательная функция
def create_block():
    &quot;&quot;&quot; Создаем еду для змейки &quot;&quot;&quot;
    global BLOCK
    posx = SEG_SIZE * random.randint(1, (WIDTH - SEG_SIZE) / SEG_SIZE)
    posy = SEG_SIZE * random.randint(1, (HEIGHT - SEG_SIZE) / SEG_SIZE)
    BLOCK = c.create_oval(posx, posy,
                          posx + SEG_SIZE, posy + SEG_SIZE,
                          fill=&quot;green&quot;)

# Подсчет очков
class Score(object):

    # функция отображения очков на экране
    def __init__(self):
        self.score = 0
        self.x = 55
        self.y = 15
        c.create_text(self.x, self.y, text=&quot;Счёт: {}&quot;.format(self.score), font=&quot;Arial 20&quot;,
                      fill=&quot;Yellow&quot;, tag=&quot;score&quot;, state=&#039;hidden&#039;)

    # функция счета очков и вывод на экран
    def increment(self):
        c.delete(&quot;score&quot;)
        self.score += 1
        c.create_text(self.x, self.y, text=&quot;Счёт: {}&quot;.format(self.score), font=&quot;Arial 20&quot;,
                      fill=&quot;Yellow&quot;, tag=&quot;score&quot;)

    # функция сброса очков при начале новой игры
    def reset(self):
        c.delete(&quot;score&quot;)
        self.score = 0

# Функция для управления игровым процессом
def main():
    &quot;&quot;&quot; Моделируем игровой процесс &quot;&quot;&quot;
    global IN_GAME
    if IN_GAME:
        s.move()

        # Определяем координаты головы
        head_coords = c.coords(s.segments[-1].instance)
        x1, y1, x2, y2 = head_coords

        # столкновения с краями игрового поля
        if x2 &gt; WIDTH or x1 &lt; 0 or y1 &lt; 0 or y2 &gt; HEIGHT:
            IN_GAME = False

        # Поедание яблока
        elif head_coords == c.coords(BLOCK):
            s.add_segment()
            c.delete(BLOCK)
            create_block()

        # Поедание змейки
        else:
            for index in range(len(s.segments) - 1):
                if head_coords == c.coords(s.segments[index].instance):
                    IN_GAME = False

        # скорость змейки
        root.after(100, main)
    # Не IN_GAME -&gt; останавливаем игру и выводим сообщения
    else:
        set_state(restart_text, &#039;normal&#039;)
        set_state(game_over_text, &#039;normal&#039;)
        set_state(close_but, &#039;normal&#039;)

class Segment(object):
    &quot;&quot;&quot; Сегмент змейки &quot;&quot;&quot;
    def __init__(self, x, y):
        self.instance = c.create_rectangle(x, y,
                                           x + SEG_SIZE, y + SEG_SIZE,
                                           fill=&quot;green&quot;)
                                           
class Snake(object):
    &quot;&quot;&quot; Класс змейки &quot;&quot;&quot;
    def __init__(self, segments):
        self.segments = segments

        # Варианты движения
        self.mapping = {&quot;Down&quot;: (0, 1), &quot;Right&quot;: (1, 0),
                        &quot;Up&quot;: (0, -1), &quot;Left&quot;: (-1, 0)}

        # инициируем направление движения
        self.vector = self.mapping[&quot;Right&quot;]

    def move(self):
        &quot;&quot;&quot; Двигаем змейку в заданном направлении &quot;&quot;&quot;
        for index in range(len(self.segments) - 1):
            segment = self.segments[index].instance
            x1, y1, x2, y2 = c.coords(self.segments[index + 1].instance)
            c.coords(segment, x1, y1, x2, y2)

        x1, y1, x2, y2 = c.coords(self.segments[-2].instance)
        c.coords(self.segments[-1].instance,
                 x1 + self.vector[0] * SEG_SIZE, y1 + self.vector[1] * SEG_SIZE,
                 x2 + self.vector[0] * SEG_SIZE, y2 + self.vector[1] * SEG_SIZE)

    def add_segment(self):
        &quot;&quot;&quot; Добавляем сегмент змейки &quot;&quot;&quot;
        score.increment()
        last_seg = c.coords(self.segments[0].instance)
        x = last_seg[2] - SEG_SIZE
        y = last_seg[3] - SEG_SIZE
        self.segments.insert(0, Segment(x, y))

    def change_direction(self, event):
        &quot;&quot;&quot; Изменение направления движения змейки &quot;&quot;&quot;
        if event.keysym in self.mapping:
            self.vector = self.mapping[event.keysym]

    # Функция обновления змейки при старте новой игры
    def reset_snake(self):
        for segment in self.segments:
            c.delete(segment.instance)

# функция для вывода сообщения
def set_state(item, state):
    c.itemconfigure(item, state=state)
    c.itemconfigure(BLOCK, state=&#039;hidden&#039;)


# Функция для нажатия кнопки (новая игра)
def clicked(event):
    global IN_GAME
    s.reset_snake()
    IN_GAME = True
    c.delete(BLOCK)
    score.reset()
    c.itemconfigure(restart_text, state=&#039;hidden&#039;)
    c.itemconfigure(game_over_text, state=&#039;hidden&#039;)
    c.itemconfigure(close_but, state=&#039;hidden&#039;)
    start_game()

# Функция для старта игры
def start_game():
    global s
    create_block()
    s = create_snake()

    # Реагируем на нажатие клавиш
    c.bind(&quot;&lt;KeyPress&gt;&quot;, s.change_direction)
    main()


# Создаем сегменты и змейку
def create_snake():
    segments = [Segment(SEG_SIZE, SEG_SIZE),
                Segment(SEG_SIZE * 2, SEG_SIZE),
                Segment(SEG_SIZE * 3, SEG_SIZE)]
    return Snake(segments)
    
# выход из игры
def close_win(root):
    exit()

# Настройка главного окна
root = Tk()
root.title(&quot;Змейка&quot;)

# Создаем экземпляр класса Canvas
c = Canvas(root, width=WIDTH, height=HEIGHT, bg=&quot;#000000&quot;)
c.grid()

# Захватываем фокус для отлавливания нажатий клавиш
c.focus_set()

# Текст результата игры
game_over_text = c.create_text(WIDTH / 2, HEIGHT / 2, text=&quot;Ты проиграл!&quot;,
                               font=&#039;Arial 20&#039;, fill=&#039;red&#039;,
                               state=&#039;hidden&#039;)
                               
# Текст начала новой игры после проигрыша
restart_text = c.create_text(WIDTH / 2, HEIGHT - HEIGHT / 3,
                             font=&#039;Arial 25&#039;,
                             fill=&#039;green&#039;,
                             text=&quot;Начать новую игру&quot;,
                             state=&#039;hidden&#039;)

# Текст выхода из программы после проигрыша
close_but = c.create_text(WIDTH / 2, HEIGHT - HEIGHT / 5, font=&#039;Arial 25&#039;,
                          fill=&#039;green&#039;,
                          text=&quot;Выход из игры&quot;,
                          state=&#039;hidden&#039;)

# Отработка событий при нажимания кнопок
c.tag_bind(restart_text, &quot;&lt;Button-1&gt;&quot;, clicked)
c.tag_bind(close_but, &quot;&lt;Button-1&gt;&quot;, close_win)

# Считаем очки
score = Score()

# Запускаем игру
start_game()

# запускаем окно
root.mainloop()</code></pre><div class="t-redactor__text">Интерфейс приложения:</div><img src="https://static.tildacdn.com/tild6366-3336-4632-b636-356230366665/tkinter_snake_1.jpg">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Библиотека Tkinter: Методы виджетов</title>
			<link>https://www.easyitway.com/tpost/4xk1xfp331-biblioteka-tkinter-metodi-vidzhetov</link>
			<amplink>https://www.easyitway.com/tpost/4xk1xfp331-biblioteka-tkinter-metodi-vidzhetov?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 16:44:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>Все виджеты в Tkinter обладают некоторыми общими методами. В этой статье мы познакомимся с такими методами. Список всех виджетов можно изучить в статье «Библиотека Tkinter: Виджеты«.</description>
			<turbo:content>
<![CDATA[<header><h1>Библиотека Tkinter: Методы виджетов</h1></header><div class="t-redactor__text">Все виджеты в Tkinter обладают некоторыми общими методами. В этой статье мы познакомимся с такими методами. Список всех виджетов можно изучить в статье «Библиотека Tkinter: Виджеты«.</div><h4  class="t-redactor__h4">1. configure</h4><div class="t-redactor__text">Виджеты могут быть сконфигурированы во время создания, но иногда необходимо изменить конфигурацию виджета во время исполнения программы.</div><div class="t-redactor__text">Для этого используется метод <strong>configure</strong> (или его синоним <strong>config</strong>). Также можно использовать квадратные скобки (widget[‘option’] = new_value).</div><div class="t-redactor__text">Пример, программа выводит текущее время, после клика по кнопке:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
import time

def button_clicked():
    # изменяем текст кнопки
    button[&#039;text&#039;] = time.strftime(&#039;%H:%M:%S&#039;)
    
root = Tk()
root.title(&quot;Методы виджетов&quot;)
root.minsize(width=500, height=400)

# создаём виджет
button = Button(root)

# конфигурируем виджет после создания
button.configure(text=time.strftime(&#039;%H:%M:%S&#039;), command=button_clicked)

# также можно использовать квадратные скобки:
# button[&#039;text&#039;] = time.strftime(&#039;%H:%M:%S&#039;)
# button[&#039;command&#039;] = button_clicked
button.pack()
root.mainloop()</code></pre><div class="t-redactor__text">В этом коде функция <strong>button_clicked</strong> вызывается каждый раз, когда пользователь «кликает» по кнопке.</div><h4  class="t-redactor__h4">2. cget</h4><div class="t-redactor__text">Метод <strong>cget</strong> является обратным к методу <strong>configure</strong>. Он предназначен для получения информации о конфигурации виджета. Здесь как и в случае с configure можно использовать квадратные скобки (value = widget[‘option’]).</div><div class="t-redactor__text">Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
from random import random

def button_clicked():
    button[&#039;text&#039;] = button[&#039;bg&#039;] # показываем предыдущий цвет кнопки
    bg = &#039;#%0x%0x%0x&#039; % (int(random()*16), int(random()*16), int(random()*16))
    button[&#039;bg&#039;] = bg
    button[&#039;activebackground&#039;] = bg
    
root = Tk()
root.title(&quot;Методы виджетов&quot;)
root.minsize(width=500, height=400)

button = Button(root, command=button_clicked)
button.pack()
root.mainloop()</code></pre><div class="t-redactor__text">В данном примере программа после «клика» на кнопку программа показывает цвет кнопки и меняет его на другой.</div><h4  class="t-redactor__h4">3. destroy</h4><div class="t-redactor__text">Метод <strong>destroy()</strong> уничтожает виджет и всех его потомков. Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
    
root = Tk()
root.title(&quot;Методы виджетов&quot;)
root.minsize(width=500, height=400)

button1 = Button(root, text=&quot;Кнопка 1&quot;)
button2 = Button(root, text=&quot;Нажми и удалишь кнопку 1&quot;, command = button1.destroy)

button1.pack()
button2.pack()
root.mainloop()</code></pre><div class="t-redactor__text">В данном примере мы создаем две кнопки и к одной кнопке даём команду: <strong>«При нажатии на кнопку уничтожать виджет в виде первой кнопки»</strong> с помощью метода destroy().<br /><br />Главное окно программы не будет закрыто, но <strong>«Кнопка 1»</strong> будет удалена с главного окна.<br /><br />Если необходимо только на время спрятать какой-либо виджет, то лучше пользоваться упаковщиком <strong>grid</strong> и методом <strong>grid_remove</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

def hide_show():
    if label.winfo_viewable():
        label.grid_remove()
    else:
        label.grid()

root = Tk()
root.title(&quot;Методы виджетов&quot;)
root.minsize(width=500, height=400)

label = Label(text=&#039;Я здесь!&#039;)
label.grid()
button = Button(command=hide_show, text=&quot;Спрятать/показать&quot;)
button.grid()
root.mainloop()</code></pre><div class="t-redactor__text">Использование <strong>grid_remove</strong> позволяет сохранять взаимное расположение виджетов.</div><h4  class="t-redactor__h4">4. quit</h4><div class="t-redactor__text">Метод <strong>quit()</strong> не уничтожает виджеты, но выходит из интерпретатора tcl/tk, то есть останавливает <strong>mainloop()</strong>. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
    
root = Tk()
root.title(&quot;Методы виджетов&quot;)
root.minsize(width=500, height=400)

# При нажатии на кнопку программа закроется.
button = Button(root, text=&quot;Закрыть программу&quot;, command = root.quit)

button.pack()
root.mainloop()</code></pre><h4  class="t-redactor__h4">5. grab_</h4><div class="t-redactor__text">Методы семейства <strong>grab_</strong> предназначены для управления потоком события. Виджет, захвативший поток, будет получать все события окна или приложения.</div><div class="t-redactor__text"><ul><li><strong>grab_set</strong> — передать поток данному виджету;</li><li><strong>grab_set_global</strong> — передать глобальный поток данному виджету. В этом случае все события на дисплее будут передаваться этому виджету. Следует пользоваться очень осторожно, т.к. остальные виджеты всех приложений не будут получать события;</li><li><strong>grab_release</strong> — освободить поток;</li><li><strong>grab_status</strong> — узнать текущий статус потока событий для виджета. Возможные значения: None, «local» или «global»;</li><li><strong>grab_current</strong> — получить виджет, который получает поток.</li></ul></div><div class="t-redactor__text">Пример, приложение захватывает глобальный поток и освобождает его через 10 секунд:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root=Tk()
root.after(200, root.grab_set_global)
root.after(10000, root.grab_release)
root.mainloop()</code></pre><h4  class="t-redactor__h4">6. focus_</h4><div class="t-redactor__text">Методы семейства <strong>focus_</strong> используются для управления фокусом ввода с клавиатуры. Виджет, имеющий фокус, получает все события с клавиатуры.</div><div class="t-redactor__text"><ul><li><strong>focus (синоним focus_set)</strong> — передать фокус виджету;</li><li><strong>focus_force</strong> — передать фокус, даже если приложение не имеет фокуса;</li><li><strong>focus_get</strong> — возвращает виджет, на который направлен фокус, либо None, если такой отсутствует;</li><li><strong>focus_displayof</strong> — возвращает виджет, на который направлен фокус на том дисплее, на котором размещён виджет, либо None, если такой отсутствует;</li><li><strong>focus_lastfor</strong> — возвращает виджет, на который будет направлен фокус, когда окно с этим виджетом получит фокус;</li><li><strong>tk_focusNext</strong> — возвращает виджет, который получит фокус следующим (обычно смена фокуса происходит при нажатии клавиши Tab). Порядок следования определяется последовательностью упаковки виджетов;</li><li><strong>tk_focusPrev</strong> — то же, что и focusNext, но в обратном порядке;</li><li><strong>tk_focusFollowsMouse</strong> — устанавливает, что виджет будет получать фокус при наведении на него мышью. Вернуть нормальное поведение достаточно сложно.</li></ul></div><div class="t-redactor__text">Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Методы виджетов&quot;)
root.minsize(width=500, height=400)

# Виджет входа
e1 = Entry(root)
e1.pack(expand = 1, fill = BOTH)

# Виджет кнопки, который в данный момент имеет фокус
e2 = Button(root, text =&quot;Button&quot;)

# здесь метод focus_set () используется для установки фокуса
e2.focus_set()
e2.pack(pady = 5)
root.mainloop()</code></pre><div class="t-redactor__text">Перепишете код и запустите для проверки. В главном окне будет стоять кнопка и иметь фокус.</div><h4  class="t-redactor__h4">7. Системные методы</h4><div class="t-redactor__text">Системные методы не являются виджет-специфичными, т.е. хотя они являются методами виджетов они влияют на работу интерпретатора tcl/tk.</div><h4  class="t-redactor__h4">1. after, after_idle и after_cancel</h4><div class="t-redactor__text">Таймеры. С помощью этих методов вы можете отложить выполнение какого-нибудь кода на определённое время.</div><div class="t-redactor__text"><strong>after</strong> — принимает два аргумента: время в миллисекундах и функцию, которую надо выполнить через указанное время. Возвращает идентификатор, который может быть использован в <strong>after_cancel</strong>.</div><div class="t-redactor__text"><strong>after_idle</strong> — принимает один аргумент — функцию. Эта функция будет выполнена после завершения всех отложенных операций (после того, как будут обработаны все события). Возвращает идентификатор, который может быть использован в <strong>after_cancel</strong>.</div><div class="t-redactor__text"><strong>after_cancel</strong> — принимает один аргумент: идентификатор задачи, полученный предыдущими функциями, и отменяет это задание.</div><div class="t-redactor__text">Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
import time

def tick():
    label.after(200, tick)
    label[&#039;text&#039;] = time.strftime(&#039;%H:%M:%S&#039;)

root = Tk()
root.title(&quot;Методы виджетов&quot;)
root.minsize(width=500, height=400)

label = Label(font=&#039;sans 20&#039;)
label.pack()
label.after_idle(tick)
root.mainloop()</code></pre><h4  class="t-redactor__h4">2. update и update_idletasks</h4><div class="t-redactor__text">Две функции, для работы с очередью задач. Их выполнение вызывает обработку отложенных задач.</div><div class="t-redactor__text"><strong>update_idletasks</strong> выполняет задачи, обычно откладываемые «на потом», когда приложение будет простаивать. Это приводит к прорисовке всех виджетов, расчёту их расположения и т.д.</div><div class="t-redactor__text">Обычно эта функция используется если были внесены изменения в состояние приложения, и вы хотите, чтобы эти изменения были отображены на экране немедленно, не дожидаясь завершения сценария.</div><div class="t-redactor__text"><strong>update</strong> обрабатывает все задачи, стоящие в очереди. Обычно эта функция используется во время «тяжёлых» расчётов, когда необходимо чтобы приложение оставалось отзывчивым на действия пользователя.</div><div class="t-redactor__text">Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
import math

def hard_job():
    x = 1000
    while True:
        x = math.log(x) ** 2.8
        root.update()
        print(x)
        break

root = Tk()
root.title(&quot;Методы виджетов&quot;)
root.minsize(width=500, height=400)

button = Button(text=&quot;Обновить&quot;, command = hard_job)
button.pack()
root.after(500, hard_job)
root.mainloop()</code></pre><h4  class="t-redactor__h4">3. eval и evalfile</h4><div class="t-redactor__text">Две недокументированные функции для выполнения кода на tcl.</div><div class="t-redactor__text"><strong>eval</strong> позволяет выполнить строку на языке программирования tcl.</div><div class="t-redactor__text"><strong>evalfile</strong> — выполнить код, записанный в файл.</div><div class="t-redactor__text">В качестве аргументов принимают соответственно строку и путь к файлу. Данные функции полезны при использовании дополнительных модулей, написанных на tcl. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Методы виджетов&quot;)
root.minsize(width=500, height=400)

root.eval(&#039;package require tile; ttk::style theme use clam&#039;)
root.eval(&#039;ttk::button .b -text {ttk button}; pack .b&#039;)
root.mainloop()</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Библиотека Tkinter: Упаковщики</title>
			<link>https://www.easyitway.com/tpost/ppsegs1pz1-biblioteka-tkinter-upakovschiki</link>
			<amplink>https://www.easyitway.com/tpost/ppsegs1pz1-biblioteka-tkinter-upakovschiki?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 16:48:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>Упаковщик (менеджер геометрии, менеджер расположения) это специальный механизм, который размещает (упаковывает) виджеты на окне. В Tkinter есть три упаковщика: pack, place, grid.</description>
			<turbo:content>
<![CDATA[<header><h1>Библиотека Tkinter: Упаковщики</h1></header><div class="t-redactor__text">Упаковщик (менеджер геометрии, менеджер расположения) это специальный механизм, который размещает (упаковывает) виджеты на окне. В Tkinter есть три упаковщика: <strong>pack</strong>, <strong>place</strong>, <strong>grid</strong>.</div><div class="t-redactor__text">В одном виджете можно использовать только один тип упаковки, при смешивании разных типов упаковки программа, скорее всего, не будет работать.</div><h4  class="t-redactor__h4">pack()</h4><div class="t-redactor__text">Упаковщик <strong>pack()</strong> является самым интеллектуальным (и самым непредсказуемым). При использовании этого упаковщика с помощью свойства <strong>side</strong> нужно указать к какой стороне родительского виджета он должен примыкать.</div><div class="t-redactor__text">Как правило этот упаковщик используют для размещения виджетов друг за другом (слева направо или сверху вниз). Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Упаковщики&quot;)
root.minsize(width=500, height=400)

button1 = Button(text=&quot;1&quot;)
button2 = Button(text=&quot;2&quot;)
button3 = Button(text=&quot;3&quot;)
button4 = Button(text=&quot;4&quot;)
button5 = Button(text=&quot;5&quot;)
button1.pack(side=&#039;left&#039;)
button2.pack(side=&#039;top&#039;)
button3.pack(side=&#039;left&#039;)
button4.pack(side=&#039;bottom&#039;)
button5.pack(side=&#039;right&#039;)
root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild3237-6162-4533-b337-333237623362/tkinter_upacovchiki_.jpg"><div class="t-redactor__text">Для создания сложной структуры с использованием этого упаковщика обычно используют Frame, вложенные друг в друга. При применении этого упаковщика можно указать следующие аргументы:</div><div class="t-redactor__text"><ul><li><strong>side</strong> («left»/»right»/»top»/»bottom») — к какой стороне должен примыкать размещаемый виджет;</li><li><strong>fill</strong> (None/»x»/»y»/»both») — необходимо ли расширять пространство предоставляемое виджету;</li><li><strong>expand</strong> (True/False) — необходимо ли расширять сам виджет, чтобы он занял всё предоставляемое ему пространство;</li><li><strong>in_</strong> — явное указание в какой родительский виджет должен быть помещён.</li></ul></div><div class="t-redactor__text">Кроме основной функции у виджетов есть дополнительные методы для работы с упаковщиками:</div><div class="t-redactor__text"><ul><li><strong>pack_configure</strong> — синоним для pack;</li><li><strong>pack_slaves</strong> (синоним slaves) — возвращает список всех дочерних упакованных виджетов;</li><li><strong>pack_info</strong> — возвращает информацию о конфигурации упаковки;</li><li><strong>pack_propagate</strong> (синоним propagate) (True/False) — включает/отключает распространении информации о геометрии дочерних виджетов. По умолчанию виджет изменяет свой размер в соответствии с размером своих потомков. Этот метод может отключить такое поведение (pack_propagate(False));</li><li><strong>pack_forget (синоним forget)</strong> — удаляет виджет и всю информацию о его расположении из упаковщика.</li></ul></div><h4  class="t-redactor__h4">grid()</h4><div class="t-redactor__text">Этот упаковщик представляет собой таблицу с ячейками, в которые помещаются виджеты. Аргументы упаковщика:</div><div class="t-redactor__text"><ul><li><strong>row</strong> — номер строки, в который помещаем виджет;</li><li><strong>rowspan</strong> — сколько строк занимает виджет;</li><li><strong>column</strong> — номер столбца, в который помещаем виджет;</li><li><strong>columnspan</strong> — сколько столбцов занимает виджет;</li><li><strong>padx/pady</strong> — размер внешней границы (бордюра) по горизонтали и вертикали;</li><li><strong>ipadx/ipady</strong> — размер внутренней границы (бордюра) по горизонтали и вертикали. Разница между pad и ipad в том, что при указании pad расширяется свободное пространство, а при ipad расширяется помещаемый виджет;</li><li><strong>sticky</strong> («n», «s», «e», «w» или их комбинация) — указывает к какой границе «приклеивать» виджет. Позволяет расширять виджет в указанном направлении. Границы названы в соответствии со сторонами света. «n» (север) — верхняя граница, «s» (юг) — нижняя, «w» (запад) — левая, «e» (восток) — правая;</li><li><strong>in_</strong> — явное указание в какой родительский виджет должен быть помещён.</li></ul></div><div class="t-redactor__text">Пример: текстовый виджет с двумя полосами прокрутки:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root=Tk()
text = Text(wrap=NONE)
vscrollbar = Scrollbar(orient=&#039;vert&#039;, command=text.yview)
text[&#039;yscrollcommand&#039;] = vscrollbar.set
hscrollbar = Scrollbar(orient=&#039;hor&#039;, command=text.xview)
text[&#039;xscrollcommand&#039;] = hscrollbar.set

# размещаем виджеты
text.grid(row=0, column=0, sticky=&#039;nsew&#039;)
vscrollbar.grid(row=0, column=1, sticky=&#039;ns&#039;)
hscrollbar.grid(row=1, column=0, sticky=&#039;ew&#039;)

# конфигурируем упаковщик, чтобы текстовый виджет расширялся
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild6438-6538-4837-b138-306131343963/tkinter_upacovchiki_.jpg"><h4  class="t-redactor__h4">place()</h4><div class="t-redactor__text">place представляет собой простой упаковщик, позволяющий размещать виджет в фиксированном месте с фиксированным размером.</div><div class="t-redactor__text">Также он позволяет указывать координаты размещения в относительных единицах для реализации «резинового» размещения.</div><div class="t-redactor__text">При использовании этого упаковщика, нам необходимо указывать координаты каждого виджета. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">button1.place(x=0,y=0)</code></pre><div class="t-redactor__text">Аргументы упаковщика:<br /><br /><ul><li><strong>anchor</strong> («n», «s», «e», «w», «ne», «nw», «se», «sw» или «center») — какой угол или сторона размещаемого виджета будет указана в аргументах x/y/relx/rely. По умолчанию «nw» — левый верхний;</li><li><strong>bordermode</strong> («inside», «outside», «ignore») — определяет в какой степени будут учитываться границы при размещении виджета;</li><li>in_ — явное указание в какой родительский виджет должен быть помещён;</li><li><strong>x</strong> и <strong>y</strong> — абсолютные координаты (в пикселях) размещения виджета;</li><li><strong>width</strong> и <strong>height</strong> — абсолютные ширина и высота виджета;</li><li><strong>relx</strong> и <strong>rely</strong> — относительные координаты (от 0.0 до 1.0) размещения виджета;</li><li><strong>relwidth</strong> и <strong>relheight</strong> — относительные ширина и высота виджета.</li></ul><br />Пример использования упаковщика place():</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
 
root = Tk()
root.geometry(&#039;300x300&#039;)
 
Button(bg=&#039;red&#039;).place(x=75, y=20)
Button(bg=&#039;green&#039;).place(relx=0.3, rely=0.5)
 
root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild6564-6662-4063-b764-376266306338/tkinter_upacovchiki_.jpg"><div class="t-redactor__text">Еще один пример использования упаковщика place():</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
 
root = Tk()
root.geometry(&#039;300x300&#039;)

Label(bg=&#039;white&#039;).place(x=10, y=10, 
                    width=50, height=30)
Label(bg=&#039;green&#039;).place(x=10, y=50, 
                    relwidth=0.3, relheight=0.15)
 
root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild3736-3962-4038-a638-643431386565/tkinter_upacovchiki_.jpg"><div class="t-redactor__text">Видео по уроку:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/n-dvwfW0QI4" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Библиотека Tkinter: Изображения</title>
			<link>https://www.easyitway.com/tpost/j0a4z58vx1-biblioteka-tkinter-izobrazheniya</link>
			<amplink>https://www.easyitway.com/tpost/j0a4z58vx1-biblioteka-tkinter-izobrazheniya?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 16:51:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>Для работы с изображениями в Tkinter имеется два класса BitmapImage и PhotoImage.</description>
			<turbo:content>
<![CDATA[<header><h1>Библиотека Tkinter: Изображения</h1></header><div class="t-redactor__text">Для работы с изображениями в Tkinter имеется два класса <strong>BitmapImage</strong> и <strong>PhotoImage</strong>.</div><div class="t-redactor__text">BitmapImage представляет собой простое двухцветное изображение, PhotoImage — полноцветное изображение.</div><h4  class="t-redactor__h4">BitmapImage</h4><div class="t-redactor__text">Конструктор класса принимает следующие аргументы:</div><div class="t-redactor__text"><ul><li><strong>background</strong> и <strong>foreground</strong> — цвета фона и переднего плана для изображения. Поскольку изображение двухцветное, то эти параметры определяют соответственно чёрный и белый цвет;</li><li><strong>file</strong> и <strong>maskfile</strong> — пути к файлу с изображением и к маске (изображению, указывающему какие пиксели будут прозрачными);</li><li><strong>data</strong> и <strong>maskdata</strong> — вместо пути к файлу можно указать уже загруженные в память данные изображения. Данная возможность удобна для встраивания изображения в программу.</li></ul></div><div class="t-redactor__text">Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *
 
data = &#039;&#039;&#039;#define image_width 15
#define image_height 15
static unsigned char image_bits[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x30, 0x0c, 0x60, 0x06,
   0x60, 0x06, 0xc0, 0x03, 0xc0, 0x03, 0x60, 0x06, 0x60, 0x06, 0x30, 0x0c,
   0x38, 0x1c, 0x00, 0x00, 0x00, 0x00 };&#039;&#039;&#039;

root=Tk()
root.title(&quot;Изображения&quot;)
root.minsize(width=100, height=100)
image = BitmapImage(data=data, background=&#039;red&#039;, foreground=&#039;green&#039;)
button=Button(root, image=image)
button.pack()
root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild6533-3431-4265-b266-343835353438/tkinter_img_1.jpg"><h4  class="t-redactor__h4">PhotoImage</h4><div class="t-redactor__text">PhotoImage позволяет использовать полноцветное изображение. Кроме того у этого класса есть несколько (достаточно примитивных) методов для работы с изображениями. PhotoImage гарантированно понимает формат GIF. Аргументы конструктора:</div><div class="t-redactor__text"><ul><li><strong>file</strong> — путь к файлу с изображением;</li><li><strong>data</strong> — вместо пути к файлу можно указать уже загруженные в память данные изображения. Изображения в формате GIF могут быть закодированы с использованием base64. Данная возможность удобна для встраивания изображения в программу;</li><li><strong>format</strong> — явное указание формата изображения;</li><li><strong>width</strong>, <strong>height</strong> — ширина и высота изображения;</li><li><strong>gamma</strong> — коррекция гаммы;</li><li><strong>palette</strong> — палитра изображения.</li></ul></div><div class="t-redactor__text">Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from tkinter import *

root = Tk()
root.title(&quot;Изображения&quot;)
def img():
    img = PhotoImage(file=&quot;Image.gif&quot;)
    label = Label(root, image=img)
    label.image_ref = img
    label.pack()

img()
root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено изображение в главную форму:</div><img src="https://static.tildacdn.com/tild3837-3361-4563-a335-306635366537/tkinter_img_2.jpg">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Библиотека Tkinter: ttk</title>
			<link>https://www.easyitway.com/tpost/mpae7khsd1-biblioteka-tkinter-ttk</link>
			<amplink>https://www.easyitway.com/tpost/mpae7khsd1-biblioteka-tkinter-ttk?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 16:53:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>ttk (themed tk) — это расширение tcl/tk с новым набором виджетов. В ttk используется новый движок для создания виджетов. Этот движок обладает поддержкой тем и стилей оформления.</description>
			<turbo:content>
<![CDATA[<header><h1>Библиотека Tkinter: ttk</h1></header><div class="t-redactor__text"><strong>ttk (themed tk)</strong> — это расширение tcl/tk с новым набором виджетов. В ttk используется новый движок для создания виджетов. Этот движок обладает поддержкой тем и стилей оформления. Благодаря этому виджеты ttk выглядят более естественно в различных операционных системах.</div><div class="t-redactor__text">В ttk включены следующие виджеты, которые можно использовать вместо соответствующих виджетов tk: Button, Checkbutton, Entry, Frame, Label, LabelFrame, Menubutton, PanedWindow, Radiobutton, Scale и Scrollbar. Кроме того имеется несколько новых виджетов: Combobox, Notebook, Progressbar, Separator, Sizegrip и Treeview.</div><div class="t-redactor__text">ttk имеет четыре встроенных темы: default, classic, alt, clam. Кроме того дополнительно под Windows есть темы winnative, xpnative и vista, а под Mac OS X — aqua.</div><h4  class="t-redactor__h4">1. Style</h4><div class="t-redactor__text">Style это класс для работы со стилями и темами. Именно этот класс надо использовать для конфигурирования внешнего вида виджетов. Основные методы класса:</div><h4  class="t-redactor__h4">configure</h4><div class="t-redactor__text">Конфигурирование внешнего вида виджетов. В качестве аргументов принимает название стиля виджета (например «TButton») и список опций конфигурирования. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">style.configure(&quot;TButton&quot;, padding=6, relief=&quot;flat&quot;, background=&quot;#ccc&quot;)</code></pre><h4  class="t-redactor__h4">map</h4><div class="t-redactor__text">Конфигурирование внешнего вида виджетов в зависимости от их состояний (active, pressed, disabled и т.д.). В качестве аргументов принимает название стиля виджета и список опций конфигурирования, где опции представлены в виде списка. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">style.map(&quot;C.TButton&quot;,
    foreground=[(&#039;pressed&#039;, &#039;red&#039;), (&#039;active&#039;, &#039;blue&#039;)],
    background=[(&#039;pressed&#039;, &#039;!disabled&#039;, &#039;black&#039;), (&#039;active&#039;, &#039;white&#039;)]
    )</code></pre><h4  class="t-redactor__h4">lookup</h4><div class="t-redactor__text">Возвращает соответствующую опцию конфигурирования. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">style.lookup(&quot;TButton&quot;, &quot;font&quot;)</code></pre><h4  class="t-redactor__h4">layout</h4><div class="t-redactor__text">Изменяет layout (схему) виджета. Виджеты ttk состоят из отдельных элементов, опций конфигурирования и других вложенных layouts. Следующий пример иллюстрирует применение метода layout:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">style.layout(&quot;TMenubutton&quot;, [
   (&quot;Menubutton.background&quot;, None),
   (&quot;Menubutton.button&quot;, {&quot;children&quot;:
       [(&quot;Menubutton.focus&quot;, {&quot;children&quot;:
           [(&quot;Menubutton.padding&quot;, {&quot;children&quot;:
               [(&quot;Menubutton.label&quot;, {&quot;side&quot;: &quot;left&quot;, &quot;expand&quot;: 1})]
           })]
       })]
   }),
])</code></pre><div class="t-redactor__text"><ul><li><strong>element_create</strong> — Создаёт новый элемент темы;</li><li><strong>element_names</strong> — Возвращает список элементов текущей темы;</li><li><strong>element_options</strong> — Возвращает список опций (конфигурацию), указанного в аргументе элемента;</li><li><strong>theme_create</strong> — Создаёт новую тему. Аргументы те же, что и в theme_settings;</li><li><strong>theme_settings</strong> — Конфигурирует существующую тему. Первый аргумент — название темы, второй аргумент — словарь, ключами которого являются названия стилей (TButton и т.п.), а значениями — layout соответствующего стиля;</li><li><strong>theme_names</strong> — Возвращает список доступных тем;</li><li><strong>theme_use</strong> — Изменяет текущую тему на указанную в аргументе.</li></ul></div><h4  class="t-redactor__h4">2. Combobox</h4><div class="t-redactor__text">Виджет Combobox предназначен для отображения списка значений, их выбора или изменения пользователем. В версии tk ему подобен виджет Listbox.</div><div class="t-redactor__text">Разница заключается в том, что Combobox имеет возможность сворачиваться подобно свитку, а Listbox будет отображаться всегда открытым. Что бы отобразить Combobox с заранее заданными значениями в форме, достаточно сделать следующее:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
frame = tk.Frame(root)
frame.grid()
combobox = ttk.Combobox(frame,values = [u&quot;ОДИН&quot;,u&quot;ДВА&quot;,u&quot;ТРИ&quot;],height=3)

#frame - задает родительский виджет, на его территории будет располагаться Combobox
#values - задает набор значений, которые будут содержаться в Combobox изначально

combobox.set(u&quot;ОДИН&quot;)#с помощью этой строчки мы установим Combobox в значение ОДИН изначально
combobox.grid(column=0,row=0)#Позиционируем Combobox на форме
root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild3030-3233-4236-a537-663932343736/tkinter_tk_1.jpg"><h4  class="t-redactor__h4">3. Progressbar</h4><div class="t-redactor__text">Виджет Progressbar отображает уровень загрузки.</div><div class="t-redactor__text"><ul><li><strong>length</strong> — длина полосы;</li><li><strong>start</strong> — Запускает бесконечный цикл загрузки. Шаг длиною 1 выполняется один раз в указанное время (в миллисекундах);</li><li><strong>stop</strong> — Останавливает цикл загрузки;</li><li><strong>step</strong> — Продвигает загрузку на заданное количество шагов.</li></ul></div><div class="t-redactor__text">Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
pb = ttk.Progressbar(root, length=100)
pb.pack()
pb.start(100)
root.mainloop()</code></pre><div class="t-redactor__text">Будет выведено:</div><img src="https://static.tildacdn.com/tild6434-6163-4136-b564-323334343131/tkinter_tk_2.jpg">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Создание графического генератора паролей на Python</title>
			<link>https://www.easyitway.com/tpost/i8egkvj5f1-sozdanie-graficheskogo-generatora-parole</link>
			<amplink>https://www.easyitway.com/tpost/i8egkvj5f1-sozdanie-graficheskogo-generatora-parole?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 16:56:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>В этом видео мы разработаем графический генератор паролей на Python используя библиотеку Tkinter.</description>
			<turbo:content>
<![CDATA[<header><h1>Создание графического генератора паролей на Python</h1></header><div class="t-redactor__text">В этом видео мы разработаем графический генератор паролей на Python используя библиотеку Tkinter.</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/ErRb4D97PVM" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>IDE PyCharm</title>
			<link>https://www.easyitway.com/tpost/vma4ar0kn1-ide-pycharm</link>
			<amplink>https://www.easyitway.com/tpost/vma4ar0kn1-ide-pycharm?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 18:38:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Это замечательная среда разработки от компании JetBrains, которая специализируется на создании продуктов для программистов, в том числе IDE.</description>
			<turbo:content>
<![CDATA[<header><h1>IDE PyCharm</h1></header><div class="t-redactor__text">В этой статье мы поговорим о знаменитой <a href="https://it-black.ru/sredy-razrabotki-v-programmirovanii/" target="_blank" rel="noreferrer noopener">IDE</a> PyCharm для языка программирования Python.</div><div class="t-redactor__text">Это замечательная среда разработки от компании <a href="https://jetbrains.ru/" target="_blank" rel="noreferrer noopener">JetBrains</a>, которая специализируется на создании продуктов для программистов, в том числе IDE.</div><div class="t-redactor__text"><strong>PyCharm</strong> — интегрированная среда разработки для языка программирования Python. Предоставляет средства для анализа кода, графический отладчик, инструмент для запуска юнит-тестов и поддерживает веб-разработку на <a href="https://www.djangoproject.com/" target="_blank" rel="noreferrer noopener">Django</a>.</div><h4  class="t-redactor__h4">История</h4><div class="t-redactor__text">PyCharm был выпущен на рынок интегрированных сред разработки для Python для создания конкуренции с <a href="https://www.pydev.org/" target="_blank" rel="noreferrer noopener">PyDev</a> и более распространённой среды разработки <a href="https://www.activestate.com/products/komodo-ide/" target="_blank" rel="noreferrer noopener">Komodo IDE</a>.</div><div class="t-redactor__text">Бета-версия была выпущена в июле 2010 года, версия 1.0 была выпущена тремя месяцами позже.</div><div class="t-redactor__text">Версия 2.0 вышла 13 декабря 2011 года. Версия 3.0 была выпущена 24 сентября 2013 года.</div><div class="t-redactor__text">PyCharm Community Edition, бесплатная версия с открытым исходным кодом, была опубликована 22 октября 2013 года.</div><div class="t-redactor__text">В марте 2016 года JetBrains перешла на подписную модель лицензирования, а вместе с этим изменилась и нумерация версий. Теперь номер версии выглядит как YYYY.R, где YYYY — год выпуска, а R — выпуск в течение этого года.</div><h4  class="t-redactor__h4">Версии PyCharm</h4><div class="t-redactor__text">PyCharm распространяется в двух вариантах: платном (PyCharm Professional Edition) и бесплатном (PyCharm Community Edition). PyCharm — это кросс-платформенная среда разработки, которая совместима с Windows, MacOS, Linux.</div><div class="t-redactor__text">Страница для скачивания <a href="https://www.jetbrains.com/ru-ru/pycharm/download/" target="_blank" rel="noreferrer noopener">PyCharm</a>.</div><img src="https://static.tildacdn.com/tild3835-6661-4030-b965-636536393162/pycharm_1.jpg"><div class="t-redactor__text">Бесплатная версия имеет открытый исходный код и распространяется под лицензией Apache 2. Это облегченная среда, которая подходит для разработки только на Python.</div><div class="t-redactor__text">Платный вариант представляет собой более расширенную и функциональную версию с возможностью разработки в том числе многоязычных веб-приложений. Professional Edition поддерживает фреймворки:</div><div class="t-redactor__text"><ol><li>Django;</li><li>Flask;</li><li>Google App Engine;</li><li>Pyramid;</li><li>web2py;</li><li>Scientific;</li><li>Angular CLI;</li><li>AngularJS;</li><li>Bootstrap;</li><li>Foundation;</li><li>HTML5 Boilerplate;</li><li>React Native.</li></ol></div><div class="t-redactor__text">И дает возможность удаленной разработки, а также работы с базами данных.</div><h4  class="t-redactor__h4">Системные требования для работы в PyCharm</h4><div class="t-redactor__text"><ol><li>64-битная версия Microsoft Windows 10, 8, 7 (SP1);</li><li>RAM: не менее 4 ГБ, рекомендуется 8 ГБ;</li><li>1,5 ГБ сводного места на жестком диске + не менее 1 ГБ для кэша;</li><li>разрешение экрана — не менее 1024×768 пикселей;</li><li>Python 2.7, Python 3.5 или более поздняя версия.</li></ol></div><h4  class="t-redactor__h4">Преимущества PyCharm</h4><div class="t-redactor__text">PyCharm имеет удобный редактор кода со всеми полезными функциями: подсветкой синтаксиса, автоматическим форматированием, дополнением и отступами. PyCharm позволяет проверять версии интерпретатора языка на совместимость, а также использовать шаблоны кода.</div><div class="t-redactor__text">Документацию можно смотреть прямо в окне редактора (для элементов) либо в браузере (для внешней документации).</div><div class="t-redactor__text">PyCharm позволяет быстро производить рефакторинг кода, а также использовать удобный графический отладчик.</div><div class="t-redactor__text"><strong>Рефакторинг</strong>, или перепроектирование кода, переработка кода, равносильное преобразование алгоритмов — процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы.</div><div class="t-redactor__text">В PyCharm можно проводить интегрированное Unit тестирование, использовать интерактивные консоли для Python, Django, SSH, отладчика и баз данных.</div><div class="t-redactor__text">Модульное тестирование, или юнит-тестирование (unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.</div><div class="t-redactor__text">Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода.</div><div class="t-redactor__text">Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.</div><div class="t-redactor__text">PyCharm имеет большую коллекцию плагинов, и его можно использовать в связке с разными трекерами вроде JIRA, Youtrack, Lighthouse, Redmine, Trac.</div><div class="t-redactor__text">Интерфейс PyCharm:</div><img src="https://static.tildacdn.com/tild3632-3163-4563-a536-666363623034/pycharm_2-768x416.jpg">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Операторы в Python</title>
			<link>https://www.easyitway.com/tpost/kmix5d0dt1-operatori-v-python</link>
			<amplink>https://www.easyitway.com/tpost/kmix5d0dt1-operatori-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 18:40:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Операторами пользуются для выполнения операций с переменными и значениями. Рассмотрим небольшой пример:</description>
			<turbo:content>
<![CDATA[<header><h1>Операторы в Python</h1></header><div class="t-redactor__text">Операторами пользуются для выполнения операций с переменными и значениями. Рассмотрим небольшой пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">10 + 5 = 15</code></pre><div class="t-redactor__text">В данном примере 10 и 5 называются операндами, а оператором является знак «+».</div><div class="t-redactor__text">Python поддерживает следующие типы операторов:</div><div class="t-redactor__text"><ol><li>Арифметические операторы;</li><li>Операторы присваивания;</li><li>Операторы сравнения;</li><li>Логические операторы;</li><li>Операторы тождественности;</li><li>Операторы принадлежности;</li><li>Побитовые операторы.</li></ol></div><h4  class="t-redactor__h4">Арифметические операторы</h4><div class="t-redactor__text">Арифметические операторы используются с числовыми значениями для выполнения общих математических операций:</div><img src="https://static.tildacdn.com/tild3831-3533-4939-a161-626266373461/2023-12-03_18-41.png"><h4  class="t-redactor__h4">Операторы присваивания</h4><div class="t-redactor__text">Операторы присваивания используются для присваивания значений переменным:</div><div class="t-redactor__text"><strong>=</strong> — Присваивает значение правого операнда левому. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">c = 10 
# присвоит переменной с значение 10</code></pre><div class="t-redactor__text"><strong>+=</strong> — Прибавит значение правого операнда к левому и присвоит эту сумму левому операнду. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">с = 5
а = 5
с += а равносильно: с = с + а. с будет равно 10</code></pre><div class="t-redactor__text"><strong>-=</strong> — Отнимает значение правого операнда от левого и присваивает результат левому операнду. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">с = 5
а = 1
с -= а равносильно: с = с - а. с будет равно 4</code></pre><div class="t-redactor__text"><strong>*=</strong> — Умножает правый операнд с левым и присваивает результат левому операнду. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">с = 5
а = 2
с *= а равносильно: с = с * а. c будет равно 10</code></pre><div class="t-redactor__text"><strong>/=</strong> — Делит левый операнд на правый и присваивает результат левому операнду. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">с = 10
а = 2
с /= а равносильно: с = с / а. c будет равно 5</code></pre><div class="t-redactor__text"><strong>%=</strong> — Делит по модулю операнды и присваивает результат левому. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">с = 5
а = 2
с %= а равносильно: с = с % а. c будет равно 1</code></pre><div class="t-redactor__text"><strong>**=</strong> — Возводит в левый операнд в степень правого и присваивает результат левому операнду. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">с = 3
а = 2
с **= а равносильно: с = с ** а. c будет равно 9</code></pre><div class="t-redactor__text"><strong>//=</strong> — Производит целочисленное деление левого операнда на правый и присваивает результат левому операнду. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">с = 11
а = 2
с //= а равносильно: с = с // а. c будет равно 5</code></pre><h4  class="t-redactor__h4">Операторы сравнения</h4><div class="t-redactor__text">Операторы сравнения используются для сравнения двух значений:</div><img src="https://static.tildacdn.com/tild3132-6234-4638-a235-326662663538/2023-12-03_18-43.png"><h4  class="t-redactor__h4">Логические операторы</h4><div class="t-redactor__text">Логические операторы используются для объединения условных операторов:</div><img src="https://static.tildacdn.com/tild3562-3433-4637-b635-386465636266/1233.png"><h4  class="t-redactor__h4">Операторы тождественности</h4><div class="t-redactor__text">Операторы тождественности используются для сравнения объектов. Являются ли они одним и тем же объектом с одинаковым местоположением в памяти:</div><img src="https://static.tildacdn.com/tild6163-3636-4339-b332-653261666431/3344.png"><h4  class="t-redactor__h4">Операторы принадлежности</h4><div class="t-redactor__text">Операторы принадлежности используются для проверки того, представлена ​​ли последовательность в объекте:</div><img src="https://static.tildacdn.com/tild6562-3635-4436-b566-363131386265/5555.png"><h4  class="t-redactor__h4">Побитовые операторы</h4><div class="t-redactor__text">Побитовые операторы используются для работы в битовом (двоичном) формате:</div><img src="https://static.tildacdn.com/tild6265-6539-4565-b835-636663666465/6666.png"><div class="t-redactor__text">Видео по уроку:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/xCiUykOSe-g" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Генератор случайных чисел на Python</title>
			<link>https://www.easyitway.com/tpost/hrdhng1ic1-generator-sluchainih-chisel-na-python</link>
			<amplink>https://www.easyitway.com/tpost/hrdhng1ic1-generator-sluchainih-chisel-na-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 18:45:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>В этой статье мы напишем программу «Угадай число», которая будет работать на основе генератора чисел.</description>
			<turbo:content>
<![CDATA[<header><h1>Генератор случайных чисел на Python</h1></header><div class="t-redactor__text">В этой статье мы напишем программу «Угадай число», которая будет работать на основе генератора чисел. Если вы новичок в Python, тогда советуем сначала изучить статью «Циклы в Python» и потом возвращаться к этой статье.<br /><br />Модуль <strong>random</strong> предоставляет функции для генерации случайных чисел, букв, случайного выбора элементов последовательности. Рассмотрим функции модуля:<br /><br /><strong>random.seed([X], version=2)</strong> — инициализация генератора случайных чисел. Если X не указан, используется системное время.<br /><br /><strong>random.getstate()</strong> — внутреннее состояние генератора.<br /><br /><strong>random.setstate(state)</strong> — восстанавливает внутреннее состояние генератора. Параметр state должен быть получен функцией getstate().<br /><br /><strong>random.getrandbits(N)</strong> — возвращает N случайных бит.<br /><br /><strong>random.randrange(start, stop, step)</strong> — возвращает случайно выбранное число из последовательности.<br /><br /><strong>random.randint(A, B)</strong> — случайное целое число N, A ≤ N ≤ B.<br /><br /><strong>random.choice(sequence)</strong> — случайный элемент непустой последовательности.<br /><br /><strong>random.shuffle(sequence, [rand])</strong> — перемешивает последовательность (изменяется сама последовательность). Поэтому функция не работает для неизменяемых объектов.<br /><br /><strong>random.sample(population, k)</strong> — список длиной k из последовательности population.<br /><br /><strong>random.random()</strong> — случайное число от 0 до 1.<br /><br /><strong>random.uniform(A, B)</strong> — случайное число с плавающей точкой, A ≤ N ≤ B (или B ≤ N ≤ A).<br /><br /><strong>random.triangular(low, high, mode)</strong> — случайное число с плавающей точкой, low ≤ N ≤ high. Mode — распределение.<br /><br /><strong>random.betavariate(alpha, beta)</strong> — бета-распределение. alpha&gt;0, beta&gt;0. Возвращает от 0 до 1.<br /><br /><strong>random.expovariate(lambd)</strong> — экспоненциальное распределение. lambd равен 1/среднее желаемое. Lambd должен быть отличным от нуля. Возвращаемые значения от 0 до плюс бесконечности, если lambd положительно, и от минус бесконечности до 0, если lambd отрицательный.<br /><br /><strong>random.gammavariate(alpha, beta)</strong> — гамма-распределение. Условия на параметры alpha&gt;0 и beta&gt;0.<br /><br /><strong>random.gauss(значение, стандартное отклонение)</strong> — распределение Гаусса.<br /><br /><strong>random.lognormvariate(mu, sigma)</strong> — логарифм нормального распределения. Если взять натуральный логарифм этого распределения, то вы получите нормальное распределение со средним mu и стандартным отклонением sigma. mu может иметь любое значение, и sigma должна быть больше нуля.<br /><br /><strong>random.normalvariate(mu, sigma)</strong> — нормальное распределение. mu — среднее значение, sigma — стандартное отклонение.<br /><br /><strong>random.vonmisesvariate(mu, kappa)</strong> — mu — средний угол, выраженный в радианах от 0 до 2π, и kappa — параметр концентрации, который должен быть больше или равен нулю. Если каппа равна нулю, это распределение сводится к случайному углу в диапазоне от 0 до 2π.<br /><br /><strong>random.paretovariate(alpha)</strong> — распределение Парето.<br /><br /><strong>random.weibullvariate(alpha, beta)</strong> — распределение Вейбулла.<br /><br />В нашей программе мы будем использовать функцию <strong>randint()</strong>. Полный листинг программы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import random

print(&quot;*&quot; * 10, &quot;Угадай число&quot;, &quot;*&quot; * 10)

print(&quot;Компьютер будет загадывать число от 1 до 100. Попробуйте угадать число. Для выхода введите 0&quot;)

answer = 1
score = 0
i = 0

while answer:
    if answer == 0:
        break

    rand = random.randint(1, 100)
    answer = int(input(&quot;Число загадано. Попробуйте отгадать: &quot;))
    if answer == rand:
        score = score + 1
        print(&quot;Красавчик!&quot;)
    else:
        print(&quot;Неудачник! Пробуй еще...&quot;)
    i = i + 1
print(&quot;Всего ты отгадал чисел &quot;, score, &quot;из&quot;, i)
print(&quot;Приходи когда поумнеешь!&quot;)

input(&quot;Нажмите Enter для выхода&quot;)</code></pre><div class="t-redactor__text">Наша программа в цикле while проверяет введенное пользователем значение. Если оно совпадает со сгенерированным в начале итерации случайным значением, значит, выводится соответствующее сообщение и увеличивается значение переменной score.<br /><br />Параллельно мы ведём счетчик итераций, чтобы знать, сколько попыток совершил пользователь (переменная i). также наша программа выводит статистику по окончанию игры.<br /><br />rand = random.randint(1, 100) — используем функцию randint и задаем диапазон загадываемых чисел от 1 до 100. Диапазон можно изменить.<br /><br />Нижеуказанная инструкция выполняет большую роль в нашей программе:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">if answer == 0:
    break</code></pre><div class="t-redactor__text">Если пользователь введет 0, выполнение будет прервано.<br /><br />В нашей программе есть небольшой недочет. При чтении данных мы не производим проверку их корректности.<br /><br />Если пользователь введет строку вместо числа, то выполнение программы будет остановлено, а на консоли будет изображено сообщение об ошибке. Для обработки таких исключений используются блоки try..except.<br /><br />Вы можете улучшить нашу программу и добавить исключения самостоятельно. В комментариях ждём ваших предложений по поводу улучшений данного кода.<br /><br />Видео по разработке программы:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/EfoQPbxtJIs" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Регулярные выражения в Python</title>
			<link>https://www.easyitway.com/tpost/j8s54m1ld1-regulyarnie-virazheniya-v-python</link>
			<amplink>https://www.easyitway.com/tpost/j8s54m1ld1-regulyarnie-virazheniya-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 18:47:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Регулярные выражения, также называемые regex, язык для поиска, извлечения и работы с определенными текстовыми шаблонами большего текста. </description>
			<turbo:content>
<![CDATA[<header><h1>Регулярные выражения в Python</h1></header><div class="t-redactor__text"><strong>Регулярные выражения</strong>, также называемые regex, язык для поиска, извлечения и работы с определенными текстовыми шаблонами большего текста. Он широко используется в проектах, которые включают проверку текста, NLP (Обработка естественного языка) и интеллектуальную обработку текста.</div><div class="t-redactor__text">Регулярные выражения используются практически во всех языках программирования. В python они реализованы в стандартном модуле <strong>«re»</strong>.</div><div class="t-redactor__text">Он широко используется в естественной обработке языка, веб-приложениях, требующих проверки ввода текста (например, адреса электронной почты) и почти во всех проектах в области анализа данных, которые включают в себя интеллектуальную обработку текста.</div><h4  class="t-redactor__h4">Согласуемые символы</h4><div class="t-redactor__text">Существуют определенные символы, которые заняты регулярными выражениями. Они так же известны как метасимволы. Рассмотрим полный список метасимволов, которые поддерживают регулярные выражения Python:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Python
. ˆ $ * + ? { } [ ] | ( )</code></pre><div class="t-redactor__text">Основная связка метасимволов, с которой вы будете сталкиваться, это квадратные скобки: [ и ]. Они используются для создания «класса символов», который является набором символов, которые вы можете сопоставить.<br /><br />Вы можете отсортировать символы индивидуально, например, так: [xyz]. Это сопоставит любой внесенный в скобки символ. Вы также можете использовать тире для выражения ряда символов, соответственно: [a-g]. Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">‘a[b-f]*f</code></pre><div class="t-redactor__text">Этот шаблон регулярного выражения показывает, что мы ищем букву а, ноль или несколько букв из нашего класса, [b-f] и поиск должен закончиться на f. Давайте используем это выражение в Python:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import re
text = &#039;abcdfghijk&#039;
 
parser = re.search(&#039;a[b-f]*f&#039;)
print(parser.group()) # &#039;abcdf&#039;</code></pre><div class="t-redactor__text">Это выражение просмотрит всю переданную ей строку, в данном случае это <strong>«abcdfghijk»</strong>.</div><div class="t-redactor__text">Выражение найдет нашу букву <strong>«а»</strong> в начале поиска. Затем, в связи с тем, что она имеет класс символа со звездочкой в конце, выражение прочитает остальную часть строки, что бы посмотреть, сопоставима ли она.</div><div class="t-redactor__text">Если нет, то выражение будет пропускать по одному символу, пытаясь найти совпадения.</div><div class="t-redactor__text">Вся магия начинается, когда мы вызываем поисковую функцию модуля re. Если мы не найдем совпадение, тогда мы получим None. В противном случае, мы получим объект Match. Чтобы увидеть, как выглядит совпадение, вам нужно вызывать метод group.</div><h4  class="t-redactor__h4">Функция match</h4><div class="t-redactor__text">Эта функция пытается соответствовать RE pattern для string с дополнительными flags. Синтаксис этой функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">re.match(pattern, string, flags = 0)</code></pre><div class="t-redactor__text"><strong>pattern</strong> – это регулярное выражение, которому необходимо соответствовать.<br /><br /><strong>string</strong> – строка, которая будет искать, чтобы соответствовать шаблону в начале строки.<br /><br /><strong>flags</strong> – можно задать различные флаги с помощью побитового OR (|).<br /><br />Функция Re.match возвращает объект match если успех, и None если провал. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import re

line = &quot;Кошки умнее собак&quot;

matchObj = re.match( r&#039;(.*) are (.*?) .*&#039;, line, re.M|re.I)

if matchObj:
   print (&quot;matchObj.group() : &quot;, matchObj.group())
   print (&quot;matchObj.group(1) : &quot;, matchObj.group(1))
   print (&quot;matchObj.group(2) : &quot;, matchObj.group(2))
else:
   print (&quot;Нет совпадения!!&quot;)</code></pre><div class="t-redactor__text">Будет выведено:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  matchObj.group() :  Кошки умнее собак
matchObj.group(1) :  Кошки
matchObj.group(2) :  умнее</code></pre><h4  class="t-redactor__h4">Функция search</h4><div class="t-redactor__text">Эта функция ищет первое вхождение pattern re в string с дополнительными flags. Синтаксис этой функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">re.search(pattern, string, flags = 0)</code></pre><div class="t-redactor__text">Функция Re.search возвращает объект match если успех, и None если провал. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import re

line = &quot;Кошки умнее собак&quot;;

searchObj = re.search( r&#039;(.*) are (.*?) .*&#039;, line, re.M|re.I)

if searchObj:
   print (&quot;searchObj.group() : &quot;, searchObj.group())
   print (&quot;searchObj.group(1) : &quot;, searchObj.group(1))
   print (&quot;searchObj.group(2) : &quot;, searchObj.group(2))
else:
   print (&quot;Ничего не найдено!!&quot;)</code></pre><div class="t-redactor__text">Будет выведено:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  matchObj.group() :  Кошки умнее собак
matchObj.group(1) :  Кошки
matchObj.group(2) :  умнее</code></pre><h4  class="t-redactor__h4">Соответствие поиску версий</h4><div class="t-redactor__text">Python предлагает две различные примитивные операции, основанные на регулярных выражениях: match проверка на сравнение только в начале строки, в то время как search проверка на сравнение где – нибудь в строке. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import re

line = &quot;Кошки умнее собак&quot;;

matchObj = re.match( r&#039;собак&#039;, line, re.M|re.I)
if matchObj:
   print (&quot;match --&gt; matchObj.group() : &quot;, matchObj.group())
else:
   print (&quot;Нет совпадения!!&quot;)

searchObj = re.search( r&#039;собак&#039;, line, re.M|re.I)
if searchObj:
   print (&quot;search --&gt; searchObj.group() : &quot;, searchObj.group())
else:
   print (&quot;Ничего не найдено!!&quot;)</code></pre><div class="t-redactor__text">Будет выведено:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  Нет совпадения!!
search --&gt; matchObj.group() :  собак</code></pre><h4  class="t-redactor__h4">Поиск и замена</h4><div class="t-redactor__text">Одним из наиболее важных методов re, которые используют регулярные выражения является sub. Синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">re.sub(pattern, repl, string, max=0)</code></pre><div class="t-redactor__text">Этот метод заменяет все вхождения RE pattern в string на repl, заменив все вхождения, если max не предусмотрен. Этот метод возвращает модифицированную строку. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import re

phone = &quot;2004-959-559 # Это номер телефона&quot;

# Удаление комментариев в стиле Python
num = re.sub(r&#039;#.*$&#039;, &quot;&quot;, phone)
print (&quot;Номер телефона : &quot;, num)

# Удалить все, кроме цифр
num = re.sub(r&#039;\D&#039;, &quot;&quot;, phone)    
print (&quot;Номер телефона : &quot;, num)</code></pre><div class="t-redactor__text">Будет выведено:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  Номер телефона :  2004-959-559
Номер телефона :  2004959559</code></pre><h4  class="t-redactor__h4">Примеры регулярных выражений</h4><h4  class="t-redactor__h4">Буквенные символы</h4><div class="t-redactor__text"><strong>python</strong> – Сравнение «python».</div><h4  class="t-redactor__h4">Классы символов</h4><div class="t-redactor__text"><strong>[Рр]ython</strong> – Сравнение «Python» или «python»</div><div class="t-redactor__text"><strong>rub[ye]</strong> – Сравнение «ruby» или «rube»</div><div class="t-redactor__text"><strong>[aeiou]</strong> – Соответствует любому одной строчной гласной</div><div class="t-redactor__text"><strong>[0-9]</strong> – Сравнение любой цифры; такой же, как [0123456789]</div><div class="t-redactor__text"><strong>[a-z]</strong> – Соответствует любому строчной букве ASCII</div><div class="t-redactor__text"><strong>[A-Z]</strong> – Сравнение любой заглавной букве ASCII</div><div class="t-redactor__text"><strong>[a-zA-Z0-9]</strong> – Сравнение любой из вышеперечисленных</div><div class="t-redactor__text"><strong>[^aeiou]</strong> – Сравнение ничего, кроме нижнего регистра гласной</div><div class="t-redactor__text"><strong>[^0-9]</strong> – Сравнение ничего, кроме цифр</div><h4  class="t-redactor__h4">Специальные классы символов</h4><div class="t-redactor__text"><strong>.</strong> – Соответствует любому символу, кроме символа новой строки</div><div class="t-redactor__text"><strong>\ d</strong> – Сравнение цифры: [0-9]</div><div class="t-redactor__text"><strong>\D</strong> – Сравнение не цифры: [^ 0-9]</div><div class="t-redactor__text"><strong>\s</strong> – Сравнение символа пробела: [\t\r\n\f]</div><div class="t-redactor__text"><strong>\S</strong> – Сравнение без пробела: [^ \t\r\n\f]</div><div class="t-redactor__text"><strong>\w</strong> – Сравнение одного текстового символа: [A-Za-z0-9_]</div><div class="t-redactor__text"><strong>\W</strong> – Сравнение несловесным символом: [^ A-Za-z0-9_]</div><h4  class="t-redactor__h4">Случаи повторения</h4><div class="t-redactor__text"><strong>ruby?</strong> – Совпадение «rub» или «ruby»: у – необязательно</div><div class="t-redactor__text"><strong>ruby*</strong> – Совпадение «rub» плюс 0 или более y.</div><div class="t-redactor__text"><strong>ruby+</strong> – Совпадение «rub» плюс 1 или более y.</div><div class="t-redactor__text"><strong>\d{3,}</strong> – Совпадение ровно 3 цифры</div><div class="t-redactor__text"><strong>\ Д {3}</strong> – Совпадение 3 или более цифр</div><div class="t-redactor__text"><strong>\d{3,5}</strong> – Совпадение 3, 4 или 5 цифр</div><h4  class="t-redactor__h4">Группировка с круглой скобкой</h4><div class="t-redactor__text"><strong>\D\d+</strong> – Ни одна из групп: + повторяется \d</div><div class="t-redactor__text"><strong>(\D\d)+</strong> – Сгруппированные: + повторяет пару \D\d</div><div class="t-redactor__text"><strong>([Pp]ython(,)?)+</strong> – Сравнение «Python», «Python, python, python» и т.д.</div><h4  class="t-redactor__h4">Обратные</h4><div class="t-redactor__text"><strong>([Pp])ython&amp;\1ails</strong> – Сравнение python&amp;pails или Python&amp;Pails</div><div class="t-redactor__text"><strong>([‘”])[^\1]*\1</strong> – Одинарные- или двойные кавычки в строке. \1 – соответствует то, что в 1-й группе подобраны. \2 – Сравнение, что во 2-й группе соответствовал, и т. д.</div><h4  class="t-redactor__h4">Альтернативы</h4><div class="t-redactor__text"><strong>python|perl</strong> – Сравнение «python» или «perl»</div><div class="t-redactor__text"><strong>rub(y|le)</strong> – Сравнение «ruby» или «ruble»</div><div class="t-redactor__text"><strong>Python(!+|\?)</strong> – «Python», а затем один или более! или один?</div><h4  class="t-redactor__h4">Якоря</h4><div class="t-redactor__text">Необходимо для определения позиции соответствия.</div><div class="t-redactor__text"><strong>^Python</strong> – Сравнение «Python» в начале строки или внутренней линии</div><div class="t-redactor__text"><strong>Python$</strong> – Сравнение «Python» в конце строки или строки</div><div class="t-redactor__text"><strong>\APython</strong> – Сравнение «Python» в начале строки</div><div class="t-redactor__text"><strong>Python\Z</strong> – Сравнение «Python» в конце строки</div><div class="t-redactor__text"><strong>\bPython\b</strong> – Сравнение «Python» на границе слова</div><div class="t-redactor__text"><strong>\brub\B</strong> – \В является не словесной границей: Сравнение «rub» в «rube» и «ruby», но не в одиночку</div><div class="t-redactor__text"><strong>Python(?=!)</strong> – Сравнение «Python», если за ними следует восклицательный знак.</div><div class="t-redactor__text"><strong>Python(?!!)</strong> – Сравнение «Python», если не последует восклицательный знак.</div><h4  class="t-redactor__h4">Специальный синтаксис со скобками</h4><div class="t-redactor__text"><strong>R(?#comment)</strong> – Сравнение «R». Все остальное является комментарием</div><div class="t-redactor__text"><strong>R(?i)uby</strong> – Без учета регистра при сопоставлении «uby»</div><div class="t-redactor__text"><strong>R(?i:uby)</strong> – То же самое, что и выше</div><div class="t-redactor__text"><strong>rub(?:y|le))</strong> – Группировать только без создания обратной связи \1</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Функции и операторы для работы со строками</title>
			<link>https://www.easyitway.com/tpost/6lnufefr91-funktsii-i-operatori-dlya-raboti-so-stro</link>
			<amplink>https://www.easyitway.com/tpost/6lnufefr91-funktsii-i-operatori-dlya-raboti-so-stro?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 18:51:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Данная статья является продолжением статьи: «Работа со строками в Python«. Рекомендуем сначала изучить прошлую статью и потом возвращаться.</description>
			<turbo:content>
<![CDATA[<header><h1>Функции и операторы для работы со строками</h1></header><div class="t-redactor__text">Данная статья является продолжением статьи: «Работа со строками в Python«. Рекомендуем сначала изучить прошлую статью и потом возвращаться.</div><div class="t-redactor__text">Для работы со строками в Python есть несколько полезных функций и операторов, которые позволяют узнать длину последовательности, узнать, есть ли в ней определённый элемент.</div><h4  class="t-redactor__h4">Функция len()</h4><div class="t-redactor__text">Функция <strong>len()</strong> возвращает длину строки. Пример работы функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ltext = 0

print(&quot;Функция len()&quot;)

text = input(&quot;Введите произвольный текст: &quot;)

print(&quot;Длина введенного текста: &quot;, len(text))

input()</code></pre><div class="t-redactor__text">Сначала мы читаем введенный пользователем текст в переменную text, а затем выводим результат функции len(text).</div><img src="https://static.tildacdn.com/tild3639-3232-4366-a633-356137666230/python_stroki_functi.jpg"><h4  class="t-redactor__h4">Оператор in</h4><div class="t-redactor__text">Оператор <strong>in</strong> возвращает True если последовательность присутствует в объекте. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">message = &quot;Пример&quot;

if &quot;а&quot; in message:
    print(&quot;Искомый символ есть в сообщении&quot;)
else:
    print(&quot;Искомого символа нет в сообщении&quot;)

input()</code></pre><div class="t-redactor__text">Данный код проверяет нашу переменную на наличие искомого символа в значении переменной и выдает сообщение. Есть также оператор not in, у которого обратная логика:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">message = &quot;Пример&quot;

if &quot;а&quot; not in message:
    print(&quot;Искомый символ есть в сообщении&quot;)
else:
    print(&quot;Искомого символа нет в сообщении&quot;)

input()</code></pre><h4  class="t-redactor__h4">Функция ord()</h4><div class="t-redactor__text">Функция <strong>ord()</strong> возвращает числовое значение для заданного символа.</div><div class="t-redactor__text">На базовом уровне компьютеры хранят всю информацию в виде цифр. Для представления символьных данных используется схема перевода, которая содержит каждый символ с его репрезентативным номером.</div><div class="t-redactor__text">Самая простая схема в повседневном использовании называется <strong>ASCII</strong>. Она охватывает латинские символы, с которыми мы чаще работает. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ord(&#039;a&#039;)
# выведет 97

ord(&#039;#&#039;)
# выведет 35</code></pre><h4  class="t-redactor__h4">Функция chr()</h4><div class="t-redactor__text">Функция <strong>chr()</strong> возвращает символьное значение для данного целого числа.</div><div class="t-redactor__text">chr() действует обратно ord(). Если задано числовое значение n, chr(n) возвращает строку, представляющую символ n:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">chr(97)
# выведет a

chr(35)
# выведет #</code></pre><h4  class="t-redactor__h4">Функция str()</h4><div class="t-redactor__text">Функция <strong>str(obj)</strong> возвращает строковое представление объекта.</div><div class="t-redactor__text">Практически любой объект в Python может быть представлен как строка. str(obj) возвращает строковое представление объекта obj:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">str(49.2)
# выведет &#039;49.2&#039;

str(3+4j)
# выведет &#039;(3+4j)&#039;</code></pre><h4  class="t-redactor__h4">Программа «Анализатор слова»</h4><div class="t-redactor__text">Для закрепления изученного создадим небольшую программу. Программа будет сообщать длину слова, количество гласных и согласных. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(&quot;*&quot; * 10, &quot; Анализатор слова &quot;, &quot;*&quot; * 10)
word = input(&quot;Введите слово: &quot;)

vowels = 0
consonants = 0

for i in word:
    letter = i.lower()
    if letter == &quot;а&quot; or letter == &quot;о&quot; or\
       letter == &quot;и&quot; or letter == &quot;е&quot; or\
       letter == &quot;ё&quot; or letter == &quot;э&quot; or\
       letter == &quot;ы&quot; or letter == &quot;у&quot; or\
       letter == &quot;ю&quot; or letter == &quot;я&quot;:
        vowels +=1
    else:
        consonants += 1
print(&quot;Длина текста:&quot;, len(word))
print(&quot;Гласные %i Согласные %i&quot; % (vowels, consonants))

input()</code></pre><div class="t-redactor__text">Переменная <strong>vowels</strong> будет содержать количество гласных букв, а <strong>consonants</strong> — согласных букв. С помощью цикла for проходимся по введенному слову.<br /><br />Метод <strong>lower()</strong> необходим для приведения символа в нижний регистр. Далее мы проверяем, относится ли буква к гласным или нет. Если гласная будет обнаружена, то переменная <strong>vowels</strong> будет увеличена на 1, в противном случае будет увеличена переменная <strong>consonants</strong>.<br /><br />Символ <strong>«\»</strong> необходим для разрыва длинной строки.<br /><br />Вывод программы:</div><img src="https://static.tildacdn.com/tild3862-3833-4064-b365-616465613033/python_stroki_functi.jpg"><div class="t-redactor__text">Видео по разработке программы:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/CTfeAycz8eQ" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Игра «Крестики-нолики» для двух игроков на Python</title>
			<link>https://www.easyitway.com/tpost/r2keth73y1-igra-krestiki-noliki-dlya-dvuh-igrokov-n</link>
			<amplink>https://www.easyitway.com/tpost/r2keth73y1-igra-krestiki-noliki-dlya-dvuh-igrokov-n?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 18:54:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>В данной статье мы разработаем небольшую консольную программу «Крестики-нолики» для закрепления темы «Функции в Python«.</description>
			<turbo:content>
<![CDATA[<header><h1>Игра «Крестики-нолики» для двух игроков на Python</h1></header><div class="t-redactor__text">В данной статье мы разработаем небольшую консольную программу «Крестики-нолики» для закрепления темы «Функции в Python«. Сначала рекомендуем изучить теорию создания функций и потом возвращаться к этой статье.</div><h4  class="t-redactor__h4">Используемые функции в программе</h4><div class="t-redactor__text"><strong>draw_board()</strong> — рисует игровое поле в привычном для человека формате.</div><div class="t-redactor__text"><strong>take_input()</strong> — принимает ввод пользователя. Проверяет корректность ввода.</div><div class="t-redactor__text"><strong>check_win</strong> — функция проверки игрового поля, проверяет, выиграл ли игрок.</div><div class="t-redactor__text"><strong>main()</strong> — основная функция игры, которая будет запускать все ранее описанные функции. Данная функция запускает и управляет игровым процессом.</div><h4  class="t-redactor__h4">Полный листинг программы</h4><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(&quot;*&quot; * 10, &quot; Игра Крестики-нолики для двух игроков &quot;, &quot;*&quot; * 10)

board = list(range(1,10))

def draw_board(board):
   print(&quot;-&quot; * 13)
   for i in range(3):
      print(&quot;|&quot;, board[0+i*3], &quot;|&quot;, board[1+i*3], &quot;|&quot;, board[2+i*3], &quot;|&quot;)
      print(&quot;-&quot; * 13)

def take_input(player_token):
   valid = False
   while not valid:
      player_answer = input(&quot;Куда поставим &quot; + player_token+&quot;? &quot;)
      try:
         player_answer = int(player_answer)
      except:
         print(&quot;Некорректный ввод. Вы уверены, что ввели число?&quot;)
         continue
      if player_answer &gt;= 1 and player_answer &lt;= 9:
         if(str(board[player_answer-1]) not in &quot;XO&quot;):
            board[player_answer-1] = player_token
            valid = True
         else:
            print(&quot;Эта клетка уже занята!&quot;)
      else:
        print(&quot;Некорректный ввод. Введите число от 1 до 9.&quot;)

def check_win(board):
   win_coord = ((0,1,2), (3,4,5), (6,7,8), (0,3,6), (1,4,7), (2,5,8), (0,4,8), (2,4,6))
   for each in win_coord:
       if board[each[0]] == board[each[1]] == board[each[2]]:
          return board[each[0]]
   return False

def main(board):
    counter = 0
    win = False
    while not win:
        draw_board(board)
        if counter % 2 == 0:
           take_input(&quot;X&quot;)
        else:
           take_input(&quot;O&quot;)
        counter += 1
        if counter &gt; 4:
           tmp = check_win(board)
           if tmp:
              print(tmp, &quot;выиграл!&quot;)
              win = True
              break
        if counter == 9:
            print(&quot;Ничья!&quot;)
            break
    draw_board(board)
main(board)

input(&quot;Нажмите Enter для выхода!&quot;)</code></pre><h4  class="t-redactor__h4">Функция draw_board()</h4><div class="t-redactor__text">Внутри программы игровое поле представлено в виде одномерного списка с числами от 1 до 9.</div><h4  class="t-redactor__h4">Функция take_input()</h4><div class="t-redactor__text">Задачи данной функции:</div><div class="t-redactor__text">1. Принять ввод пользователя.</div><div class="t-redactor__text">2. Обработать некорректный ввод, например, введено не число. Для преобразования строки в число используем функцию int().</div><div class="t-redactor__text">3. Обработать ситуации. когда клетка занята или когда введено число не из диапазона 1..9.</div><div class="t-redactor__text">Для обработки некорректного ввода мы используем блок try…except. Если пользователь введет строку, то выполнение программы не прервется, а будет выведено сообщение «Некорректный ввод. Вы уверены, что ввели число?», а затем цикл перейдет на следующую итерацию с возможностью по-новому ввести число.</div><h4  class="t-redactor__h4">Функция check_win()</h4><div class="t-redactor__text">Данная функция проверяет игровое поле. Мы создаем кортеж с выигрышными координатами и проходимся циклом for по нему.</div><div class="t-redactor__text">Если символы во всех трех заданных клетках равны — возвращаем выигрышный символ, иначе — возвращаем значение False.</div><div class="t-redactor__text">Непустая строка(выигрышный символ) при приведении ее к логическому типу вернет True.</div><h4  class="t-redactor__h4">Функция main()</h4><div class="t-redactor__text">В данной функции создаем цикл while. Цикл выполняется пока один из игроков не выиграл. В данном цикле мы выводим игровое поле, принимаем ввод пользователя, при этом определяя токен(икс или нолик) игрока.</div><div class="t-redactor__text">Ждем, когда переменная counter станет больше 4 для того, чтобы избежать заведомо ненужного вызова функции check_win.</div><div class="t-redactor__text">Переменная tmp была создана для того, чтобы лишний раз не вызывать функцию check_win, мы просто «запоминаем» ее значение и при необходимости используем в строке «print(tmp, «выиграл!»)».</div><div class="t-redactor__text">Вывод программы:</div><img src="https://static.tildacdn.com/tild6639-6233-4932-b739-663166306439/python_igra_krestik_.jpg"><div class="t-redactor__text">Наша игра получилась очень простой. Рекомендуется самостоятельно написать данный код для полного его понимания. Ждем ваших предложений по улучшению или модернизации данной игры.<br /><br />Видео по созданию игры:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/t2vB9AXRoF4" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Обработка исключений в Python</title>
			<link>https://www.easyitway.com/tpost/y10hsf8e11-obrabotka-isklyuchenii-v-python</link>
			<amplink>https://www.easyitway.com/tpost/y10hsf8e11-obrabotka-isklyuchenii-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 18:56:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Обработка исключений является мощным механизмом по управлению программой в особых ситуациях. Он позволяет избежать ее аварийного завершения вследствие внезапных и непредвиденных ошибок.</description>
			<turbo:content>
<![CDATA[<header><h1>Обработка исключений в Python</h1></header><div class="t-redactor__text">Обработка исключений является мощным механизмом по управлению программой в особых ситуациях. Он позволяет избежать ее аварийного завершения вследствие внезапных и непредвиденных ошибок.<br /><br />Разработка программы на любом языке довольно часто бывает связана с возникновением различного рода ошибок, препятствующих получению желаемого результата.<br /><br />Как правило, не все они приводят к моментальному завершению программы: некоторые ошибки можно ликвидировать еще на этапе компиляции, другие же способны оставаться незамеченными достаточно долгое время, а третьи и вовсе не зависят от программиста и возникают лишь в определенных ситуациях.<br /><br />Рассмотрим пример, показывающий невозможность операции деления на ноль:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">print(10 / 0)</code></pre><div class="t-redactor__text">После попытки запуска будет выведено:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Traceback (most recent call last):
File &quot;index.py&quot;, line 1, in 
print(10 / 0)
ZeroDivisionError: division by zero</code></pre><div class="t-redactor__text">В данном случае отображается файл, а также номер строки кода, где было выброшено исключение <strong>ZeroDivisionError</strong>.</div><h4  class="t-redactor__h4">Конструкция try/except</h4><div class="t-redactor__text">Данная конструкция используется и в других языках программирования. В операторе <strong>try</strong> определяется потенциально опасный фрагмент кода — выполнение которого может вызвать исключения.</div><div class="t-redactor__text">Затем пишется оператор <strong>except</strong>, а блок кода, следующий за ним, будет выполнен только, если система сгенерировала исключение.</div><div class="t-redactor__text">Пример обработки исключения:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">try:
  k = int(input(&quot;Введите целое число: &quot;))
  print(&quot;Вы ввели: &quot;, k)
except:
  print(&quot;Нужно было ввести целое число!!!&quot;)
input()</code></pre><div class="t-redactor__text">Если пользователь введёт число, тогда программа выведет его. А вот если ввести строку, которая не может быть преобразована в целое число, то будет исключение.</div><h4  class="t-redactor__h4">Типы исключений</h4><div class="t-redactor__text">Разные типы исключений генерируют типы исключений. Рассмотрим самые популярные типы исключений:</div><div class="t-redactor__text"><ol><li><strong>IOError</strong> — генерирует, если невозможно выполнить операцию ввода/вывода.</li><li><strong>IndexError</strong> — генерируется, если в последовательности не найден элемент с заданным индексом.</li><li><strong>KeyError</strong> — если в словаре не найден указанный ключ.</li><li><strong>NameError</strong> — если не найдено имя(переменной или функции).</li><li><strong>SyntaxError</strong> — если в коде обнаружена синтаксическая ошибка.</li><li><strong>TypeError</strong> — если стандартная операция применяется к объекту неподходящего типа.</li><li><strong>ValueError</strong> — если операция или функция принимает аргумент с неподходящим значением.</li><li><strong>ZeroDivisionError</strong> — если есть деление на 0.</li></ol></div><div class="t-redactor__text">В Python можно обработать несколько исключений. Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">try:
  a = int(input(&quot;Введите целое число: &quot;))
  b = int(input(&quot;Введите целое число: &quot;))
  print(&quot;a/b = &quot;, a/b)
except ValueError:
  print(&quot;Нужно было ввести целое число!!!&quot;)
except ZeroDivisionError:
  print(&quot;На 0 делить нельзя!&quot;)
input()</code></pre><div class="t-redactor__text">В примере мы добавили исключения при неправильно введённом значении и при деление на 0. Самостоятельно проверьте работоспособность примера.</div><h4  class="t-redactor__h4">Передача аргумента исключения</h4><div class="t-redactor__text">В Python можно передать в программу свое ругательство, то есть сообщение об ошибки, но при этом программа не будет прервана. Это называется передачей аргумента исключения. Поправим наш прошлый пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">try:
  a = int(input(&quot;Введите целое число: &quot;))
  b = int(input(&quot;Введите целое число: &quot;))
  print(&quot;a/b = &quot;, a/b)
except ValueError:
  print(&quot;Нужно было ввести целое число!!!&quot;)
except ZeroDivisionError as e:
  print(&quot;На 0 делить нельзя!&quot;)
  print(&quot;Что сказал нам интерпретатор:&quot;)
  print(e)
input()</code></pre><div class="t-redactor__text">Вывод:</div><img src="https://static.tildacdn.com/tild3263-3739-4530-b135-333738333761/obr_iskl_python_1.jpg"><h4  class="t-redactor__h4">Блок else</h4><div class="t-redactor__text">Оператор <strong>try/except</strong> также имеет пункт <strong>else</strong>. Он работает только в том случае, если в вашем коде нет ни единой ошибки. Исправим наш прошлый пример используя else:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">try:
  k = int(input(&quot;Введите целое число: &quot;))
except:
  print(&quot;Нужно было ввести целое число!!!&quot;)
else:
  print(&quot;Вы ввели: &quot;, k)
input()</code></pre><div class="t-redactor__text">В try принято помещать код, который может сгенерировать исключение. В else можно поместить код, который будет выполнен, если все нормально и исключение не было сгенерировано.</div><h4  class="t-redactor__h4">Оператор finally</h4><div class="t-redactor__text">Также у блока except есть еще один необязательный блок finally, который сработает независимо от того, выполнился код с ошибками или без. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">try:
   a = int(input(&quot;Введите первое число: &quot;))
   b = int(input(&quot;Введите второе число: &quot;))
   print(&quot;a/b = &quot;, a/b)
except ValueError:
   print(&quot;Это не число!&quot;)
except ZeroDivisionError:
   print(&quot;На ноль делить нельзя!&quot;)
except:
   print(&quot;Неожиданная ошибка.&quot;)
else:
   print(&quot;Код выполнился без ошибок&quot;)
finally:
   print(&quot;Я выполняюсь в любом случае!&quot;)
input()</code></pre><div class="t-redactor__text">Вывод программы:</div><img src="https://static.tildacdn.com/tild3131-6566-4538-a665-623061663563/obr_iskl_python_2.jpg"><div class="t-redactor__text">Используя обработку исключительных, можно защитить программу от взлома, непредвиденного поведения и в будущем получить детальную информацию по логическим ошибкам, содержащимся в ней.<br /><br />Видео по теме «Обработка исключений»:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/rVZkU2T5OpU" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe><h4  class="t-redactor__h4">Программа «Тесты 2.0»</h4><div class="t-redactor__text">В статье «Условный оператор IF» мы создавали программу «Тесты». В этой статье мы продолжим разрабатывать данную программу.</div><div class="t-redactor__text">Сделаем так, чтобы наши вопросы и ответы хранились в списках. Также у нас будет переменная n, содержащая количество вопросов. Мы с легкостью сможем изменять количество вопросов. В нашей новой версии сделаем защиту нашей программы с помощью конструкция try/except.</div><h4  class="t-redactor__h4">Программа «Редактор тестов»</h4><div class="t-redactor__text">Программа «Редактор тестов» будет записывать вопросы и ответы в файл <strong>«test.dat»</strong> с помощью модуля pickle.</div><div class="t-redactor__text">Преимущество такого подхода в том, что тестируемый не сможет открыть Python-файл программы и просмотреть список правильных ответов. Ведь в <strong>«test.dat»</strong> все данные хранятся в двоичном виде. Рассмотрим листинг программы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import pickle

questions = [&quot;&quot;&quot;
      Сколько бит в одном байте
      1) 8
      2) 6
      3) 4
      4) 2
      &quot;&quot;&quot;,
      &quot;&quot;&quot;
      Сколько байт в одном килобайте
      1) 1000
      2) 1024
      3) 1048
      4) 256
      &quot;&quot;&quot;,
      &quot;&quot;&quot;
      Компания-разработчик Windows
      1) Apple
      2) Melkosoft
      3) Cybersoft
      4) Microsoft
      &quot;&quot;&quot;,
      &quot;&quot;&quot;
      Компания-разработчик MacOS
      1) Apple
      2) Microsoft
      3) Fredd
      4) google
      &quot;&quot;&quot;,
      &quot;&quot;&quot;
      Символом какой операционной системы является пингвин
      1) Linux
      2) FreeBSD
      3) MacOS
      4) Windows
      &quot;&quot;&quot;]
      
answers = [1, 2, 4, 1, 1]

datafile = open(&quot;test.dat&quot;, &quot;wb&quot;)

pickle.dump(questions, datafile)
pickle.dump(answers, datafile)

datafile.close()

input(&quot;Файл test.dat создан!&quot;)</code></pre><div class="t-redactor__text">Рекомендуется изучить статью «Файлы. Работа с файлами в Python» для лучшего понимания работы с файлами в Python.<br /><br />В результате работы программы будет создан файл <strong>«test.dat»</strong> с законсервированными списками вопросов и правильных ответов.<br /><br />Файл с вопросами и ответами создан, а теперь продолжим разработку программы «Тесты». Листинг программы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import pickle

mark = 0

print(&quot;*&quot; * 10, &quot;Тесты 2.0&quot;, &quot;*&quot; * 10)

# загружаем списки вопросов и ответов
try:
  datafile = open(&quot;test.dat&quot;, &quot;rb&quot;)
except:
  print(&quot;Ошибка при загрузке вопросов!&quot;)
else:
  
  questions = pickle.load(datafile)
  answers = pickle.load(datafile)
  datafile.close()
  n = len(answers) # количество вопросов и ответов
  i = 0
  for i in range(0, n):
      print(questions[i])
      try:
        a = int(input(&quot;Ваш ответ: &quot;))
        if a == answers[i]:
           mark = mark + 1
           print(&quot;Правильно!&quot;)
        else:
           print(&quot;Неправильно!&quot;)
      except:
           print(&quot;Нужно было ввести число. Ответ засчитан как неправильный!&quot;)
  print(&quot;Вы правильно ответили на &quot;, mark, &quot;вопросов из &quot;, n)
  
input(&quot;Нажмите Enter для выхода&quot;)</code></pre><div class="t-redactor__text">Подробно рассмотрим код, написанной программы. Вопросы у нас выводятся в цикле for. В цикле мы выводим вопрос из списка «questions», далее читаем ответ, если ответ совпадает с правильным (которые хранятся в списке «answers»), то увеличиваем переменную «mark» и выводим сообщение «Правильно!». В противном случае «Неправильно!».<br /><br />В коде мы используем обработку исключений — вдруг файл <strong>«test.dat»</strong> будет отсутствовать. Если же все нормально (блок else), мы загрузим списки вопросов и ответов, определим количество вопросов.<br /><br />Если пользователь введёт некорректные значения, тогда обработка исключений будет выводить ошибку и ответ засчитан не будет.<br /><br />Вывод программы:</div><img src="https://static.tildacdn.com/tild3539-3936-4366-a334-316338386665/obr_iskl_python_3.jpg"><div class="t-redactor__text">Программа получилась хорошая, но еще требует множества доработок. Чтобы вопросы не шли по порядку надо написать много вопросов и задавать случайным образом. Чем больше вопросов, тем меньше вероятность того, что пользователи будут получать одинаковые вопросы.<br /><br />Также наши вопросы можно взломать без труда. Поэтому рекомендуется зашифровать их.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Работа с популярными форматами в Python</title>
			<link>https://www.easyitway.com/tpost/bjfsxmpn41-rabota-s-populyarnimi-formatami-v-python</link>
			<amplink>https://www.easyitway.com/tpost/bjfsxmpn41-rabota-s-populyarnimi-formatami-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 19:00:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Python поддерживает работу с различными популярными форматами данных — CSV, JSON.</description>
			<turbo:content>
<![CDATA[<header><h1>Работа с популярными форматами в Python</h1></header><div class="t-redactor__text">Python поддерживает работу с различными популярными форматами данных — CSV, JSON.</div><h4  class="t-redactor__h4">Работа с CSV-данными</h4><div class="t-redactor__text">CSV — популярный формат т.к. многие средства импорта/экспорта работают с ним. Данный формат обязан своей популярности MS Excel, которая позволяет сохранять в CSV свои таблицы. Для доступа к CSV-файлам нужно импортировать модуль csv.</div><div class="t-redactor__text">Напишем программу, выводящую первые N-строк из CSV файла:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import csv

max = int(input(&quot;Сколько строк вывести из файла: &quot;))

k = 0
with open(&#039;test.csv&#039;) as f:
  f_csv = csv.reader(f)
  headers = next(f_csv)
  for row in f_csv:
    print(row)
    k = k + 1
    if k == max:
      break

input()</code></pre><div class="t-redactor__text">В данном примере пользователь должен ввести сколько вывести строк из файла. Далее мы с помощью цикла проходим по всему файлу <strong>«test.csv»</strong> и выводим строки из этого файла. Переменная <strong>row</strong> является кортежем.<br /><br />Чтобы записать CSV-данные, вы можете использовать модуль csv, но создать объект writer. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import csv

headers = [&#039;Symbol&#039;, &#039;Price&#039;, &#039;Date&#039;, &#039;Time&#039;]
rows = [(&#039;AA&#039;, 39, &#039;02/02/2020&#039;, &#039;00:00&#039;), (&#039;BB&#039;, 36, &#039;03/03/2020&#039;, &#039;00:12&#039;), (&#039;CC&#039;, 23, &#039;04/05/2020&#039;, &#039;12:34&#039;)]

with open(&#039;test2.csv&#039;, &#039;w&#039;) as f:
  f_csv = csv.writer(f)
  f_csv.writerow(headers)
  f_csv.writerows(rows)

input(&quot;Файл создан!&quot;)</code></pre><div class="t-redactor__text">В данном примере мы создаем файл в формате csv. Файл будет выглядеть вот так:</div><img src="https://static.tildacdn.com/tild3736-6665-4433-b066-333065643132/python_format_2.jpg"><h4  class="t-redactor__h4">Работа с JSON-данными</h4><div class="t-redactor__text">Python также обладает поддержкой формата JSON (JavaScript Object Notation). Модуль json предоставляет простой способ кодировать и декодировать данные в JSON. Пример преобразования структуры данных Python в JSON:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import json

data = {
     &#039;name&#039; : &#039;Max&#039;,
     &#039;shares&#039; : 100,
     &#039;count&#039; : 542.20
}
json_str = json.dumps(data)

print(json_str)

input()</code></pre><div class="t-redactor__text">Если вы работаете с файлами, а не строками, вы можете использовать функции json.dump() и json.load() для кодирования и декодирования данных. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import json

data = {
     &#039;name&#039; : &#039;Max&#039;,
     &#039;shares&#039; : 100,
     &#039;count&#039; : 542.20
}

# записываем JSON-данные
with open(&#039;data.json&#039;, &#039;w&#039;) as f:
 json.dump(data, f)

# читаем данные обратно
with open(&#039;data.json&#039;, &#039;r&#039;) as f:
 data = json.load(f)
 print(data)
 
input()</code></pre><div class="t-redactor__text">Данный пример создаст файл <strong>«data.json»</strong>, внесет в него данные и потом прочитает внесенные данные. Самостоятельно проверьте работоспособность данного кода.</div><div class="t-redactor__text">JSON-кодирование поддерживает базовые типы данных — None, bool, int, float и str, а также списки, кортежи и словари, состоящие из тех базовых типов.</div><h4  class="t-redactor__h4">Работа с XML-данными</h4><div class="t-redactor__text">XML расшифровывается как eXtensible Markup Language — «расширяемый язык разметки».</div><div class="t-redactor__text">XML — стандартизированный, но расширяемый язык текстовой разметки, основанный на удобном и легко читаемом, как пользователями, так и компьютером, синтаксисе, состоящем из тегов, атрибутов и препроцессоров.</div><div class="t-redactor__text">Для извлечения данных из простого XML-документа можно использовать модуль xml.etree.ElementTree.</div><div class="t-redactor__text">Напишем простую RSS-ленту:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;rss version=&quot;2.0&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot;&gt;
&lt;channel&gt;
 &lt;title&gt;RSS-лента&lt;/title&gt;
 &lt;link&gt;https://it-black.ru&lt;/link&gt;
 &lt;language&gt;ru&lt;/language&gt;
 &lt;dedication&gt;Описание&lt;/dedication&gt;
 &lt;item&gt;
   &lt;title&gt;Заголовок 1&lt;/title&gt;
   &lt;link&gt;Ссылка 1&lt;/link&gt;
   &lt;dedication&gt;Описание 1&lt;/dedication&gt;
   &lt;pubDate&gt;Дата 1&lt;/pubDate&gt;
 &lt;/item&gt;
 &lt;item&gt;
   &lt;title&gt;Заголовок 2&lt;/title&gt;
   &lt;link&gt;Ссылка 2&lt;/link&gt;
   &lt;dedication&gt;Описание 2&lt;/dedication&gt;
   &lt;pubDate&gt;Дата 2&lt;/pubDate&gt;
 &lt;/item&gt;
&lt;/channel&gt;
&lt;/rss&gt;</code></pre><div class="t-redactor__text">Для извлечения данных из простого XML-документа можно использовать модуль xml.etree.ElementTree. Напишем сценарий, который сделает сводку произвольной RSS-ленты, содержащей элементы title, pubDate, link. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from urllib.request import urlopen
from xml.etree.ElementTree import parse

# Загружвем RSS-ленту и парсим её
doc = parse(&#039;test.xml&#039;)

# Извлекаем и выводим интересующие теги
for item in doc.iterfind(&#039;channel/item&#039;):
  title = item.findtext(&#039;title&#039;)
  date = item.findtext(&#039;pubDate&#039;)
  link = item.findtext(&#039;link&#039;)

  print(title)
  print(date)
  print(link)
input()</code></pre><div class="t-redactor__text">Функция xml.etree.ElementTree.parse() парсит весь XML-документ в объект документа.<br /><br />Видео по работе с форматами:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/dhQtZjYFgpU" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Копирование проекта в «.exe» на Python</title>
			<link>https://www.easyitway.com/tpost/gs2g26eyx1-kopirovanie-proekta-v-exe-na-python</link>
			<amplink>https://www.easyitway.com/tpost/gs2g26eyx1-kopirovanie-proekta-v-exe-na-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 19:05:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>Написав программу на языке программирования Python мы начинаем думать: «А как собрать нашу программу в файл и запускать на любом компьютере без установки интерпретатора Python?». В этой статье мы разберемся в этом вопросе.</description>
			<turbo:content>
<![CDATA[<header><h1>Копирование проекта в «.exe» на Python</h1></header><div class="t-redactor__text">Написав программу на языке программирования Python мы начинаем думать: «А как собрать нашу программу в файл и запускать на любом компьютере без установки интерпретатора Python?». В этой статье мы разберемся в этом вопросе.</div><div class="t-redactor__text">Существует большое количество библиотек, позволяющих это сделать, среди которых самые популярные: cx_Freeze, py2exe, nuitka, PyInstaller и др.</div><div class="t-redactor__text">В данной статье мы подробно рассмотрим установку библиотеки PyInstaller и собрание проекта на операционной системе Windows, а это означает, что мы будем собирать проект в <strong>«.exe»</strong> файл.</div><div class="t-redactor__text">На <a href="https://www.pyinstaller.org/" target="_blank" rel="noreferrer noopener">официальном сайте</a> библиотеки PyInstaller вы можете изучить документацию по другим операционным системам.</div><h4  class="t-redactor__h4">Установка PyInstaller</h4><div class="t-redactor__text">Чтобы установить PyInstaller необходимо сначала установить Python.</div><div class="t-redactor__text">Для корректной работы PyInstaller рекомендуется установить версию Python 3.7.6 т.к. на данный момент (Февраль 2020) библиотека корректно работает с данной версией Python, а с самой новой версией не работает.</div><div class="t-redactor__text">Для установки библиотеки запустите командную строку от имени администратора:</div><img src="https://static.tildacdn.com/tild6233-6331-4263-b061-633934623065/pyinstall_1.jpg"><div class="t-redactor__text">Установим необходимую библиотеку pypiwin32. В командной строке напишите строку:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">pip install pypiwin32</code></pre><img src="https://static.tildacdn.com/tild3164-3230-4634-b331-653664333235/pyinstall_2.jpg"><div class="t-redactor__text">Если у вас выйдет строка <strong>«WARNING»</strong>, как на картинке ниже, тогда необходимо обновить <strong>«pip»</strong> до последней версии. Код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">pip install --upgrade pip</code></pre><img src="https://static.tildacdn.com/tild3838-6461-4165-b433-333935646365/pyinstall_3.jpg"><div class="t-redactor__text">После того, как обновите pip вводим строку для загрузки библиотеки:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">pip install pyinstaller</code></pre><img src="https://static.tildacdn.com/tild6331-6236-4239-a162-326636666330/pyinstall_4.jpg"><div class="t-redactor__text">После загрузки библиотеки проверьте её версию:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">pyinstaller --version</code></pre><img src="https://static.tildacdn.com/tild3362-3632-4132-b538-366239626536/pyinstall_5.jpg"><div class="t-redactor__text">Проверим все установленные библиотеки с помощью кода:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">pip list</code></pre><img src="https://static.tildacdn.com/tild3239-3032-4064-b065-333831383366/pyinstall_6.jpg"><div class="t-redactor__text">Все необходимые библиотеки мы установили. Если вы все сделали по описанию, тогда у вас должно быть как на изображении.</div><h4  class="t-redactor__h4">Собрание проекта</h4><div class="t-redactor__text">В статье «Библиотека Tkinter в Python» мы создали небольшое графическое приложение. Для примера возьмем это приложение и соберем в .exe файл (приложение имеет имя: form.py).</div><div class="t-redactor__text">В папке с проектом запускаем командную строку (cmd):</div><img src="https://static.tildacdn.com/tild6632-3339-4163-b838-326533653762/pyinstall_7.jpg"><div class="t-redactor__text">Прописываем код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">pyinstaller form.py</code></pre><img src="https://static.tildacdn.com/tild3238-3232-4865-b761-656233666565/pyinstall_8.jpg"><div class="t-redactor__text">Это и есть простейшая команда, которая соберет наш проект.<br /><br />PyInstaller анализирует файл form.py и делает следующее:<br /><br /><ol><li>Пишет файл form.spec в той же папке, где находится скрипт.</li><li>Создает папку build в той же папке, где находится скрипт.</li><li>Записывает некоторые логи и рабочие файлы в папку build.</li><li>Создает папку dist в той же папке, где находится скрипт.</li><li>Пишет исполняемый файл в папку dist.</li></ol><br />После работы программы вы найдете две папки: dist и build. В папке dist и находится наше приложение. Впоследствии папку build можно спокойно удалить, она не влияет на работоспособность приложения.</div><img src="https://static.tildacdn.com/tild3239-3462-4063-b162-393539363863/pyinstall_9.jpg"><h4  class="t-redactor__h4">Наиболее часто используемые опции:</h4><div class="t-redactor__text"><strong>—onefile</strong> — сборка в один файл, т.е. файлы .dll не пишутся.</div><div class="t-redactor__text"><strong>—windowed</strong> -при запуске приложения, будет появляться консоль.</div><div class="t-redactor__text"><strong>—noconsole</strong> — при запуске приложения, консоль появляться не будет.</div><div class="t-redactor__text"><strong>—icon=app.ico</strong> — добавляем иконку в окно.</div><div class="t-redactor__text"><strong>—paths</strong> — возможность вручную прописать путь к необходимым файлам, если pyinstaller не может их найти(например: —paths D:\python35\Lib\site-packages\PyQt5\Qt\bin).</div><div class="t-redactor__text">Синтаксис команды pyinstaller:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">pyinstaller [options] script [script ...] | specfile</code></pre><div class="t-redactor__text">Используем опцию <strong>—onefile</strong> для сборки нашего проекта в один файл.<br /><br />Можете взять другой проект или удалить все файлы проекта созданные библиотекой pyinstaller и собрать его заново. Код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">pyinstaller --onefile form.py</code></pre><img src="https://static.tildacdn.com/tild6631-3231-4633-a437-613736643561/pyinstall_10.jpg"><div class="t-redactor__text">После работы программы вы найдете две папки: dist и build. В папке dist и находится наше приложение. Теперь наш проект собран в одном файле:</div><img src="https://static.tildacdn.com/tild3934-6533-4565-b132-376361313732/pyinstall_11.jpg"><div class="t-redactor__text">Запустите собранный <strong>.exe</strong> файл проекта и проверьте его работоспособность. На этом наша статья подходит к завершению. В комментариях вы можете задавать интересующие вопросы.<br /><br />Видео по копированию проекта в «.exe»:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/AUH2yNY6TI4" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Средства шифрования в Python</title>
			<link>https://www.easyitway.com/tpost/zanajhb9k1-sredstva-shifrovaniya-v-python</link>
			<amplink>https://www.easyitway.com/tpost/zanajhb9k1-sredstva-shifrovaniya-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 19:13:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>В Python не так уж много инструментов стандартной библиотеки, которые работают с шифрованием.</description>
			<turbo:content>
<![CDATA[<header><h1>Средства шифрования в Python</h1></header><div class="t-redactor__text">В Python не так уж много инструментов стандартной библиотеки, которые работают с шифрованием. В данной статье мы рассмотрим несколько библиотек для шифрования и научимся шифровать и расшифровывать строки.</div><h4  class="t-redactor__h4">1. Хеширование</h4><div class="t-redactor__text">Если вам нужно шифровать пароли, то для этого подойдет модуль стандартной библиотеки <strong>Python hashlib</strong>.</div><div class="t-redactor__text">Он включает в себя безопасные алгоритмы хеширования FIPS, такие как SHA1, SHA224, SHA256, SHA384, а также SHA512 и MD5.</div><div class="t-redactor__text">Python также поддерживает функции хеширования adler32 и crc32, но они содержатся в модуле <strong>zlib</strong>. Одно из самых популярных применений хеширования это хранение хеша пароля, вместо самого пароля.</div><div class="t-redactor__text">Другой популярный случай, в котором применяется хеширование – это хеширование файла, с последующей отправкой файла и его хеша по отдельности. Получатель файла может запустить хеш в файле, чтобы убедиться в том, что файл соответствует отправленному хешу.</div><div class="t-redactor__text">Существует метод быстрого создания хеша, мы рассмотрим его, когда создадим наш хеш sha512:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import hashlib

result = hashlib.sha1(b&#039;hello&#039;).hexdigest()
print(result)

input()
# Будет выведено: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d</code></pre><div class="t-redactor__text">В данном примере мы создали наш экземпляр хеша и вызвали его метод дайджеста одновременно. Далее, мы выводим наш хеш, чтобы на него посмотреть.</div><h4  class="t-redactor__h4">Вывод ключа</h4><div class="t-redactor__text">У Python весьма ограниченная поддержка вывода ключа, встроенная в стандартную библиотеку. Фактически, единственный метод, предлагаемый <strong>hashlib</strong> это <strong>pbkdf2_hmac</strong>, который является основанной на пароле функцией вывода ключа <strong>PKCS#5</strong>.</div><div class="t-redactor__text">Он использует <strong>HMAC</strong> в качестве своей псевдослучайной функцией. Вы можете использовать что-нибудь на подобии для хеширования вашего пароля, так как он поддерживает соль и итерации.</div><div class="t-redactor__text">Например, если вы собираетесь использовать SHA-256, вам может понадобиться соль минимум в 16 битов и 100.000 итераций.</div><div class="t-redactor__text"><strong>Соль</strong> — это просто случайные данные, которые вы используете в качестве дополнения в вашем хеше, с целью усложнения расшифровки вашего пароля. В целом, она защищает ваш пароль от словарных атак и рассчитанных заранее радужных таблиц. Давайте посмотрим на пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import binascii
import hashlib

dk = hashlib.pbkdf2_hmac(hash_name=&#039;sha256&#039;,
                         password=b&#039;bad_password34&#039;,
                         salt=b&#039;bad_salt&#039;,
                         iterations=100000)

result = binascii.hexlify(dk)
print(result)

input()
# Будет выведено: b&#039;1a5abae9b195a4d1dbd2c79d9787841c2c68c39e507c3f26e89b2969eea8dac6&#039;</code></pre><div class="t-redactor__text">Здесь мы создаем хеш SHA256 в пароле при помощи соли со 100,000 итераций. Конечно, SHA в буквальном смысле не рекомендуется для создания ключей паролей. Вместо этого, вам лучше использовать что-то вроде <strong>scrypt</strong>. Пакет <strong>bcrypt</strong> разработан специально для хеширования паролей.</div><h4  class="t-redactor__h4">2. RSA</h4><div class="t-redactor__text">RSA — криптографический алгоритм с открытым ключом. При создании приложения вы генерируете два ключа: публичный (открытый) и приватный (закрытый).</div><div class="t-redactor__text">Открытый ключ передается всем желающим и заинтересованным. С его помощью можно зашифровать данные. А вот расшифровать можно только зная другой ключ из пары (т.е. закрытый).</div><div class="t-redactor__text">Чтобы установить модуль RSA для Python необходимо прописать в командной строке (от имени администратора):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">pip install rsa</code></pre><div class="t-redactor__text">Пример использования RSA:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">import rsa
(pubkey, privkey) = rsa.newkeys(512)
message = b&#039;Demo text&#039;
 
# шифруем
crypto = rsa.encrypt(message, pubkey)
print(crypto)
print(&quot;\n&quot;)
#расшифровываем
message = rsa.decrypt(crypto, privkey)
print(message)

input()
# Будет выведено: 
# b&#039;\x0e4\x91\xe8r\xa3\xe2`\xf7z\xffs\xf2\x80\xfb\x8c\xf2\x19R\xb7\x1f\x0c\x0f\xaf\xe5*o\xd2\xb7&amp;]E\xa6\xa0b\xcc#\x1bv\xa2a\xe1iO#fs\xa8]\xc2\xf7\xc3\xe2s.s \x13|M\xd5P\xcb\x91&#039;

# b&#039;Demo text&#039;</code></pre><h4  class="t-redactor__h4">3. cryptography</h4><div class="t-redactor__text">Пакет <strong>cryptography</strong> нацелен на то, чтобы быть «криптографом для людей», равно как и библиотека requests является «HTTP для людей».</div><div class="t-redactor__text">Суть в том, что вам нужно разработать простые криптографические рецепты которые и безопасны, и простые в использовании.</div><div class="t-redactor__text">Чтобы установить модуль cryptography для Python необходимо прописать в командной строке (от имени администратора):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">pip install cryptography</code></pre><div class="t-redactor__text">Cryptography установится совместно с несколькими зависимостями. С помощью модуля <strong>Fernet</strong> можно зашифровать текст. Рассмотрим пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from cryptography.fernet import Fernet

# Шифруем
cipher_key = Fernet.generate_key()
cipher = Fernet(cipher_key)
text = b&#039;Message&#039;
encrypted_text = cipher.encrypt(text)
print(encrypted_text)
print(&quot;\n&quot;)

# Дешифруем
decrypted_text = cipher.decrypt(encrypted_text)
print(decrypted_text)

input()
# Будет выведено:
b&#039;gAAAAABeU57f6UhNhi8WtK11n5sj5MNcwl1JoTd_i8VaR1-74w5Ub0riQMMC6Ak5TSopFN-dCg4MRODSL-w2HD9RGKYfkhHTug==&#039;

b&#039;Message&#039;</code></pre><div class="t-redactor__text">Модуль <strong>Fernet</strong> реализует простую в использовании схему аутентификации, которая использует симметричный алгоритм шифрования, который гарантирует, что каждое зашифрованное в нем сообщение не может быть использовано или прочитано без определенного вами ключа.<br /><br />Для начала, нам нужно импортировать Fernet. Затем мы генерируем ключ. Далее мы создаем экземпляр нашего шифра Fernet при помощи нашего ключа. Теперь у нас есть шифр, который мы можем использовать для шифрования и расшифровки нашего сообщения.<br /><br />Следующий шаг, это создание сообщения, достойного шифровки, с последующей его шифровкой при помощи метода <strong>encrypt</strong>.<br /><br />Для расшифровки нашего сообщения, мы просто вызовем метод <strong>decrypt</strong> в нашем шифре и передадим зашифрованный текст. В результате мы получим текстовую байтовую строку нашего сообщения.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Модуль time в Python</title>
			<link>https://www.easyitway.com/tpost/skjir027h1-modul-time-v-python</link>
			<amplink>https://www.easyitway.com/tpost/skjir027h1-modul-time-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 22:00:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>В этом видео вы познакомитесь с модулем time в языке программирования Python.</description>
			<turbo:content>
<![CDATA[<header><h1>Модуль time в Python</h1></header><div class="t-redactor__text">В этом видео вы познакомитесь с модулем time в языке программирования Python.</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/Ov1YmN6KH00" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Создание генератора паролей в Python</title>
			<link>https://www.easyitway.com/tpost/5uah1ecp01-sozdanie-generatora-parolei-v-python</link>
			<amplink>https://www.easyitway.com/tpost/5uah1ecp01-sozdanie-generatora-parolei-v-python?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 22:01:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по Python</category>
			<description>В этом видео вы научитесь создавать генератор паролей на языке программирования Python.</description>
			<turbo:content>
<![CDATA[<header><h1>Создание генератора паролей в Python</h1></header><div class="t-redactor__text">В этом видео вы научитесь создавать генератор паролей на языке программирования Python.</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/YenkcYnlk8Q" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Создание генератора паролей в Python — Version 2.0</title>
			<link>https://www.easyitway.com/tpost/396x44or91-sozdanie-generatora-parolei-v-python-ver</link>
			<amplink>https://www.easyitway.com/tpost/396x44or91-sozdanie-generatora-parolei-v-python-ver?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 22:02:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Библиотека Tkinter</category>
			<description>В этом видео мы улучшим нашу созданную программу для генерации паролей на языке программирования Python.</description>
			<turbo:content>
<![CDATA[<header><h1>Создание генератора паролей в Python — Version 2.0</h1></header><div class="t-redactor__text">В этом видео мы улучшим нашу созданную программу для генерации паролей на языке программирования Python.</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/0KpJ_W5XABw" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Знакомство с фреймворком Django</title>
			<link>https://www.easyitway.com/tpost/o15a59m1p1-znakomstvo-s-freimvorkom-django</link>
			<amplink>https://www.easyitway.com/tpost/o15a59m1p1-znakomstvo-s-freimvorkom-django?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 22:35:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Фреймворк Django</category>
			<description>Django — это программный каркас с богатыми возможностями, подходящий для разработки сложных сайтов и веб-приложений, написанный на языке программирования Python.</description>
			<turbo:content>
<![CDATA[<header><h1>Знакомство с фреймворком Django</h1></header><div class="t-redactor__text">С данной статьи мы начинаем большой курс по написанию собственного сайта на Django. Для начала познакомимся с данным фреймворком, установим и проверим работоспособность отладочного веб-сервера.</div><div class="t-redactor__text"><a href="https://www.djangoproject.com/" target="_blank" rel="noreferrer noopener"><strong>Django</strong></a> — это программный каркас с богатыми возможностями, подходящий для разработки сложных сайтов и веб-приложений, написанный на языке программирования Python.</div><div class="t-redactor__text">Django — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC. Проект поддерживается организацией Django Software Foundation.</div><div class="t-redactor__text"><strong>Model-View-Controller</strong> (MVC, «Модель-Представление-Контроллер», «Модель-Вид-Контроллер») — схема разделения данных приложения, пользовательского интерфейса и управляющей логики на три отдельных компонента: модель, представление и контроллер — таким образом, что модификация каждого компонента может осуществляться независимо.</div><div class="t-redactor__text">Сайт на Django строится из одного или нескольких приложений, которые рекомендуется делать отчуждаемыми и подключаемыми.</div><div class="t-redactor__text">Один из основных принципов фреймворка — <strong>DRY</strong>.</div><div class="t-redactor__text"><strong>Don’t repeat yourself, DRY</strong> (не повторяйся) — это принцип разработки программного обеспечения, нацеленный на снижение повторения информации различного рода, особенно в системах со множеством слоёв абстрагирования.</div><div class="t-redactor__text">Django проектировался для работы под управлением Apache (с модулем mod_python) и с использованием PostgreSQL в качестве базы данных.</div><div class="t-redactor__text">В настоящее время, помимо PostgreSQL, Django может работать с другими СУБД: MySQL (MariaDB), SQLite, Microsoft SQL Server, DB2, Firebird, SQL Anywhere и Oracle.</div><div class="t-redactor__text">Для работы с базой данных Django использует собственный ORM, в котором модель данных описывается классами Python, и по ней генерируется схема базы данных.</div><div class="t-redactor__text">Веб-фреймворк Django используется в таких крупных и известных сайтах, как Instagram, Disqus, Mozilla, The Washington Times, Pinterest, lamoda.</div><div class="t-redactor__text">Некоторые возможности Django:</div><div class="t-redactor__text"><ol><li>ORM, API доступа к БД с поддержкой транзакций;</li><li>встроенный интерфейс администратора, с уже имеющимися переводами на многие языки;</li><li>диспетчер URL на основе регулярных выражений;</li><li>расширяемая система шаблонов с тегами и наследованием;</li><li>система кеширования;</li><li>интернационализация;</li><li>подключаемая архитектура приложений, которые можно устанавливать на любые Django-сайты;</li><li>«generic views» — шаблоны функций контроллеров;</li><li>авторизация и аутентификация, подключение внешних модулей аутентификации: LDAP, OpenID и прочие;</li><li>система фильтров («middleware») для построения дополнительных обработчиков запросов, как например включённые в дистрибутив фильтры для кеширования, сжатия, нормализации URL и поддержки анонимных сессий;</li><li>библиотека для работы с формами (наследование, построение форм по существующей модели БД);</li><li>встроенная автоматическая документация по тегам шаблонов и моделям данных, доступная через административное приложение.</li></ol></div><h4  class="t-redactor__h4">Установка Django</h4><div class="t-redactor__text">Начиная с версии Python 3.4, в составе исполняющей среды языка поставляется утилита <strong>pip</strong>, с помощью которой очень удобно выполнять установку дополнительных библиотек.</div><div class="t-redactor__text">Чтобы установить django на компьютер необходимо запустить командную строку (от имени администратора) и ввести команду:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">pip install django</code></pre><div class="t-redactor__text">Помимо Django, эта команда установит также библиотеку pytz, выполняющую обработку значений даты и времени с учетом временных зон и используемую в фреймворке.</div><h4  class="t-redactor__h4">Проект Django</h4><div class="t-redactor__text">После установки Django необходимо создать новый проект. Проектом называется совокупность всего программного кода, составляющего разрабатываемый сайт.</div><div class="t-redactor__text">Физически он представляет собой папку, в котором находятся разнообразные файлы с исходным кодом. Зайдите в командную строку и перейдите в папку, в которой должна находиться папка проекта. В командной строке введите команду:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">django-admin startproject projectDjango</code></pre><div class="t-redactor__text">Утилита <strong>django-admin</strong> служит для выполнения разнообразных административных задач. Команда <strong>startproject</strong> указывает ей создать новый проект с именем, записанным после этой команды.</div><div class="t-redactor__text">В папке с проектом будет создана структура файлов. Рассмотрим их подробнее:</div><div class="t-redactor__text"><strong>manage.py</strong> — программный файл с кодом одноименной утилиты, с использованием которой производятся различные действия над самим проектом.</div><div class="t-redactor__text">Внутренняя папка <strong>projectDjango</strong> — формирует пакет языка Python, содержащий модули, которые относятся к проекту целиком и задают его конфигурацию (ключевые настройки). Название этого пакета совпадает с названием проекта и менять его не стоит.</div><div class="t-redactor__text">В данном пакете лежат файлы:</div><div class="t-redactor__text"><strong>__init.py__</strong> — пустой файл, сообщающий Python, что папка, в которой он находится, является полноценным пакетом.</div><div class="t-redactor__text"><strong>settings.py</strong> — модуль с настройками самого проекта. Включает описание конфигурации базы данных проекта, пути ключевых папок, важные параметры, связанные с безопасностью.</div><div class="t-redactor__text"><strong>urls.py</strong> — модуль с маршрутами уровня проекта.</div><div class="t-redactor__text"><strong>wsgi.py</strong> — модуль, связывающий проект с веб-сервером. Используется при публикации готового сайта в Интернете.</div><div class="t-redactor__text"><strong>asgi.py</strong> — модуль предназначенный для обеспечения стандартного интерфейса между асинхронными веб-серверами Python, фреймворками и приложениями.</div><div class="t-redactor__text">Проект Django можно поместить в любое место файловой системы компьютера.</div><h4  class="t-redactor__h4">Отладочный веб-сервер Django</h4><div class="t-redactor__text">В состав Django входит отладочный веб-сервер, написанный на языке Python, не требующий сложной настройки и всегда готовый к работе.</div><div class="t-redactor__text">Чтобы запустить веб-сервер необходимо запустить командную строку в папке проекта и отдать команду:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">manage.py runserver</code></pre><img src="https://static.tildacdn.com/tild6137-6133-4961-b166-363139346465/django_fr_2.jpg"><div class="t-redactor__text">Здесь мы пользуемся утилитой <strong>manage.py</strong>, сгенерированной программой <strong>django-admin</strong> при создании проекта.<br /><br />Команда <strong>runserver</strong> запускает отладочный веб-сервер. После выполнения команды в командной строке будет выведено сообщение:</div><img src="https://static.tildacdn.com/tild6331-6566-4139-b134-346130363838/django_fr_3.jpg"><div class="t-redactor__text">В данном сообщении видно, что сайт доступен по адресу <strong>«http://127.0.0.1:8000/»</strong> или <strong>«http://localhost:8000/»</strong>. Отладочный сервер по умолчанию работает через TCP-порт 8000 (при необходимости можно использовать другой).<br /><br />Запустим браузер и наберем адрес нашего сайта. Мы увидим информационную страничку, представленную самим Django с сообщением, что сайт, хоть еще и пуст, но работает:</div><img src="https://static.tildacdn.com/tild6635-3932-4961-b039-363535306466/django_fr_4-1024x549.jpg"><div class="t-redactor__text">Остановить отладочный веб-сервер можно, переключившись в экземпляр командной строки, в которой он был запущен, и нажать комбинацию клавиш <strong>«Ctrl + Break»</strong>.<br /><br />На этом первая статья по фреймворку Django подходит к завершению. Рекомендуем проделать все необходимые настройки и проверить свой проект на работоспособность. В последующих статьях по Django мы будем продолжать создавать наш проект.<br /><br />Видео по установке:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/pvq8UiC5zGI" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Создание Django-проекта в PyCharm</title>
			<link>https://www.easyitway.com/tpost/ci3nu9xyr1-sozdanie-django-proekta-v-pycharm</link>
			<amplink>https://www.easyitway.com/tpost/ci3nu9xyr1-sozdanie-django-proekta-v-pycharm?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 22:39:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Фреймворк Django</category>
			<description>В этом видео мы создадим Django-проект в программе PyCharm.</description>
			<turbo:content>
<![CDATA[<header><h1>Создание Django-проекта в PyCharm</h1></header><div class="t-redactor__text">В этом видео мы создадим Django-проект в программе PyCharm.</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/r-2xH5_MRws" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Фреймворк Django: Создаем первое приложение</title>
			<link>https://www.easyitway.com/tpost/2icd9371l1-freimvork-django-sozdaem-pervoe-prilozhe</link>
			<amplink>https://www.easyitway.com/tpost/2icd9371l1-freimvork-django-sozdaem-pervoe-prilozhe?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 22:40:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Фреймворк Django</category>
			<description>В этой статье мы продолжаем изучать фреймворк Django, а именно создадим свое первое приложение и выведем его в браузер используя отладочный веб-сервер.</description>
			<turbo:content>
<![CDATA[<header><h1>Фреймворк Django: Создаем первое приложение</h1></header><div class="t-redactor__text">В этой статье мы продолжаем изучать фреймворк Django, а именно создадим свое первое приложение и выведем его в браузер используя отладочный веб-сервер.</div><div class="t-redactor__text">Пустой проект не содержит никакой функциональности и поэтому в Django существует такое понятие как «Приложения».</div><h4  class="t-redactor__h4">Приложения</h4><div class="t-redactor__text">Приложение в Django – это web-приложение, которое предоставляет определенный функционал – например, web-блог, хранилище каких-то записей или простое приложение для голосования. Приложение может использоваться несколькими проектами.</div><div class="t-redactor__text">Каждое приложение Django состоит из пакета Python, который следует некоторым соглашениям. Django содержит команду, которая создает структуру для нового приложения, что позволяет вам сосредоточиться на написании кода, а не на создании каталогов.</div><div class="t-redactor__text">Для создания нового приложения остановим отладочный веб-сервер (если он включен). В командной строке проверим, находимся ли мы в папке проекта, и наберем команду:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">manage.py startapp btest</code></pre><div class="t-redactor__text">Команда <strong>startapp</strong> утилиты <strong>manage.py</strong> запускает создание нового «пустого» приложения, чье имя указано после этой команды.<br /><br />Утилита <strong>manage.py</strong> создала новый каталог и файлы:</div><img src="https://static.tildacdn.com/tild3463-6530-4630-b738-376634376130/django_apps_1.jpg"><div class="t-redactor__text"><ul><li><strong>migrations</strong> – папка вложенного пакета, в котором будут сохраняться модули сгенерированный Django миграций (в папке находится пустой файл __init__.py);</li><li><strong>__init__.py</strong> – пустой файл, сигнализирующий языку Python, что это папка – пакет;</li><li><strong>admin.py</strong> – модуль административных настроек и классов-редакторов;</li><li><strong>apps.py</strong> – модуль с настройками приложения;</li><li><strong>models.py</strong> – модуль с моделями;</li><li><strong>tests.py</strong> – модель с тестирующими процедурами;</li><li><strong>views.py</strong> – модуль с контроллерами.</li></ul>Теперь зарегистрируем только что созданное приложение в проекте. Найдем в пакете конфигурации файл <strong>settings.py</strong> и отыщем следующий фрагмент кода:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">INSTALLED_APPS = [
    &#039;django.contrib.admin&#039;,
    &#039;django.contrib.auth&#039;,
    &#039;django.contrib.contenttypes&#039;,
    &#039;django.contrib.sessions&#039;,
    &#039;django.contrib.messages&#039;,
    &#039;django.contrib.staticfiles&#039;,
]</code></pre><div class="t-redactor__text">Список, хранящийся в переменной <strong>INSTALLED_APPS</strong>, перечисляет все приложения, зарегистрированные в проекте и участвующие в его работе.<br /><br />Добавим в код наше приложение. Итоговый листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">INSTALLED_APPS = [
    &#039;django.contrib.admin&#039;,
    &#039;django.contrib.auth&#039;,
    &#039;django.contrib.contenttypes&#039;,
    &#039;django.contrib.sessions&#039;,
    &#039;django.contrib.messages&#039;,
    &#039;django.contrib.staticfiles&#039;,
    &#039;btest.apps.BtestConfig&#039;,
]</code></pre><div class="t-redactor__text">Обратим внимание на три важных момента. Во-первых, элемент списка приложений должен представлять собой строку с путем к классу <strong>BtestConfig</strong>, описывающему конфигурацию приложения и объявленному в файле <strong>apps.py</strong>, что хранится в пакете приложения.</div><div class="t-redactor__text">Во-вторых, этот путь указывается в том формате, в котором записываются пути к модулям в стандарте языка Python (т.е. разделяются точками).</div><div class="t-redactor__text">В-третьих, этот путь указывается относительно папки проекта. После изменения кода сохраните и закройте файл <strong>settings.py</strong>.</div><h4  class="t-redactor__h4">Представления</h4><div class="t-redactor__text">Функция представления, или коротко представление – это функция Python, которая принимает web-запрос и возвращает web-ответ. Ответом может быть HTML-содержимое страницы, или перенаправление, или 404 ошибка, или XML-документ, или что угодно.</div><div class="t-redactor__text">Давайте создадим свое первое представление. Откроем файл <strong>btest/views.py</strong>, удалим имеющийся там код и добавим следующий код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from django.http import HttpResponse

def index(request):
    return HttpResponse(&quot;Привет, программист! Это твое первое приложение. Поздравляем!&quot;)</code></pre><div class="t-redactor__text">Наше представление – это, собственно функция <strong>index()</strong>. Единственное, что она делает, — отправляет пользователю текстовое сообщение.</div><div class="t-redactor__text">Любая функция представления в качестве единственного обязательного параметра принимает экземпляр класса <strong>Httprequest</strong>, хранящий различные сведения о полученном запросе.</div><div class="t-redactor__text">В теле функции мы создаём экземпляр класса HttpResponse (он объявлен в модуле <strong>django.http</strong>), который будет представлять отправляемый клиенту ответ.</div><h4  class="t-redactor__h4">Маршруты</h4><div class="t-redactor__text">Чтобы вызвать представление, нам нужно назначить его на какой-то URL через конфигурацию URL-ов.</div><div class="t-redactor__text">Чтобы добавить настройки URL-ов в приложение, создадим файл <strong>urls.py</strong> в пакете этого приложения (т.е. в папке btest) и запишем в него код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from django.urls import path
from .views import index

urlpatterns = [
    path(&#039;&#039;, index),
]</code></pre><div class="t-redactor__text">Пустая строка, переданная первым параметром в функцию <strong>path()</strong>, обозначает корень пути из маршрута предыдущего уровня вложенности (родительского). Сохраним и закроем файл <strong>urls.py</strong>.<br /><br />Чтобы при наборе Интернет-адреса <strong>«http://localhost:8000/btest/»</strong> запускался только что написанная функция представления index(), нам нужно связать таковой с шаблонным адресом <strong>btest/</strong>.<br /><br />Найдем в пакете конфигурации файл <strong>urls.py</strong>. Откроем файл и найдем код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from django.contrib import admin
from django.urls import path

urlpatterns = [
    path(&#039;admin/&#039;, admin.site.urls),
]</code></pre><div class="t-redactor__text">В данном коде содержится список маршрутов, оформленный в виде обычного списка Python, и присваивается переменной <strong>urlpatterns</strong>.<br /><br />Каждый элемент списка маршрутов (т.е. каждый маршрут) должен представляться в виде результата, возвращаемого функцией <strong>path()</strong> из модуля <strong>Django.urls</strong>.<br /><br />Добавим в список новый маршрут. Листинг будет выглядеть так:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path(&#039;btest/&#039;, include(&#039;btest.urls&#039;)),
    path(&#039;admin/&#039;, admin.site.urls),
]</code></pre><div class="t-redactor__text">Вложенный список маршрутов, указываемый во втором параметре функции <strong>path()</strong>, должен представлять собой результат, возвращенный функцией <strong>include()</strong> из модуля <strong>django.urls</strong>.<br /><br />Единственным параметром эта функция принимает строку с путем к модулю, где записан список маршрутов.<br /><br />Сохраняем все файлы и запускам отладочный web-сервер.<br /><br />Набрав в браузере строку <strong>«http://localhost:8000/btest/»</strong>, мы попадем на страницу с нашим сообщением:</div><img src="https://static.tildacdn.com/tild3933-3433-4131-b761-396533633532/django_apps_2.jpg"><div class="t-redactor__text">Если всё правильно сделали, тогда в браузере должно появится данное сообщение. Поздравляем! Вы создали своё первое приложение на Django.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Модели и миграции в Django</title>
			<link>https://www.easyitway.com/tpost/7cbtr9vur1-modeli-i-migratsii-v-django</link>
			<amplink>https://www.easyitway.com/tpost/7cbtr9vur1-modeli-i-migratsii-v-django?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 22:43:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Фреймворк Django</category>
			<description>Модель — это однозначное и исчерпывающее описание сущности, хранящейся в базе данных в виде класса Python.</description>
			<turbo:content>
<![CDATA[<header><h1>Модели и миграции в Django</h1></header><h4  class="t-redactor__h4">Модели</h4><div class="t-redactor__text">Модель — это однозначное и исчерпывающее описание сущности, хранящейся в базе данных в виде класса Python.</div><div class="t-redactor__text">Класс модели описывает таблицу базы данных, в которой будет храниться набор сущностей, и содержит атрибуты класса (в других языках программирования их называют свойствами класса, или статическими свойствами), каждый из которых описывает одно из полей этой таблицы.</div><div class="t-redactor__text">Отдельный экземпляр класса представляет отдельную конкретную сущность, извлеченную из базы данных, т.е. отдельную запись соответствующей таблицы.</div><div class="t-redactor__text">Помимо этого, класс модели предоставляет инструменты для выборки сущностей из базы данных, их фильтрации и сортировки на основе заданных критериев. Полученный результат представляется в виде последовательности экземпляров класса модели.</div><div class="t-redactor__text">Модели объявляются на уровне приложения. Объявляющий их код должен записываться в модуль <strong>models.py</strong> пакета приложения. Для примера, объявим модель <strong>«Bb»</strong>, которая будет представлять объявление со следующими полями:</div><div class="t-redactor__text"><ul><li><strong>title</strong> — заголовок объявления, содержащий название продаваемого товара (тип — строковый, длина — 50 символов). Поле, обязательное к заполнению;</li><li><strong>content</strong> — текст объявления, описание товара (тип — memo);</li><li><strong>price</strong> — цена (тип — вещественное число);</li><li>published — дата публикации (тип — дата и время, значение по умолчанию — текущие дата и время, индексированное).</li></ul></div><div class="t-redactor__text">В нашем прошлом проекте откроем модуль <strong>models.py</strong> пакета приложения <strong>«btest»</strong> и запишем в него код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from django.db import models

class Bb(models.Model):
  title = models.CharField(max_length=50)
  content = models.TextField(null=True, blank=True)
  price = models.FloatField(null=True, blank=True)
  published = models.DateTimeField(auto_now_add=True, db_index=True)</code></pre><div class="t-redactor__text">Модель должна быть подклассом класса <strong>Model</strong> из модуля <strong>django.db.models</strong>. Рассмотрим использованные нами классы полей и их параметры:<br /><br /><ul><li><strong>CharField</strong> — обычное строковое поле фиксированной длины;</li><li><strong>TextField</strong> — текстовое поле неограниченной длины, или memo-поле. Присвоив параметрам <strong>null</strong> и <strong>blank</strong> конструктора значения <strong>True</strong>, мы укажем, что это поле можно не заполнять;</li><li><strong>FloatField</strong> — поле хранения вещественных чисел;</li><li><strong>DateTimeField</strong> — поле для хранения отметки даты и времени. Присвоив параметру <strong>auto_now_add</strong> конструктора значения <strong>True</strong>. Параметр <strong>db_index</strong> при присваивании ему значения <strong>True</strong> укажет создать для этого поля индекс.</li></ul><br />После написания кода сохраним файл. Далее с помощью миграции мы создадим в базе данных необходимые структуры.<br /><br />По умолчанию созданный проект Django настроен на использование базы данных в формате <a href="https://www.sqlite.org/index.html" target="_blank" rel="noreferrer noopener">SQLite</a>, хранящейся в файле db.sqlite3 в папке проекта. Данная база данных будет создана при первом запуске отладочного web-сервера.<br /><br />Для работы с базами данных в проекте Django в файле settings.py определен параметр DATABASES, который по умолчанию выглядит следующим образом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DATABASES = {
    &#039;default&#039;: {
        &#039;ENGINE&#039;: &#039;django.db.backends.sqlite3&#039;,
        &#039;NAME&#039;: os.path.join(BASE_DIR, &#039;db.sqlite3&#039;),
    }
}</code></pre><div class="t-redactor__text">Конфигурация используемой базы данных в данном случае складывается из двух параметров. Параметр <strong>ENGINE</strong> указывает на используемый движок для доступа к БД.<br /><br />В данном случае это встроенный пакет <strong>django.db.backends.sqlite3</strong>. Второй параметр — <strong>NAME</strong> указывает на путь к базе данных.<br /><br />Чтобы использовать другие системы управления базами данных, необходимо будет установить соответствующий пакет:</div><img src="https://static.tildacdn.com/tild6263-3061-4633-b035-303663623532/migration_django_6.png"><h4  class="t-redactor__h4">Миграции</h4><div class="t-redactor__text">Миграция — это модуль Python, созданный самим Django на основе определенной модели и предназначенный для формирования в базе данных всех требуемых этой моделью структур.</div><div class="t-redactor__text">Для формирования миграции на основе модели <strong>«Bb»</strong> перейдем в командную строку нашего проекта, и дадим команду:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">manage.py makemigrations btest</code></pre><div class="t-redactor__text">Команда <strong>makemigrations</strong> утилиты <strong>manage.py</strong> запускает генерирование миграций для всех моделей, объявленных в приложении, чье имя записано после команды, и не изменившихся с момента предыдущего генерирования миграций.</div><img src="https://static.tildacdn.com/tild6339-3632-4136-a534-353139323438/migration_django.png"><div class="t-redactor__text">Сформированные таким образом модули с миграциями сохраняются в пакете <strong>migrations</strong>, находящемся в пакете приложения. Модуль с кодом нашей первой миграции будет иметь имя <strong>0001_initial.py</strong>. Откроем его и просмотрим код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name=&#039;Bb&#039;,
            fields=[
                (&#039;id&#039;, models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name=&#039;ID&#039;)),
                (&#039;title&#039;, models.CharField(max_length=50)),
                (&#039;content&#039;, models.TextField(blank=True, null=True)),
                (&#039;price&#039;, models.FloatField(blank=True, null=True)),
                (&#039;published&#039;, models.DateTimeField(auto_now_add=True, db_index=True)),
            ],
        ),
    ]</code></pre><div class="t-redactor__text">Миграция при выполнении порождает команды на языке SQL, которые будут отправлены СУБД, и, собственно, выполняет все действия по созданию необходимых структур данных. Посмотрим на результирующий SQL-код нашей миграции через командную строку:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">manage.py sqlmigrate btest 0001</code></pre><div class="t-redactor__text">Результат команды:</div><img src="https://static.tildacdn.com/tild3338-6534-4865-a463-336437316435/migration_django_2.png"><div class="t-redactor__text">Первое выполнение миграций рекомендуется производить для всех приложений, входящих в проект. Для этого наберём в командной строке команду выполнения всех миграций всех приложений проекта:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">manage.py migrate</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild6561-6137-4564-a436-346232373237/migration_django_3.png"><h4  class="t-redactor__h4">Консоль Django</h4><div class="t-redactor__text">Фреймворк включает в свой состав собственную редакцию консоли Python Shell, называемую консолью Django. Для её запуска напишем в командной строке команду для запуска консоли:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">manage.py shell</code></pre><h4  class="t-redactor__h4">Работа с моделями</h4><div class="t-redactor__text">Создадим первое объявление — первую запись модели Bb:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from btest.models import Bb
b1 = Bb(title=&#039;Дом&#039;, content=&#039;ООО &quot;Агент&quot;. Два этажа, кирпич, свет, газ, канализация&#039;, price=10000000)</code></pre><div class="t-redactor__text">Созданная таким образом запись модели не сохраняется в базе данных. а существует только в оперативной памяти. Чтобы сохранить её, достаточно вызвать у неё метод save() без параметров:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">b1.save()</code></pre><div class="t-redactor__text">Проверить сохранилось ли первое объявление можно, получив значение ключевого поля:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">b1.pk

#Выведет: 1</code></pre><div class="t-redactor__text">Атрибут класса pk, поддерживаемый всеми моделями, хранит значение ключевого поля текущей записи. Это значение может быть получено только после того, как запись модели успешно сохранится в базе данных.<br /><br />Можно обратиться к любому полю записи, воспользовавшись соответствующим ему атрибутом класса модели. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">b1.title

#Выведет: &#039;Дом&#039;</code></pre><div class="t-redactor__text">Для закрепления материала создадите еще несколько объявлений. Пример:</div><img src="https://static.tildacdn.com/tild3133-3635-4663-b031-663130306565/migration_django_4.png"><div class="t-redactor__text">Другой вариант добавления:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Bb.objects.create(title=&#039;Дача&#039;, content=&#039;Один этаж. Брус.&#039;, price=100000000)</code></pre><div class="t-redactor__text">Все классы моделей поддерживают атрибут класса <strong>objects</strong>. Он хранит диспетчер записей — особую структуру, позволяющую манипулировать всей совокупностью имеющихся в модели записей. Диспетчер записей представляется экземпляром класса Manager.<br /><br />Метод <strong>create()</strong> диспетчера записей создает новую запись модели, принимая в качестве набора именованных параметров значения её полей. При этом он сразу же сохраняет созданную запись и возвращает её в качестве результата.<br /><br />За удаление записей отвечает метод <strong>delete()</strong>.<br /><br />После добавления записей выйдем из консоли Django набрав команду:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">exit()</code></pre><div class="t-redactor__text">Откроем модуль <strong>views.py</strong> пакета приложения <strong>«btest»</strong> и исправим код для вывода наших объявлений:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from django.http import HttpResponse
from .models import Bb

def index(request):
  s = &#039;Список объявлений\r\n\r\n\r\n&#039;
  for bb in Bb.objects.order_by(&#039;-published&#039;):
    s += bb.title + &#039;\r\n&#039; + bb.content + &#039;\r\n\r\n&#039;
  return HttpResponse(s, content_type=&#039;text/plain; charset=utf-8&#039;)</code></pre><div class="t-redactor__text">Список объявлений мы представили в виде обычного текста, разбитого на строки последовательностью специальных символов возврата каретки и перевода строки: \r\n. <strong>order_by</strong> сортирует записи по убыванию даты.<br /><br />При создании экземпляра класса <strong>HttpResponse</strong>, представляющего отсылаемый клиенту ответ, мы в именованном параметре content_type конструктора указали тип отправляемых данных: обычный текст, набранный в кодировке UTF-8 (если этого не сделать, браузер посчитает текст HTML-кодом и выведет его одной строкой).<br /><br />Сохраним исправляемый файл и запустим отладочный web-сервер с помощью команды <strong>«manage.py runserver»</strong>. Результат:</div><img src="https://static.tildacdn.com/tild3734-6333-4633-a362-613565633064/migration_django_5.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Создание и использование шаблонов в Django</title>
			<link>https://www.easyitway.com/tpost/c7rmrcrdg1-sozdanie-i-ispolzovanie-shablonov-v-djan</link>
			<amplink>https://www.easyitway.com/tpost/c7rmrcrdg1-sozdanie-i-ispolzovanie-shablonov-v-djan?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 22:49:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Фреймворк Django</category>
			<description>Шаблоны (template) отвечают за формирование внешнего вида приложения. Они предоставляют специальный синтаксис, который позволяет внедрять данные в код HTML.</description>
			<turbo:content>
<![CDATA[<header><h1>Создание и использование шаблонов в Django</h1></header><div class="t-redactor__text">Шаблоны (template) отвечают за формирование внешнего вида приложения. Они предоставляют специальный синтаксис, который позволяет внедрять данные в код HTML.<br /><br />Подсистема Django, называется шаблонизатором, загружает шаблон, объединяет его с данными, извлеченными из моделей, полученными от посетителя или сгенерированными в процессе работы, и формирует на основе всего этого полноценный документ, который и отправляется клиенту.<br /><br />Директивы указывают поместить в заданное место HTML-кода какое-либо значение, теги управляют генерированием содержимого результирующего документа, а фильтры выполняют какие-либо преобразования указанного значения перед выходом.<br /><br />По умолчанию шаблонизатор ищет все шаблоны в папках <strong>«templates»</strong>, вложенных в папках пакетов приложений. Файлы шаблонов должны иметь расширение <strong>html</strong>.<br /><br />Нам надо указать, что этот каталог будет использоваться в качестве хранилища шаблонов. Для этого откроем файл <strong>settings.py</strong> в папке нашего проекта. В этом файле настройка шаблонов производится с помощью переменной <strong>TEMPLATES</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">TEMPLATES = [
    {
        &#039;BACKEND&#039;: &#039;django.template.backends.django.DjangoTemplates&#039;,
        &#039;DIRS&#039;: [],
        &#039;APP_DIRS&#039;: True,
        &#039;OPTIONS&#039;: {
            &#039;context_processors&#039;: [
                &#039;django.template.context_processors.debug&#039;,
                &#039;django.template.context_processors.request&#039;,
                &#039;django.contrib.auth.context_processors.auth&#039;,
                &#039;django.contrib.messages.context_processors.messages&#039;,
            ],
        },
    },
]</code></pre><div class="t-redactor__text">Параметр <strong>DIRS</strong> задает набор каталогов, которые хранят шаблоны. Но по умолчанию он пуст. Теперь изменим данный кусок кода следующим образом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">TEMPLATE_DIR = os.path.join(BASE_DIR, &quot;templates&quot;)
TEMPLATES = [
    {
        &#039;BACKEND&#039;: &#039;django.template.backends.django.DjangoTemplates&#039;,
        &#039;DIRS&#039;: [TEMPLATE_DIR,],
        &#039;APP_DIRS&#039;: True,
        &#039;OPTIONS&#039;: {
            &#039;context_processors&#039;: [
                &#039;django.template.context_processors.debug&#039;,
                &#039;django.template.context_processors.request&#039;,
                &#039;django.contrib.auth.context_processors.auth&#039;,
                &#039;django.contrib.messages.context_processors.messages&#039;,
            ],
        },
    },
]</code></pre><div class="t-redactor__text">После настроек создадим в папке пакета приложения <strong>«btest»</strong> папку <strong>«templates»</strong>, а в ней — вложенную папку <strong>«btest»</strong>.<br /><br />Затем в папке <strong>«templates\btest»</strong> определим новый файл <strong>index.html</strong> со следующим кодом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ru&quot;&gt;
&lt;head&gt;
	&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html&quot; charset=&quot;UTF-8&quot;&gt;
	&lt;title&gt;Главная - Доска объявлений&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;h1&gt;Объявления&lt;/h1&gt;
	{% for bb in bbs %}
	&lt;div&gt;
		&lt;h2&gt;{{ bb.title }}&lt;/h2&gt;
		&lt;p&gt;{{ bb.content }}&lt;/p&gt;
		&lt;p&gt;{{ bb.published|date:&quot;d.m.Y. H:i:s&quot;}}&lt;/p&gt;
	&lt;/div&gt;
	{% endfor %}
&lt;/body&gt;
&lt;/html&gt;</code></pre><div class="t-redactor__text">Теги языка гипертекстовой разметки вы должны изучить самостоятельно, а вот теги шаблонизаторов мы рассмотрим подробнее. Начнем с тега:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">{% for bb in bbs %}
...
{% endfor %}</code></pre><div class="t-redactor__text">По назначению он аналогичен циклу <strong>for…in</strong> языка Python.<br /><br />На каждом проходе он извлекает из последовательности, хранящейся в переменной <strong>bbs</strong>, очередной элемент, заносит его в переменную <strong>bb</strong> и делает её доступной в своём теле.<br /><br />Познакомимся с директивой шаблонизатора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">{{ bb.title }}</code></pre><div class="t-redactor__text">Она указывает извлечь значение из атрибута <strong>title</strong> объекта, хранящегося в созданной упомянутым ранее тегом переменной <strong>bb</strong>, и вставить это значение в то место кода, в котором находится она сама.<br /><br />Фильтр <strong>date</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;p&gt;{{ bb.published|date:&quot;d.m.Y. H:i:s&quot;}}&lt;/p&gt;</code></pre><div class="t-redactor__text">Он преобразует значение из атрибута <strong>published</strong> объекта, хранящегося в переменной <strong>bb</strong>, т.е. дату и время публикации объявления, в формат, собственно, даты и времени.<br /><br />Теперь используем нашу страницу <strong>«index.html»</strong> для отправки ответа пользователю. И для этого перейдем в приложении <strong>btest</strong> к файлу <strong>views.py</strong>, который определяет функции для обработки запроса. Изменим этот файл следующим образом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from .models import Bb
from django.shortcuts import render
 
def index(request):
    bbs = Bb.objects.order_by(&#039;-published&#039;)
    return render(request, &quot;btest/index.html&quot;, {&#039;bbs&#039;: bbs})</code></pre><div class="t-redactor__text">Функция-сокращение <strong>render()</strong> из модуля django.shortcuts позволяет выполнить рендеринг шаблона в одном выражении.<br /><br />В файле <strong>urls.py</strong> в главном проекте отредактируем сопоставление функции <strong>index</strong> с запросом к корню веб-приложения:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from django.contrib import admin
from django.urls import path, include
from btest import views

urlpatterns = [
    path(&#039;&#039;, views.index),
    path(&#039;admin/&#039;, admin.site.urls),
]</code></pre><div class="t-redactor__text">Запустим отладочный web-сервер и проверим наш сайт по ссылке <strong>«http://localhost:8000»</strong>. Результат:</div><img src="https://static.tildacdn.com/tild3930-3565-4231-a437-626537326438/template_django-1.png"><h4  class="t-redactor__h4">TemplateResponse</h4><div class="t-redactor__text">Для генерации шаблона мы применяли функцию <strong>render()</strong>, которая является наиболее распространенным вариантом. Однако также мы можем использовать класс <strong>TemplateResponse</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from .models import Bb
from django.template.response import TemplateResponse
 
def index(request):
    bbs = Bb.objects.order_by(&#039;-published&#039;)
    return TemplateResponse(request,  &quot;btest/index.html&quot;, {&#039;bbs&#039;: bbs})</code></pre><div class="t-redactor__text">После применения класса <strong>TemplateResponse</strong> проверьте работоспособность нашего сайта. Результат будет прежний.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Административный web-сайт Django</title>
			<link>https://www.easyitway.com/tpost/k7hb4afr61-administrativnii-web-sait-django</link>
			<amplink>https://www.easyitway.com/tpost/k7hb4afr61-administrativnii-web-sait-django?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 23:10:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Фреймворк Django</category>
			<description>Административный web-сайт предоставляет доступ ко всем моделям, объявленным во всех приложениях, что составляют проект. С помощью данной панели можно просматривать, добавлять, править и удалять записи, выполнять фильтрацию и сортировку.</description>
			<turbo:content>
<![CDATA[<header><h1>Административный web-сайт Django</h1></header><div class="t-redactor__text">Административный web-сайт предоставляет доступ ко всем моделям, объявленным во всех приложениях, что составляют проект. С помощью данной панели можно просматривать, добавлять, править и удалять записи, выполнять фильтрацию и сортировку.</div><div class="t-redactor__text">Эта подсистема реализована в стандартном приложении <strong>django.contrib.auth</strong>. За работу административного web-сайта отвечает стандартное приложение <strong>django.contrib.admin</strong>. данные приложения заносятся в список зарегистрированных в проекте изначально.</div><h4  class="t-redactor__h4">Создание пользователя</h4><div class="t-redactor__text">Чтобы успешно задействовать встроенные средства разграничения доступа Django, нужно хотя бы один раз произвести операцию по выполнению миграций. В прошлых статьях по Django мы это уже сделали.</div><div class="t-redactor__text">После этого необходимо создать зарегистрированного пользователя сайта с максимальными правами — суперпользователя. Для этого запустим командную строку из нашего проекта и наберем команду:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">manage.py createsuperuser</code></pre><div class="t-redactor__text">Далее утилита manage.py запросит имя, адрес электронной почты и пароль (минимум 8 символов):</div><img src="https://static.tildacdn.com/tild3561-6264-4264-a132-306133383035/admin_panel_django_1.png"><h4  class="t-redactor__h4">Смена языка для административной панели</h4><div class="t-redactor__text">Для смены языка откроем модуль <strong>settings.py</strong> пакета конфигурации нашего проекта и найдем в нём код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">LANGUAGE_CODE = &#039;en-us&#039;</code></pre><div class="t-redactor__text">Переменная <strong>LANGUAGE_CODE</strong> задает код языка, используемого при выводе системных сообщений и страниц административного сайта. Исправим это выражение, занеся в него код российского русского языка:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">LANGUAGE_CODE = &#039;ru-ru&#039;</code></pre><h4  class="t-redactor__h4">Добавление приложения в административную панель</h4><div class="t-redactor__text">Чтобы наше созданное ранее приложение <strong>«btest»</strong> появилось в списке административного сайта, его нужно зарегистрировать там.</div><div class="t-redactor__text">Для этого откроем модуль административных настроек <strong>admin.py</strong> пакета приложения <strong>«btest»</strong> и заменим имеющийся в нём код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from django.contrib import admin
from .models import Bb
admin.site.register(Bb)</code></pre><div class="t-redactor__text">В новом коде мы вызвали метод <strong>register()</strong> у экземпляра <strong>AdminSite</strong>, представляющего сам административный сайт и хранящегося в переменной <strong>site</strong> модуля <strong>django.contrib.admin</strong>. Этому методу мы передали в качестве параметра ссылку на класс нашей модели <strong>Bb</strong>.</div><h4  class="t-redactor__h4">Запуск административной панели</h4><div class="t-redactor__text">Для запуска административной панели необходимо запустить отладочный web-сервер и прописать в браузере интернет-адрес: <strong>http://localhost:8000/admin/</strong>. После этого будет выведена страница входа с формой, в которой нужно набрать введенные при создании суперпользователя имя и пароль и нажать кнопку <strong>«Вход»</strong>:</div><img src="https://static.tildacdn.com/tild3339-6466-4032-a161-306534343161/admin_panel_django_2.png"><div class="t-redactor__text">Если вы все правильно ввели, то увидите страницу со списком приложений зарегистрированных в проекте и объявляющих какие-либо модели. Наше добавленное приложение присутствует в панели:</div><img src="https://static.tildacdn.com/tild3033-3635-4531-b134-623336616565/admin_panel_django_4.png"><h4  class="t-redactor__h4">Добавление новых записей</h4><div class="t-redactor__text">Каждое название модели в списке представляет собой гиперссылку, щелкнув на которой, мы попадем на страницу списка записей этой модели. Зайдем в нашу модель <strong>Bb</strong>:</div><img src="https://static.tildacdn.com/tild3935-6335-4366-b438-636138663431/admin_panel_django_5.png"><div class="t-redactor__text">В данном окне можно добавить новую новую запись или удалить существующую. Давайте добавим новое объявление на наш сайт. Для этого нажмем на кнопку <strong>«Добавить»</strong> справа в административной панели:</div><img src="https://static.tildacdn.com/tild6134-3439-4435-a131-363432393732/admin_panel_django_6.jpg"><div class="t-redactor__text">Для сохранения объявления необходимо нажать на кнопку «Сохранить». После сохранения зайдем на наш сайт по ссылке: <strong>http://localhost:8000</strong>. На нашем сайте появилось новое объявление:</div><img src="https://static.tildacdn.com/tild3330-3630-4762-b636-313966346139/admin_panel_django_7.jpg"><div class="t-redactor__text">На этом наша статья закончена. Теперь можно добавлять наши объявления с помощью формы в административной панели нашего сайта на фремворке Django. Добавить нового пользователя можно с помощью модели <strong>«Пользователи»</strong>:</div><img src="https://static.tildacdn.com/tild6531-3233-4638-b837-393366343339/admin_panel_django_8.jpg">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Параметры полей и моделей</title>
			<link>https://www.easyitway.com/tpost/clthn14e51-parametri-polei-i-modelei</link>
			<amplink>https://www.easyitway.com/tpost/clthn14e51-parametri-polei-i-modelei?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 23:14:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Фреймворк Django</category>
			<description>Для того, чтобы наша административная панель Django выглядела более понятна для обычного пользователя необходимо указать правильные названия полей.</description>
			<turbo:content>
<![CDATA[<header><h1>Параметры полей и моделей</h1></header><div class="t-redactor__text">Для того, чтобы наша административная панель Django выглядела более понятна для обычного пользователя необходимо указать правильные названия полей.<br /><br />Наша созданная модель представляется непонятной аббревиатурой <strong>«Bbs»</strong>, а не простым и ясным текстом <strong>«Объявления»</strong>. Откроем модуль <strong>«models.py»</strong> пакета приложения <strong>«btest»</strong>. В написанный код необходимо ввести несколько поправок:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from django.db import models

class Bb(models.Model):
  title = models.CharField(max_length=50, verbose_name=&#039;Товар&#039;)
  content = models.TextField(null=True, blank=True, verbose_name=&#039;Описание&#039;)
  price = models.FloatField(null=True, blank=True, verbose_name=&#039;Цена&#039;)
  published = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name=&#039;Опубликовано&#039;)
  
  class Meta:
    verbose_name_plural = &#039;Объявления&#039;
    verbose_name = &#039;Объявление&#039;
    ordering = [&#039;-published&#039;]</code></pre><div class="t-redactor__text">В вызове каждого конструктора класса поля мы добавили именованный параметр <strong>verbose_name</strong>. Он указывает <strong>«человеческое»</strong> название поля, которое будет выводится на экран.<br /><br />Далее, в классе модели мы объявили вложенный класс <strong>«Meta»</strong>, а в нём — атрибуты класса, которые зададут параметры уже самой модели:<br /><br /><ul><li><strong>verbose_name_plural</strong> — название модели во множественном числе;</li><li><strong>verbose_name</strong> — название модели в единственном числе;</li><li><strong>ordering</strong> — последовательность полей, по которым по умолчанию будет выполняться сортировка записей.</li></ul><br />После исправления кода сохраните его. Теперь можно исправить код контроллера <strong>index()</strong>. Он объявлен в модуле <strong>views.py</strong> пакета приложения, убрав из выражения, извлекающего список записей, указание сортировки:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from .models import Bb
from django.shortcuts import render
 
def index(request):
    bbs = Bb.objects.all()
    return render(request, &quot;btest/index.html&quot;, {&#039;bbs&#039;: bbs})</code></pre><div class="t-redactor__text">Сохраним код и запустим отладочный web-сервер. Зайдем по ссылке <strong>«http://localhost:8000/admin»</strong> и проверим наши исправления:</div><img src="https://static.tildacdn.com/tild3963-3236-4264-a434-363537636161/param_models_admin_p.png"><img src="https://static.tildacdn.com/tild6163-3232-4465-a430-626263663361/param_models_admin_p.png"><img src="https://static.tildacdn.com/tild6666-6362-4235-b431-353832393438/param_models_admin_p.png"><div class="t-redactor__text">Все получилось, но на странице списка записей все позиции представляются строками вида <strong>«имя класса модели object значение ключа»</strong>, из которых невозможно понять, что же хранится в каждой из этих записей.<br /><br />Данную проблему можно исправить в модуле административных настроек <strong>«admin.py»</strong> пакета приложения. Откроем его и заменим имеющийся в нем код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from django.contrib import admin
from .models import Bb

class BbAdmin(admin.ModelAdmin):
  list_display = (&#039;title&#039;, &#039;content&#039;, &#039;price&#039;, &#039;published&#039;)
  list_display_links = (&#039;title&#039;, &#039;content&#039;)
  search_fields = (&#039;title&#039;, &#039;content&#039;, &#039;price&#039;, &#039;published&#039;)

admin.site.register(Bb, BbAdmin)</code></pre><div class="t-redactor__text">Редактор <strong>BbAdmin</strong> объявляется как подкласс класса <strong>ModelAdmin</strong> из модуля <strong>django.contrib.admin</strong>. Он содержит набор атрибутов класса, которые и задают параметры представления модели. Мы используем следующие атрибуты класса:<br /><br /><ul><li><strong>list_display</strong> — последовательность имен полей, которые должны выводиться в списке записей;</li><li><strong>list_display_links</strong> — последовательность имен полей, которые должны быть преобразованы в гиперссылки, ведущие на страницу правки записей;</li><li><strong>search_fields</strong> — последовательность имен полей, по которым должна выполняться фильтрация.</li></ul><br />Запустим отладочный web-сервер или обновим страницу в браузере если он уже запущен и перейдем на страницу списка записей модели <strong>Bb</strong>:</div><img src="https://static.tildacdn.com/tild3664-3662-4330-b334-636264616332/param_models_admin_p.png"><div class="t-redactor__text">Все объявления удачно отобразились и поиск по объявлениям работает.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Связи между моделями</title>
			<link>https://www.easyitway.com/tpost/ozz2pn7d11-svyazi-mezhdu-modelyami</link>
			<amplink>https://www.easyitway.com/tpost/ozz2pn7d11-svyazi-mezhdu-modelyami?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 23:16:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Фреймворк Django</category>
			<description>В нашем проекте есть одна модель под названием «Объявления». В этой статье мы создадим новый класс модели «Rubric», которая будет представлять рубрики объявлений.</description>
			<turbo:content>
<![CDATA[<header><h1>Связи между моделями</h1></header><div class="t-redactor__text">В нашем проекте есть одна модель под названием <strong>«Объявления»</strong>. В этой статье мы создадим новый класс модели <strong>«Rubric»</strong>, которая будет представлять рубрики объявлений. Допишем в модуль <strong>models.py</strong> пакета приложения <strong>«btest»</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Rubric(models.Model):
  name = models.CharField(max_length=20, db_index=True,
  verbose_name=&#039;Название&#039;)
  
  class Meta:
    verbose_name_plural = &#039;Рубрики&#039;
    verbose_name = &#039;Рубрика&#039;
    ordering = [&#039;name&#039;]</code></pre><div class="t-redactor__text">Новая модель содержит одно объявленное поле <strong>«name»</strong>, которое будет хранить название рубрики. Для этого поля мы сразу велели создать индекс, т.к. будем выводить перечень рубрик отсортированным по их названиям.<br /><br />Осталось добавить в модель <strong>Bb</strong> поле внешнего ключа, устанавливающее связь между текущей записью этой модели и записью модели <strong>Rubric</strong>, т.е. между объявлением и рубрикой, к которой оно относится.<br /><br />Таким образом будет создана связь <strong>«один-со-многими»</strong>, при которой одна запись модели <strong>Rubric</strong> будет связана с произвольным количеством записей модели <strong>Bb</strong>.<br /><br />Создадим в последней такое поле, назвав его <strong>rubric</strong>. Изменим код класса <strong>Bb</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Bb(models.Model):
  title = models.CharField(max_length=50, verbose_name=&#039;Товар&#039;)
  content = models.TextField(null=True, blank=True, verbose_name=&#039;Описание&#039;)
  price = models.FloatField(null=True, blank=True, verbose_name=&#039;Цена&#039;)
  published = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name=&#039;Опубликовано&#039;)
  rubric = models.ForeignKey(&#039;Rubric&#039;, null=True,
  on_delete=models.PROTECT, verbose_name=&#039;Рубрика&#039;)
  
  class Meta:
    verbose_name_plural = &#039;Объявления&#039;
    verbose_name = &#039;Объявление&#039;
    ordering = [&#039;-published&#039;]</code></pre><div class="t-redactor__text">Класс <strong>ForeignKey</strong> представляет поле внешнего ключа, в котором фактически будет храниться ключ записи из первичной модели. Первым параметром конструктору этого класса передается класс первичной модели в виде:<br /><br /><ul><li>ссылки на класс — если код, объявляющий класс первичной модели, располагается перед кодом класса вторичной модели;</li><li>строки с именем класса — если вторичная модель объявлена раньше первичной.</li></ul><br />Все поля, создаваемые в моделях, по умолчанию обязательны к заполнению. Следовательно, добавить новое, обязательное к заполнению поле в модель, которая уже содержит записи, нельзя — сама СУБД откажется делать это и выведет сообщение об ошибке.<br /><br />Необходимо пометить поле <strong>rubric</strong> как необязательное, присвоив параметру <strong>null</strong> значение <strong>True</strong> — только после этого будет успешно добавлено в модуль.<br /><br />Именованный параметр <strong>on_delete</strong> управляет каскадными удалениями записей вторичной модели после удаления записи первичной модели, с которой они были связаны. Значение <strong>PROTECT</strong> этого параметра запрещает каскадные удаления.<br /><br />Сохраним исправленный модуль и выполним генерирование миграций, которые внесут необходимые изменения в структуры базы данных:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">manage.py makemigrations btest</code></pre><div class="t-redactor__text">После выполнения данной команды в папке migrations будет создан модуль миграции с именем вида <strong>«002_auto_отметка текущей даты и времени.py»</strong>. Выполним созданную миграцию:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">manage.py migrate</code></pre><div class="t-redactor__text">Зарегистрируем новую модель на административном сайте, добавив в модуль <strong>admin.py</strong> пакета приложения такие два выражения:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">from .models import Rubric
...
admin.site.register(Rubric)</code></pre><div class="t-redactor__text">Сохраним файл, запустим отладочный web-сервер и зайдем на административный сайт:</div><img src="https://static.tildacdn.com/tild3161-3664-4236-a365-663663613661/rubric_django_1.png"><div class="t-redactor__text">Добавим новую рубрику:</div><img src="https://static.tildacdn.com/tild6266-3437-4663-b236-643765393739/rubric_django_2-768x.png"><img src="https://static.tildacdn.com/tild3034-6635-4361-b935-323639393336/rubric_django_3.png"><h4  class="t-redactor__h4">Строковое представление модели</h4><div class="t-redactor__text">Наша рубрика создалась, но она представляется строкой вида <strong>«имя класса модели object значение ключа записи»</strong>. Необходимо переопределить в классе модели метод <strong>__str__()</strong>, возвращающий строковое представление класса.</div><div class="t-redactor__text">Откроем модуль <strong>models.py</strong> и изменим в объявление класса модели <strong>Rubric</strong> код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Rubric(models.Model):
  name = models.CharField(max_length=20, db_index=True,
  verbose_name=&#039;Название&#039;)
  def __str__(self):
    return self.name
  
  class Meta:
    verbose_name_plural = &#039;Рубрики&#039;
    verbose_name = &#039;Рубрика&#039;
    ordering = [&#039;name&#039;]</code></pre><div class="t-redactor__text">Сохраните файл, обновим страницу списка рубрик и посмотрим, что у нас получилось:</div><img src="https://static.tildacdn.com/tild3361-6636-4732-a331-336137633430/rubric_django_4.png"><div class="t-redactor__text">Создадим необходимые рубрики и добавим во все наши объявления соответствующую рубрику:</div><img src="https://static.tildacdn.com/tild6664-3063-4933-b565-303731376634/rubric_django_5_1.png"><div class="t-redactor__text">Осталось сделать так, чтобы в списке записей модели <strong>Bb</strong>, выводились рубрики объявлений. Для этого необходимо в последовательность имен полей, присвоенную атрибуту <strong>list_display</strong> класса <strong>BbAdmin</strong>, поле <strong>rubric</strong> (в файле admin.py):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">list_display = (&#039;title&#039;, &#039;content&#039;, &#039;price&#039;, &#039;published&#039;, &#039;rubric&#039;)</code></pre><div class="t-redactor__text">Сохраним файл и обновим страницу списка объявлений — и увидим новый столбец:</div><img src="https://static.tildacdn.com/tild6265-3036-4963-b331-376265343430/rubric_django_6-768x.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Краткая история SQL</title>
			<link>https://www.easyitway.com/tpost/454brhprn1-kratkaya-istoriya-sql</link>
			<amplink>https://www.easyitway.com/tpost/454brhprn1-kratkaya-istoriya-sql?amp=true</amplink>
			<pubDate>Sun, 03 Dec 2023 23:46:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Приветствую тебя, друг! Ты попал на нужный сайт если хочешь самостоятельно изучать языки программирования. И с этой статьи я даю начало своему новому самоучителю по языку SQL.</description>
			<turbo:content>
<![CDATA[<header><h1>Краткая история SQL</h1></header><div class="t-redactor__text">Приветствую тебя, друг! Ты попал на нужный сайт если хочешь самостоятельно изучать языки программирования. И с этой статьи я даю начало своему новому самоучителю по языку SQL.</div><div class="t-redactor__text">Также на сайте ты можешь найти самоучитель по языку PHP. Ведь если совместить эти два языка, то можно самостоятельно создать динамический сайт. Ну про это ты узнаешь читая данный самоучитель. Сначала я хочу начать с истории с языка. Приступим.</div><h4  class="t-redactor__h4">Что такое SQL?</h4><div class="t-redactor__text"><strong>SQL</strong> (Structured Query Language) — Структурированный Язык Запросов — стандартный язык запросов по работе с реляционными БД. Язык SQL появился после реляционной алгебры, и его прототип был разработан в конце 70-х годов в компании <strong>IBM Research</strong>. Он был реализован в первом прототипе реляционной СУБД фирмы IBM System R. В дальнейшем этот язык применялся во многих коммерческих СУБД и в силу своего широкого распространения постепенно стал стандартом «де-факто» для языков манипулирования данными в реляционных СУБД.</div><div class="t-redactor__text"><strong><em>Реляционная база данных (БД)</em></strong><em> – это набор данных с предопределенными связями между ними. Эти данные организованны в виде набора таблиц, состоящих из столбцов и строк. В таблицах хранится информация об объектах, представленных в базе данных. В каждом столбце таблицы хранится определенный тип данных, в каждой ячейке – значение атрибута. Каждая строка таблицы представляет собой набор связанных значений, относящихся к одному объекту или сущности.</em></div><div class="t-redactor__text"><strong><em>Реляционная СУБД (или РСУБД)</em></strong><em> — система управления реляционными БД. Понятие реляционный касательно СУБД появилось благодаря работам английского специалиста Эдгара Кодда (Edgar Codd). Такие модели управления можно охарактеризовать простотой, удобным табличным представлением и возможностью использования формального аппарата алгебры отношений и реляционного исчисления для обработки данных.</em></div><div class="t-redactor__text">Первоначально язык назывался <strong>SEQUEL</strong> (Structured English Query Language), но потом слово «English» пропало из этого словосочетания. С одной стороны, SQL был ориентирован на удобную и понятную пользователям формулировку запросов к реляционным БД. С другой стороны, практически с самого начала он был так называемым «полным языком БД». Это означает, что SQL включал:</div><div class="t-redactor__text"><ul><li>средства определения и манипулирования схемой БД;</li><li>средства определения ограничений целостности и триггеров;</li><li>средства определения представлений БД;</li><li>средства определения структур физического уровня, поддерживающих эффективное выполнение запросов;</li><li>средства авторизации доступа к отношениям и их полям;</li><li>средства определения точек сохранения транзакции и выполнения фиксации и откатов транзакций.</li></ul></div><h4  class="t-redactor__h4">Зачем нужен SQL?</h4><div class="t-redactor__text">Сейчас, при разработке серьезных веб-приложений, практически всегда используются базы данных. В них хранится информация, необходимая для работы сайта — начиная от самого содержимого (контента), и заканчивая логинами и паролями пользователей и различными настройками сайта.</div><div class="t-redactor__text">Несмотря на то, что в базе данных можно хранить не только текстовую информацию, но и, скажем, картинки, какие-то документы и т.д, как правило она все же используется именно для хранения текстовой информации, а информация другого типа хранится в виде файлов.</div><div class="t-redactor__text">А с помощью языка SQL разработчик приложений работает с базой данных. Записывает или выводит данные из базы данных. Делает различные манипуляции с ней. Таким образом, язык SQL является тем связующим звеном, которое обеспечивает взаимодействие приложения с базой данных и хранящейся в ней информацией.</div><h4  class="t-redactor__h4">История создания</h4><div class="t-redactor__text">Первый международный стандарт языка SQL был принят в <strong>1989 г</strong>. Иногда стандарт <strong>SQL1</strong> также называют стандартом ANSI/ISO, и подавляющее большинство доступных на рынке СУБД поддерживают этот стандарт полностью. Однако развитие информационных технологий, связанных с базами данных, и необходимость реализации переносимых приложений потребовали в скором времени доработки и расширения первого стандарта SQL.</div><div class="t-redactor__text">В конце <strong>1992 г</strong>. был принят новый международный стандарт языка SQL, который называется <strong>SQL/92</strong> или <strong>SQL2</strong>. И он не лишен недостатков, но в то же время является существенно более точным и полным, чем SQL/89. В настоящий момент большинство производителей СУБД внесли изменения в свои продукты так, чтобы они в большей степени удовлетворяли стандарту SQL2.</div><div class="t-redactor__text">В <strong>1999</strong> году появился новый стандарт, названный <strong>SQL3</strong>. Если отличия между стандартами SQL1 и SQL2 во многом были количественными, то стандарт SQL3 соответствует качественным серьезным преобразованиям. В SQL3 введены новые типы данных, при этом предполагается возможность задания сложных структурированных типов данных, которые в большей степени соответствуют объектной ориентации.</div><div class="t-redactor__text">Наконец, добавлен раздел, который вводит стандарты на события и триггеры, которые ранее не затрагивались в стандартах, хотя давно уже широко использовались в коммерческих СУБД. В стандарте определены возможности четкой спецификации триггеров как совокупности события и действия.</div><div class="t-redactor__text">В конце <strong>2003</strong> года был принят и опубликован новый вариант международного стандарта SQL:2003.В SQL:2003 специфицирован ряд новых и важных свойств, с небольшими модификациями, внесёнными позже в 2008 году.</div><h4  class="t-redactor__h4">Выводы</h4><div class="t-redactor__text">SQL нельзя в полной мере отнести к традиционным языкам программирования, он не содержит традиционные операторы, управляющие ходом выполнения программы, операторы описания типов и многое другое, он содержит только набор стандартных операторов доступа к данным, хранящимся в базе данных.</div><div class="t-redactor__text">Операторы SQL встраиваются в базовый язык программирования, которым может быть любой стандартный язык типа C++, PL, COBOL и т. д. Кроме того, операторы SQL могут выполняться непосредственно в интерактивном режиме.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Примеры систем управления базами данных (СУБД)</title>
			<link>https://www.easyitway.com/tpost/t7z8814hv1-primeri-sistem-upravleniya-bazami-dannih</link>
			<amplink>https://www.easyitway.com/tpost/t7z8814hv1-primeri-sistem-upravleniya-bazami-dannih?amp=true</amplink>
			<pubDate>Sun, 10 Dec 2023 23:17:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Чтобы начать изучать язык SQL надо выбрать хорошую и стабильную СУБД для работы с базами данных. В этой статье я хочу рассказать о некоторых популярных СУБД работающих с SQL.</description>
			<turbo:content>
<![CDATA[<header><h1>Примеры систем управления базами данных (СУБД)</h1></header><div class="t-redactor__text">Чтобы начать изучать язык SQL надо выбрать хорошую и стабильную СУБД для работы с базами данных. В этой статье я хочу рассказать о некоторых популярных СУБД работающих с SQL.</div><div class="t-redactor__text">В первой статье я уже говорил для чего нужна СУБД. Если вы забыли, тогда советую её перечитать. Прочитали? Молодцы! Приступаем рассматривать примеры СУБД.</div><h4  class="t-redactor__h4">MySQL</h4><div class="t-redactor__text">База данных <strong>MySQL</strong> — это самая популярная в мире база данных с открытым кодом. Благодаря своей проверенной производительности, надежности и простоте использования база данных MySQL наиболее часто используется для веб-приложений на таких ресурсах, как Facebook, Twitter, YouTube.</div><div class="t-redactor__text">Кроме того, её особенно часто выбирают в качестве встроенной базы данных, распространяемой тысячами поставщиков программного обеспечения и производителей оборудования.</div><div class="t-redactor__text">MySQL является решением для малых и средних приложений. Входит в состав серверов <a href="http://www.wampserver.com/ru/" target="_blank" rel="noreferrer noopener">WAMP</a>, <a href="https://www.appserv.org/en/" target="_blank" rel="noreferrer noopener">AppServ</a>, <a href="http://help.ubuntu.ru/wiki/lamp" target="_blank" rel="noreferrer noopener">LAMP</a> и в портативные сборки серверов <a href="http://www.denwer.ru/" target="_blank" rel="noreferrer noopener">Денвер</a>, <a href="https://www.apachefriends.org/ru/index.html" target="_blank" rel="noreferrer noopener">XAMPP</a>, <a href="https://www.vswamp.com/?lang=ru" target="_blank" rel="noreferrer noopener">VertrigoServ</a>.</div><div class="t-redactor__text">Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты, однако в дистрибутив входит библиотека внутреннего сервера, позволяющая включать MySQL в автономные программы.</div><div class="t-redactor__text">Гибкость СУБД MySQL обеспечивается поддержкой большого количества типов таблиц: пользователи могут выбрать как таблицы типа MyISAM, поддерживающие полнотекстовый поиск, так и таблицы InnoDB, поддерживающие транзакции на уровне отдельных записей.</div><div class="t-redactor__text">Более того, СУБД MySQL поставляется со специальным типом таблиц EXAMPLE, демонстрирующим принципы создания новых типов таблиц. Благодаря открытой архитектуре и GPL-лицензированию, в СУБД MySQL постоянно появляются новые типы таблиц.</div><div class="t-redactor__text">26 февраля 2008 года Sun Microsystems приобрела MySQL AB за 1 млрд долларов, 27 января 2010 года <a href="https://www.oracle.com/ru/index.html" target="_blank" rel="noreferrer noopener">Oracle</a> приобрела Sun Microsystems за 7,4 млрд долларов и включила MySQL в свою линейку СУБД.</div><h4  class="t-redactor__h4">PostgreSQL</h4><div class="t-redactor__text">PostgreSQL — свободная объектно-реляционная система управления базами данных (СУБД).</div><div class="t-redactor__text">PostgreSQL создана на основе некоммерческой СУБД Postgres, разработанной как open-source проект в Калифорнийском университете в Беркли.</div><div class="t-redactor__text">К разработке Postgres, начавшейся в 1986 году, имел непосредственное отношение Майкл Стоунбрейкер, руководитель более раннего проекта Ingres, на тот момент уже приобретённого компанией Computer Associates.</div><div class="t-redactor__text">Название расшифровывалось как «Post Ingres», и при создании Postgres были применены многие уже ранее сделанные наработки.</div><div class="t-redactor__text">Стоунбрейкер и его студенты разрабатывали новую СУБД в течение восьми лет с 1986 по 1994 год. За этот период в синтаксис были введены процедуры, правила, пользовательские типы и другие компоненты.</div><div class="t-redactor__text">В 1995 году разработка снова разделилась: Стоунбрейкер использовал полученный опыт в создании коммерческой СУБД Illustra, продвигаемой его собственной одноимённой компанией, а его студенты разработали новую версию Postgres — Postgres95, в которой язык запросов POSTQUEL — наследие Ingres — был заменен на SQL.</div><div class="t-redactor__text">Разработка Postgres95 была выведена за пределы университета и передана команде энтузиастов. Новая СУБД получила имя, под которым она известна и развивается в текущий момент — PostgreSQL.</div><h4  class="t-redactor__h4">MS SQL Server</h4><div class="t-redactor__text">Microsoft SQL Server — система управления реляционными базами данных (РСУБД), разработанная корпорацией Microsoft. Основной используемый язык запросов — Transact-SQL, создан совместно Microsoft и Sybase.</div><div class="t-redactor__text">Transact-SQL является реализацией стандарта ANSI/ISO по структурированному языку запросов (SQL) с расширениями. Используется для работы с базами данных размером от персональных до крупных баз данных масштаба предприятия.</div><h4  class="t-redactor__h4">SQLite</h4><div class="t-redactor__text">SQLite — это встраиваемая кроссплатформенная БД, которая поддерживает достаточно полный набор команд SQL и доступна в исходных кодах (на языке C).</div><div class="t-redactor__text">Исходные коды SQLite находятся в public domain, то есть вообще никаких ограничений на использование.</div><h4  class="t-redactor__h4">Oracle Database</h4><div class="t-redactor__text">Oracle Database или Oracle RDBMS — объектно-реляционная система управления базами данных компании Oracle.<br /><br />Современная СУБД Oracle это мощный программный комплекс, позволяющий создавать приложения любой степени сложности. Ядром этого комплекса является база данных, хранящая информацию, количество которой за счет предоставляемых средств масштабирования практически безгранично.<br /><br />C высокой эффективностью работать с этой информацией одновременно может практически любое количество пользователей (при наличии достаточных аппаратных ресурсов), не проявляя тенденции к снижению производительности системы при резком увеличении их числа.<br /><br />В СУБД Oracle последней версии позволяют безгранично увеличивать мощность и скорость работы сервера Oracle и своих приложений, просто добавляя новые и новые узлы кластера.<br /><br />Это не требует остановки работающих приложений, не требует переписывания старых приложений, разработанных для обычной одно-машинной архитектуры. Кроме того, выход из строя отдельных узлов кластера также не приводит к остановке приложения.<br /><br />СУБД работающих с языком SQL существует множество. Конечно я все СУБД не стал перечислять, но про самые актуальные рассказал. А вот, какой пользоваться выбирать каждому для себя. Всем удачи! Увидимся в следующей статье.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Установка локального сервера XAMPP</title>
			<link>https://www.easyitway.com/tpost/7v6o4co7x1-ustanovka-lokalnogo-servera-xampp</link>
			<amplink>https://www.easyitway.com/tpost/7v6o4co7x1-ustanovka-lokalnogo-servera-xampp?amp=true</amplink>
			<pubDate>Sun, 10 Dec 2023 23:19:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Локальный сервер — это специальная программа, которая устанавливается на компьютер и позволяет осуществлять разработку сайтов и работу в БД не выходя в сеть Интернет.</description>
			<turbo:content>
<![CDATA[<header><h1>Установка локального сервера XAMPP</h1></header><div class="t-redactor__text">Сегодня я хочу познакомить Вас с локальным сервером XAMPP. И для начала расскажу что это такое и зачем он нужен.</div><div class="t-redactor__text"><strong>Локальный сервер</strong> — это специальная программа, которая устанавливается на компьютер и позволяет осуществлять разработку сайтов и работу в БД не выходя в сеть Интернет.</div><div class="t-redactor__text">Работа локального сервера полностью имитирует работу реального сервера хост-провайдера. Функционал ничем не отличается от возможностей хостинга и состоит из аналогичных компонентов, а именно из базы данных MySQL, сервера, поддержки РНР и скриптов для работы с базами данных.</div><div class="t-redactor__text">Существует множество локальных сервером, но я хорошо использую сервер XAMPP. Если вы используете другой, то это не страшно.</div><div class="t-redactor__text"><strong>Локальный сервер </strong><a href="https://www.apachefriends.org/ru/index.html" target="_blank" rel="noreferrer noopener"><strong>XAMPP</strong></a> — является самой популярной средой разработки PHP. XAMPP полностью бесплатный и простой в установке дистрибутив Apache, содержащий MariaDB, PHP и Perl. XAMPP создан с открытым исходным кодом, чтобы быть невероятно простым в установке и в использовании.</div><div class="t-redactor__text"><em>Если у Вас стоит локальный сервер на компьютере, тогда XAMPP не запустится пока вы не удалите свой сервер.</em></div><div class="t-redactor__text">Этот сервер пригодится для использования панели <a href="https://www.phpmyadmin.net/" target="_blank" rel="noreferrer noopener">phpMyAdmin</a>.</div><div class="t-redactor__text"><strong>phpMyAdmin</strong> — СУБД — приложение с открытым кодом, написанное на языке PHP и представляющее собой веб-интерфейс для администрирования СУБД MySQL. PHPMyAdmin позволяет через браузер и не только осуществлять администрирование сервера MySQL, запускать команды SQL и просматривать содержимое таблиц и баз данных.</div><div class="t-redactor__text">Вот именно ради phpMyAdmin нам и надо установить сервер XAMPP. Если вы используете другое приложение для администрирования СУБД MySQL, тогда можете не ставить данный сервер.</div><h4  class="t-redactor__h4">1. Подготовка</h4><div class="t-redactor__text">Для начала нужно скачать дистрибутив сервера на официальном <a href="https://www.apachefriends.org/ru/download.html" target="_blank" rel="noreferrer noopener">сайте</a>. Сервер можно поставить на операционные системы Windows, Linux и Mac OS. Я пользуюcь «маком» поэтому я буду описывать установку на Mac OS и параллельно на Windows.</div><h4  class="t-redactor__h4">2. Установка</h4><div class="t-redactor__text">Установка очень проста. Запускайте установщик, соглашайтесь со всеми условиями (в Windows нужно выбрать локальный диск куда хотите поставить сервер). Рекомендуется оставить всё по умолчанию и дожидаться установки (минут 20-30).</div><h4  class="t-redactor__h4">3. Запуск сервера</h4><div class="t-redactor__text">Запуск сервера на Windows:</div><div class="t-redactor__text"><ol><li>Зайти на локальный диск (на который поставили сервер);</li><li>Найти папку XAMPP. Открыть и запустить приложение «xampp_control»;</li><li>Откроется панель контроля сервера. Запустить модули (нажать START) MySQL и Apache;</li></ol></div><img src="https://static.tildacdn.com/tild3666-3963-4637-b065-303837653738/Screen-Shot.png"><div class="t-redactor__text">4.Если модули стали подсвечиваться зелёным цветом, тогда поздравляю всё получилось и сервер запущен.<br /><br />Запуск сервера на Mac OS:<br /><br /><ol><li>В программах найдите значок XAMPP и запустите его;</li><li>Откроется окно программы. Для запуска сервера на вкладке «General» нажмите кнопку Start;</li></ol></div><img src="https://static.tildacdn.com/tild6539-3162-4531-b966-643661353261/start_mac.png"><div class="t-redactor__text">3.Перейдите на вкладку «Services» и посмотрите горят ли зелёным цветом все значки. Если горят красным нажмите на кнопку «Start All» (для запуска нужных компонентов);<br /><br /></div><img src="https://static.tildacdn.com/tild3032-6564-4334-b839-613766646232/services.png"><div class="t-redactor__text">4.И последний шаг на вкладке «Network» запустите «localhost:8080» (если он не запустился самостоятельно). Это нужно для доступа к серверу через браузер;<br /><br /></div><img src="https://static.tildacdn.com/tild3930-3130-4238-b337-396237383036/Network.png"><h4  class="t-redactor__h4">Запуск phpMyAdmin</h4><div class="t-redactor__text">После всех манипуляций приступим к последнему этапу. Запустите браузер (например Google Chrome) и в адресной строке напишите адрес сервера.</div><div class="t-redactor__text">Для Windows всегда по умолчанию «localhost» или «127.0.0.1». Для Mac OS «localhost:8080» или «127.0.0.1:8080» где «8080» номер локального порта. Если всё правильно сделали должна открыться главная страница сервера (даже без интернета).</div><div class="t-redactor__text">На главной странице Вас приветствует сервер и рассказывает о своих преимуществах. Но нам надо запустить phpMyAdmin для работы с MySQL. В конце меню нажмите на значёк и откроется СУБД (по умолчанию: логин root и без пароля). Поэтому вход будет быстрый т.к. без пароля.</div><img src="https://static.tildacdn.com/tild3538-3036-4436-b166-666435336439/localhost.png"><div class="t-redactor__text">Вот так выглядит интерфейс программы phpMyAdmin. На следующем уроке мы начнем изучать команды языка SQL и примеры я буду показывать на phpMyAdmin. Будут вопросы пишите их в комментариях. Удачи!</div><img src="https://static.tildacdn.com/tild3561-3836-4765-b065-353465386138/phpMyAdmin.png"><div class="t-redactor__text">Подробное видео по установке:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/11pJhwz_Pak" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: CREATE</title>
			<link>https://www.easyitway.com/tpost/v66fyr1zm1-operator-sql-create</link>
			<amplink>https://www.easyitway.com/tpost/v66fyr1zm1-operator-sql-create?amp=true</amplink>
			<pubDate>Sun, 10 Dec 2023 23:22:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Доброго времени суток! Вот и пришло наше время изучать операторы языка SQL и начнем с оператора создания баз данных и таблиц в phpMyAdmin — CREATE.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: CREATE</h1></header><div class="t-redactor__text">Доброго времени суток! Вот и пришло наше время изучать операторы языка SQL и начнем с оператора создания баз данных и таблиц в phpMyAdmin — <strong>CREATE</strong>.</div><div class="t-redactor__text">Оператор SQL <strong>CREATE</strong> служит для создания объектов базы данных. Разные СУБД работают с разными объектами, но наиболее общими для большинства СУБД будут команды создания таблицы (оператор SQL CREATE TABLE) и создания базы данных.</div><h4  class="t-redactor__h4">Создание базы данных</h4><div class="t-redactor__text">Для начала открываем phpMyAdmin, как его открыть я объяснял в предыдущей статье. Нажимаем вкладку SQL — откроется окно команд и приготовимся писать наши запросы. Самое первое, что вам следует изучить, это оператор <strong>CREATE DATABASE</strong>. Он понадобится для создания базы данных. Создадим базу данных с именем site:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">CREATE DATABASE site;</code></pre><div class="t-redactor__text">После написания запроса нажмите на кнопку «Вперёд» и новая база данных (пустая) появится слева в списке БД.</div><img src="https://static.tildacdn.com/tild6439-6266-4139-b633-373137336337/site.png"><div class="t-redactor__text">Далее приведем запрос, который проверит, существует ли база данных с таким именем при создании:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">#проверка на существование
CREATE DATABASE IF NOT EXISTS site;</code></pre><div class="t-redactor__text">Вы уже можете заметить, что комментарии в SQL ставятся с помощью символа хэш (#).<br /><br />Еще один важный момент заключается в кодировке: лучше всего создавать базу данных с кодировкой <a href="https://ru.wikipedia.org/wiki/UTF-8" target="_blank" rel="noreferrer noopener">utf-8</a>, тогда у вас будут правильно отображаться кириллические символы. Вот окончательный вариант создания базы данных:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">CREATE DATABASE site CHARACTER SET utf8 COLLATE utf8_general_ci;</code></pre><h4  class="t-redactor__h4">Создание таблиц</h4><div class="t-redactor__text">Базу мы создали, теперь в этой базе нужно создать таблицы. Для создания таблиц используется похожий оператор <strong>CREATE TABLE</strong>.</div><div class="t-redactor__text">Для начала выберем ту базу данных, которая нам нужна, слева в списке баз данных выберете базу site, а затем нажмите на вкладку SQL или просто перейдите на вкладку SQL и введите команду <strong>«USE site;»</strong>, затем на другой строчке пишите Ваш запрос.</div><div class="t-redactor__text">Таким образом вы выберите нужную для Вас базу данных. Пример создания таблицы «newTable»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">CREATE TABLE newTable(
  id INT(11) NOT NULL,
  name VARCHAR(45) NOT NULL,
  city VARCHAR(45) NOT NULL,
  message VARCHAR(255),
  PRIMARY KEY (id));</code></pre><div class="t-redactor__text">В операторе CREATE TABLE мы указываем имена столбцов, тип данных, хранящийся в этих столбцах, также id мы представляем как первичный ключ, по этому ключу можно обращаться к данным.<br /><br />Стоит отметить конструкцию NOT NULL, она говорит о том, что в этом поле не может быть пустых значений. Цифры в скобочках это максимальное число символов в данном столбце.<br /><br /><ul><li>INT — основной тип целочисленных данных;</li><li>VARCHAR — тип текстовых данных;</li><li>PRIMARY KEY — запрос на создание первичного ключа.</li></ul><br />На этом и заканчивается эта небольшая статья. Вам остаётся запомнить эти команды и больше практиковаться.<br /><br />Чтобы закрепить урок: создайте новую базу данных и пару таблиц в этой базе данных. Ваши вопросы и «SQL запросы» пишите в комментариях.<br /><br />Видео по созданию базы данных:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/40qL0R2aIQM" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe><div class="t-redactor__text">Видео по созданию таблиц:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/U_R558Bq3Cw" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: INSERT</title>
			<link>https://www.easyitway.com/tpost/lgoci625g1-operator-sql-insert</link>
			<amplink>https://www.easyitway.com/tpost/lgoci625g1-operator-sql-insert?amp=true</amplink>
			<pubDate>Sun, 10 Dec 2023 23:25:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>INSERT — оператор языка SQL, который позволяет добавить строки в таблицу, заполняя их значениями. Значения можно вставлять перечислением с помощью слова values и перечислив их в круглых скобках через запятую.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: INSERT</h1></header><div class="t-redactor__text">Доброго времени суток друзья! На прошлом <a href="https://it-black.ru/operator-sql-create/" target="_blank" rel="noreferrer noopener">уроке</a> мы научились создавать базу данных и таблицы в эти базы данных, но таблицы получились «пустые». И вот в этой статье я хочу Вас научить, как вносить данные в эти таблицы и поможет нам в этом оператор SQL под названием «INSERT». Приступим:<br /><br /><strong>INSERT</strong> — оператор языка SQL, который позволяет добавить строки в таблицу, заполняя их значениями. Значения можно вставлять перечислением с помощью слова values и перечислив их в круглых скобках через запятую.<br /><br />Оператор SQL INSERT с указанием столбцов имеет следующий синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">INSERT INTO &lt;название таблицы&gt; ([&lt;Имя столбца&gt;, ... ]) values (&lt;Значение&gt;,...);</code></pre><div class="t-redactor__text">Также, значения могут быть записаны и без указания столбцов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">INSERT INTO &lt;название таблицы&gt; values (&lt;Значение&gt;,...);</code></pre><div class="t-redactor__text">Запись значений может производиться и с помощью оператора SQL SELECT (оператор SELECT мы будем изучать немного позже):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">INSERT INTO &lt;название таблицы&gt; SELECT Имя столбца,... FROM название таблицы</code></pre><div class="t-redactor__text">Используя оператор <strong>SQL SELECT</strong> можно вставить более одной записи. В случае, если для каких-либо полей таблицы не указаны значения, они будут заменены значением по умолчанию null.</div><h4  class="t-redactor__h4">Пример работы оператора</h4><div class="t-redactor__text">Имеется таблица «Planets». С помощью оператора SQL INSERT нужно добавить запись, присвоив полям таблицы следующие значения — ID: 4; PlanetName: Venus; Radius: 6051; SunSeason: 243; OpeningYear: 1610; HavingRings: No; Opener: Galileo Galilei;</div><img src="https://static.tildacdn.com/tild6665-3861-4533-a335-353938306237/insert_1.png"><pre class="t-redactor__highlightcode"><code data-lang="{$la}">INSERT INTO Planets (ID, PlanetName, Radius, SunSeason, OpeningYear, HavingRings, Opener)
VALUES (4, &quot;Venus&quot;, 6051, 243, 160, &quot;No&quot;, &quot;Galileo Galilei&quot;);</code></pre><div class="t-redactor__text">После выполнения команды таблица Planets будет выглядеть так (как видите добавилась новая строка и это очень просто):</div><img src="https://static.tildacdn.com/tild3830-6632-4236-b338-313362333930/insert_2.png"><div class="t-redactor__text">Вы наверное заметили что данный пример я показал на основе первого синтаксиса где нужно прописывать каждое имя столбца, но этот же пример можно написать и по другому:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">INSERT INTO Planets VALUES (4, &quot;Venus&quot;, 6051, 243, 160, &quot;No&quot;, &quot;Galileo Galilei&quot;);</code></pre><div class="t-redactor__text">Данный пример сработает если Вам нужно вставить под каждый столбец и Вы знаете порядок этик столбцов. Иначе данные могут попасть не в свой столбец.<br /><br />Вот и подошёл мой небольшой урок по оператору INSERT в SQL. Надеюсь Вам всё понятно, если будут вопросы пишите и я обязательно отвечу.<br /><br />Подробное видео:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/wScMWciaSsY" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: ALTER TABLE</title>
			<link>https://www.easyitway.com/tpost/9lmetnikr1-operator-sql-alter-table</link>
			<amplink>https://www.easyitway.com/tpost/9lmetnikr1-operator-sql-alter-table?amp=true</amplink>
			<pubDate>Sun, 10 Dec 2023 23:27:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор ALTER TABLE используется для добавления, удаления или модификации колонки в уже существующей таблице. ALTER TABLE изменяет определение таблицы одним из следующих способов:</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: ALTER TABLE</h1></header><div class="t-redactor__text">Оператор <strong>ALTER TABLE</strong> используется для добавления, удаления или модификации колонки в уже существующей таблице. ALTER TABLE изменяет определение таблицы одним из следующих способов:<br /><br /><ul><li>добавляет столбец;</li><li>добавляет ограничение целостности;</li><li>переопределяет столбец (тип данных, размер, умалчиваемое значение);</li><li>удаляет столбец;</li><li>модифицирует характеристики памяти или иные параметры;</li><li>включает, выключает или удаляет ограничение целостности или триггер.</li></ul><br />Структура существующей таблицы может быть модифицирована с помощью команды ALTER TABLE. Пример переименование таблицы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ALTER TABLE  table1 RENAME table2;</code></pre><div class="t-redactor__text">Пример добавления в таблицу table2 столбца «name_new_column» с типом int:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ALTER TABLE  table2 ADD COLUMN name_new_column int;</code></pre><div class="t-redactor__text">Пример добавления в таблицу table2 столбец «name_new_column» с типом int, причем столбец не может принимать значение NULL:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ALTER TABLE  table2 ADD COLUMN name_new_column int NOT NULL;</code></pre><div class="t-redactor__text">Пример добавления в таблицу table2 столбец «name_new_column» с типом int, причем столбец по умолчанию имеет значение «1»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ALTER TABLE  table2 ADD COLUMN name_new_column int DEFAULT 1;</code></pre><div class="t-redactor__text">Пример удаления из таблицы table2 столбца name_new_column:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ALTER TABLE  table2 DROP COLUMN name_new_column;</code></pre><div class="t-redactor__text">Видео по статье:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/33v0HUkd-gU" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: UPDATE</title>
			<link>https://www.easyitway.com/tpost/4su75zuhx1-operator-sql-update</link>
			<amplink>https://www.easyitway.com/tpost/4su75zuhx1-operator-sql-update?amp=true</amplink>
			<pubDate>Sun, 10 Dec 2023 23:30:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор UPDATE&nbsp;изменяет имеющиеся данные в таблице. Команда имеет следующий синтаксис:</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: UPDATE</h1></header><div class="t-redactor__text">Оператор <strong>UPDATE</strong> изменяет имеющиеся данные в таблице. Команда имеет следующий синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">UPDATE &lt;имя таблицы&gt;
SET {&lt;имя столбца&gt; = {&lt;выражение для вычисления значения столбца&gt;
| NULL
| DEFAULT},...}
[ {WHERE &lt;предикат&gt;}];</code></pre><div class="t-redactor__text">С помощью одного оператора могут быть заданы значения для любого количества столбцов. Однако в одном и том же операторе UPDATE можно вносить изменения в каждый столбец указанной таблицы только один раз. При отсутствии предложения WHERE будут обновлены все строки таблицы.</div><div class="t-redactor__text">Если столбец допускает NULL-значение, то его можно указать в явном виде. Кроме того, можно заменить имеющееся значение на значение по умолчанию (DEFAULT) для данного столбца.</div><h4  class="t-redactor__h4">Примеры оператора SQL UPDATE</h4><div class="t-redactor__text">Имеется следующая таблица Planets:</div><img src="https://static.tildacdn.com/tild3930-6539-4437-b364-306433663130/update_2.png"><div class="t-redactor__text">Пример 1. С помощью оператора SQL UPDATE изменим название планеты <strong>Neptune</strong> на <strong>Pluton</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">UPDATE Planets
SET PlanetName = &#039;Pluton&#039;
WHERE ID = 3;</code></pre><div class="t-redactor__text">В этом примере условие оператора SQL WHERE является обязательным, так как без него все поля столбца PlanetName во всей таблице изменились бы на Pluton. В данном случае, нам приходит на помощь столбец ID, т.к. он является Первичным ключом, позволяющим однозначно идентифицировать запись.<br /><br />Пример 2. Увеличим зарплату всех учителей в 2 раза, а премию — в 10 раз.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">UPDATE teachers
  SET
  zarplata = zarplata * 2,
  premia = premia * 10;</code></pre><div class="t-redactor__text">В данном примере оператор WHERE не используется и именно поэтому в таблице teachers обновятся столбцы «zarplata» и «premia» полностью для всех сотрудников.<br /><br />Подробное видео:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/qpV5KobEgc8" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: DROP</title>
			<link>https://www.easyitway.com/tpost/69mgzuntb1-operator-sql-drop</link>
			<amplink>https://www.easyitway.com/tpost/69mgzuntb1-operator-sql-drop?amp=true</amplink>
			<pubDate>Sun, 10 Dec 2023 23:31:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор SQL DROP является универсальным оператором удаления объектов базы данных.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: DROP</h1></header><div class="t-redactor__text">На данном уроке я хочу Вас познакомить с очень нужным оператором SQL под названием: «DROP». Он пригодится если Вам будет нужно удалить ненужные таблицы или даже полностью базу данных. Начнём знакомство:<br /><br />Оператор SQL DROP является универсальным оператором удаления объектов базы данных. Используя его можно удалить таблицы (TABLE), индексы (INDEX) и базы данных (DATABASE). Оператор SQL DROP имеет одинаковый синтаксис для удаления различных объектов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DROP [ INDEX | TABLE | DATABASE ] object;</code></pre><div class="t-redactor__text">Где <strong>object</strong> — название базы, таблицы, столбца в таблице, индекса.</div><h4  class="t-redactor__h4">Примеры использования оператора</h4><div class="t-redactor__text">Пример 1. Удаление базы данных «MyBase»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DROP DATABASE MyBase;</code></pre><div class="t-redactor__text">Пример 2. Удаление таблицы «Articles»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DROP TABLE Articles;</code></pre><div class="t-redactor__text">Пример 3. Удаление индексов в таблице:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DROP INDEX my_index;</code></pre><div class="t-redactor__text">Когда индекс в базе данных больше не нужен, разработчик может удалить его командой <strong>DROP INDEX</strong>. После удаления индекса эффективность поиска с использованием столбца или столбцов, ограниченных индексом, больше не повышается и упоминание об индексе исчезает из словаря данных. Индекс, применяемый для первичного ключа, удалить нельзя.<br /><br />Синтаксис оператора DROP INDEX одинаков для удаления индекса любого типа (уникальности, битовой карты или В-дерева). Чтобы каким-то образом улучшить индекс, нужно сначала удалить его, а потом создать новый.<br /><br />Пример 4. Запрос удаляет индексы, указанные в my_index из таблицы Articles, но она не работает в версиях MySQL до 3.22.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DROP INDEX my_index ON Articles;</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: DELETE</title>
			<link>https://www.easyitway.com/tpost/i8cbpyylp1-operator-sql-delete</link>
			<amplink>https://www.easyitway.com/tpost/i8cbpyylp1-operator-sql-delete?amp=true</amplink>
			<pubDate>Sun, 10 Dec 2023 23:33:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>DELETE — это DM-операция удаления записей из таблицы. Критерий отбора записей для удаления определяется выражением WHERE.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: DELETE</h1></header><div class="t-redactor__text"><strong>DELETE</strong> — это DM-операция удаления записей из таблицы. Критерий отбора записей для удаления определяется выражением <strong>WHERE</strong>. В случае, если критерий отбора не определён, выполняется удаление всех записей. Синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DELETE FROM &lt;имя таблицы &gt; 
[WHERE &lt;предикат&gt;];</code></pre><div class="t-redactor__text">Более быстро операцию удаление всех строк из таблицы можно в Transact-SQL также выполнить с помощью команды:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">TRUNCATE TABLE &lt;имя таблицы&gt;</code></pre><div class="t-redactor__text">Transact-SQL (T-SQL) — процедурное расширение языка SQL, используемое для программирования на стороне сервера в Microsoft SQL Server и Sybase ASE.</div><h4  class="t-redactor__h4">Примеры работы оператора</h4><div class="t-redactor__text">Пример 1. Требуется удалить из таблицы Laptop все портативные компьютеры с размером экрана менее 15 дюймов.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DELETE FROM Laptop
WHERE screen &lt; 15;</code></pre><div class="t-redactor__text">Все блокноты можно удалить с помощью оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DELETE FROM Laptop;</code></pre><div class="t-redactor__text">Transact-SQL расширяет синтаксис оператора DELETE, вводя дополнительное предложение FROM:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">FROM &lt;источник табличного типа&gt;</code></pre><div class="t-redactor__text">При помощи этого предложения можно выполнять соединения таблиц, что логически заменяет использование подзапросов в предложении WHERE для идентификации удаляемых строк. Рассмотрим пример:<br /><br />Пример 2. Пусть требуется удалить те модели ноутбуков из таблицы Product, для которых нет соответствующих строк в таблице Notebook. Используя стандартный синтаксис, задача решается так:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DELETE FROM Notebook 
WHERE type = &#039;nb&#039; AND 
 model NOT IN (SELECT model 
 FROM NB);</code></pre><div class="t-redactor__text">Предикат type = 'Nb' необходим здесь, чтобы не были удалены также модели принтеров, сканеров и персональных компьютеров.<br /><br />Эту же задачу можно решить с помощью дополнительного предложения FROM следующим образом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DELETE FROM Notebook 
FROM Product pr LEFT JOIN 
 NB ON pr.model = NB.model 
WHERE type = &#039;nb&#039; AND 
 NB.model IS NULL;</code></pre><div class="t-redactor__text">Здесь применяется внешнее соединение, в результате чего столбец NB.model для моделей ноутбуков, отсутствующих в таблице NB, будет содержать NULL-значение, что и используется для идентификации подлежащих удалению строк.<br /><br />Подробное видео:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/AQQfNOer15U" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: SELECT</title>
			<link>https://www.easyitway.com/tpost/mvgxibg9a1-operator-sql-select</link>
			<amplink>https://www.easyitway.com/tpost/mvgxibg9a1-operator-sql-select?amp=true</amplink>
			<pubDate>Sun, 10 Dec 2023 23:37:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>C помощью оператора SELECT происходит выборка значений, хранящихся в базе данных. </description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: SELECT</h1></header><div class="t-redactor__text">C помощью оператора <strong>SELECT</strong> происходит выборка значений, хранящихся в базе данных. В структуру запроса оператора SQL SELECT могут быть включены многие дополнительные операторы: уточняющие условие выборки, производящие группировку, сортировку выходных значений.<br /><br />Чтобы создать простейший SELECT запрос, необходимо указать имя столбца и название таблицы. Базовый синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT column_list 
FROM table_name 
[WHERE условие] 
[GROUP BY условие] 
[HAVING условие] 
[ORDER BY условие] </code></pre><div class="t-redactor__text"><strong>SELECT</strong> — ключевое слово, которое сообщает базе данных о том, что оператор является запросом. Все запросы начинаются с этого слова, за ним следует пробел.<br /><br /><strong>Column_list</strong> — список столбцов таблицы, которые выбираются запросом. Столбцы, не указанные в операторе, не будут включены в результат. Если необходимо вывести данные всех столбцов, можно использовать сокращенную запись. Звездочка (*) означает полный список столбцов.<br /><br /><strong>FROM table_name</strong> — ключевое слово, которое должно присутствовать в каждом запросе. После него через пробел указывается имя таблицы, являющейся источником данных.<br /><br />Код в скобках «[]» является не обязательным в операторе SELECT. Он необходим для более точного определения запроса.<br /><br />Оператор <strong>WHERE</strong> задает дополнительные условия выборки. Оператор <strong>GROUP BY</strong> используют для группирования результата по столбцу или по нескольким столбцам. Оператор <strong>HAVING</strong> включают в запрос для задания условия агрегатных функций. Оператор <strong>ORDER BY</strong> используется для сортировки значений.<br /><br />Примеры оператора SQL SELECT. Имеется следующая таблица Gruppa:</div><img src="https://static.tildacdn.com/tild6261-3734-4136-b064-653964356566/2023-12-10_23-38.png"><div class="t-redactor__text">Пример 1. С помощью оператора SELECT вывести имена студентов (Name):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT Name FROM Gruppa;</code></pre><div class="t-redactor__text">Пример 2. С помощью оператора SELECT вывести информацию о студенте (Иванове):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Gruppa WHERE FIO = &#039;Иванов&#039;;</code></pre><div class="t-redactor__text">Подробное видео:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/IF4zYTno1hk" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Операторы SQL: USE и SHOW</title>
			<link>https://www.easyitway.com/tpost/cbe8kbcml1-operatori-sql-use-i-show</link>
			<amplink>https://www.easyitway.com/tpost/cbe8kbcml1-operatori-sql-use-i-show?amp=true</amplink>
			<pubDate>Mon, 11 Dec 2023 15:37:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>SHOW — эта команда предназначена для просмотра доступных баз данных и таблиц в конкретных базах данных.</description>
			<turbo:content>
<![CDATA[<header><h1>Операторы SQL: USE и SHOW</h1></header><div class="t-redactor__text">В данной статье я хочу показать Вам, как работают две простые команды. Если вы работаете в консольной базе данных эти две команды будут незаменимы.</div><h4  class="t-redactor__h4">Команда SHOW</h4><div class="t-redactor__text"><strong>SHOW</strong> — эта команда предназначена для просмотра доступных баз данных и таблиц в конкретных базах данных. Для просмотра списка баз данных необходимо ввести такую команду:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SHOW DATABASES;</code></pre><div class="t-redactor__text">Пример работы команды:</div><img src="https://static.tildacdn.com/tild3139-3031-4563-a564-616331346339/show-877x1024.png"><div class="t-redactor__text">Для просмотра списка таблиц используется эта же команда в таком виде:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">USE test;
SHOW TABLES;</code></pre><div class="t-redactor__text">Пример работы команды:</div><img src="https://static.tildacdn.com/tild3566-3534-4635-b136-393034373430/show_tables.png"><div class="t-redactor__text">Думаю вы заметили что пример состоит из двух строк и первая строка нам еще не знакома. Это наша вторая команда. Давайте рассмотрим её:</div><h4  class="t-redactor__h4">Команда USE</h4><div class="t-redactor__text">Команда <strong>USE</strong> служит для выбора активной базы данных. Для перехода к некоторой базе данных необходимо выполнить следующую операцию:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">USE test;</code></pre><div class="t-redactor__text">Пример этой команды мы уже рассмотрели выше. Выбираете активную базу данных, а затем делайте с ней что угодно в конкретной задаче.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: WHERE</title>
			<link>https://www.easyitway.com/tpost/zutfdi5x61-operator-sql-where</link>
			<amplink>https://www.easyitway.com/tpost/zutfdi5x61-operator-sql-where?amp=true</amplink>
			<pubDate>Mon, 11 Dec 2023 15:40:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор SQL WHERE служит для задания дополнительного условия выборки, операций вставки, редактирования и удаления записей.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: WHERE</h1></header><div class="t-redactor__text">Оператор SQL <strong>WHERE</strong> служит для задания дополнительного условия выборки, операций вставки, редактирования и удаления записей.<br /><br />Оператор SQL WHERE имеет следующий синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">WHERE condition</code></pre><div class="t-redactor__text">Условие (condition) может включать в себя предикаты AND, OR, NOT, LIKE, BETWEEN, IS, IN, ключевое слово NULL, операторы сравнения и равенства (&lt;, &gt;, =). Примеры оператора SQL WHERE. Возьмём таблицу:</div><img src="https://static.tildacdn.com/tild6531-6236-4230-b239-643465636632/where_1-1024x264.png"><div class="t-redactor__text"><strong>Пример 1.</strong> Используя оператор SQL WHERE выведим записи, значение радиуса (Radius) которых находится в пределах от 3000 до 9000:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Planets WHERE Radius BETWEEN 3000 AND 9000;</code></pre><div class="t-redactor__text"><strong>Пример 2.</strong> Используя оператор SQL WHERE вывести название планеты (PlanetName), год её открытия (OpeningYear) и имя первооткрывателя (Opener), планет, чье название не начинается или не заканчивается на букву «s»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT PlanetName, OpeningYear, Opener
FROM Planets
WHERE PlanetName NOT LIKE &#039;%s&#039;
AND PlanetName NOT LIKE &#039;S%&#039;;</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: ORDER BY</title>
			<link>https://www.easyitway.com/tpost/x0a13adms1-operator-sql-order-by</link>
			<amplink>https://www.easyitway.com/tpost/x0a13adms1-operator-sql-order-by?amp=true</amplink>
			<pubDate>Tue, 12 Dec 2023 00:44:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор ORDER BY&nbsp;выполняет сортировку выходных значений. Оператор можно применять как к числовым столбцам, так и к строковым.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: ORDER BY</h1></header><div class="t-redactor__text">Оператор <strong>ORDER BY</strong> выполняет сортировку выходных значений. Оператор можно применять как к числовым столбцам, так и к строковым. В последнем случае, сортировка будет происходить по алфавиту. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ORDER BY column_name [ASC | DESC]</code></pre><div class="t-redactor__text">Сортировка может производиться как по возрастанию, так и по убыванию значений:<br /><br /><ul><li>Параметр <strong>ASC</strong> (по умолчанию) устанавливает порядок сортирования во возрастанию, от меньших значений к большим.</li><li>Параметр <strong>DESC</strong> устанавливает порядок сортирования по убыванию, от больших значений к меньшим.</li></ul><br />Рассмотрим примеры оператора SQL ORDER BY. Имеется следующая таблица Artists.</div><img src="https://static.tildacdn.com/tild3532-3561-4231-a132-393466653666/2023-12-12_00-45.png"><div class="t-redactor__text"><strong>Пример 1.</strong> Выведем все записи таблицы, упорядоченные по названию исполнителя с помощью оператора SQL ORDER BY:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Artists ORDER BY Singer;</code></pre><div class="t-redactor__text"><strong>Пример 2.</strong> Выведем названия исполнителя, альбома, год выпуска тех альбомов, которые выпущены после 2001 года, упорядоченные по убыванию года:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT Singer, Album, Year
FROM Artists
WHERE Year &gt; 2001
ORDER BY Year DESC;</code></pre><div class="t-redactor__text">Самостоятельно создайте таблицу Artists и выполните каждый пример. В комментариях можете писать новые примеры к данной таблице и не только.<br /><br />Видео:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/MTJ0NjQ4fDg" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: GROUP BY</title>
			<link>https://www.easyitway.com/tpost/9x2zdxlgf1-operator-sql-group-by</link>
			<amplink>https://www.easyitway.com/tpost/9x2zdxlgf1-operator-sql-group-by?amp=true</amplink>
			<pubDate>Tue, 12 Dec 2023 00:47:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор GROUP BY&nbsp;используется для объединения результатов выборки по одному или нескольким столбцам. Синтаксис оператора:</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: GROUP BY</h1></header><div class="t-redactor__text">Оператор <strong>GROUP BY</strong> используется для объединения результатов выборки по одному или нескольким столбцам. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">GROUP BY column_name</code></pre><div class="t-redactor__text">Примеры оператора SQL GROUP BY. Имеется следующая таблица Artists:</div><img src="https://static.tildacdn.com/tild3835-6636-4365-a334-383230373464/123.png"><div class="t-redactor__text"><strong>Пример 1.</strong> Используя оператор SQL GROUP BY найти сумму продаж альбомов (Sale) всех исполнителей (Singer):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT Singer, SUM(Sale) AS AllSales
FROM Artists
GROUP BY Singer;</code></pre><div class="t-redactor__text"><strong>Пример 2.</strong> Узнать в каком году был выпущен последний альбом каждой из групп используя оператор SQL GROUP BY:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT Singer, MAX(Year) AS LastAlbumYear
FROM Artists
GROUP BY Singer;</code></pre><div class="t-redactor__text">Самостоятельно создайте таблицу Artists и выполните каждый пример. В комментариях можете писать новые примеры к данной таблице и не только.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: HAVING</title>
			<link>https://www.easyitway.com/tpost/k23zbec3o1-operator-sql-having</link>
			<amplink>https://www.easyitway.com/tpost/k23zbec3o1-operator-sql-having?amp=true</amplink>
			<pubDate>Tue, 12 Dec 2023 00:49:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: HAVING</h1></header><div class="t-redactor__text">Оператор <strong>HAVING</strong> наряду с оператором WHERE позволяет определять условия выборки уже сгруппированных некоторым образом данных. Только оператор HAVING применяется не для всего набора столбцов таблицы, а для набора созданного оператором SQL GROUP BY и применяется всегда строго после него. Его синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">HAVING aggregate_function(column_name) operator value;</code></pre><div class="t-redactor__text">Примеры оператора SQL HAVING. Имеется следующая таблица Artists:</div><img src="https://static.tildacdn.com/tild6632-3164-4130-a564-373765323165/2023-12-12_00-49.png"><div class="t-redactor__text"><strong>Пример 1.</strong> Используя оператор SQL HAVING выведем название исполнителей (Singer) число продаж альбомов (Sale) которого больше 2000000:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT Singer, SUM(Sale)
FROM Artists
GROUP BY Singer
HAVING SUM(Sale) &gt; 2000000;</code></pre><div class="t-redactor__text"><strong>Пример 2.</strong> Используя оператор SQL HAVING выведем название исполнителя, который исполнялся еще до 1995 года:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT Singer, MIN(Year)
FROM Artists
GROUP BY Singer
HAVING MIN(Year) &lt; 1995;</code></pre><div class="t-redactor__text">Самостоятельно создайте таблицу Artists и выполните каждый пример. В комментариях можете писать новые примеры к данной таблице и не только.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: DISTINCT</title>
			<link>https://www.easyitway.com/tpost/9vd1c51jc1-operator-sql-distinct</link>
			<amplink>https://www.easyitway.com/tpost/9vd1c51jc1-operator-sql-distinct?amp=true</amplink>
			<pubDate>Tue, 12 Dec 2023 00:51:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор DISTINCT используется для указания на то, что следует работать только с уникальными значениями столбца.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: DISTINCT</h1></header><div class="t-redactor__text">Оператор <strong>DISTINCT</strong> используется для указания на то, что следует работать только с уникальными значениями столбца.<br /><br />Он нашел широкое применение в операторе SQL SELECT, для выборки уникальных значений. Так же используется в агрегатных функциях. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT DISTINCT column_name FROM table_name;</code></pre><div class="t-redactor__text">Примеры оператора SQL DISTINCT. Имеется следующая таблица Artists:</div><img src="https://static.tildacdn.com/tild3639-3163-4561-b861-333064343839/3444.png"><div class="t-redactor__text"><strong>Пример 1.</strong> Используя оператор SQL DISTINCT вывести, какие исполнители (Singer) имеются в таблице:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT DISTINCT Singer FROM Artists;</code></pre><div class="t-redactor__text"><strong>Пример 2.</strong> Используя оператор SQL DISTINCT и COUNT вывести количество уникальных исполнителей в таблице:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT COUNT(DISTINCT Singer)
AS CountOfSingers
FROM Artists;</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild3738-6561-4163-b834-386233383766/countofsingers.png"><div class="t-redactor__text">Цифра «3» т.к. в таблице 3 музыкальных группы, которые просто повторяются и уже не уникальны.<br /><br />Самостоятельно создайте таблицу Artists и выполните каждый пример. В комментариях можете писать новые примеры к данной таблице и не только.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Операторы SQL: AND и OR</title>
			<link>https://www.easyitway.com/tpost/skgfd0yay1-operatori-sql-and-i-or</link>
			<amplink>https://www.easyitway.com/tpost/skgfd0yay1-operatori-sql-and-i-or?amp=true</amplink>
			<pubDate>Tue, 12 Dec 2023 00:53:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Операторы AND и OR — предикаты языка SQL, служащие для создания логических выражений.</description>
			<turbo:content>
<![CDATA[<header><h1>Операторы SQL: AND и OR</h1></header><div class="t-redactor__text">Операторы <strong>AND</strong> и <strong>OR</strong> — предикаты языка SQL, служащие для создания логических выражений. В SQL предикатами называются операторы, возвращающие значения TRUE или FALSE. Предикат AND — эквивалент логического умножения (конъюнкции), предикат OR — эквивалент логического сложения (дизъюнкции).<br /><br />Таблица истинности для предикатов:</div><img src="https://static.tildacdn.com/tild3266-3331-4366-b433-633231376337/555.png"><div class="t-redactor__text">Для выполнения условия предиката AND должны быть выполнены оба условия. Для выполнения предиката OR должно быть выполнено хотя бы одно условие.<br /><br />Предикат AND имеет следующий синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">boolean_expression AND boolean_expression</code></pre><div class="t-redactor__text">Предикат OR имеет следующий синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">boolean_expression OR boolean_expression</code></pre><div class="t-redactor__text">Примеры оператора SQL AND &amp; OR. Имеется следующая таблица Planets:</div><img src="https://static.tildacdn.com/tild6466-3261-4132-a232-383836623762/666.png"><div class="t-redactor__text"><strong>Пример 1.</strong> Используя операторы AND и OR вывести записи планет, у которых радиус планеты меньше 10000 и открытых (OpeningYear) после 1620:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Planets WHERE Radius &lt; 10000 AND OpeningYear &gt; 1620;</code></pre><div class="t-redactor__text"><strong>Пример 2.</strong> Используя операторы AND и OR вывести записи планет, названия которых начинаются с буквы «N» или заканчиваются на букву «s» и не имеющие колец:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT *
FROM Planets
WHERE (PlanetName LIKE &#039;N%&#039;
OR PlanetName LIKE &#039;%s&#039;)
AND HavingRings = &#039;No&#039;;</code></pre><div class="t-redactor__text">Самостоятельно создайте таблицу Planets и выполните каждый пример. В комментариях можете писать новые примеры к данной таблице и не только.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Функции языка SQL</title>
			<link>https://www.easyitway.com/tpost/0r78putvg1-funktsii-yazika-sql</link>
			<amplink>https://www.easyitway.com/tpost/0r78putvg1-funktsii-yazika-sql?amp=true</amplink>
			<pubDate>Tue, 12 Dec 2023 00:56:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>COUNT() — функция возвращающая количество записей (строк) таблицы. Запись функции с указанием столбца вернет количество записей конкретного столбца за исключением NULL записей.</description>
			<turbo:content>
<![CDATA[<header><h1>Функции языка SQL</h1></header><div class="t-redactor__text">В этой статье вы можете рассмотреть виды функций в языке SQL. Функции могут быть агрегатными или скалярными. Начнем…</div><h4  class="t-redactor__h4">COUNT()</h4><div class="t-redactor__text"><strong>COUNT()</strong> — функция возвращающая количество записей (строк) таблицы. Запись функции с указанием столбца вернет количество записей конкретного столбца за исключением NULL записей. Синтаксис функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">COUNT(column_name);</code></pre><div class="t-redactor__text">Запись функции с указанием маски «*» вернет количество всех записей в таблице. Синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">COUNT(*);</code></pre><div class="t-redactor__text">Рассмотрим примеры. Имеется следующая таблица Universities:</div><img src="https://static.tildacdn.com/tild6336-6233-4430-a436-663066613239/777.png"><div class="t-redactor__text">Пример 1. Вывести число записей таблицы, используя функцию COUNT:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT COUNT(*)
FROM Universities; // выведит 7</code></pre><div class="t-redactor__text">Пример 2. Найти количество университетов расположенных в Москве, используя функцию COUNT:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT COUNT(*) FROM Universities WHERE Location = &#039;Moscow&#039;; // выведит 3</code></pre><h4  class="t-redactor__h4">AVG()</h4><div class="t-redactor__text"><strong>AVG()</strong> — функция возвращающая среднее значение столбца. Данная функция применима только для числовых столбцов. Синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">AVG(column_name);</code></pre><div class="t-redactor__text">Рассмотрим пример. Возьмем нашу таблицу Universities. Пример. Используя функцию AVG найти среднее число студентов (Students) всех университетов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT AVG(Students) FROM Universities; // выведит 23133</code></pre><h4  class="t-redactor__h4">MIN()</h4><div class="t-redactor__text"><strong>MIN()</strong> — функция возвращающая минимальное значение столбца. Функция имеет следующий синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">MIN(column_name);</code></pre><div class="t-redactor__text">Рассмотрим пример. Возьмем нашу таблицу Universities. Пример. Используя функцию MIN найти минимальное значение столбца Professores:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT MIN(Professores) FROM Universities; // выведит 936</code></pre><h4  class="t-redactor__h4">MAX()</h4><div class="t-redactor__text"><strong>MAX()</strong> — функция возвращающая максимальное значение столбца таблицы. Функция имеет следующий синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">MAX(column_name);</code></pre><div class="t-redactor__text">Рассмотрим пример. Возьмем нашу таблицу Universities. Пример. Используя функцию MAX найти максимальное значение колонки Students:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT MAX(Students) FROM Univerities; // выведит 57000</code></pre><h4  class="t-redactor__h4">SUM()</h4><div class="t-redactor__text"><strong>SUM()</strong> — функция, возвращающая сумму значений столбца таблицы. Используется только для числовых столбцов. Синтаксис функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SUM ( [ALL | DISTINCT] expression );</code></pre><div class="t-redactor__text">Параметр <strong>ALL</strong> — является параметром по умолчанию. Считается сумма всех строк. При указании параметра <strong>DISTINCT</strong> — происходит подсчет только уникальных значений.<br /><br />Рассмотрим примеры. Возьмем нашу таблицу Universities. Пример 1. Используя функцию SUM найти количество студентов (Students) всех университетов в таблице:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT SUM(Students) FROM Universities; // выведит 161935</code></pre><div class="t-redactor__text">Пример 2. Используя функцию SUM произвести подсчет уникальных значений столбца Faculties:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT SUM(DISTINCT Faculties) FROM Universities; // выведит 117 (в столбце Faculties присутствует 2 одинаковых записи, под ID 1 и 5. Значение столбца под ID 5 не суммируется.)</code></pre><h4  class="t-redactor__h4">ROUND()</h4><div class="t-redactor__text"><strong>ROUND()</strong> — функция для округления десятичных чисел. Работает только с числовыми столбцами или произвольными вещественными числами. Синтаксис функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ROUND(expression, length);</code></pre><div class="t-redactor__text"><strong>expression</strong> — название столбца или столбцов, а так же вещественное число. <strong>length</strong> — указывает точность округления для числа.<br /><br />Рассмотрим пример. Возьмём таблицу Planets:</div><img src="https://static.tildacdn.com/tild3364-6361-4436-b163-366165336465/888.png"><div class="t-redactor__text">Пример. Используя функцию ROUND округлить столбец SunSeason с точностью до одного знака после запятой:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT ROUND(SunSeason, 1) FROM Planets;</code></pre><h4  class="t-redactor__h4">UCASE()</h4><div class="t-redactor__text"><strong>UCASE()</strong> — функция, возвращающая значения столбца или столбцов в верхнем регистре букв. В СУБД MS SQL Server аналогом UCASE() является функция UPPER с тем же синтаксисом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">UCASE(column_name)</code></pre><div class="t-redactor__text">Рассмотрим пример. Возьмём нашу таблицу Planets. Пример. Вывести названия планет в верхнем регистре, у которых нет колец, используя функцию UCASE:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT UCASE(PlanetName)
FROM Planets
WHERE HavingRings = &#039;No&#039;;</code></pre><h4  class="t-redactor__h4">LCASE()</h4><div class="t-redactor__text"><strong>LCASE()</strong> — функция, возвращающая значения столбца или столбцов в нижнем регистре букв. В СУБД MS SQL Server аналогом оператора SQL LCASE() является функция LOWER с тем же синтаксисом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">LCASE(column_name);</code></pre><div class="t-redactor__text">Рассмотрим пример. Возьмём нашу таблицу Planets. Пример. С помощью функции LCASE вывести в нижнем регистре названия планет, у которых есть кольца:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT LCASE(PlanetName)
FROM Planets
WHERE HavingRings = &#039;Yes&#039;;</code></pre><h4  class="t-redactor__h4">LEN()</h4><div class="t-redactor__text"><strong>LEN()</strong> — функция, возвращающая длину значения в поле записи. Функция исключает из подсчета конечные пробелы. Синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">LEN(column_name);</code></pre><div class="t-redactor__text">Рассмотрим пример. Возьмём нашу таблицу Planets. Пример. Вывести первооткрывателя планеты (Opener) и длину названия открытым им планеты, с помощью функции LEN:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT Opener, LEN(PlanetName) FROM Planets;</code></pre><h4  class="t-redactor__h4">MID()</h4><div class="t-redactor__text"><strong>MID()</strong> — функция, выводящая определенное количество символов текстового поля таблицы. Синтаксис функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">MID(colunm_name,start [,length]);</code></pre><div class="t-redactor__text">Параметр <strong>start</strong> задает позицию начального символа. Параметр <strong>length</strong> устанавливает количество символов для вывода начиная с позиции, указанной в параметре start.<br /><br />Рассмотрим пример. Возьмём нашу старую таблицу Universities. Пример. Вывести первые 3 символа названия города (Location) с помощью функции MID:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT MID(Location, 1, 3) FROM Universities;</code></pre><h4  class="t-redactor__h4">NOW()</h4><div class="t-redactor__text"><strong>NOW()</strong> — функция, возвращающая системное время и дату. Синтаксис функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">NOW();</code></pre><div class="t-redactor__text">Рассмотрим пример. Возьмём нашу старую таблицу Universities. Пример. Вывести сколько на текущий момент студентов обучается в каждом университете. используя функцию NOW:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT UniversityName, Students, NOW() AS CurDate FROM Universities;</code></pre><div class="t-redactor__text">Для закрепления материала выполните пример каждой функцию самостоятельно. Если будут вопросы пишите в комментариях и я обязательно на них отвечу.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: INNER JOIN</title>
			<link>https://www.easyitway.com/tpost/3av0oybih1-operator-sql-inner-join</link>
			<amplink>https://www.easyitway.com/tpost/3av0oybih1-operator-sql-inner-join?amp=true</amplink>
			<pubDate>Tue, 12 Dec 2023 01:05:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: INNER JOIN</h1></header><img src="https://static.tildacdn.com/tild3133-3436-4564-a334-616239346631/inner_join_1.png"><div class="t-redactor__text">Оператор <strong>INNER JOIN</strong> формирует таблицу из записей двух или нескольких таблиц. Каждая строка из первой (левой) таблицы, сопоставляется с каждой строкой из второй (правой) таблицы, после чего происходит проверка условия. Если условие истинно, то строки попадают в результирующую таблицу. В результирующей таблице строки формируются конкатенацией строк первой и второй таблиц. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT
    column_names [,... n]
FROM
    Table_1 INNER JOIN Table_2
ON condition;</code></pre><div class="t-redactor__text">Условие для сравнения задается в операторе ON. Пример <strong>INNER JOIN</strong>. Имеются две таблицы:<br /><br /><strong>Authors</strong> — содержит в себе информацию об авторах книг:</div><img src="https://static.tildacdn.com/tild6538-3864-4136-a637-343432333630/111.png"><img src="https://static.tildacdn.com/tild6364-3334-4935-a330-613866393766/111.png"><div class="t-redactor__text"><strong>Books</strong> — содержит в себе информацию о названии книг:</div><img src="https://static.tildacdn.com/tild3161-3066-4133-a535-633030323433/222.png"><div class="t-redactor__text">В таблице <strong>Books</strong> поле <strong>Book_ID</strong> являются внешним ключом и ссылаются на таблицу <strong>Authors</strong>.<br /><br />Пример. Используя оператор INNER JOIN вывести на экран, какими авторами были написаны какие из книг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Authors INNER JOIN Books
ON Authors.Author_ID = Books.Book_ID;</code></pre><div class="t-redactor__text">В запросе оператора <strong>INNER JOIN</strong> условие сравнения — это равенство полей Author_ID и Book_ID. В результирующую таблицу не попадет книга под названием Programming in PHP, так как значение её Book_ID не найдет равенства ни с одной строкой Author_ID.<br /><br />Самостоятельно создайте таблицы и выполните пример. В комментариях можете писать новые примеры к данному оператору и не только.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Характеристики PHP</title>
			<link>https://www.easyitway.com/tpost/b27t94v021-harakteristiki-php</link>
			<amplink>https://www.easyitway.com/tpost/b27t94v021-harakteristiki-php?amp=true</amplink>
			<pubDate>Thu, 14 Dec 2023 23:33:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Главным фактором при проектировании языка РНР является практичность. РНР должен предоставить программисту средства для быстрого и эффективного решения поставленных задач. РНР обусловлен пятью важными характеристиками:</description>
			<turbo:content>
<![CDATA[<header><h1>Характеристики PHP</h1></header><div class="t-redactor__text">Главным фактором при проектировании языка РНР является практичность. РНР должен предоставить программисту средства для быстрого и эффективного решения поставленных задач. РНР обусловлен пятью важными характеристиками:</div><h3  class="t-redactor__h3">Традиционность:</h3><div class="t-redactor__text">Язык РНР кажется знакомым программистам, работающим в разных областях. Многие конструкции языка позаимствованы из Си Perl, а нередко код РНР практически неотличим от того, что встречается в типичных программах С или Pascal. Это заметно снижает начальные усилия при изучении РНР.</div><h3  class="t-redactor__h3">Простота:</h3><div class="t-redactor__text">Сценарий РНР может состоять из 10000 строк или из одной строки — все зависит от специфики вашей задачи. Вам не придется подгружать библиотеки, указывать специальные параметры компиляции. Механизм РНР просто начинает выполнять код после первой экранирующей последовательности. Если код имеет правильный синтаксис, он исполняется в точности так, как указал программист.</div><h3  class="t-redactor__h3">Эффективность:</h3><div class="t-redactor__text">Эффективность является исключительно важным фактором при программировании для многопользовательских сред, к числу которых относится и WWW. В РНР 4.0 был реализован механизм выделения ресурсов и обеспечена улучшенная поддержка объектно-ориентированного программирования, а также средства управления сеансом.</div><h3  class="t-redactor__h3">Безопасность:</h3><div class="t-redactor__text">В РНР реализованы механизмы безопасности, находящиеся под управлением администраторов; при правильной настройке РНР это обеспечивает максимальную свободу действий и безопасность. РНР может работать в безопасном режиме(safe mode), который ограничивает возможности применения РНР пользователями по ряду важных показателей.</div><div class="t-redactor__text">В стандартный набор функций РНР входит ряд надежных механизмов шифрования. РНР также совместим с многими приложениями независимых фирм, что позволяет легко интегрировать его с защищенными технологиями электронной коммерции.</div><div class="t-redactor__text">Другое преимущество заключается в том, что исходный текст сценариев РНР нельзя просмотреть в браузере, поскольку сценарий компилируется до его отправки по запросу пользователя. Реализация РНР на стороне сервера предотвращает похищение нетривиальных сценариев пользователями.</div><h3  class="t-redactor__h3">Гибкость:</h3><div class="t-redactor__text">Поскольку РНР является встраиваемым языком, он отличается исключительной гибкостью по отношению к потребностям разработчика. Хотя РНР обычно рекомендуется использовать в сочетании с HTML, он с таким же успехом интегрируется и в JavaScript, WML, XML и другие языки.</div><div class="t-redactor__text">Кроме того, хорошо структурированные приложения РНР легко расширяются по мере необходимости. В сущности, сценарии РНР могут передаваться любым устройствам с браузерами, включая сотовые телефоны, электронные записные книжки, пейджеры и портативные компьютеры. Программисты, занимающиеся вспомогательными утилитами, могут запускать РНР в режиме командной строки.</div><div class="t-redactor__text">РНР не содержит кода, ориентированного на конкретный web-сервер, пользователи не ограничиваются определенными серверами. Apache, Microsoft IIS, Netscape Enterprise Server, Stronghold и Zeus — РНР работает на всех серверах.</div><div class="t-redactor__text">Поскольку эти серверы работают на разных платформах, РНР в целом является платформенно независимым языком и существует на таких платформах, как UNIX, Solaris, FreeBSD и Windows.</div><h3  class="t-redactor__h3">Немного о преимуществах и недостатках:</h3><div class="t-redactor__text">Преимущества</div><div class="t-redactor__text"><ul><li>является свободным программным обеспечением, распространяемым под особой лицензией (PHP license);</li><li>легок в освоении на всех этапах;</li><li>поддерживается большим сообществом пользователей и разработчиков;</li><li>имеет развитую поддержку баз данных;</li><li>имеется огромное количество библиотек и расширений языка;</li><li>является довольно полной заменой проприетарной среды ASP (Active Server Pages) от Microsoft;</li><li>может быть развёрнут почти на любом сервере;</li><li>портирован под большое количество аппаратных платформ и операционных систем.</li></ul></div><div class="t-redactor__text">Недостатки</div><div class="t-redactor__text"><ul><li>не подходит для создания десктопных приложений или системных компонентов;</li><li>имеет слабые средства для работы с исключениями;</li><li>глобальные параметры конфигурации влияют на базовый синтаксис языка, что затрудняет настройку сервера и разворачивание приложений;</li><li>веб-приложения, написанные на PHP, зачастую имеют проблемы с безопасностью.</li></ul></div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Знакомство с PHP</title>
			<link>https://www.easyitway.com/tpost/y4grjuoc21-znakomstvo-s-php</link>
			<amplink>https://www.easyitway.com/tpost/y4grjuoc21-znakomstvo-s-php?amp=true</amplink>
			<pubDate>Thu, 14 Dec 2023 23:34:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Запомните все php файлы имеют расширения «.php». Если не ставить данного расширения у вас ничего не заработает.</description>
			<turbo:content>
<![CDATA[<header><h1>Знакомство с PHP</h1></header><div class="t-redactor__text">Для работы понадобится сервер, который бы мог интерпретировать php. Я рекомендую использовать <a href="http://open-server.ru/download/" target="_blank" rel="noreferrer noopener">Open Server</a>, как самый быстрый и простой способ. Сервер является портативным, устанавливать его не надо. На официальном сайте есть полный мануал его настройки. Также для изучения на практике php вам понадобится редактор кода, рекомендую поставить <a href="http://sublimetext.ru/" target="_blank" rel="noreferrer noopener">Sublime Text</a>, т.к. он быстр, прост и бесплатен. Запомните все php файлы имеют расширения «.php». Если не ставить данного расширения у вас ничего не заработает.</div><div class="t-redactor__text">Механизм лексического анализа должен как-то отличать код РНР от других элементов страницы. Существуют четыре варианта оформления перехода в РНР:</div><div class="t-redactor__text"><ul><li>стандартные теги;</li><li>короткие теги;</li><li>теги script;</li><li>теги в стиле ASP.</li></ul></div><h3  class="t-redactor__h3">Cтандартные теги:</h3><div class="t-redactor__text">Стандартные теги это те теги, которые часто используются в работе программистам.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
  print &quot;Welcome PHP!&quot;; 
 ?&gt;</code></pre><h3  class="t-redactor__h3">Короткие теги:</h3><div class="t-redactor__text">Короткие теги наиболее компактные в РНР.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">
&lt;?
  print &quot;Welcome PHP!&quot;; 
 ?&gt;</code></pre><div class="t-redactor__text">По умолчанию они не используются, их нужно активизировать. Есть 2 способа это сделать:</div><div class="t-redactor__text"><ul><li>указать ключ -enable-short-tags при компиляции РНР;</li><li>включить параметр short_open_tag в файл php.ini.</li></ul></div><h3  class="t-redactor__h3">Теги script:</h3><div class="t-redactor__text">Некоторые текстовые редакторы ошибочно принимают код РНР за код HTML, что нарушает работу над web-страницей. Решение этой проблемы заключается в использовании тега script:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;script language=&quot;php&quot;&gt;
&lt;?php print &quot;Welcome PHP!&quot;; ?&gt;
&lt;/script&gt;</code></pre><h3  class="t-redactor__h3">Теги в стиле ASP:</h3><div class="t-redactor__text">Четвертый способ оформления внедренного кода РНР — теги в стиле ASP(Active Server Page). Они похожи на короткие теги, описанные выше, однако вместо вопросительного знака используется знак процента(%):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;%php 
  print &quot;Welcome PHP!&quot;; 
 %&gt;</code></pre><div class="t-redactor__text">У тегов в стиле ASP есть одна особенность, делающая запись более компактной. Во внедренный код РНР не обязательно включать команду print — знак равенства(=), расположенный сразу же после открывающего тега в стиле ASP, приказывает лексическому механизму РНР вывести значение указанной переменной:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;%=$primer %&gt;</code></pre><h3  class="t-redactor__h3">Внедрение HTML в РНР:</h3><div class="t-redactor__text">Одной из самых замечательных особенностей PHP является простота использования в сочетании с другими языками — например, HTML.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;html&gt;
&lt;head&gt;
&lt;title&gt;PHP + HTML&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php
print &quot;&lt;h3&gt;Внедряем HTML в PHP.&lt;/h3&gt;&quot;;
?&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h3  class="t-redactor__h3">Включение нескольких сценариев РНР:</h3><div class="t-redactor__text">Для обеспечения необходимой гибкости при построении динамических web-приложений можно внедрить в страницу несколько сценариев РНР. При внедрении нескольких сценариев переменные, значения которых были присвоены в одном сценарии, могут использоваться в другом сценарии той же страницы.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;html&gt;
&lt;head&gt;
&lt;title&gt;
&lt;?php
print &quot;Another PHP-enabled page&quot;;
$primer = &quot;Hello World!&quot;;
?&gt;
&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;?php print $primer; ?&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h3  class="t-redactor__h3">Комментарии в РНР:</h3><div class="t-redactor__text">Комментарии следует использовать даже в относительно простых и незамысловатых сценариях. В РНР существуют два формата комментариев:</div><div class="t-redactor__text"><ul><li>Однострочные комментарии обычно используются для коротких пояснений или примечаний, относящихся к локальному коду.</li><li>Многострочные комментарии обычно используются при оформлении алгоритмов на псевдокоде и в более подробных объяснениях.</li></ul></div><div class="t-redactor__text">Оба способа в конечном счете приводят к одинаковому результату и совершенно не влияют на общее быстродействие сценария. Выбор варианта остается за вами.</div><h4  class="t-redactor__h4">Однострочные комментарии:</h4><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
// Выбрать цвет машины
$mashine_color = &quot;black&quot;;

# Выбрать цвет телефона
$phone_color = &quot;green&quot;;

print &quot;Mashine are $mashine_color, phone are $phone_color&quot;
?&gt;</code></pre><h4  class="t-redactor__h4">Многострочные комментарии:</h4><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
/*
  Пример использования многострочных комментариев 
  Автор: Черемных Виктор
  Дата: 21 ноября 2016 год
*/
?&gt;</code></pre><div class="t-redactor__text">Как видите, многострочные комментарии особенно удобны для вывода относительно длинной сводной информации.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Основные конструкции PHP</title>
			<link>https://www.easyitway.com/tpost/r1s6fu10j1-osnovnie-konstruktsii-php</link>
			<amplink>https://www.easyitway.com/tpost/r1s6fu10j1-osnovnie-konstruktsii-php?amp=true</amplink>
			<pubDate>Thu, 14 Dec 2023 23:37:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Любой сценарий PHP сформирован из ряда конструкций. Конструкциями могут быть операторы, функции, циклы.
</description>
			<turbo:content>
<![CDATA[<header><h1>Основные конструкции PHP</h1></header><div class="t-redactor__text">Любой сценарий PHP сформирован из ряда конструкций. Конструкциями могут быть операторы, функции, циклы. Конструкции обычно заканчиваются точкой с запятой. Кроме того, конструкции могут быть сгруппированы в группу, формируя группу конструкций с фигурными скобками {…}. Группа конструкций — это также отдельная конструкция.</div><div class="t-redactor__text">Сегодня я кратко расскажу об основных конструкциях PHP. Приступим:</div><h3  class="t-redactor__h3">Условные операторы:</h3><div class="t-redactor__text">Условные операторы являются наиболее распространенными конструкциями во всех алгоритмических языках программирования.</div><h4  class="t-redactor__h4">1. Конструкция if</h4><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
if (логическое выражение)
оператор;
?&gt;</code></pre><div class="t-redactor__text">Конструкция if содержит логическое выражение. Если логическое выражение истинно (true), то оператор, следующий за конструкцией if будет исполнен, а если логическое выражение ложно (false), то следующий за if оператор исполнен не будет. Приведем пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
if ($a &gt; $b) echo &quot;значение a больше, чем b&quot;;
?&gt;</code></pre><h4  class="t-redactor__h4">2. Конструкция else</h4><div class="t-redactor__text">Часто возникает потребность исполнения операторов не только в теле конструкции if, но и в случае, если условие конструкции if не выполнено. В данной ситуации нельзя обойтись без конструкции else. Такая конструкция будет называться if-else.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
if (логическое_выражение)
инструкция_1;
else
инструкция_2;
?&gt;</code></pre><div class="t-redactor__text">Если логическое_выражение истинно, то выполняется<br /><br />инструкция_1, а иначе — инструкция_2. Как и в любом другом языке, конструкция else может опускаться, в этом случае при получении должного значения просто ничего не делается. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
if ($a &gt; $b) {
     echo &quot;a больше, чем b&quot;;
} else {
     echo &quot;a НЕ больше, чем b&quot;;
}
?&gt;</code></pre><h4  class="t-redactor__h4">Конструкция if-else.</h4><div class="t-redactor__text">Обратите внимание на расположение двоеточия (:)! Если его пропустить, будет сгенерировано сообщение об ошибке.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
if (логическое_выражение):
команды;
elseif(другое_логическое_выражение):
другие_команды;
else:
иначе_команды;
endif
?&gt;</code></pre><h4  class="t-redactor__h4">3. Конструкция elseif</h4><div class="t-redactor__text">elseif — это комбинация конструкций if и else. Эта конструкция расширяет условную конструкцию if-else.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
if (логическое_выражение_1)
оператор_1;
elseif (логическое_выражение_2)
оператор_2;
else
оператор_3;
?&gt;</code></pre><h4  class="t-redactor__h4">Практический пример использования конструкции elseif:</h4><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
if ($a &gt; $b) {
     echo &quot;a больше, чем b&quot;;
} elseif ($a == $b) {
     echo &quot;a равен b&quot;;
} else {
     echo &quot;a меньше, чем b&quot;;
}
?&gt;</code></pre><h3  class="t-redactor__h3">Управляющие конструкции</h3><h3  class="t-redactor__h3">Циклы:</h3><div class="t-redactor__text">Циклы позволяют повторять определенное (и даже неопределенное — когда работа цикла зависит от условия) количество раз различные операторы. Данные операторы называются телом цикла. Проход цикла называется итерацией.</div><h4  class="t-redactor__h4">1. Цикл с предусловием while</h4><div class="t-redactor__text">Цикл с предусловием while работает по принципам:</div><div class="t-redactor__text"><ul><li>Вычисляется значение логического выражения.</li><li>Если значение истинно, выполняется тело цикла, в противном случае — переходим на следующий за циклом оператор.</li></ul></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
while (логическое_выражение)
инструкция;
?&gt;</code></pre><div class="t-redactor__text">В данном случае телом цикла является инструкция. Обычно тело цикла состоит из большого числа операторов. Пример цикла с предусловием while:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$x=0;
while ($x++&lt;10) echo $x;
// Выводит 12345678910
?&gt;</code></pre><h4  class="t-redactor__h4">2. Цикл с постусловием do while</h4><div class="t-redactor__text">В отличие от цикла while, этот цикл проверяет значение выражения не до, а после каждого прохода. Таким образом, тело цикла выполняется хотя бы один раз.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
do
{
тело_цикла;
}
while (логическое_выражение);
?&gt;</code></pre><div class="t-redactor__text">После очередной итерации проверяется, истинно ли логическое_выражение, и, если это так, управление передается вновь на начало цикла, в противном случае цикл обрывается. Пример скрипта:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$x = 1;
do {
     echo $x;
} while ($x++&lt;10);
?&gt;</code></pre><h4  class="t-redactor__h4">3. Цикл со счетчиком for</h4><div class="t-redactor__text">Цикл со счетчиком используется для выполнения тела цикла определенное число раз. С помощью цикла for можно (и нужно) создавать конструкции, которые будут выполнять действия не такие, как простая переборка значения счетчика.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
for (инициализирующие_команды; условие_цикла; команды_после_итерации) { тело_цикла; }
?&gt;</code></pre><div class="t-redactor__text">Цикл for начинает свою работу с выполнения инициализирующих_команд. Данные команды выполняются только один раз.<br /><br />После этого проверяется условие_цикла, если оно истинно (true), то выполняется тело_цикла. После того, как будет выполнен последний оператор тела, выполняются команды_после_итерации. Затем снова проверяется условие_цикла. Если оно истинно (true), выполняется тело_цикла и команды_после_итерации.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
for ($x=0; $x&lt;10; $x++) echo $x;
//Выведит 0123456789
?&gt;</code></pre><div class="t-redactor__text">Для цикла for имеется и альтернативный синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
for(инициализирующие_команды; условие_цикла; команды_после_итерации):
операторы;
endfor;
?&gt;</code></pre><h4  class="t-redactor__h4">4. Цикл перебора массивов foreach</h4><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
foreach (массив as $ключ=&gt;$значение)
команды;
?&gt;</code></pre><div class="t-redactor__text">Команды циклически выполняются для каждого элемента массива, при этом очередная пара ключ=&gt;значение оказывается в переменных $ключ и $значение. Пример работы цикла foreach:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$names[&quot;Иванов&quot;] = &quot;Андрей&quot;;
$names[&quot;Петров&quot;] = &quot;Борис&quot;;
$names[&quot;Волков&quot;] = &quot;Сергей&quot;;
$names[&quot;Макаров&quot;] = &quot;Федор&quot;;
foreach ($names as $key =&gt; $value) {
echo &quot;&lt;b&gt;$value $key&lt;/b&gt;&lt;br&gt;&quot;;
}
?&gt;</code></pre><div class="t-redactor__text">Рассмотренный сценарий выводит</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Андрей Иванов
Борис Петров
Сергей Волков
Федор Макаров</code></pre><div class="t-redactor__text">У цикла foreach имеется и другая форма записи, которую следует применять, когда нас не интересует значение ключа очередного элемента.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
foreach (массив as $значение)
команды;
?&gt;</code></pre><div class="t-redactor__text">Цикл foreach оперирует не исходным массивом, а его копией. Это означает, что любые изменения, которые вносятся в массив, не могут быть «видны» из тела цикла. Что позволяет в качестве массива использовать не только переменную, но и результат работы какой-нибудь функции, возвращающей массив (в этом случае функция будет вызвана всего один раз — до начала цикла, а затем работа будет производиться с копией возвращенного значения).</div><h4  class="t-redactor__h4">5. Конструкция break</h4><div class="t-redactor__text">Очень часто для того, чтобы упростить логику сложного цикла, удобно иметь возможность его прервать в ходе очередной итерации. Для этого и существует конструкция break, которая осуществляет немедленный выход из цикла.</div><div class="t-redactor__text">Она может задаваться с одним необязательным параметром — числом, которое указывает, из какого вложенного цикла должен быть произведен выход. По умолчанию используется 1, т. е. выход из текущего цикла, но иногда применяются и другие значения.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
break; // По умолчанию
break(номер_цикла); // Для вложенных циклов (указывается номер прерываемого цикла)
?&gt;</code></pre><div class="t-redactor__text">Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$x=0;
while ($x++&lt;10) {
if ($x==3) break;
echo &quot;&lt;b&gt;Итерация $x&lt;/b&gt;&lt;br&gt;&quot;;
}
// Когда $x равен 3, цикл прерывается
?&gt;</code></pre><div class="t-redactor__text">Цикл выведет:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Итерация 1
Итерация 2</code></pre><div class="t-redactor__text">Если нам нужно прервать работу определенного (вложенного) цикла, то нужно передать конструкции break параметр — номер_цикла, например, break(1). Нумерация циклов выглядит так:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">for (...) // Третий цикл
{
  for (...) // Второй цикл
  {
     for (...) // Первый цикл
     {
     }
  }
}</code></pre><h4  class="t-redactor__h4">6. Конструкция continue</h4><div class="t-redactor__text">Конструкция continue так же, как и break, работает только «в паре» с циклическими конструкциями. Она немедленно завершает текущую итерацию цикла и переходит к новой (конечно, если выполняется условие цикла для цикла с предусловием). Точно так же, как и для break, для continue можно указать уровень вложенности цикла, который будет продолжен по возврату управления.</div><div class="t-redactor__text">В основном continue позволяет вам сэкономить количество фигурных скобок в коде и увеличить его удобочитаемость. Это чаще всего бывает нужно в циклах-фильтрах, когда требуется перебрать некоторое количество объектов и выбрать из них только те, которые удовлетворяют определенным условиям.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$x=0;
while ($x++&lt;5) {
if ($x==3) continue;
echo &quot;&lt;b&gt;Итерация $x&lt;/b&gt;&lt;br&gt;&quot;;
}
// Цикл прервется только на третьей итерации
?&gt;</code></pre><div class="t-redactor__text">Cкрипт выведет:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Итерация 1
Итерация 2
Итерация 4
Итерация 5</code></pre><h3  class="t-redactor__h3">Конструкция выбора:</h3><h4  class="t-redactor__h4">switch-case</h4><div class="t-redactor__text">Часто вместо нескольких расположенных подряд инструкций if-else целесообразно воспользоваться специальной конструкцией выбора switch-case. Данная конструкция предназначена для выбора действий, в зависимости от значения указанного выражения.</div><div class="t-redactor__text">Конструкция switch-case чем-то напоминает конструкцию if-else. Конструкцию выбора можно использовать, если предполагаемых вариантов много, например, более 5, и для каждого варианта нужно выполнить специфические действия.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
switch(выражение) {
case значение1: команды1; [break;]
case значение2: команды2; [break;]
. . .
case значениеN: командыN; [break;]
[default: команды_по_умолчанию; [break]]
}
?&gt;</code></pre><div class="t-redactor__text">Принцип работы конструкции switch-case такой:<br /><br /><ul><li>Вычисляется значение выражения;</li><li>Просматривается набор значений. Пусть значение1 равно значению выражения, вычисленного на первом шаге. Если не указана конструкция break, то будут выполнены команды i, i+1, i+2, … , N. В противном случае будет выполнена только команда с номером i.</li><li>Если ни одно значение из набора не совпало со значением выражения, тогда выполняется блок default, если он указан.</li></ul><br />Пример использования конструкции switch-case:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$x=1;
// Используем if-else
if ($x == 0) {
    echo &quot;x=0&lt;br&gt;&quot;;
} elseif ($x == 1) {
    echo &quot;x=1&lt;br&gt;&quot;;
} elseif ($x == 2) {
    echo &quot;x=2&lt;br&gt;&quot;;
}
// Используем switch-case
switch ($x) {
case 0:
    echo &quot;x=0&lt;br&gt;&quot;;
    break;
case 1:
    echo &quot;x=1&lt;br&gt;&quot;;
    break;
case 2:
    echo &quot;x=2&lt;br&gt;&quot;;
    break;
}
?&gt;</code></pre><div class="t-redactor__text">Рассмотренный сценарий выводит x=1 дважды.</div><h3  class="t-redactor__h3">Конструкция возврата значений:</h3><h4  class="t-redactor__h4">return</h4><div class="t-redactor__text">Конструкция return возвращает значения, преимущественно из пользовательских функций, как параметры функционального запроса. При вызове return исполнение пользовательской функции прерывается, а конструкция return возвращает определенные значения.</div><div class="t-redactor__text">Если конструкция return будет вызвана из глобальной области определения (вне пользовательских функций), то скрипт также завершит свою работу, а return также возвратит определенные значения.</div><div class="t-redactor__text">Пример использования конструкции return для возврата значений типа integer:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
function retfunct()
{
     return 7;
}
echo retfunct();   // выводит &#039;7&#039;.
?&gt;</code></pre><div class="t-redactor__text">Пример возврата конструкцией return массивов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
function numbers()
{
     return array (0, 1, 2);
}
list ($zero, $one, $two) = numbers();
echo $zero;
echo $one;
echo $two;
// Выводит &#039;012&#039;
?&gt;</code></pre><h3  class="t-redactor__h3">Конструкции включений:</h3><div class="t-redactor__text">Конструкции включений позволяют собирать PHP программу (скрипт) из нескольких отдельных файлов. В PHP существуют две основные конструкции включений: require и include.</div><h4  class="t-redactor__h4">1. require()</h4><div class="t-redactor__text">Конструкция require позволяет включать код до выполнения сценария.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">require имя_файла;</code></pre><div class="t-redactor__text">При запуске программы интерпретатор заменит инструкцию на содержимое файла имя_файла (этот файл может также содержать сценарий на PHP).</div><h4  class="t-redactor__h4">2. include</h4><div class="t-redactor__text">Конструкция include также предназначена для включения файлов в код сценария PHP. В отличие от конструкции require конструкция include позволяет включать файлы в код PHP скрипта во время выполнения сценария.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">include имя_файла;</code></pre><h4  class="t-redactor__h4">3. require_once и include_once</h4><div class="t-redactor__text">Используя конструкции однократного включения require_once и include_once, можно быть уверенным, что один файл не будет включен дважды. Работают конструкции require_once и include_once так же, как и requre и include. Разница в их работе лишь в том, что перед включением файла интерпрететор проверяет, включен ли указанный файл ранее или нет. Если да, то файл не будет включен вновь.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Типы данных (переменных) в PHP</title>
			<link>https://www.easyitway.com/tpost/6ousr7lrg1-tipi-dannih-peremennih-v-php</link>
			<amplink>https://www.easyitway.com/tpost/6ousr7lrg1-tipi-dannih-peremennih-v-php?amp=true</amplink>
			<pubDate>Thu, 14 Dec 2023 23:45:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Типы данных составляют основу любого языка программирования и являются средством, с помощью которого программист представляет разные типы информации.</description>
			<turbo:content>
<![CDATA[<header><h1>Типы данных (переменных) в PHP</h1></header><div class="t-redactor__text">Типы данных составляют основу любого языка программирования и являются средством, с помощью которого программист представляет разные типы информации. PHP поддерживает восемь простых типов данных (переменных).<br /><br />Четыре скалярных типа:<br /><br /><ul><li>Тип boolean (двоичные данные)</li></ul><br />Это простейший тип. Он выражает истинность значения — это может быть либо TRUE, либо FALSE. Чтобы определить булев тип, используйте ключевое слово TRUE или FALSE. Оба регистро-независимы.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$a = True; // присвоить $a значение TRUE
?&gt;</code></pre><div class="t-redactor__text"><ul><li>Тип integer (целые числа)</li></ul><br />Целое это число из множества Z = {…, -2, -1, 0, 1, 2, …}, обычно длиной 32 бита (от –2 147 483 648 до 2 147 483 647). Целые могут быть указаны в десятичной, шестнадцатеричной или восьмеричной системе счисления.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$a = 1234; // десятичное число
$a = -123; // отрицательное число
$a = 0123; // восьмеричное число 
$a = 0x1A; // шестнадцатеричное число 
?&gt;</code></pre><div class="t-redactor__text"><ul><li>Тип float (числа с плавающей точкой или ‘double’)</li></ul><br />Double — вещественное число довольно большой точности (ее должно хватить для подавляющего большинства математических вычислений). Числа с плавающей точкой (они же числа двойной точности или действительные числа) могут быть определены при помощи любого из следующих синтаксисов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?&gt;</code></pre><div class="t-redactor__text"><ul><li>Тип string (строки)</li></ul><br />Строка в PHP — это набор символов любой длины. Длина строки ограничена только размером свободной оперативной памяти. Строка легко может быть обработана при помощи стандартных функций, можно также непосредственно обратиться к любому ее символу.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?
$a = &quot;Это просто текст&quot;;
echo $a; //Выводит &#039;Это просто текст&#039;
?&gt;</code></pre><div class="t-redactor__text">Два смешанных типа:<br /><br /><ul><li>Тип array (массивы)</li></ul><br />Массив в PHP — это упорядоченный набор данных, в котором устанавлено соответствие между значением и ключом. Индекс (ключ) служит для однозначной идентификации элемента внутри массива. В одном массиве не может быть двух элементов с одинаковыми индексами.<br /><br />Простой массив (список) пишется так:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
// Простой способ инициализации массива
$names[0]=&quot;Апельсин&quot;;
$names[1]=&quot;Банан&quot;;
$names[2]=&quot;Груша&quot;;
$names[3]=&quot;Помидор&quot;;
// names - имя массива 
// 0, 1, 2, 3 - индексы
?&gt;</code></pre><div class="t-redactor__text"><ul><li>Тип object (объекты)</li></ul><br />Объект является одним из базовых понятий объектно-ориентированного программирования. Внутренняя структура объекта похожа на хэш, за исключением того, что для доступа к отдельным элементам и функциям используется оператор -&gt;, а не квадратные скобки. Для инициализации объекта используется выражение new, создающее в переменной экземпляр объекта.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
class foo
{
     function do_foo()
     {
         echo &quot;Doing foo.&quot;; 
     }
}

$bar = new foo;
$bar-&gt;do_foo();
?&gt;</code></pre><div class="t-redactor__text">Два специальных типа:<br /><br /><ul><li>Тип resource (ресурсы)</li></ul><br />Ресурс — это специальная переменная, содержащая ссылку на внешний ресурс. Ресурсы создаются и используются специальными функциями.<br /><br /><ul><li>Тип NULL («пустой» тип)</li></ul><br />Специальное значение NULL говорит о том, что эта переменная не имеет значения. NULL — это единственно возможное значение типа NULL (пустой тип).<br /><br />Переменная считается NULL если:<br /><br /><ul><li>Присвоена константа NULL;</li><li>Не было присвоено какое-либо значение;</li><li>Была удалена с помощью unset().</li></ul><br />unset() разрушает специфицированные переменные. unset() не true-функция: это оператор. Поскольку никакое значение не возвращается, попытка получить значение unset() даст ошибку разбора.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$var = NULL;
?&gt;</code></pre><div class="t-redactor__text">Существуют также несколько псевдотипов:<br /><br /><ul><li>Псевдотип mixed (смешанный)</li></ul><br />mixed говорит о том, что параметр может принимать множество типов, но не обязательно все.<br /><br /><ul><li>Псевдотип number (числовой)</li></ul><br />number говорит о том, что параметр может быть либо integer, либо float.<br /><br />Некоторые функции принимают в качестве параметра определенные пользователем callback-функции. Callback-функции могут быть не только простыми функциями, но также методами объектов, включая статические методы классов.<br /><br />PHP-функция передается просто как строка ее имени. Её можно передать в любую встроенную или определенную пользователем функцию за исключением array(), echo(), empty(), eval(), exit(), isset(), list(), print() и unset().</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php 

// простой пример callback
function my_callback_function() {
     echo &#039;hello world!&#039;;
}
call_user_func(&#039;my_callback_function&#039;); 

// примеры callback-метода
class MyClass {
     function myCallbackMethod() {
         echo &#039;Hello World!&#039;;
     }
}

// вызов метода статического класса 
//без создания объекта
call_user_func(array(&#039;MyClass&#039;, &#039;myCallbackMethod&#039;)); 

// вызов метода объекта
$obj = new MyClass();
call_user_func(array(&amp;$obj, &#039;myCallbackMethod&#039;));
?&gt;</code></pre><div class="t-redactor__text">Сегодня мы с рассмотрели «Типы данных (переменных) в PHP». Я не стал расписывать много про каждый тип. Для каждого типа написано краткое объяснение, этого хватит для понимания данной темы. Материал необходим для самостоятельного написания простых программ на PHP в наших последущих уроках. На следующем уроке мы подробнее рассмотрим массивы в PHP. Все вопросы пишите в коментариях и я постораюсь на них ответить.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Массивы</title>
			<link>https://www.easyitway.com/tpost/33rog37f61-massivi</link>
			<amplink>https://www.easyitway.com/tpost/33rog37f61-massivi?amp=true</amplink>
			<pubDate>Thu, 14 Dec 2023 23:48:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>В PHP массив — настолько часто используемая структура, что вам придётся встречаться с ней очень и очень часто.</description>
			<turbo:content>
<![CDATA[<header><h1>Массивы</h1></header><div class="t-redactor__text">В PHP массив — настолько часто используемая структура, что вам придётся встречаться с ней очень и очень часто. Для быстрой и успешной работы необходимо понимать, как работают массивы и какие при этом используются приёмы.<br /><br />В программировании термин «массив» означает набор элементов данных одного типа, причём доступ к элементам осуществляется по номеру элемента.<br /><br />Переменная, представляющая массив в PHP, может служить как обычным массивом с цифровыми индексами, они носят название «Простые массивы», так и отображением (stroki), то есть, массивом со строковыми индексами. Такие массивы называются ассоциативными.<br /><br />Ассоциативный массив — это объект, задающий набор «ключей» и соответствующих им «значений». Массив можно представить в виде таблицы из двух колонок, в которой одна колонка является «ключом», а другая колонка — «значением»:</div><img src="https://static.tildacdn.com/tild3131-3038-4932-b163-303463616434/2023-12-14_23-48.png"><div class="t-redactor__text">Массив может быть создан языковой конструкцией array(). В качестве параметров она принимает любое количество разделенных запятыми пар key =&gt; value (ключ =&gt; значение).</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">array(
    key  =&gt; value,
    key2 =&gt; value2,
    key3 =&gt; value3,
    ...

)</code></pre><h3  class="t-redactor__h3">Многомерный массив:</h3><div class="t-redactor__text">Многомерный массив (массив массивов) предоставляет в распоряжение программиста более эффективные средства для хранения информации, требующей дополнительного структурирования. Создать многомерный массив несложно, просто добавьте дополнительную пару квадратных скобок, чтобы вывести массив в новое измерение:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$chessboard [1] [4] = &quot;King&quot;; // Двухмерный массив

$capitals[&quot;USA&quot;] [&quot;Ohio&quot;] = &quot;Columbus&quot;: // Двухмерный массив

$streets[&quot;USA&quot;][&quot;Ohio&quot;][&quot;Columbus&quot;] = &quot;Harrison&quot;; // Трехмерный массив</code></pre><h3  class="t-redactor__h3">Перебор элементов массива:</h3><div class="t-redactor__text">Число элементов в массиве не обязательно знать заранее — его можно вычислить при помощи функции count()</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  &lt;?php
  for ($i = 1; $i &lt;= count($arr); $i++)
  {
    echo $arr[$i].&quot; &quot;;
  }
  ?&gt;</code></pre><div class="t-redactor__text">Для вывода всех элементов массива на экран мы можем использовать функцию print_r, которая выведет все элементы массива вместе с их индексами.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php

$arr[0] = &quot;PHP&quot;;
$arr[1] = &quot;HTML&quot;;
$arr[2] = &quot;CSS&quot;;

print_r($arr);
?&gt; </code></pre><div class="t-redactor__text">Отображение в браузере:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Array ( [0] =&gt; PHP [1] =&gt; HTML [2] =&gt; CSS )</code></pre><div class="t-redactor__text">Также в PHP присутствует специальный цикл для обработки массивов - цикл foreach. Он представлен для упрощения работы с массивами.<br /><br />Синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">foreach (array as $value) statement
foreach (array as $key =&gt; $value) statement</code></pre><div class="t-redactor__text">Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$arr[0] = &quot;PHP&quot;;
$arr[1] = &quot;HTML&quot;;
$arr[2] = &quot;CSS&quot;;

foreach($arr as $value)

{
   echo $value, &quot;&lt;br&gt;&quot;;
   
}

?&gt;</code></pre><div class="t-redactor__text">Функция file(), которая читает файл и возвращает его содержимое в виде массива. Каждый элемент массива соответствует одной строке.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> &lt;?php
  $arr = file(&quot;text.txt&quot;);
  for($i = 0; $i &lt; count($arr); $i++)
  { 
     echo $arr[$i].&quot;&lt;br /&gt;&quot;;
  }
 ?&gt;</code></pre><div class="t-redactor__text">Функция explode(), позволяет разбить строку на несколько фрагментов, каждый из которых помещается в отдельный элемент массива:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
   $str = &quot;654|mail@mail.ru|http://www.it-black.ru|login|password&quot;;
  $arr = explode(&quot;|&quot;,$str);
  for($i = 0; $i &lt; count($arr); $i++)
  { 
     echo $arr[$i].&quot;&lt;br /&gt;&quot;;
  } 
?&gt;</code></pre><div class="t-redactor__text">Выведит:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">654
mail@mail.ru
https://www.it-black.ru
login
password</code></pre><div class="t-redactor__text">Существует и обратная функция — implode(), которая объединяет, элементы массива в строку, используя для этого заданный разделитель:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  &lt;?php
  $arr[] = &quot;654&quot;;
  $arr[] = &quot;mail@mail.ru&quot;;
  $arr[] = &quot;https://www.it-black.ru&quot;;
  $arr[] = &quot;login&quot;;
  $arr[] = &quot;password&quot;;
  
  $str = implode(&quot;##&quot;,$arr); 
  
  echo $str; //654##mail@mail.ru##http://www.it-black.ru##login##password
  ?&gt;</code></pre><div class="t-redactor__text">Уничтожить весь массив сразу можно с помощью функции unset().</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  &lt;?php
  $arr = array(9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
  unset($arr);
  if(isset($arr)) echo &quot;Массив определён&quot;;
  else echo &quot;Массив не определён&quot;; 
  ?&gt;</code></pre><h3  class="t-redactor__h3">Суперглобальные массивы:</h3><div class="t-redactor__text">Эти массивы содержат всю информацию о состоянии сервера и среды выполнения скрипта. Массивы доступны в любом месте скрипта без дополнительных объявлений, т.е. не надо использовать ключевое слово global.</div><div class="t-redactor__text"><ul><li>$GLOBALS - содержит все глобальные переменные программы.</li><li>$_GET, $_POST - содержат параметры запроса GET, POST.</li><li>В эти массивы помещаются данные, передаваемые скрипту извне (так называемый, пользовательский ввод). Пользователь может влиять только на эти два массива плюс массив файлов и cookie. И именно поэтому все элементы этих массивов должны тщательно проверяться на допустимые значения.</li><li>$_SESSION - содержит содержимое сессии текущего пользователя.</li><li>$_COOKIE - содержит набор Cookie, переданных с запросом HTTP.</li><li>В массив $_COOKIES автоматически помещаются все cookies, которые получены от браузера. Это массив, из которого в любое время можно узнать какие cookies установлены на стороне клиента.</li><li>Массив $_REQUEST объединяет три массива: $_POST, $_GET, $_COOKIES. Пользоваться массивом $_REQUEST очень удобно в случаях, когда нет разницы, каким методом был сделан запрос.</li><li>$_FILES - содержит описание файлов, загруженных по HTTP POST, закодированному как multipart/form-data.</li><li>$_SERVER - содержат соответственно данные, переданные веб-сервером (заголовки HTTP, информация о сервере, информация об удалённом клиенте, путь к файлу скрипта).</li><li>С помощью этого массива можно узнать практически всё о сервере, на котором исполняется скрипт. Например:</li></ul></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
  echo &#039;параметры сервера:&#039; . &quot;&lt;br /&gt;\n&quot;;

    echo &quot;Операционная система: &quot; .
		$_SERVER[&quot;OS&quot;] . &quot;&lt;br /&gt;\n&quot;;
    echo &quot;Web-сервер: &quot; .
		$_SERVER[&quot;SERVER_SOFTWARE&quot;] . &quot;&lt;br /&gt;\n&quot;;
    echo &quot;Имя сервера: &quot; .
		$_SERVER[&quot;SERVER_NAME&quot;] . &quot;&lt;br /&gt;\n&quot;;
    echo &quot;Адрес сервера: &quot; .
		$_SERVER[&quot;SERVER_ADDR&quot;] . &quot;&lt;br /&gt;\n&quot;;
    echo &quot;Порт сервера: &quot; .
		$_SERVER[&quot;SERVER_PORT&quot;] . &quot;&lt;br /&gt;\n&quot;;
    echo &quot;Адрес клиента: &quot; .
		$_SERVER[&quot;REMOTE_ADDR&quot;] . &quot;&lt;br /&gt;\n&quot;;
    echo &quot;Путь к документам на сервере: &quot; .
		$_SERVER[&quot;DOCUMENT_ROOT&quot;] . &quot;&lt;br /&gt;\n&quot;;
    echo &quot;Полный путь к текущему скрипту: &quot; .
		$_SERVER[&quot;SCRIPT_FILENAME&quot;] . &quot;&lt;br /&gt;\n&quot;;
    echo &quot;Имя текущего скрипта: &quot; .
		$_SERVER[&quot;PHP_SELF&quot;] . &quot;&lt;br /&gt;\n&quot;;
  ?&gt;</code></pre><div class="t-redactor__text"><ul><li>Пользоваться этим массивом нужно аккуратно, т.к. некоторые сервера имеют достаточно специфичные настройки или значения параметров. Иногда это приводит к неприятным ошибкам, которые очень сложно диагностировать и исправить.</li><li>$_ENV - содержит переменные окружения установленные для всех скриптов на сервере.</li></ul><br />Суперглобальные массивы очень удобны в работе, но злоупортеблять ими не стоит, особенно массивом $_SESSION. Если переменной нужна только в локальной области видимости - не надо её делать глобальной. Слишком большое количество "лишних" переменных сильно снижает быстродействие и эффективность скрипта.<br /><br />Немного практики для закрепления материала (сделайте задания самостоятельно и ответы напишите в комментариях):<br /><br />1. Дан массив $a = array('Linux', 'Mac OS', 'Max', 'Alex', 'Dragons', 'Little');. Определите числа элементов в массиве с помощью функции count().<br /><br />2. Создайте массив и отобразите его с помощью функции ptint_r.<br /><br />3. Создайте текстовый файл (заполните его) и с помощью функции file(), возвратите содержимое в виде массива.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Переменные в PHP</title>
			<link>https://www.easyitway.com/tpost/tpymup7ez1-peremennie-v-php</link>
			<amplink>https://www.easyitway.com/tpost/tpymup7ez1-peremennie-v-php?amp=true</amplink>
			<pubDate>Thu, 14 Dec 2023 23:52:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Когда выполняется код, нам надо где-то хранить промежуточные результаты и другие данные. Для этого в программировании используются переменные.</description>
			<turbo:content>
<![CDATA[<header><h1>Переменные в PHP</h1></header><div class="t-redactor__text">Когда выполняется код, нам надо где-то хранить промежуточные результаты и другие данные. Для этого в программировании используются переменные. В переменной можно сохранить какое-то число или строку. У каждой переменной есть имя, и она обозначается конструкцией вроде $daysPassed (в начале всегда ставится знак доллара). Название (daysPassed — «прошлоДней») придумывает программист. Чтобы сохранить значение в переменной, используется оператор =.<br /><br />Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$daysPassed = 10;</code></pre><div class="t-redactor__text">Эта команда создает переменную $daysPassed и кладет в нее число 10. Теперь можно вывести это значение с помощью echo:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">echo $daysPassed; → напечатает 10</code></pre><div class="t-redactor__text">Имя переменной начинается с буквы или символа подчеркивания и состоит из букв, символов подчеркивания, цифр или других ASCII-символов в интервале от 127 до 255.</div><h2  class="t-redactor__h2">Область видимости переменных</h2><div class="t-redactor__text">Область видимости определяется как область доступности переменной в той программе, в которой она была объявлена. В зависимости от области видимости переменные РНР делятся на четыре типа:</div><h3  class="t-redactor__h3">1. Локальные переменные</h3><div class="t-redactor__text">Переменная, объявленная внутри пользовательской функции, считается локальной. На нее можно ссылаться только в этой функции. При любом присваивании вне функции будет использоваться совершенно другая переменная, которая не имеет ничего общего (кроме имени) с переменной, объявленной внутри функции. При выходе из пользовательской функции, в которой была объявлена локальная переменная, эта переменная и ее значение уничтожаются.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
  
  /* глобальная область видимости */
    
  $age = 30;  // присвоить переменной age значение 30

  function birth() {
    // присвоить переменной age значение 1
    $age = 1;  // это локальная переменная - она видна только внутри функции
  }
     
  // Вызов функции
  birth();
     
  // выводим значение переменной age
  echo $age;  // =&gt; 30
   
?&gt;</code></pre><div class="t-redactor__text">Внутри функции birth выполняется присваивание переменной $age значения 1, но это не таже самая переменная, что была определена в глобальной области видимости. Поэтому, когда выполняется вывод на экран значения переменной $age, выводится первоначальное значение 30.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> &lt;?php

  /* глобальная область видимости */
    
  $age = 30;  // присвоить переменной age значение 30
  
  function birth() {
   
    $age = 1;  // это локальная переменная - она видна только внутри функции
    
    echo $age;  // выводим значение переменной внутри функции
    
  }
   
?&gt;</code></pre><div class="t-redactor__text">Теперь мы вывели значение переменной $age внутри функции. Она выведит «1» т.к. мы обращаемся к локальной переменной.</div><h3  class="t-redactor__h3">2. Параметры функций</h3><div class="t-redactor__text">В РНР, как и во многих других языках программирования, любые параметры, передаваемые функции при вызове, должны быть объявлены в заголовке функции. Хотя параметрам присваиваются аргументы, переданные извне, после выхода из функции они становятся недоступными.</div><div class="t-redactor__text">Параметры объявляются в круглых скобках после имени функции. Объявление параметров практически не отличается от объявления типичной переменной:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Функция умножает переданное значение на 10 и возвращает результат
function x10($value) {
  $value = $value * 10;
  return $value;
}</code></pre><h3  class="t-redactor__h3">3. Глобальные переменные</h3><div class="t-redactor__text">Глобальные переменные позволяют вам пересекать границы между функциями, чтобы обращаться к значениям переменных. Ключевое слово global указывает, что данная переменная будет той же самой переменной повсюду в программе, то есть глобальной переменной. Изменение глобальной переменной внутри функции можно наблюдать за ее пределами. Не существует никаких ограничений на количество глобальных переменных, которые могут обрабатываться функцией:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
 
  // присвоим переменной age значение 30
  $age = 30;
 
  // определяем функцию
  function birth() {
    // определить переменную как глобальную
    global $age;
      
    // увеличиваем значение переменной age на 1
    $age = $age + 1;
  }
  // вызываем функцию
  birth();
 
  //выводим значение переменной age
  echo $age;
  
?&gt;</code></pre><div class="t-redactor__text">В результате исполнения этого кода будет выведено: 31.</div><div class="t-redactor__text">Глобальные переменные следует использовать в редких случаях, поскольку легко изменить значение переменной по ошибке, не предусмотрев последствий.</div><h3  class="t-redactor__h3">4. Статические переменные</h3><div class="t-redactor__text">Статические переменные — это переменные, которые не исчезают после завершения работы функции. Значение статической переменной можно использовать при следующем вызове функции — она по прежнему будет иметь то же значение, которое получила при последнем вызове функции. Статическая переменная объявляется с помощью ключевого слова static. При объявлении статической переменной в функции создается постоянное хранилище, в результате чего статическая переменная запоминает свое последнее значение.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
 
  // определение функции
  function birth() {
    // определяем переменную age как статическую
    static $age = 0;
     
    //увеличиваем значение age на 1
    $age = $age + 1;
     
    // выводим на экран значение переменной
    echo &quot;Значение статической переменной: $age&quot;;
  }
 
  // вызываем дважды функцию
  birth();
  birth();
 
?&gt;</code></pre><div class="t-redactor__text">Будет выведено:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Значение статической переменной: 1
Значение статической переменной: 2</code></pre><div class="t-redactor__text">Значение переменной $age сохраняется между вызовами функции birth. Это значение будет существовать, пока выполнение программы не завершится.</div><div class="t-redactor__text">Cтатические переменные имеют одну особенность, во время объявления переменной, ей может быть присвоено только статическое значение. Попытка присвоить этим переменным значения, являющиеся результатом выполнения работы выражений, вызовет ошибку обработки.</div><h2  class="t-redactor__h2">Переменные в переменных</h2><div class="t-redactor__text">В некоторых ситуациях бывает удобно использовать переменные, содержимое которых может динамически интерпретироваться как имя другой переменной.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$a = &quot;hello&quot;;
?&gt;</code></pre><div class="t-redactor__text">Переменная берет значение переменной и рассматривает его как имя переменной. В вышеприведенном примере hello может быть использовано как имя переменной при помощи двух знаков доллара. То есть:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  &lt;?php
$$a = &quot;world&quot;;
?&gt;</code></pre><div class="t-redactor__text">Теперь в дереве символов PHP определены и содержатся две переменные: $a, содержащая «hello», и $hello, содержащая «world». Таким образом, выведем:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
echo &quot;$a ${$a}&quot;;
?&gt;</code></pre><div class="t-redactor__text">И также выведем:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> &lt;?php
echo &quot;$a $hello&quot;;
?&gt;</code></pre><div class="t-redactor__text">Они обе выведут: hello world.</div><h2  class="t-redactor__h2">Стандартные переменные</h2><div class="t-redactor__text">В РНР поддерживается ряд стандартных переменных, предоставляющих в распоряжение программиста довольно подробную информацию о внутренней конфигурации. Значения одних переменных задаются РНР, другие изменяются в зависимости от операционной системы и web-сервера, с которыми работает РНР.</div><div class="t-redactor__text">Чтобы получить полный список переменных web-сервера, окружения и РНР, определенных для вашей конфигурации системы, достаточно выполнить следующий код:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">while(list($var,$value) = each($GLOBALS)) :
  echo &quot;&lt;BR&gt;$var =&gt; $value&quot;;
endwhile;</code></pre><div class="t-redactor__text">Стандартные переменные содержат разнообразные сведения — как полезные, так и не очень.<br /><br />Для закрепления материала попробуйте самостоятельно создать и вывести переменные любой сложности.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Константы</title>
			<link>https://www.easyitway.com/tpost/ntzekvddi1-konstanti</link>
			<amplink>https://www.easyitway.com/tpost/ntzekvddi1-konstanti?amp=true</amplink>
			<pubDate>Thu, 14 Dec 2023 23:56:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Константы — это идентификаторы (имена) простых значений. Их значение не может изменяться в ходе выполнения скрипта. Имена констант чувствительны к регистру. По принятому соглашению, имена констант всегда пишутся в верхнем регистре.</description>
			<turbo:content>
<![CDATA[<header><h1>Константы</h1></header><div class="t-redactor__text">Иногда в PHP переменные довольно неудобно использовать для постоянного хранения каких либо определенных значений, которые не меняются в течение работы программы. Такими значениями могут быть математические константы, пути к файлам, разнообразные пароли. Как раз для этих целей в PHP предусмотрена такая конструкция, как константа.<br /><br />Константы — это идентификаторы (имена) простых значений. Их значение не может изменяться в ходе выполнения скрипта. Имена констант чувствительны к регистру. По принятому соглашению, имена констант всегда пишутся в верхнем регистре.<br /><br />Имя константы должно соответствовать тем же правилам, что и другие имена в PHP. Правильное имя начинается с буквы или символа подчеркивания и состоит из букв, цифр и подчеркиваний. Регулярное выражение для проверки правильности имени константы выглядит так: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.<br /><br />В РНР константы определяются функцией define(). Эта функция имеет формат:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">define ($name, $value, $case_sen), где:

$name - имя константы;
$value - значение константы;
$case_sen - необязательный параметр логического типа, 
указывающий, следует ли учитывать регистр букв (true) или нет (false).</code></pre><div class="t-redactor__text">Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  &lt;?php
define(&quot;pi&quot;,3.14,true);
echo pi;
// Выводит 3.14
?&gt;</code></pre><h3  class="t-redactor__h3">Различия между константами и переменными:</h3><div class="t-redactor__text"><ul><li>У констант нет приставки в виде знака доллара ($);</li><li>Константы можно определить только с помощью функции define();</li><li>Константы могут быть определены и доступны в любом месте без учета области видимости;</li><li>Константы не могут быть определены или аннулированы после первоначального объявления;</li><li>Константы могут иметь только скалярные значения.</li></ul></div><h3  class="t-redactor__h3">Предопределенные константы:</h3><div class="t-redactor__text">PHP предоставляет большой список предопределенных констант для каждого выполняемого скрипта. Многие из этих констант определяются различными модулями и будут присутствовать только в том случае, если эти модули доступны в результате динамической загрузки или в результате статической сборки.</div><div class="t-redactor__text">В этот список входит и отдельный вид констант PHP — так называемые «магические константы». Это системные константы, значение которых определяет и устанавливает интерпретатор.</div><div class="t-redactor__text"><ul><li>__LINE__ Содержит номер текущей строки в текущем файле;</li></ul></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">   &lt;?php
echo &quot;Номер строки: &quot; . __LINE__; // Номер строки: 2
echo &quot;Номер строки: &quot; . __LINE__; // Номер строки: 3
echo &quot;Номер строки: &quot; . __LINE__; // Номер строки: 4
?&gt;</code></pre><div class="t-redactor__text"><ul><li>__FILE__ Содержит полное имя текущего файла;</li></ul></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  &lt;?php
echo &quot;Имя файла: &quot; . __FILE__;
// Имя файла: C:\openServer\domeins\localhost\index.php
?&gt;</code></pre><div class="t-redactor__text"><ul><li>__FUNCTION__ Содержит имя текущей функции;</li></ul></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
     function mySampleFunc() {
    echo  &quot;Имя функции: &quot; . __FUNCTION__;
}
mySampleFunc(); //Имя функции: mySampleFunc
     ?&gt;</code></pre><div class="t-redactor__text"><ul><li>__CLASS__ Содержит имя текущего класса;</li></ul></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  &lt;?php
    class Sample
{
    public function __construct() {
        echo __CLASS__;
    }
}
$obj = new Sample(); // Sample
    ?&gt;</code></pre><div class="t-redactor__text"><ul><li>__METHOD__ Содержит имя текущего метода текущего класса.</li></ul></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> &lt;?php
  class Sample
{
    public static function myMethod() {
        echo  &quot;Имя метода: &quot; . __METHOD__;
    }
}
Sample::myMethod(); // Имя метода: myMethod 
    ?&gt;</code></pre><div class="t-redactor__text">Эти константы очень удобны при отладке, но во всех других случаях их лучше не использовать.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Выражения, операнды и операторы</title>
			<link>https://www.easyitway.com/tpost/2cnisajck1-virazheniya-operandi-i-operatori</link>
			<amplink>https://www.easyitway.com/tpost/2cnisajck1-virazheniya-operandi-i-operatori?amp=true</amplink>
			<pubDate>Thu, 14 Dec 2023 23:58:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Выражение — это любая единица исходного кода программы, которая может быть вычислена для получения значения, например, вызов функции, использование операторов, или просто обращение к переменной по имени. </description>
			<turbo:content>
<![CDATA[<header><h1>Выражения, операнды и операторы</h1></header><h3  class="t-redactor__h3">Выражения</h3><div class="t-redactor__text">Выражение — это любая единица исходного кода программы, которая может быть вычислена для получения значения, например, вызов функции, использование операторов, или просто обращение к переменной по имени. В PHP почти всё является выражением.</div><div class="t-redactor__text">Выражения делятся на простые и сложные. Простые выражения являются самостоятельными выражениями — они не включают в себя ещё более простых выражений. Сложные выражения состоят из простых выражений. Типичный способ конструирования сложных выражений из простых выражений заключается в использовании операторов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  &lt;?php
// Примеры простых выражений
11                        // Числовой литерал
$str                      // Возвращает значение переменной
[]                        // Литерал массива
()                        // Оператора группировки
 
// Примеры сложных выражений
$alpha + 19                // Возвращает результат арифметической операции
($alpha - 37) * $beta / 2  // Возвращает результат арифметических операций
foo()                      // Возвращает результат вызова функции
$mass[1]                   // Возвращает значение элемента массива
?&gt;</code></pre><div class="t-redactor__text">Некоторые выражения оканчиваются точкой с запятой. Именно поэтому любое выражение — это то, что вычисляется для получения значения:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$a = 10;</code></pre><h3  class="t-redactor__h3">Операнды</h3><div class="t-redactor__text">Операнд представляет собой некоторую величину, обрабатываемую в программе. Операнды могут относиться к любому типу данных. Примеры операндов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$а++; // $а - операнд

$sum = $val1 + $val2; // $sum. $val1 и $val2 - операнды</code></pre><h3  class="t-redactor__h3">Операторы</h3><div class="t-redactor__text">Оператор представляет собой символическое обозначение некоторого действия, выполняемого с операндами в выражении. PHP выполняет автоматическое преобразование типов на основании типа оператора, объединяющего два операнда.</div><div class="t-redactor__text">В таблице приведен полный список всех операторов, упорядоченных по убыванию приоритета:</div><img src="https://static.tildacdn.com/tild3662-6665-4465-b231-396639386338/123.png"><div class="t-redactor__text">Также в PHP существует 8 разных видов операторов рассмотрим их подробнее:<br /><br /><ul><li>Математические операторы</li></ul></div><img src="https://static.tildacdn.com/tild6539-3663-4938-b338-316436626431/233.png"><div class="t-redactor__text"><ul><li>Операторы присваивания</li></ul>Операторы присваивания задают новое значение переменной.<br /><br /></div><img src="https://static.tildacdn.com/tild3161-3730-4534-b738-393465303264/333.png"><div class="t-redactor__text"><ul><li>Строковые операторы</li></ul>Строковые операторы PHP обеспечивают удобные средства конкатенации (то есть слияния) строк.<br /><br /></div><img src="https://static.tildacdn.com/tild3165-3166-4965-b735-313138643761/444.png"><div class="t-redactor__text"><ul><li>Операторы инкремента и декремента</li></ul>Вспомогательные операторы инкремента (++) и декремента (— (два минуса)), делают программу более наглядной и обеспечивают укороченную запись для увеличения или уменьшения текущего значения переменной на 1.<br /><br /></div><img src="https://static.tildacdn.com/tild6563-6566-4562-a562-383033623863/555.png"><div class="t-redactor__text"><ul><li>Логические операторы</li></ul>Логические операторы обеспечивают средства для принятия решений в зависимости от значения переменных. Логические операторы позволяют управлять порядком выполнения команд в программе и часто используются в управляющих конструкциях.<br /><br /></div><img src="https://static.tildacdn.com/tild3732-6235-4564-b831-353833326434/666.png"><div class="t-redactor__text"><ul><li>Операторы равенства</li></ul>Операторы равенства предназначены для сравнения двух величин и проверки их эквивалентности.<br /><br /></div><img src="https://static.tildacdn.com/tild6536-6362-4938-a135-353938353438/777.png"><div class="t-redactor__text"><ul><li>Операторы сравнения</li></ul>Операторы сравнения, как и логические операторы, позволяют управлять логикой программы и принимать решения при сравнении двух и более переменных.<br /><br /></div><img src="https://static.tildacdn.com/tild3466-3334-4365-a439-616638313535/888.png"><div class="t-redactor__text"><ul><li>Поразрядные операторы</li></ul>Поразрядные операторы выполняют операции с целыми числами на уровне отдельных битов, составляющих число.<br /><br /></div><img src="https://static.tildacdn.com/tild6630-3766-4137-b839-633335343263/999.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: PRIMARY KEY</title>
			<link>https://www.easyitway.com/tpost/v0x30mex31-operator-sql-primary-key</link>
			<amplink>https://www.easyitway.com/tpost/v0x30mex31-operator-sql-primary-key?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 13:55:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор PRIMARY KEY&nbsp;(Первичный ключ) — это параметр, который устанавливается для однозначной идентификации той или иной записи в таблице.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: PRIMARY KEY</h1></header><div class="t-redactor__text">Оператор <strong>PRIMARY KEY</strong> (Первичный ключ) — это параметр, который устанавливается для однозначной идентификации той или иной записи в таблице. Значения PRIMARY KEY должны быть всегда уникальны, а так же не содержать значений NULL. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">//Для MySQL:
CREATE TABLE table_name (
id int NOT NULL,
PRIMARY KEY (id));</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}">//Для MS SQL Server, Oracle, MS Access:
CREATE TABLE table_name (
id int NOT NULL PRIMARY KEY);</code></pre><div class="t-redactor__text">Пример работы оператора. Используя оператор <strong>PRIMARY KEY</strong> создадим таблицу Students с Первичным ключом ID:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Решение для MySQL:
CREATE TABLE Students (
ID int NOT NULL,
Name varchar(10),
famyly varchar(20),
god_postuplenia varchar(4),
PRIMARY KEY (ID));</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Решение для MS SQL Server, Oracle, MS Access:
CREATE TABLE Planets (
ID int NOT NULL PRIMARY KEY,
Name varchar(10),
famyly varchar(20),
god_postuplenia varchar(4));</code></pre><div class="t-redactor__text">После обработки сервером нашего запроса создаться таблица и если посмотреть структуру созданной таблицы (я использую phpMyAdmin), то можно увидеть возле «ID» это означает что первичный ключ установился успешно:</div><img src="https://static.tildacdn.com/tild3130-3535-4963-b433-336335646162/primary_key_primes_s.png"><div class="t-redactor__text">Для закрепления материала советую самостоятельно отработать примеры на своем компьютере. Если будут вопросы пишите в комментариях и я помогу.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: FOREIGN KEY</title>
			<link>https://www.easyitway.com/tpost/y50iz7y7g1-operator-sql-foreign-key</link>
			<amplink>https://www.easyitway.com/tpost/y50iz7y7g1-operator-sql-foreign-key?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 13:57:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор FOREIGN KEY (Внешний ключ) служит для указания в одной таблице на Первичный ключ (PRIMARY KEY) в другой.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: FOREIGN KEY</h1></header><div class="t-redactor__text">Оператор <strong>FOREIGN KEY</strong> (Внешний ключ) служит для указания в одной таблице на Первичный ключ (PRIMARY KEY) в другой. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">//Для MySQL:
CREATE TABLE table_1 (
ID_1 int NOT NULL
ID_2 int
PRIMARY KEY (ID_1)
FOREIGN KEY (ID_2) REFERENCES table_2(ID_2));</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}">//Для MS SQL Server, Oracle, MS Access:
CREATE TABLE table_1 (
ID_1 int NOT NULL PRIMARY KEY
ID_2 int FOREIGN KEY REFERENCES table_2(ID_2));</code></pre><div class="t-redactor__text">Пример оператора <strong>FOREIGN KEY</strong>. Имеются две таблицы:<br /><br /><strong>Authors</strong> — содержит в себе информацию об авторах книг:</div><img src="https://static.tildacdn.com/tild3933-3333-4135-a265-623363663438/2023-12-17_13-58.png"><div class="t-redactor__text"><strong>Books</strong> — содержит в себе информацию о названии книг:</div><img src="https://static.tildacdn.com/tild3032-6435-4430-b338-386231623131/2023-12-17_13-58_1.png"><div class="t-redactor__text">В таблице <strong>Books</strong> поле Book_ID являются Внешним ключом и ссылаются на таблицу <strong>Authors</strong>. Для организации таблиц с подобной структурой используется следующий код с использованием оператора <strong>FOREIGN KEY</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">//Для MySQL:
CREATE TABLE Authors (
Author_ID int NOT NULL, 
AuthorName varchar(50),
PRIMARY KEY(Author_ID));
 
CREATE TABLE Books (
Book_ID int NOT NULL,
BookName varchar(100),
FOREIGN KEY (Book_ID) REFERENCES Authors(Author_ID));</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// для MS SQL Server:
CREATE TABLE Authors (
AuthorID int NOT NULL PRIMARY KEY,
AuthorName varchar(50));
 
CREATE TABLE Books (
Book_ID int FOREIGN KEY REFERENCES Authors(Author_ID),
BookName varchar(100));</code></pre><div class="t-redactor__text">Для закрепления материала советую самостоятельно отработать примеры на своем компьютере. Если будут вопросы пишите в комментариях и я помогу.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: LEFT JOIN</title>
			<link>https://www.easyitway.com/tpost/chpmfxadx1-operator-sql-left-join</link>
			<amplink>https://www.easyitway.com/tpost/chpmfxadx1-operator-sql-left-join?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 13:59:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор LEFT JOIN осуществляет формирование таблицы из записей двух или нескольких таблиц. В операторе важен порядок следования таблиц, так как от этого будет зависеть полученный результат. </description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: LEFT JOIN</h1></header><div class="t-redactor__text">Оператор <strong>LEFT JOIN</strong> осуществляет формирование таблицы из записей двух или нескольких таблиц. В операторе важен порядок следования таблиц, так как от этого будет зависеть полученный результат. Алгоритм работы оператора следующий:<br /><br />1. Сначала происходит формирование таблицы внутренним соединением (оператор INNER JOIN) левой и правой таблиц;<br /><br />2. Затем, в результат добавляются записи левой таблицы не вошедшие в результат формирования таблицы внутренним соединением. Для них, соответствующие записи из правой таблицы заполняются значениями NULL.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Синтаксис оператора:
SELECT
    column_names [,... n]
FROM
    Table_1 LEFT JOIN Table_2
ON condition;</code></pre><div class="t-redactor__text">Примеры оператора <strong>LEFT JOIN</strong>. Возьмем две известные нам таблицы. Authors и Books. В таблице Books поле Book_ID являются внешним ключом и ссылаются на таблицу Authors.</div><img src="https://static.tildacdn.com/tild3062-3961-4337-b331-316534613037/2023-12-17_13-58.png"><img src="https://static.tildacdn.com/tild3766-6432-4234-b930-643961366665/2023-12-17_14-00.png"><div class="t-redactor__text">Пример. Пользуясь оператором <strong>LEFT JOIN</strong> вывести, какие книги написали все авторы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT *
FROM Authors LEFT JOIN Books
ON Authors.Author_ID = Books.Book_ID;</code></pre><div class="t-redactor__text">Для закрепления материала советую самостоятельно отработать данный пример и посмотреть что получиться. Если будут вопросы пишите в комментариях.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: RIGHT JOIN</title>
			<link>https://www.easyitway.com/tpost/fnzoon1n71-operator-sql-right-join</link>
			<amplink>https://www.easyitway.com/tpost/fnzoon1n71-operator-sql-right-join?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 14:01:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор RIGHT JOIN осуществляет формирование таблицы из записей двух или нескольких таблиц. В операторе важен порядок следования таблиц, так как от этого будет зависеть полученный результат. </description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: RIGHT JOIN</h1></header><div class="t-redactor__text">Оператор <strong>RIGHT JOIN</strong> осуществляет формирование таблицы из записей двух или нескольких таблиц. В операторе важен порядок следования таблиц, так как от этого будет зависеть полученный результат. Алгоритм работы оператора следующий:<br /><br />1. Сначала происходит формирование таблицы внутренним соединением (оператор INNER JOIN) левой и правой таблиц;<br /><br />2. Затем, в результат добавляются записи левой таблицы не вошедшие в результат формирования таблицы внутренним соединением. Для них, соответствующие записи из правой таблицы заполняются значениями NULL.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Синтаксис оператора:
SELECT
    column_names [,... n]
FROM
    Table_1 RIGHT JOIN Table_2 ON condition;</code></pre><div class="t-redactor__text">Примеры оператора <strong>RIGHT JOIN</strong>. Возьмем две известные нам таблицы. Authors и Books. В таблице Books поле Book_ID являются внешним ключом и ссылаются на таблицу Authors.</div><img src="https://static.tildacdn.com/tild3364-3237-4532-b864-353762646430/2023-12-17_14-02.png"><img src="https://static.tildacdn.com/tild6364-6462-4365-b863-633561636636/2023-12-17_14-03.png"><div class="t-redactor__text">Пример. С помощью оператора <strong>RIGHT JOIN</strong> вывести авторов всех книг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Authors
RIGHT JOIN Books ON Authors.Author_ID = Books.Book_ID;</code></pre><div class="t-redactor__text">Для закрепления материала советую самостоятельно отработать данный пример и посмотреть что получиться. Если будут вопросы пишите в комментариях.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: FULL JOIN</title>
			<link>https://www.easyitway.com/tpost/8a2i3782k1-operator-sql-full-join</link>
			<amplink>https://www.easyitway.com/tpost/8a2i3782k1-operator-sql-full-join?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 14:04:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор FULL JOIN осуществляет формирование таблицы из записей двух или нескольких таблиц.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: FULL JOIN</h1></header><div class="t-redactor__text">Оператор <strong>FULL JOIN</strong> осуществляет формирование таблицы из записей двух или нескольких таблиц. В этом операторе не важен порядок следования таблиц, он никак не влияет на окончательный результат, так как оператор является симметричным.<br /><br />Оператор FULL JOIN можно воспринимать как сочетание операторов INNER JOIN + LEFT JOIN + RIGHT JOIN. Алгоритм его работы следующий:<br /><br />1. Сначала формируется таблица на основе внутреннего соединения (INNER JOIN);<br /><br />2. Затем, в таблицу добавляются значения не вошедшие в результат формирования из правой таблицы (LEFT JOIN). Для них, соответствующие записи из правой таблицы заполняются значениями NULL.<br /><br />3. И последним действием в таблицу добавляются значения не вошедшие в результат формирования из левой таблицы (RIGHT JOIN). Для них, соответствующие записи из левой таблицы заполняются значениями NULL.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Синтаксис оператора:
SELECT
    column_names [,... n]
FROM
    Table_1 FULL JOIN Table_2
ON condition;</code></pre><div class="t-redactor__text">Рассмотрим пример. Возьмем две известные нам таблицы. Authors и Books. В таблице Books поле Book_ID являются внешним ключом и ссылаются на таблицу Authors.</div><img src="https://static.tildacdn.com/tild6435-6132-4930-b263-316163343832/2023-12-17_14-02.png"><img src="https://static.tildacdn.com/tild3865-6539-4234-b665-663939376638/2023-12-17_14-03.png"><div class="t-redactor__text">Выведем авторов всех книг и книги всех авторов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Authors FULL JOIN Books
ON Authors.Author_ID = Books.Book_ID;</code></pre><div class="t-redactor__text">Полное внешнее соединение (FULL JOIN) не поддерживается в MySQL. Можно считать, что это – «избыточная» операция, т.к. она представляется через объединение левого и правого внешних соединений.<br /><br />Для закрепления материала советую самостоятельно отработать данный пример и посмотреть что получиться. Если будут вопросы пишите в комментариях.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: CROSS JOIN</title>
			<link>https://www.easyitway.com/tpost/sm0vx3npm1-operator-sql-cross-join</link>
			<amplink>https://www.easyitway.com/tpost/sm0vx3npm1-operator-sql-cross-join?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 14:06:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор CROSS JOIN&nbsp;формирует таблицу перекрестным соединением (декартовым произведением) двух таблиц.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: CROSS JOIN</h1></header><div class="t-redactor__text">Оператор <strong>CROSS JOIN</strong> формирует таблицу перекрестным соединением (декартовым произведением) двух таблиц. При использовании данного оператора каждая строка левой таблицы сцепляется с каждой строкой правой таблицы. В результате получается таблица со всеми возможными сочетаниями строк обеих таблиц. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT
    column_names [,... n]
FROM
    Table_1 CROSS JOIN Table_2;</code></pre><div class="t-redactor__text">Рассмотрим пример. Возьмем две известные нам таблицы. Authors и Books. В таблице Books поле Book_ID являются внешним ключом и ссылаются на таблицу Authors.</div><img src="https://static.tildacdn.com/tild3633-3361-4235-a561-653730313366/2023-12-17_14-02.png"><img src="https://static.tildacdn.com/tild6565-6465-4937-b433-353033363533/2023-12-17_14-03.png"><div class="t-redactor__text">Произведём декартово произведение обеих таблиц с помощью оператора <strong>CROSS JOIN</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Authors CROSS JOIN Books;</code></pre><div class="t-redactor__text">Для закрепления материала советую самостоятельно отработать данный пример и посмотреть что получиться. Если будут вопросы пишите в комментариях.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: DEFAULT</title>
			<link>https://www.easyitway.com/tpost/5vzsgaxxn1-operator-sql-default</link>
			<amplink>https://www.easyitway.com/tpost/5vzsgaxxn1-operator-sql-default?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 14:07:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор DEFAULT&nbsp;определяет значение, которым будет заполнен тот или иной столбец по умолчанию при создании таблицы.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: DEFAULT</h1></header><div class="t-redactor__text">Оператор <strong>DEFAULT</strong> определяет значение, которым будет заполнен тот или иной столбец по умолчанию при создании таблицы. Данное значение будет вставляться в запись, если иное не указано. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">CREATE TABLE table_name (
column_name1 data_type(size) DEFAULT &#039;default_name&#039;);</code></pre><div class="t-redactor__text">Пример оператора. Cоздадим таблицу Students, где по умолчанию в столбце Othislen должно стоять значение «NO»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">CREATE TABLE Students (
ID int,
Name varchar(10),
FIO varchar(20),
Gruppa varchar(10), 
Othislen varchar(5) DEFAULT &#039;NO&#039;);</code></pre><div class="t-redactor__text">Теперь при заполнении таблицы оператором INSERT, если мы не станем указывать значение поля Othislen, в него будет автоматически проставлено значение «NO».<br /><br />Для закрепления материала советую самостоятельно отработать данный пример и посмотреть что получиться. Если будут вопросы пишите в комментариях.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: VIEW</title>
			<link>https://www.easyitway.com/tpost/coauok84g1-operator-sql-view</link>
			<amplink>https://www.easyitway.com/tpost/coauok84g1-operator-sql-view?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 14:08:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор VIEW — объект базы данных, представляющий собой представление. Представление — это виртуальная таблица, внутреннее содержимое которой определяется исходя из параметров запроса.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: VIEW</h1></header><div class="t-redactor__text">Оператор <strong>VIEW</strong> — объект базы данных, представляющий собой представление. Представление — это виртуальная таблица, внутреннее содержимое которой определяется исходя из параметров запроса.<br /><br />Представления широко используются когда необходимо представить структуру базы данных в удобном для восприятия человеком виде, а так же в соображениях безопасности, предоставляя пользователям возможность обращаться к данным, но не разрешая им доступ к исходным таблицам. Для создания представления используется оператор CREATE и синтаксис выглядит следующим образом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">CREATE VIEW view_name
AS SELECT column_name
FROM table_name
WHERE condition;</code></pre><div class="t-redactor__text">Примеры оператора. Возьмём таблицу <strong>Planets</strong>:</div><img src="https://static.tildacdn.com/tild6230-3737-4439-b032-663038353930/123.png"><div class="t-redactor__text">Используя оператор <strong>VIEW</strong> создадим на основе таблицы Planets представление, содержащее в себе название планеты и год её открытия:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">CREATE VIEW Planets_View
AS SELECT Planet_Name, OpeningYear
FROM Planets;</code></pre><div class="t-redactor__text">В результате будет создано представление с названием Planets_View которая будет содержать в себе значения столбцов Planet_Name и OpeningYear. Посмотрим результат созданного представления:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Planets_View;</code></pre><img src="https://static.tildacdn.com/tild3139-6431-4662-b538-386332656436/321.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: UNION</title>
			<link>https://www.easyitway.com/tpost/ub628chor1-operator-sql-union</link>
			<amplink>https://www.easyitway.com/tpost/ub628chor1-operator-sql-union?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 14:11:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор UNION используется для объединения двух и более запросов оператора SELECT. Синтаксис оператора:</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: UNION</h1></header><div class="t-redactor__text">Оператор <strong>UNION</strong> используется для объединения двух и более запросов оператора SELECT. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;</code></pre><div class="t-redactor__text">Каждый из операторов SQL <strong>SELECT</strong> должен иметь в своем запросе одинаковое количество столбцов и типы возвращаемых данных, иначе произойдет ошибка при формировании результирующей таблицы. Примеры оператора. Имеется следующая таблица <strong>Artists</strong>:</div><img src="https://static.tildacdn.com/tild6464-3135-4137-b230-373232626564/456.png"><div class="t-redactor__text">С помощью оператора UNION выведим название исполнителя и альбома:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT Singer FROM Artists
UNION
SELECT Album FROM Artists;</code></pre><div class="t-redactor__text">Результат будет такой:</div><img src="https://static.tildacdn.com/tild6339-6438-4731-b264-323733643439/444.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: TOP</title>
			<link>https://www.easyitway.com/tpost/9mrg3aef51-operator-sql-top</link>
			<amplink>https://www.easyitway.com/tpost/9mrg3aef51-operator-sql-top?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:19:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор TOP позволяет ограничить выборку числа записей до заданного числа.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: TOP</h1></header><div class="t-redactor__text">Оператор <strong>TOP</strong> позволяет ограничить выборку числа записей до заданного числа. При использовании оператора TOP совместно с оператором ORDER BY, на вывод пойдет первые N записей отсортированного списка, в противном случае, выведутся первые N строк таблицы.<br /><br />Данный оператор используется только в СУБД <strong>MS SQL Server</strong>. Аналогом в MySQL является оператор LIMIT.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Синтаксис оператора TOP:
TOP ( N [PERCENT] )

// Параметр PERCENT позволяет задать количество строк в процентах.</code></pre><div class="t-redactor__text">Примеры оператора TOP. Возьмём нашу таблица <strong>Artists</strong>:</div><img src="https://static.tildacdn.com/tild3065-6136-4666-b539-376237613437/1.png"><div class="t-redactor__text">Пример 1. Используя оператор TOP вывести 3 самых свежих альбома (название и год выпуска):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT TOP(3) Album, Year FROM Artists ORDER BY Year;</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild3766-3939-4739-a362-303633313030/2.png"><div class="t-redactor__text">Пример 2. Используя оператор TOP вывести первые 2 строки таблицы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT TOP(2) * FROM Artists;</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild6465-3838-4162-b932-653466633937/3.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: LIMIT</title>
			<link>https://www.easyitway.com/tpost/axie5xf4c1-operator-sql-limit</link>
			<amplink>https://www.easyitway.com/tpost/axie5xf4c1-operator-sql-limit?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:21:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор LIMIT позволяет вывести указанное число строк из таблицы. Оператор записывается всегда в конце запроса. LIMIT — это аналог оператора TOP.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: LIMIT</h1></header><div class="t-redactor__text">Оператор <strong>LIMIT</strong> позволяет вывести указанное число строк из таблицы. Оператор записывается всегда в конце запроса. LIMIT — это аналог оператора TOP.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Синтаксис оператора

LIMIT first_row [, last_row]</code></pre><div class="t-redactor__text">Оператор LIMIT выводит то количество записей, которое указано в параметре first_row. Если, через запятую указано значение параметра last_row, то будут выведены строки в диапазоне first_row — last_row включительно.<br /><br />Примеры оператора. Имеется следующая таблица <strong>Universities</strong>:</div><img src="https://static.tildacdn.com/tild3635-6632-4766-a437-343038336632/1.png"><div class="t-redactor__text">Пример 1. С использованием оператора LIMIT вывести названия университетов из таблицы с 4 по 6:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT UniversityName FROM Universities LIMIT 3, 3;</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild3435-3862-4335-b336-316636663638/2.png"><div class="t-redactor__text">Пример 2. С использованием оператора LIMIT вывести первые 2 записи таблицы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Universities LIMIT 2;</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild3736-3133-4331-b334-323534353531/3.png"><div class="t-redactor__text">Видео по оператору:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/f9Df4EOF-Qw" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: IN</title>
			<link>https://www.easyitway.com/tpost/48lpu5g8a1-operator-sql-in</link>
			<amplink>https://www.easyitway.com/tpost/48lpu5g8a1-operator-sql-in?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:24:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор IN&nbsp;позволяет определить, совпадает ли значение объекта со значением в списке. Синтаксис оператора:</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: IN</h1></header><div class="t-redactor__text">Оператор <strong>IN</strong> позволяет определить, совпадает ли значение объекта со значением в списке. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">expression [ NOT ] IN ( expression, [...] )</code></pre><div class="t-redactor__text">Примеры оператора. Возьмём таблицу <strong>Universities</strong>:</div><img src="https://static.tildacdn.com/tild3238-6537-4566-a132-666532373431/1.png"><div class="t-redactor__text">Используя оператор IN выведим записи университетов из Новосибирска и Екатеринбурга:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT *
FROM Universities
WHERE Location IN (&#039;Novosibirsk&#039;, &#039;Yekaterinburg&#039;);</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild3134-3933-4833-b033-663262333533/2.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: AS</title>
			<link>https://www.easyitway.com/tpost/y8iit2gid1-operator-sql-as</link>
			<amplink>https://www.easyitway.com/tpost/y8iit2gid1-operator-sql-as?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:26:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор AS&nbsp;используется для именования результирующих столбцов при выборке элементов. Синтаксис оператора:</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: AS</h1></header><div class="t-redactor__text">Оператор <strong>AS</strong> используется для именования результирующих столбцов при выборке элементов. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT column_name AS new_column_name FROM table_name;</code></pre><div class="t-redactor__text">Примеры оператора. Возьмём таблицу <strong>Planets</strong>:</div><img src="https://static.tildacdn.com/tild3837-6234-4431-b163-386366613164/3.png"><div class="t-redactor__text">С помощью оператора <strong>AS</strong> выведим среднее значение радиуса планет таблицы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT AVG(Radius) AS AverageRadius FROM Planets;</code></pre><div class="t-redactor__text">Столбец будет называться AverageRadius. Без использования оператора AS, столбец имел бы название AVG(Radius). Результат:</div><img src="https://static.tildacdn.com/tild6636-6538-4361-a365-373434383933/4.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: TRUNCATE</title>
			<link>https://www.easyitway.com/tpost/odzita87f1-operator-sql-truncate</link>
			<amplink>https://www.easyitway.com/tpost/odzita87f1-operator-sql-truncate?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:27:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор TRUNCATE служит для очистки таблицы от всех данных. Оператор TRUNCATE аналогичен оператору DELETE применяемом без оператора, WHERE.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: TRUNCATE</h1></header><div class="t-redactor__text">Оператор <strong>TRUNCATE</strong> служит для очистки таблицы от всех данных. Оператор TRUNCATE аналогичен оператору DELETE применяемом без оператора, WHERE. Основные отличия операторов:<br /><br /><ul><li>Оператор TRUNCATE не ведет запись об удаленных данных в журнал событий;</li><li>DELETE осуществляет блокировку построчно, оператор TRUNCATE по всей странице целиком. Вследствие этого, оператор TRUNCATE не возвращает никакого значения, DELETE же, возвращает количество удаленных строк;</li><li>TRUNCATE удаляет все строки таблицы, но структура таблицы (столбцы, ограничения, индексы и т.д.) остается. Счетчик, который используется для уникальности новых записей обнуляется. Нельзя использовать TRUNCATE TABLE для таблиц, связанных ограничением FOREIGN KEY. Поскольку TRUNCATE TABLE не логируется, то и не может активировать триггер;</li><li>DELETE удаляет строки в таблицы и для каждой оставляет запись в логе транзакции;</li><li>DELETE не обнуляет счетчик уникальности;</li><li>DELETE может использоваться с выражением WHERE или без него;</li><li>После DELETE возможен откат.</li></ul><br />Реализация оператора TRUNCATE различна для каждой СУБД, поэтому рекомендуется обращаться к документации используемой системы. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">TRUNCATE TABLE table_name;</code></pre><div class="t-redactor__text">Пример оператора. Представим что у нас есть таблица <strong>Students</strong> с данными. Удалим все данные из таблицы используя оператор TRUNCATE:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">TRUNCATE TABLE Students;</code></pre><div class="t-redactor__text">Для лучшего усвоения материала не забывайте отрабатывать примеры самостоятельно на своем компьютере.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: BETWEEN</title>
			<link>https://www.easyitway.com/tpost/oi39s54ux1-operator-sql-between</link>
			<amplink>https://www.easyitway.com/tpost/oi39s54ux1-operator-sql-between?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:29:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор BETWEEN&nbsp;задает диапазон, в котором будет осуществляться проверка условия. Синтаксис оператора:</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: BETWEEN</h1></header><div class="t-redactor__text">Оператор <strong>BETWEEN</strong> задает диапазон, в котором будет осуществляться проверка условия. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">test_expression [NOT] BETWEEN begin_expression AND end_expression</code></pre><div class="t-redactor__text"><ul><li>test_expression — задает объект для проверки по диапазону;</li><li>start_expression — начальное значение диапазона;</li><li>end_expression — конечное значение диапазона.</li></ul><br />Примеры оператора. Возьмём таблицу <strong>Universities</strong>:</div><img src="https://static.tildacdn.com/tild3136-6262-4434-a662-383132633365/1.png"><div class="t-redactor__text"><strong>Пример 1.</strong> Используя оператор BETWEEN вывести записи тех университетов, число студентов (Students) которых от 10000 до 30000:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Universities
WHERE Students BETWEEN 10000 AND 30000;</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild6139-3831-4135-a334-636137323361/2.png"><div class="t-redactor__text"><strong>Пример 2.</strong> Используя оператор BETWEEN вывести записи университетов, число преподавателей (Professores) которых менее 2000 и более 14000:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Universities
WHERE Professores NOT BETWEEN 2000 AND 14000;</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild3231-6639-4435-a161-643139383361/3.png">]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Оператор SQL: NOT</title>
			<link>https://www.easyitway.com/tpost/vv5jf201n1-operator-sql-not</link>
			<amplink>https://www.easyitway.com/tpost/vv5jf201n1-operator-sql-not?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:31:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Оператор NOT&nbsp;служит для задания противоположно заданного условия.</description>
			<turbo:content>
<![CDATA[<header><h1>Оператор SQL: NOT</h1></header><div class="t-redactor__text">Оператор <strong>NOT</strong> служит для задания противоположно заданного условия. Является эквивалентом операции инверсии в математической логике и может применяется только для булевых значений. Синтаксис оператора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">[ NOT ] boolean_expression</code></pre><div class="t-redactor__text">Пример оператора NOT. Возьмём таблицу <strong>Artists</strong>:</div><img src="https://static.tildacdn.com/tild3362-3262-4735-b262-646531373338/1.png"><div class="t-redactor__text">Используя оператор NOT выведем записи таблицы, без исполнителя Drowning Pool и Massive Attack:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Artists WHERE Singer NOT IN (&#039;Drowning Pool&#039;, &#039;Massive Attack&#039;);</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild3733-3861-4731-b133-666264356132/2.png"><div class="t-redactor__text">Для лучшего закрепления материала отработайте пример самостоятельно на своём компьютере.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Предикат SQL: LIKE</title>
			<link>https://www.easyitway.com/tpost/efuoat3l11-predikat-sql-like</link>
			<amplink>https://www.easyitway.com/tpost/efuoat3l11-predikat-sql-like?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:33:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Предикат LIKE&nbsp;сравнивает строку, указанную в первом выражении, для вычисления значения строки, называемого проверяемым значением, с образцом</description>
			<turbo:content>
<![CDATA[<header><h1>Предикат SQL: LIKE</h1></header><div class="t-redactor__text">Предикат <strong>LIKE</strong> сравнивает строку, указанную в первом выражении, для вычисления значения строки, называемого проверяемым значением, с образцом, который определен во втором выражении для вычисления значения строки. Синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">expression [ NOT ] LIKE pattern</code></pre><div class="t-redactor__text">где, <strong>expression</strong> — любое символьное выражение. <strong>pattern</strong> — шаблон, по которому будет происходить проверка выражения expression. Шаблон может включать в себя следующие спец. символы:<br /><br /><ul><li>символ подчеркивания (_), который можно применять вместо любого единичного символа в проверяемом значении;</li><li>символ процента (%) заменяет последовательность любых символов (число символов в последовательности может быть от 0 и более) в проверяемом значении;</li><li>[] — диапазон или последовательность символов;</li><li>[^] — исключающий диапазон или последовательность символов.</li></ul><br />Рассмотрим примеры. Возьмём таблицу <strong>Universities</strong>:</div><img src="https://static.tildacdn.com/tild3961-3264-4063-b466-383662313738/3.png"><div class="t-redactor__text"><strong>Пример 1.</strong> С помощью предиката LIKE вывести записи университетов, имеющих в своем названии слово «State»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Universities WHERE UniversityName LIKE &#039;%State%&#039;;</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild3233-3263-4135-b931-366137636434/4.png"><div class="t-redactor__text"><strong>Пример 2.</strong> С помощью предиката LIKE вывести записи университетов, доменное имя сайта которых содержит 4 символа (за исключением домена .ru):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Universities WHERE Site LIKE &#039;____.ru&#039;;</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild3533-3734-4631-b237-333936666232/5.png"><div class="t-redactor__text"><strong>Пример 3.</strong> С помощью предиката LIKE вывести записи университетов, первая буква доменного имени сайта которых содержит буквы из диапазона [k-o]:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Universities WHERE Site LIKE &#039;[k-o]%&#039;;</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild6163-3431-4263-a561-396561653230/6.png"><div class="t-redactor__text"><strong>Пример 4.</strong> С помощью предиката LIKE вывести записи университетов, вторая буква названия города которых, не входит в диапазон [e-o]:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM Universities WHERE Location LIKE &#039;_[^e-o]%&#039;;</code></pre><div class="t-redactor__text">Результат:</div><img src="https://static.tildacdn.com/tild6136-6261-4038-b666-633162356463/7.png"><div class="t-redactor__text">Для лучшего закрепления нового материала советую отработать все примеры самостоятельно на своем компьютере.<br /><br />Видео:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/AfDsjf2Ls04" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Установка MySQL Workbench</title>
			<link>https://www.easyitway.com/tpost/7oxxiafma1-ustanovka-mysql-workbench</link>
			<amplink>https://www.easyitway.com/tpost/7oxxiafma1-ustanovka-mysql-workbench?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:38:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>MySQL Workbench — инструмент для визуального проектирования баз данных, интегрирующий проектирование, моделирование, создание и эксплуатацию БД в единое бесшовное окружение для системы баз данных MySQL.</description>
			<turbo:content>
<![CDATA[<header><h1>Установка MySQL Workbench</h1></header><div class="t-redactor__text"><strong>MySQL Workbench</strong> — инструмент для визуального проектирования баз данных, интегрирующий проектирование, моделирование, создание и эксплуатацию БД в единое бесшовное окружение для системы баз данных MySQL. Является преемником DBDesigner 4 от FabForce.</div><div class="t-redactor__text">MySQL Workbench предлагается в двух редакциях:</div><div class="t-redactor__text"><ol><li><strong>Community Edition</strong> — распространяется под свободной лицензией GNU GPL;</li><li><strong>Standard Edition</strong> — доступна по ежегодной оплачиваемой подписке. Эта версия включает в себя дополнительные функции, которые повышают производительность разработчиков и администраторов БД.</li></ol></div><div class="t-redactor__text">Первая версия MySQL Workbench была выпущена в сентябре 2005 года. MySQL Workbench был первым семейством продуктов, который был доступен в двух вариантах.</div><div class="t-redactor__text">Чтобы привлечь разработчиков в основную команду разработки, коммерческая стандартная версия программы (Standard Edition) предлагается поверх свободной версии (Community Edition), распространяемой под лицензией GNU GPL.</div><div class="t-redactor__text">«Community Edition» является полнофункциональным продуктом, обладающим всеми основными возможностями коммерческого варианта.</div><h4  class="t-redactor__h4">Возможности программы</h4><div class="t-redactor__text"><ol><li>Позволяет наглядно представить модель базы данных в графическом виде.</li><li>Наглядный и функциональный механизм установки связей между таблицами, в том числе «многие ко многим» с созданием таблицы связей.</li><li>Reverse Engineering — восстановление структуры таблиц из уже существующей на сервере БД (связи восстанавливаются в InnoDB, при использовании MyISAM — связи необходимо устанавливать вручную).</li><li>Удобный редактор SQL запросов, позволяющий сразу же отправлять их серверу и получать ответ в виде таблицы.</li><li>Возможность редактирования данных в таблице в визуальном режиме.</li></ol></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/9PjDpoPTWkM" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Манипуляция с пользователями в MySQL Workbench</title>
			<link>https://www.easyitway.com/tpost/vddt7fffi1-manipulyatsiya-s-polzovatelyami-v-mysql</link>
			<amplink>https://www.easyitway.com/tpost/vddt7fffi1-manipulyatsiya-s-polzovatelyami-v-mysql?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:39:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Для выполнения любой из этих команд вам нужно иметь права доступа root. Также, обязательно выполняйте FLUSH PRIVILEGES после любого изменения в правах доступа.
</description>
			<turbo:content>
<![CDATA[<header><h1>Манипуляция с пользователями в MySQL Workbench</h1></header><div class="t-redactor__text">В прошлой статье мы научились устанавливать программу MySQL Workbench и при установке создавали пользователя для работы с программой.</div><div class="t-redactor__text">В этой статье вы научитесь создавать нового пользователя, изменять пароль, добавлять привелегии для пользователя и удалять пользователей в MySQL через консоль MySQL Workbench.</div><div class="t-redactor__text">Для выполнения любой из этих команд вам нужно иметь права доступа root. Также, обязательно выполняйте FLUSH PRIVILEGES после любого изменения в правах доступа.</div><h4  class="t-redactor__h4">1. Создание пользователя MySQL с неограниченными правами доступа</h4><div class="t-redactor__text">Как только вы начнёте использовать MySQL, вам будет предоставлено имя пользователя и пароль. Эти начальные учётные данные дают вам привелегии «root-доступа». Пользователь с правами доступа root имеют полный доступ ко всем базам данных и таблицам внутри этих баз.</div><div class="t-redactor__text">Если вы хотите создать еще одного пользователя с неограниченными правами, тогда вам необходимо:</div><div class="t-redactor__text">1. Запустить консоль «MySQL Workbench Command Line Client»</div><div class="t-redactor__text">2. В консоли напишите команду:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">CREATE USER &#039;имя пользователя&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;пароль&#039;;</code></pre><div class="t-redactor__text">Вместо имени пользователя и пароля введите свои данные.<br /><br />3. Просто создать нового пользователя недостаточно. Необходимо назначить для него права доступа. Чтобы назначить вновь созданном пользователю неограниченные права доступа к базе данных, выполните следующую команду:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">GRANT ALL PRIVILEGES ON * . * TO &#039;имя пользователя&#039;@&#039;localhost&#039;;</code></pre><div class="t-redactor__text">Для того, чтоб изменения вошли в силу запустите команду обновления:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">FLUSH PRIVILEGES;</code></pre><div class="t-redactor__text">На этом создание нового пользователя окончено. Новый пользователь получил те же права доступа в базе данных, что и пользователь root.<br /><br />Все пользователи хранятся в базе данных «mysql» таблице user. Давайте проверим добавился наш новый пользователь в таблицу. Для это необходимо ввести команды:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">use mysql; // выбераем нужную БД
select user, host from user; // выводим все данные таблицы user</code></pre><div class="t-redactor__text">После этого появится вся информация из таблицы, и наш новый пользователь должен там находиться.<br /><br />Чтобы запустить командную строку под новым пользователем необходимо зайти в интерфейс программы MySQL Workbench и создать новое подключение:</div><img src="https://static.tildacdn.com/tild3234-3765-4466-a134-623136386563/mysql_man_polz_2.jpg"><div class="t-redactor__text">Вводим все данные нового пользователя:</div><img src="https://static.tildacdn.com/tild6136-3030-4535-a137-666564313036/mysql_man_polz_3.jpg"><div class="t-redactor__text">После создания нового подключения нажимаем на него правой кнопкой мыши и запускаем командную строку:</div><img src="https://static.tildacdn.com/tild3236-6434-4438-b430-346664393232/mysql_man_polz_4.jpg"><h4  class="t-redactor__h4">2. Назначить специальные права доступа для пользователя MySQL</h4><div class="t-redactor__text">Для безопасности ваших файлов в БД MySQL лучше предоставлять разные уровни доступа для разных пользователей. MySQL позволяет сделать это легко и быстро, выполнив следующую команду:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">GRANT [тип прав] ON [имя базы данных].[имя таблицы] TO ‘non-root’@&#039;localhost’;</code></pre><div class="t-redactor__text">Нужно заменить значение «тип прав» на тот вид прав доступа, который вы хотите предоставить новому пользователю. Также вам нужно указать базу данных и имена таблиц, доступ к которым предоставляется. В MySQL есть несколько типов прав доступа, некоторые из них описаны ниже:<br /><br />CREATE – Позволяет пользователям создавать базы данных/таблицы;<br /><br />SELECT – Позволяет пользователям делать выборку данных;<br /><br />INSERT – Позволяет пользователям добавлять новые записи в таблицы;<br /><br />UPDATE – Позволяет пользователям изменять существующие записи в таблицах;<br /><br />DELETE – Позволяет пользователям удалять записи из таблиц;<br /><br />DROP – Позволяет пользователям удалять записи в базе данных/таблицах.</div><h4  class="t-redactor__h4">3. Удаление пользователя</h4><div class="t-redactor__text">Удалить существующего пользователя можно, используя команду:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DROP USER &#039;имя пользователя&#039;@&#039;localhost&#039;;</code></pre><h4  class="t-redactor__h4">4. Смена пароля в MySQL</h4><div class="t-redactor__text">Для смены пароля пользователя можно воспользоваться следующими командами:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Версия 5.7.6 и более современная:
ALTER USER &#039;имя пользователя&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;New_Password&#039;;</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Версия 5.7.5 и древнее:
SET PASSWORD FOR &#039;имя пользователя&#039;@&#039;localhost&#039; = PASSWORD(&#039;New_Password&#039;);</code></pre><h4  class="t-redactor__h4">5. Удаление пароля</h4><div class="t-redactor__text">Если необходимо удалить пароль у пользователя, тогда нужно выполнить команду в консоли MySQL:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">UPDATE mysql.user SET authentication_string=null WHERE User=&#039;имя пользователя&#039;;
FLUSH PRIVILEGES;
exit;</code></pre><div class="t-redactor__text">После удаления пароля вход в консоль будет производится без пароля. В целях безопасности это не рекомендуется делать.</div><h4  class="t-redactor__h4">6. Добавление пароля</h4><div class="t-redactor__text">С помощью пункта 5 можно удалить пароль у конкретного пользователя, а с помощью этой команды можно обратно задать новый пароль для пользователя:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ALTER USER &#039;имя пользователя&#039;@&#039;localhost&#039; IDENTIFIED WITH caching_sha2_password BY &#039;пароль&#039;;</code></pre><div class="t-redactor__text">Видео:</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/RmEkJLXEMFM" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Установка СУБД PostgreSQL</title>
			<link>https://www.easyitway.com/tpost/a18c8aixl1-ustanovka-subd-postgresql</link>
			<amplink>https://www.easyitway.com/tpost/a18c8aixl1-ustanovka-subd-postgresql?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:44:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы подробно рассмотрим установку СУБД PostgreSQL на персональный компьютер по управлением операционной системы Windows</description>
			<turbo:content>
<![CDATA[<header><h1>Установка СУБД PostgreSQL</h1></header><div class="t-redactor__text">Скачать СУБД PostgreSQL можно на <a href="https://www.postgresql.org/" target="_blank" rel="noreferrer noopener">официальном сайте</a>. На главной странице сайта нажмите на «Download» и на следующей странице выбирайте свою операционную систему.<br /><br />Мы выбираем <strong>«Windows»</strong> и на следующей странице необходимо нажать на: <strong>«Download the installer»</strong>. Откроется окно выбора версии PostgreSQL (на февраль 2020 актуальная версия 12.1), нажимаем на <strong>«Download»</strong> и скачиваем СУБД.</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/Banzbq2e9o8" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Установка Microsoft SQL Server 2019 Express на Windows 10</title>
			<link>https://www.easyitway.com/tpost/gfea37y621-ustanovka-microsoft-sql-server-2019-expr</link>
			<amplink>https://www.easyitway.com/tpost/gfea37y621-ustanovka-microsoft-sql-server-2019-expr?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:46:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы установим СУБД Microsoft SQL Server 2019 Express на операционную систему Windows 10.</description>
			<turbo:content>
<![CDATA[<header><h1>Установка Microsoft SQL Server 2019 Express на Windows 10</h1></header><div class="t-redactor__text">В этом видео мы установим СУБД Microsoft SQL Server 2019 Express на операционную систему Windows 10.</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/6870NrPaGsQ" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Работа с типами данных «Дата и время» в MySQL</title>
			<link>https://www.easyitway.com/tpost/gc3brlbyp1-rabota-s-tipami-dannih-data-i-vremya-v-m</link>
			<amplink>https://www.easyitway.com/tpost/gc3brlbyp1-rabota-s-tipami-dannih-data-i-vremya-v-m?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:46:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео вы научитесь работать с типами данных «Дата и время» в MySQL.</description>
			<turbo:content>
<![CDATA[<header><h1>Работа с типами данных «Дата и время» в MySQL</h1></header><div class="t-redactor__text">В этом видео вы научитесь работать с типами данных «Дата и время» в MySQL.</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/6pXZNWhwF40" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Работа с «AUTO INCREMENT» в таблицах MySQL</title>
			<link>https://www.easyitway.com/tpost/jd54zxsme1-rabota-s-auto-increment-v-tablitsah-mysq</link>
			<amplink>https://www.easyitway.com/tpost/jd54zxsme1-rabota-s-auto-increment-v-tablitsah-mysq?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:47:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы поговорим об «AUTO INCREMENT» и научимся создавать таблицы MySQL с автоматической нумерацией.</description>
			<turbo:content>
<![CDATA[<header><h1>Работа с «AUTO INCREMENT» в таблицах MySQL</h1></header><div class="t-redactor__text">В этом видео мы поговорим об «AUTO INCREMENT» и научимся создавать таблицы MySQL с автоматической нумерацией.</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/hvMJ6aY4xVU" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Установка новой версии MySQL Workbench на Windows 10</title>
			<link>https://www.easyitway.com/tpost/axlatlaua1-ustanovka-novoi-versii-mysql-workbench-n</link>
			<amplink>https://www.easyitway.com/tpost/axlatlaua1-ustanovka-novoi-versii-mysql-workbench-n?amp=true</amplink>
			<pubDate>Sun, 17 Dec 2023 15:48:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео вы научитесь устанавливать новую версию СУБД MySQL Workbench на операционную систему Windows 10.</description>
			<turbo:content>
<![CDATA[<header><h1>Установка новой версии MySQL Workbench на Windows 10</h1></header><div class="t-redactor__text">В этом видео вы научитесь устанавливать новую версию СУБД MySQL Workbench на операционную систему Windows 10.</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/OUya1nc_nvQ" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Что такое функция в php</title>
			<link>https://www.easyitway.com/tpost/fegvhb5yn1-chto-takoe-funktsiya-v-php</link>
			<amplink>https://www.easyitway.com/tpost/fegvhb5yn1-chto-takoe-funktsiya-v-php?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 14:05:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Функция это просто блок кода, который имеет название и входные параметры для обработки, который может быть выполнен, когда нам это нужно.</description>
			<turbo:content>
<![CDATA[<header><h1>Что такое функция в php</h1></header><div class="t-redactor__text">Вот мы и перешли к 3 главе под названием «Функции» и сегодня я расскажу что такое функции в php, как их объявлять и зачем они нужны.</div><div class="t-redactor__text">Функция это просто блок кода, который имеет название и входные параметры для обработки, который может быть выполнен, когда нам это нужно. Может показаться, что толку от них мало, но, когда вы поймете и научитесь использовать функции, вы сможете сэкономить кучу времени и написать код, который будет гораздо более удобным для чтения.</div><h3  class="t-redactor__h3">Зачем вообще они нужны??</h3><div class="t-redactor__text">Функции нужны для того, чтоб в коде не возникали ошибки и хаос. Если весь код состоит всего из нескольких переменных и операций, то можно обойтись и без функций. Но как только их становятся десятки, сотни и тысячи, без разделения кода на изолированные логические кусочки (функции) уже не обойтись. Функции позволяют писать программы, постепенно углубляясь в отдельные аспекты и не теряя при этом «общую картину». И еще они нужны для сокращения возможных ошибок, т.к. позволяют изолировать переменные, объявляемые внутри функций от случайного их изменения в других частях кода.</div><h3  class="t-redactor__h3">Вызов функции:</h3><div class="t-redactor__text">Функция объявляется при помощи ключевого слова function, после которого в фигурных скобках записываются различные операторы, составляющие тело функции.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  function MyFunction()
{
 // операторы
}</code></pre><div class="t-redactor__text">Название функции может начинаться со знака «_», но не с цифры!<br /><br />Если функция принимает аргументы, то они записываются как переменные в объявлении функции. Аргумент функции представляет собой переменную, передаваемую в тело функции для дальнейшего использования в операциях. В случае, когда функция принимает больше одного аргумента, эти переменные разделяются запятыми:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">function MyFunction($var, $var1, $var2)</code></pre><div class="t-redactor__text">Если функция возвращает какое-либо значение, в теле функции обязательно должен присутствовать оператор return:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  function MyFunction()
{
  return $ret; // возвращается значение переменной $ret
}</code></pre><div class="t-redactor__text">Пример самой простой функции.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  function get_sum()
  {
    $var = 20;
    $var1 = 5;
    $sum = $var + $var1;
    return $sum;
  }
  echo(get_sum()); // выводит 25</code></pre><div class="t-redactor__text">В этом примере показана функция, вычисляющая сумму двух чисел. Эта функция не принимает ни одного аргумента, а просто вычисляет сумму и возвращает полученный результат. После этого, она вызывается в теле оператора echo для вывода результата в браузер.<br /><br />Переменные $var и $var1 мы можем объявить как аргументы и в этом случае в теле функции их определять не надо:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  function get_sum($var, $var1)
  {
    $sum = $var + $var1;
    echo $sum;
  }
  get_sum(5,2); // выводит 7</code></pre><div class="t-redactor__text">Переменная, содержащая значение, переданное через аргумент, называется параметром функции.<br /><br />На этой прекрасной ноте мы закончим, ведь изучать надо постепенно чтобы не запутаться. А пока потренируйтесь объявлять функции разными способами.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Вложенные функции php</title>
			<link>https://www.easyitway.com/tpost/ixnmgrl8f1-vlozhennie-funktsii-php</link>
			<amplink>https://www.easyitway.com/tpost/ixnmgrl8f1-vlozhennie-funktsii-php?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 14:22:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<turbo:content>
<![CDATA[<header><h1>Вложенные функции php</h1></header><div class="t-redactor__text">Функции можно вызывать внутри других функций — по аналогии с тем, как одна управляющая конструкция (if, while, for и т.д.) может находиться внутри другой.<br /><br />Такая возможность удобна в любых программах, и в больших, и в малых, поскольку она увеличивает степень модульности приложения и упрощает сопровождение программы.<br /><br />Вложенные функции выглядят следующим образом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> function Parent($a) 
   { 
      echo $a; 
      function Child($b) 
   { 
      echo $b+1; 
      return $b*$b; 
   } 
      return $a*$a*Child($a); // фактически возвращает $a*$a*($a+1)*($a+1) 
   } 
// Вызываем функции 
Parent(10); 
Child(30); </code></pre><div class="t-redactor__text">Видно, что нет никаких ограничений на место описания функции — будь то глобальная область видимости программы, либо же тело какой-то другой функции.<br /><br />Каждая функция добавляется во внутреннюю таблицу функций PHP тогда, когда управление доходит до участка программы, содержащего определение этой функции. При этом, конечно, само тело функции пропускается, однако ее имя фиксируется и может далее быть использовано в сценарии для вызова.<br /><br />Если же в процессе выполнения программы PHP никогда не доходит до определения некоторой функции, она не будет «видна», как будто ее и не существует.<br /><br />Вложенное объявление еще не делает функцию «защищенной», то есть не ограничивает возможность ее вызова той функцией, в которой она была объявлена.<br /><br />Вложенная функция не наследует параметров родительской функции. Параметры должны передаваться ей точно так же, как и любой другой функции.<br /><br />Хотя вложенные функции не защищены от вызова из других точек сценария, они не могут вызываться до вызова своей родительской функции.<br /><br />При попытке вызвать вложенную функцию раньше вызова родительской функции выводится сообщение об ошибке.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Возврат значений из функции</title>
			<link>https://www.easyitway.com/tpost/cc8e6i5d11-vozvrat-znachenii-iz-funktsii</link>
			<amplink>https://www.easyitway.com/tpost/cc8e6i5d11-vozvrat-znachenii-iz-funktsii?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 14:24:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Значения возвращаются при помощи необязательного оператора возврата. Возвращаемые значения могут быть любого типа, в том числе это могут быть массивы и объекты.</description>
			<turbo:content>
<![CDATA[<header><h1>Возврат значений из функции</h1></header><div class="t-redactor__text">В статье «что такое функция в php.» я немного затрагивал тему о возврате значений из функции с помощью конструкции return, но сегодня я расскажу об этом подробнее.<br /><br />Значения возвращаются при помощи необязательного оператора возврата. Возвращаемые значения могут быть любого типа, в том числе это могут быть массивы и объекты. Возврат приводит к завершению выполнения функции и передаче управления обратно к той строке кода, в которой данная функция была вызвана.<br /><br />return возвращает управление программой в вызывавший модуль. Выполнение возвращается в выражение, следующее после вызова текущего модуля. Если вызвано из функции, выражение return немедленно прекращает выполнение текущей функции и возвращает свой аргумент как значение данной функции.<br /><br />Если return вызывается из глобальной области видимости, выполнение текущего файла скрипта прекращается. Если текущий файл скрипта был подключен с помощью функций include или require, тогда управление возвращается к файлу, который вызывал текущий. Более того, если текущий файл скрипта был подключен с помощью include, тогда значение переданное return будет возвращено в качестве значения вызова include. Если return вызывается из главного файла скрипта, тогда выполнение скрипта прекращается. Если текущий файл скрипта был вызван конфигурационными опциями auto_prepend_file или auto_append_file из файла настроек php.ini, тогда выполнение этого скрипта прекращается.<br /><br />Пример 1 Использование конструкции return</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">function square($num)
{
    return $num * $num;
}
echo square(4);   // выводит &#039;16&#039;.</code></pre><div class="t-redactor__text">Функция не может возвращать несколько значений, но это можно добиться, возвращая массив.<br /><br />Пример 2 Возврат нескольких значений в виде массива.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">function small_mass()
{
    return array (0, 1, 2);
}
list ($zero, $one, $two) = small_mass();</code></pre><div class="t-redactor__text">Для того, чтобы функция возвращала результат по ссылке, вам необходимо использовать оператор &amp; и при описании функции, и при присвоении переменной возвращаемого значения.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  function &amp;returns_reference()
{
    return $someref;
}

$newref =&amp; returns_reference();</code></pre><h3  class="t-redactor__h3">Объявление типов возвращаемых значений</h3><div class="t-redactor__text">В PHP 7 добавлена возможность объявлять тип возвращаемого значения. Аналогично объявлению типов аргументов можно задать тип значения, которое будет возвращаться функцией. Типы, которые можно объявить для возвращаемых значений те же, что и для аргументов функций.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  function sum($a, $b): float {
    return $a + $b;
}

// Будет возвращаться значение типа float.
var_dump(sum(1, 2));</code></pre><div class="t-redactor__text">Возврат в режиме строгой типизации</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> declare(strict_types=1);

function sum($a, $b): int {
    return $a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1, 2.5));</code></pre><div class="t-redactor__text">Возврат объектов</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class C {}

function getC(): C {
    return new C;
}

var_dump(getC());</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Рекурсивные функции</title>
			<link>https://www.easyitway.com/tpost/g849isvv71-rekursivnie-funktsii</link>
			<amplink>https://www.easyitway.com/tpost/g849isvv71-rekursivnie-funktsii?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:12:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Большинство языков программирования поддерживает рекурсивные функции, то есть такие, которые вызывают сами себя. </description>
			<turbo:content>
<![CDATA[<header><h1>Рекурсивные функции</h1></header><div class="t-redactor__text">Большинство языков программирования поддерживает рекурсивные функции, то есть такие, которые вызывают сами себя. Это весьма мощный инструмент, позволяющий создавать довольно изящные и функциональные программы, но вот используется он достаточно редко. Технически рекурсивные функции ничем не отличаются от обычных. Единственное различие заключается в том, что где-то в коде функции находится вызов ее самой. Например, если вы напишете</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">function test() { 
разные операторы 
test();
разные операторы
   }
то это и будет рекурсивная функция.</code></pre><div class="t-redactor__text">Рекурсия бывает:<br /><br /><ul><li>Прямая</li><li>Непрямая</li></ul><br />Рассмотрим пример рекурсивной функции (прямой), используемой при вычислении факториала x!</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">function factorial($x) {
if ($x === 0) return 1;
else return $x*factorial($x-1);
}
echo factorial(7);</code></pre><div class="t-redactor__text">В рассмотренном примере пользовательская функция factorial() вызывает сама себя, что является прямой рекурсией. Непрямая рекурсия возникает, когда первая функция вызывает вторую, а вторая — первую.<br /><br />Если функция вызывается достаточно часто, рекурсия делает программу более эффективной. Тем не менее, при использовании рекурсии необходима осторожность, поскольку ошибки могут привести к зацикливанию программы.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Функции-переменные в php</title>
			<link>https://www.easyitway.com/tpost/4bgh80kbm1-funktsii-peremennie-v-php</link>
			<amplink>https://www.easyitway.com/tpost/4bgh80kbm1-funktsii-peremennie-v-php?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:13:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Одной из интересных возможностей РНР являются функции-переменные (variable functions), то есть динамические вызовы функций, имена которых определяются во время выполнения программы.</description>
			<turbo:content>
<![CDATA[<header><h1>Функции-переменные в php</h1></header><div class="t-redactor__text">Одной из интересных возможностей РНР являются функции-переменные (variable functions), то есть динамические вызовы функций, имена которых определяются во время выполнения программы. Хотя в большинстве web-приложений можно обойтись и без функций-переменных, они значительно сокращают объем и сложность программного кода, а также часто снимают необходимость в условных командах if.<br /><br />Вызов функции-переменной представляет собой имя переменной, за которым следует пара круглых скобок. В круглых скобках могут перечисляться параметры:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$имя_функции();</code></pre><div class="t-redactor__text">Вот маленький пример использования функции-переменной (я взял два разных приветствия):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  //Первое приветствие
function druck() {
  print &quot;Привет Друг!!.&quot;;
}
//Второе приветствие
function podruga() {
  print &quot;Привет подруга!!.&quot;;
}

// Выбрать 1 приветствие
$language = &quot;druck&quot;;

//Выполнить функцию
$language();</code></pre><div class="t-redactor__text">Данный код показывает интересную концепцию функций-переменных и наглядно показывает, что функции-переменные способствуют уменьшению объема программного кода. Если бы не эта возможность, функцию пришлось бы выбирать командой if или switch; это привело бы к заметному увеличению объема программного кода и риску появления дополнительных ошибок при кодировании. Именно поэтому лучше пользоваться функциями-переменными.<br /><br />Попробуйте самостоятельно для закрепления материала придумать свои функции и вызвать их таким способом. Удачи Вам!!</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Построение библиотек функций</title>
			<link>https://www.easyitway.com/tpost/0h0l0d70p1-postroenie-bibliotek-funktsii</link>
			<amplink>https://www.easyitway.com/tpost/0h0l0d70p1-postroenie-bibliotek-funktsii?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:14:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Библиотеки функций — одно из самых эффективных средств экономии времени при построении приложений.</description>
			<turbo:content>
<![CDATA[<header><h1>Построение библиотек функций</h1></header><div class="t-redactor__text">Как только появляются многократно используемые фрагменты кода, сразу хочется поместить их куда-нибудь в библиотеку и вызывать по мере необходимости. В PHP библиотеку можно построить на основе классов. Поскольку классы будут использоваться, в основном, для работы с базами данных, создавать их можно на основе соответствующих классов библиотеки.<br /><br />Библиотеки функций — одно из самых эффективных средств экономии времени при построении приложений. Вместо того чтобы постоянно переписывать функции в новый сценарий или копировать их через текстовый буфер, гораздо удобнее разместить все функции сортировки в отдельном файле и присвоить ему легко узнаваемое имя (например array_sorting.inc). Вот маленький пример такого файла.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">function merge_sort($array, $tmparray, $right, $left)
{ ..... }
function bubble_sort($array, $n)
{ ..... }
function quik_sort($array, $right, $left)
{ ..... }</code></pre><div class="t-redactor__text">Библиотека array_sorting.inc служит накопителем для всех функций сортировки. Библиотеку функций можно включить в сценарий при помощи команд PHP include() или require(), в результате чего все функции библиотеки становятся доступными. Синтаксис этих команд выглядит так:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">include(путь/имя файла); или include &quot;путь/имя файла&quot;;
require(путь/имя файла); или require &quot;путь/имя файла&quot;;</code></pre><div class="t-redactor__text">И в заключении маленький пример использования функций библиотеки array_sorting.inc в сценарии:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Предполагается, что библиотека array_sorting.inc
// находится в одном каталоге со сценарием.
// Поэтому подключаем библиотеку
include(&quot;array_sorting.inc&quot;);

// Теперь можно использовать любые функции из array_sorting.inc
$some_array = array(50, 42. 35, 46);

// Также используем функцию bubble_sort()
$sorted_array = bubble_sort($some_array, 1);</code></pre><div class="t-redactor__text">Советую всем при разработке приложений создать свою собственную библиотеку. Это вам очень поможет в разработке и исключит повторное набивание функций.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Анонимные функции</title>
			<link>https://www.easyitway.com/tpost/2j6c9bbun1-anonimnie-funktsii</link>
			<amplink>https://www.easyitway.com/tpost/2j6c9bbun1-anonimnie-funktsii?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:16:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Анонимные функции, также известные как замыкания (closures), позволяют создавать функции, не имеющие определенных имен.</description>
			<turbo:content>
<![CDATA[<header><h1>Анонимные функции</h1></header><div class="t-redactor__text">Анонимные функции, также известные как замыкания (closures), позволяют создавать функции, не имеющие определенных имен. Они наиболее полезны в качестве значений callback-параметров, но также могут иметь и множество других применений.<br /><br />Использование анонимных фукций в php стало возможным, начиная с версии 5.3.0. В версии 5.4.0 в анонимных функциях стало возможным использовать $this. Вот пример анонимной функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  &lt;?php
  echo preg_replace_callback(&#039;~-([a-z])~&#039;, function ($match) {
    return strtoupper($match[1]);
}, &#039;hello-world&#039;);
// выведет helloWorld
?&gt;</code></pre><div class="t-redactor__text">Замыкания также могут быть использованы в качестве значений переменных; PHP автоматически преобразует такие выражения в экземпляры внутреннего класса Closure. Присвоение замыкания переменной использует тот же синтаксис, что и для любого другого присвоения, включая завершающую точку с запятой. Вот маленький пример присвоения анонимной функции переменной:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$greet = function($name)
{
    printf(&quot;Hello %s\r\n&quot;, $name);
};

$greet(&#039;World&#039;);
$greet(&#039;PHP&#039;);
?&gt;</code></pre><h3  class="t-redactor__h3">Использование ключевого слова use.</h3><div class="t-redactor__text">Замыкания могут также наследовать переменные из родительской области видимости. Любая подобная переменная должна быть объявлена в заголовке функции. Наследование переменных из родительской области видимости не то же самое, что использование глобальных переменных. Глобальные переменные существуют в глобальной области видимости, которая не меняется, вне зависимости от того, какая функция выполняется в данный момент. Родительская область видимости — это функция, в которой было объявлено замыкание.</div><div class="t-redactor__text">Функция обращается к своему контексту при помощи ключевого слова use. Это схоже с использованием ключевого слова global, но не идентично ему. Вот пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$arr = array(1, 2, 3, 4, 5);
 
$func = function($par) use ($n){
   return $par + $n; 
};
$n = 1;
$b = array_map($func, $arr);
 
print_r($b);
// Выведит: Array ( [0] =&gt; 1 [1] =&gt; 2 [2] =&gt; 3 [3] =&gt; 4 [4] =&gt; 5 )
?&gt;</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Объектно-ориентированные возможности РНР</title>
			<link>https://www.easyitway.com/tpost/1sv6nvvzs1-obektno-orientirovannie-vozmozhnosti-rnr</link>
			<amplink>https://www.easyitway.com/tpost/1sv6nvvzs1-obektno-orientirovannie-vozmozhnosti-rnr?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:17:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Если вы ориентируетесь в современных технологиях программирования, объектно-ориентированное программирование (ООП) наверняка является частью вашей повседневной работы. </description>
			<turbo:content>
<![CDATA[<header><h1>Объектно-ориентированные возможности РНР</h1></header><div class="t-redactor__text">Если вы ориентируетесь в современных технологиях программирования, объектно-ориентированное программирование (ООП) наверняка является частью вашей повседневной работы. Именно поэтому в новой главе по языку PHP «Классы и объекты» в первой статье я расскажу объектно-ориентированные возможности РНР.</div><div class="t-redactor__text">Объектно-ориентированные программы более просты и мобильны, их легче модифицировать и сопровождать, чем их «традиционных» собратьев. Кроме того, сама идея объектной ориентированности при грамотном ее использовании позволяет программе быть даже более защищенной от различного рода ошибок, чем это задумывал программист в момент работы над ней.</div><div class="t-redactor__text">Стратегию ООП лучше всего описать как смещение приоритетов в процессе программирования от функциональности приложения к структурам данных. Это позволяет программисту моделировать в создаваемых приложениях реальные объекты и ситуации. Технология ООП обладает тремя главными преимуществами:</div><div class="t-redactor__text"><ul><li>она проста для понимания — ООП позволяет мыслить категориями повседневных объектов;</li><li>повышенно надежна и проста для сопровождения — правильное проектирование обеспечивает простоту расширения и модификации объектно-ориентированных программ. Модульная структура позволяет вносить независимые изменения в разные части программы, сводя к минимуму риск ошибок программирования;</li><li>ускоряет цикл разработки — модульность и здесь играет важную роль, поскольку различные компоненты ООП-программ можно легко использовать в других программах, что уменьшает избыточность,кода и снижает риск внесения ошибок при копировании.</li></ul></div><div class="t-redactor__text">Объектно-ориентированное программирование основано на:</div><div class="t-redactor__text"><ul><li>Инкапсуляции</li><li>Полиморфизме</li><li>Наследовании</li></ul></div><div class="t-redactor__text">ИНКАПСУЛЯЦИЯ — это механизм, объединяющий данные и обрабатывающий их код как единое целое.</div><div class="t-redactor__text">Многие преимущества ОО обусловлены одним из его фундаментальных принципов — инкапсуляцией. Инкапсуляцией называется включение различных мелких элементов в более крупный объект, в результате чего программист работает непосредственно с этим объектом. Это приводит к упрощению программы, поскольку из нее исключаются второстепенные детали.</div><div class="t-redactor__text">ПОЛИМОРФИЗМ позволяет использовать одни и те же имена для похожих, но технически разных задач. Главным в полиморфизме является то, что он позволяет манипулировать объектами путем создания стандартных интерфейсов для схожих действий. Полиморфизм значительно облегчает написание сложных программ.</div><div class="t-redactor__text">НАСЛЕДОВАНИЕ позволяет одному объекту приобретать свойства другого объекта. При копировании создается точная копия объекта, а при наследовании точная копия дополняется уникальными свойствами, которые характерны только для производного объекта.</div><div class="t-redactor__text">Хотя PHP обладает общими объектно-ориентированными возможностями, он не является полноценным ОО-языком (например, таким, как C++ или Java). В частности, в PHP не поддерживаются следующие объектно-ориентированные возможности:</div><div class="t-redactor__text"><ul><li>множественное наследование;</li><li>автоматический вызов конструкторов</li><li>абстрактные классы;</li><li>перегрузка методов;</li><li>перегрузка операторов</li><li>закрытый и открытый доступ, виртуальные функции;</li><li>деструкторы;</li><li>полиморфизм.</li></ul></div><div class="t-redactor__text">Но и без всего перечисленного вы все равно сможете извлечь пользу из объектно-ориентированных возможностей, поддерживаемых PHP. Реализация ООП в PHP оказывает колоссальную помощь в модульном оформлении функциональности вашей программы.</div><div class="t-redactor__text">Начиная с версии PHP 5 объектная модель была полностью переписана, она стала более производительной и функциональной.</div><h3  class="t-redactor__h3">Основные понятия ООП</h3><h4  class="t-redactor__h4">Классы</h4><div class="t-redactor__text">Класс — это каркас для объекта. Это кусок кода, который определяет:</div><div class="t-redactor__text"><ul><li>Типы данных, которые будут содержать созданные объекты класса</li><li>Функции, которые будут содержать эти объекты.</li></ul></div><h4  class="t-redactor__h4">Объекты</h4><div class="t-redactor__text">Объект — это переменная специального типа, которая создается через класс. Она содержит действительные данные и функции для манипулирования ими. Можно создавать сколько угодно объектов от одного единственного класса. Каждая функция объекта не зависит от другого объекта, даже если они созданы от одного и того же класса.</div><h4  class="t-redactor__h4">Переменные класса</h4><div class="t-redactor__text">Значения данных, которые хранятся в том или ином объекте, записываются в специальные переменные, называемые переменными класса. Переменные класса тесно связаны с его объектом. Несмотря на то что все объекты класса имеют одни и те же переменные, их значения могут отличаться.</div><h4  class="t-redactor__h4">Методы</h4><div class="t-redactor__text">Функции, определяемые в классе и применяемые для объектов этого класса, называются методами. Они не во многом отличаются от обычных функций — вы можете передавать им значения, они могут содержать локальные переменные и возвращать значения. Однако, методы чаще работают с переменными объекта.</div><div class="t-redactor__text">На этом теория закончилась, в последующих статьях главы «Классы и объекты» я на практике покажу как работать с объектами, классами, методами и переменными класса.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Классы и объекты в РНР</title>
			<link>https://www.easyitway.com/tpost/ledt1x8nr1-klassi-i-obekti-v-rnr</link>
			<amplink>https://www.easyitway.com/tpost/ledt1x8nr1-klassi-i-obekti-v-rnr?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:18:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Класс — это базовое понятие в объектно-ориентированном программировании. Классы образуют синтаксическую базу ООП. Их можно рассматривать как своего рода «контейнеры» для логически связанных данных и функций.</description>
			<turbo:content>
<![CDATA[<header><h1>Классы и объекты в РНР</h1></header><div class="t-redactor__text">Класс — это базовое понятие в объектно-ориентированном программировании. Классы образуют синтаксическую базу ООП. Их можно рассматривать как своего рода «контейнеры» для логически связанных данных и функций.</div><h3  class="t-redactor__h3">Определение класса</h3><div class="t-redactor__text">Каждое определение класса начинается с ключевого слова class, затем следует имя класса, и далее пара фигурных скобок, которые заключают в себе определение свойств и методов этого класса.</div><div class="t-redactor__text">Именем класса может быть любое слово, кроме тех, которые входят в список зарезервированных слов, начинается с буквы или символа подчеркивания и за которым следует любое количество букв, цифр или символов подчеркивания.</div><div class="t-redactor__text">Класс может содержать собственные константы, переменные (называемые свойствами) и функции (называемые методами). Пример объявления класса:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Имя_класса {
// описание членов класса - свойств и методов для их обработки
}
  </code></pre><div class="t-redactor__text">Пример простого определения класса</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
class SimpleClass
{
    // объявление свойства
    public $var = &#039;значение по умолчанию&#039;;

    // объявление метода
    public function displayVar() {
        echo $this-&gt;var;
    }
}
?&gt;</code></pre><div class="t-redactor__text">Псевдо-переменная $this доступна в том случае, если метод был вызван в контексте объекта. $this является ссылкой на вызываемый объект. Обычно это тот объект, которому принадлежит вызванный метод, но может быть и другой объект, если метод был вызван статически из контекста другого объекта.</div><h3  class="t-redactor__h3">extends</h3><div class="t-redactor__text">Класс может наследовать методы и свойства другого класса используя ключевое слово extends при его описании. Невозможно наследовать несколько классов, один класс может наследовать только один базовый класс.</div><div class="t-redactor__text">Наследуемые методы и свойства могут быть переопределены (за исключением случаев, когда метод класса объявлен как final) путем объявления их с теми же именами, как и в родительском классе. Существует возможность доступа к переопределенным методам или статическим методам путем обращения к ним через parent::</div><div class="t-redactor__text">Когда переопределяются методы число и типы аргументов должны оставаться такими же как и были.</div><div class="t-redactor__text">Пример простого наследования классов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
class ExtendClass extends SimpleClass
{
    // Переопределение метода родителя
    function displayVar()
    {
        echo &quot;Расширенный класс\n&quot;;
        parent::displayVar();
    }
}

$extended = new ExtendClass();
$extended-&gt;displayVar();
?&gt;</code></pre><div class="t-redactor__text">Результат выполнения данного примера:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Расширенный класс
значение по умолчанию</code></pre><h3  class="t-redactor__h3">::class</h3><div class="t-redactor__text">Начиная с версии PHP 5.5 можно использовать ключевое слово class для разрешения имени класса. С помощью конструкции ClassName::class можно получить строку с абсолютным именем класса ClassName. Это довольно полезно при работе с классами, использующими пространства имен.</div><div class="t-redactor__text">Пример разрешения имени класса:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
namespace NS {
    class ClassName {
    }

    echo ClassName::class;
}
?&gt;</code></pre><h3  class="t-redactor__h3">Создание объектов</h3><div class="t-redactor__text">Экземпляр класса — это объект. Объект — это совокупность данных (свойств) и функций (методов) для их обработки. Свойства и методы называются членами класса. Вообще, объектом является все то, что поддерживает инкапсуляцию.</div><div class="t-redactor__text">Если класс можно рассматривать как тип данных, то объект — как переменную (по аналогии). Скрипт может одновременно работать с несколькими объектами одного класса, как с несколькими переменными.</div><div class="t-redactor__text">Для объявления объекта необходимо использовать оператор new:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Объект = new Имя_класса;</code></pre><div class="t-redactor__text">Новый объект всегда будет создан, за исключением случаев, когда он содержит конструктор, в котором определен вызов исключения в случае ошибки. Рекомендуется определять классы до создания их экземпляров (в некоторых случаях это обязательно).<br /><br />Пример создания нового объекта:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
class Test
{
    static public function getNew()
    {
        return new static;
    }
}

class Child extends Test
{}

$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);

$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);

$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?&gt;</code></pre><div class="t-redactor__text">Результат выполнения данного примера:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">bool(true)
bool(true)
bool(true)</code></pre><h3  class="t-redactor__h3">Конструкторы</h3><div class="t-redactor__text">Довольно часто при создании объекта требуется задать значения некоторых свойств. Разработчики технологии ООП реализовали его в концепции конструкторов. Конструктор представляет собой метод, который задает значения некоторых свойств (а также может вызывать другие методы). Конструкторы вызываются автоматически при создании новых объектов. Чтобы это стало возможным, имя метода-конструктора должно совпадать с именем класса, в котором он содержится. Пример конструктора:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
class Webpage {
var $bgcolor;
 function Webpage($color) {
 $this-&gt;bgcolor = $color;
 }
}

// Вызвать конструктор класса Webpage
$page = new Webpage(&quot;brown&quot;);
?&gt;</code></pre><div class="t-redactor__text">Раньше создание объекта и инициализация свойств выполнялись раздельно. Конструкторы позволяют выполнить эти действия за один этап.</div><h3  class="t-redactor__h3">Деструкторы</h3><div class="t-redactor__text">В РНР отсутствует непосредственная поддержка деструкторов. Но можно легко имитировать работу деструктора, вызывая функцию РНР unset(). Эта функция уничтожает содержимое переменной и возвращает занимаемые ею ресурсы системе. С объектами unset() работает так же, как и с переменными.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">unset($Webpage); // эта команда удаляет из памяти все содержимое $Webpage.</code></pre><div class="t-redactor__text">Необходимость в вызове деструкторов возникает лишь при работе с объектами, использующими большой объем ресурсов, поскольку все переменные и объекты автоматически уничтожаются по завершении сценария.</div><h3  class="t-redactor__h3">Инициализация объектов</h3><div class="t-redactor__text">Иногда возникает необходимость выполнить инициализацию объекта — присвоить его свойствам первоначальные значения. Предположим, имя класса Coor и он содержит два свойства: имя человека и город его проживания. Можно написать метод (функцию), который будет выполнять инициализацию объекта, например Init():</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
// Создаем новый класс Coor:
class Coor {
// данные (свойства):
var $name;
var $city;

// Инициализирующий метод:
 function Init($name) {
 $this-&gt;name = $name;
 $this-&gt;city = &quot;London&quot;;
   }
}

// Создаем объект класса Coor:
$object = new Coor;
// Для инициализации объекта сразу вызываем метод:
$object-&gt;Init();
?&gt;</code></pre><div class="t-redactor__text">Главное не забыть вызвать функцию сразу после создания объекта, либо вызвать какой-нибудь метод между созданием (оператор new) объекта и его инициализацией (вызовом Init).</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Наследование классов в PHP</title>
			<link>https://www.easyitway.com/tpost/0jh5ibazr1-nasledovanie-klassov-v-php</link>
			<amplink>https://www.easyitway.com/tpost/0jh5ibazr1-nasledovanie-klassov-v-php?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:22:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Наследование — это не просто создание точной копии класса, а расширение уже существующего класса, чтобы потомок мог выполнять какие-нибудь новые, характерные только ему функции.</description>
			<turbo:content>
<![CDATA[<header><h1>Наследование классов в PHP</h1></header><div class="t-redactor__text">Наследование — это не просто создание точной копии класса, а расширение уже существующего класса, чтобы потомок мог выполнять какие-нибудь новые, характерные только ему функции.</div><div class="t-redactor__text">Наследование — это хорошо зарекомендовавший себя принцип программирования. PHP использует этот принцип в своей объектной модели. Этот принцип будет распространяться на то, каким образом множество классов и объектов относятся друг к другу.</div><h4  class="t-redactor__h4">Как происходит наследование</h4><div class="t-redactor__text">Наследование базируется на понятиях класс-родитель и класс-наследник. Используя определенный синтаксис, вы можете создать класс, который будет наследовать другой класс (становится его наследником).</div><div class="t-redactor__text">Когда вы создаете дочерний класс, он наследует все поля и методы своего базового класса. В дочерний класс можно добавлять дополнительные поля и методы, тем самым расширяя функциональность класса-родителя.</div><h4  class="t-redactor__h4">Создание дочерних классов</h4><div class="t-redactor__text">Cоздать класс, который станет наследником другого класса, в PHP очень просто. Нужно только использовать ключевое слово extends:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class ParentClass {

  // описание полей и методов
}

class ChildClass extends ParentClass {

  // описание дополнительных полей и методов
}</code></pre><div class="t-redactor__text">Мы создали класс ParentClass, а затем класс ChildClass, который наследуется от ParentClass. ChildClass наследует все поля и методы класса ParentClass, и в него также могут быть добавлены свои поля и методы.<br /><br />Пример наследования:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Foo
{
    public function printItem($string)
    {
        echo &#039;Foo: &#039; . $string . PHP_EOL;
    }
    
    public function printPHP()
    {
        echo &#039;PHP is great.&#039; . PHP_EOL;
    }
}

class Bar extends Foo
{
    public function printItem($string)
    {
        echo &#039;Bar: &#039; . $string . PHP_EOL;
    }
}

$foo = new Foo();
$bar = new Bar();
$foo-&gt;printItem(&#039;baz&#039;); // Выведет: &#039;Foo: baz&#039;
$foo-&gt;printPHP();       // Выведет: &#039;PHP is great&#039; 
$bar-&gt;printItem(&#039;baz&#039;); // Выведет: &#039;Bar: baz&#039;
$bar-&gt;printPHP();       // Выведет: &#039;PHP is great&#039;</code></pre><h4  class="t-redactor__h4">Перегрузка родительских методов</h4><div class="t-redactor__text">При создании дочернего класса, он наследует все поля и методы своего родительского класса. Но, может возникнуть необходимость изменить функциональность методов супер-класса в дочернем классе.</div><div class="t-redactor__text">Чтобы перегрузить метод супер-класса в дочернем классе, просто создайте в нем метод с таким же названием. Тогда при вызове метода для объектов дочернего класса, будет вызываться именно перегруженный метод, а не метод супер-класса:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class ParentClass {

  public function myMethod() {

    // (действия)

  }
  
}

class ChildClass extends ParentClass {

  public function myMethod() {

    // вызывется для объекта класса ChildClass

    // вместо метода супер-класса MyMethod()

  }

}</code></pre><h4  class="t-redactor__h4">Переопределение методов</h4><div class="t-redactor__text">Если в классе-потомке определить метод с именем, которое уже использовалось при объявлении другого метода в классе-предке, то такой метод будет называться переопределённым. Такой подход вполне себя оправдывает ведь классы, стоящие в одной цепочки наследования, описывают схожие множества объектов со схожим поведением, и для обозначения похожего действий таких объектов вполне естественно использовать одно и то же имя метода.</div><div class="t-redactor__text">Для примера возьмем два класса Admin и User. Например есть сайт где администратор, и пользователь могут авторизироваться, и для совершения этого действия можно использовать одно имя метода, например, authorize. Авторизация пользователя и администратора будет проходить немного по-разному: если для пользователя достаточно записать в сессию только логин, то для администратора необходимо записать в сессию ещё и уровень прав доступа.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Admin {
  private $rights;
 
  public function __construct($login, $password, $rights) {
    $this-&gt;login = $login;
    $this-&gt;password = $password;
    $this-&gt;rights = $rights;
  }
 
  public function authorize() {
    $_SESSION[&#039;login&#039;] = $this-&gt;getLogin();
    $_SESSION[&#039;rights&#039;] = $this-&gt;getRights();
  }
 
  public function getLogin() {
    return $this-&gt;login;
  }
 
  public function getRights() {
    return $this-&gt;rights;
  }
 
  public function setRights($rights) {
    $this-&gt;rights = $rights;
  }
}
 
class User {
  private $login;
  private $password;
  private $rights;
 
  public function __construct($login, $password, $rights = 0) {
    $this-&gt;login = $login;
    $this-&gt;password = $password;
    $this-&gt;rights = $rights;
  }
 
  public function getLogin() {
    return $this-&gt;login;
  }
 
  public function getRights() {
    return $this-&gt;rights;
  }
 
  public function setRights($rights) {
    $this-&gt;rights = $rights;
  }
 
  public function authorize() {
    $_SESSION[&#039;login&#039;] = $this-&gt;getLogin();
  }
}</code></pre><div class="t-redactor__text">Теперь при написании кода, который будет авторизовывать пользователей или администраторов не нужно будет знать, от экземпляра какого класса вызывается метод authorize.</div><h4  class="t-redactor__h4">Обращение к полям и методам класса-предка</h4><div class="t-redactor__text">Иногда бывает необходимо получить доступ к полю или методу класса-предка из класса-наследника. Использование методов, реализованных в классе-предке, иногда позволяет избавиться от дублирования кода. Чтобы избежать дублирования можно вызвать конструктор класса-предка из конструктора класса-потомка.</div><div class="t-redactor__text">Чтобы обратится к полям или методам класса-предка используется ключевое слово parent.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">public function __construct($login, $password, $rights) {
  parent::__construct($login, $password);
  $this-&gt;rights = $rights;
}</code></pre><div class="t-redactor__text">Обращение к полям класса-предка происходит аналогичным образом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class A {
  public $property = &#039;value&#039;;  
}
 
class B extends A{
  public function getProperty() {
    return $this-&gt;property;
  }
}
 
$b = new B();
 
echo &quot;{$b-&gt;getProperty()}
&quot;; // value</code></pre><div class="t-redactor__text">На этом наш урок о наследовании в php закончен. Думаю все понятно, но если есть вопросы задавайте их комментариях. Всем удачи!</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Полиморфизм классов в PHP</title>
			<link>https://www.easyitway.com/tpost/8mfj08ojn1-polimorfizm-klassov-v-php</link>
			<amplink>https://www.easyitway.com/tpost/8mfj08ojn1-polimorfizm-klassov-v-php?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:24:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Полиморфизм — это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. </description>
			<turbo:content>
<![CDATA[<header><h1>Полиморфизм классов в PHP</h1></header><div class="t-redactor__text">Продолжаем изучать классы и сегодня мы поговорим о полиморфизме классов в php.</div><div class="t-redactor__text">Полиморфизм — это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных.</div><div class="t-redactor__text">В более общем смысле, концепцией полиморфизма является идея «один интерфейс, множество методов». Это означает, что можно создать общий интерфейс для группы близких по смыслу действий. Преимуществом полиморфизма является то, что он помогает cнижать сложность программ, разрешая использование того же интерфейса для задания единого класса действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор. Вам, как программисту, не нужно делать этот выбор самому. Нужно только помнить и использовать общий интерфейс.</div><div class="t-redactor__text">Полиморфность класса — это свойство базового класса использовать функции производных классов, даже если на момент определения еще неизвестно, какой именно класс будет включать его в качестве базового и, тем самым, становиться от него производным.</div><h4  class="t-redactor__h4">Интерфейс</h4><div class="t-redactor__text">Интерфейс – то же самое, что и класс, за исключением того, что он не может содержать код. Интерфейс может определять названия методов и аргументов, но не содержание методов. Любые классы, реализующие интерфейс, должны реализовывать все методы, определяемые интерфейсом. Класс может реализовать множественные интерфейсы.</div><div class="t-redactor__text">Общий интерфейс – неотъемлемая часть полиморфизма. Определить интерфейс в PHP можно двумя способами: interfaces и abstract classes. Оба имеют свою область применения, и их можно смешивать и сочетать для подгонки в свою иерархию классов.</div><div class="t-redactor__text">Интерфейс объявляется ключевым словом «interface»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">interface MyInterface { 

// methods 

}</code></pre><div class="t-redactor__text">Присоединить к классу интерфейс можно с помощью ключевое слово «implements»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class MyClass implements MyInterface { 

// methods 

} </code></pre><div class="t-redactor__text">Методы в интерфейсе можно определять так же, как в классе, за исключением того, что они не могут иметь содержимого:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">interface MyInterface { 

public function doThis(); 

public function doThat(); 

public function setName($name); 

} </code></pre><h4  class="t-redactor__h4">Абстрактный класс</h4><div class="t-redactor__text">Абстрактный класс – это смесь интерфейса и класса. Он может определять как функциональность, так и интерфейс. Классы, расширяющие абстрактный класс должны реализовывать все абстрактные методы, определенные в абстрактном классе.</div><div class="t-redactor__text">Абстрактный класс объявляется таким же образом, как и классы, но с добавлением ключевого слова «abstract»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">abstract class MyAbstract { 

// methods 

}</code></pre><div class="t-redactor__text">Абстрактный класс можно назначить к классу используя ключевое слово «extends»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class MyClass extends MyAbstract { 

// class methods 

} </code></pre><div class="t-redactor__text"><strong>Пример полиморфизма в PHP</strong></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">abstract class Publication {
 // определяем правило, что все публикации должны печататься, т.е. иметь метод do_print()
 abstract public function do_print();
}

class News extends Publication {
 // переопределяем абстрактный метод печати
 public function do_print() {
  echo &#039;&lt;h4&lt;Новость&lt;/h4&lt;&#039;;
  //...
 }
}
class Announcement extends Publication {
 // переопределяем абстрактный метод печати
 public function do_print() {
  echo &#039;&lt;h4&lt;Объявление&lt;/h4&lt;&#039;;
  //...
 }
}
class Article extends Publication {
 // переопределяем абстрактный метод печати
 public function do_print() {
  echo &#039;&lt;h4&lt;Статья&lt;/h4&lt;&#039;;
  //...
 }
}

//Наполняем массив публикаций объектами, производными от Publication
$publications[] = new News();
$publications[] = new Announcement();
$publications[] = new Article();

foreach ($publications as $publication) {
 if ($publication instanceof Publication) { // Если мы работаем с наследниками Publication
  $publication-&gt;do_print(); // то мы можем смело выводить данные на печать
 }
 else {
  //исключение или обработка ошибки
 }
}</code></pre><div class="t-redactor__text">Вся суть полиморфизма заключаеться в последей части кода.<br /><br />С учетом того, что таблицы разные, поля в них тоже разные, удобнее всего получить отдельные списки для новостей и для статей. Мы сортируем данные, формируя, один большой массив объектов. Далее мы можем в рамках одного интерфейса вывести все объекты. Но при этом на экран новости и статьи будут выводиться немного по разному, например с разной иконкой или различным началом заголовка. Таким образом нам не нужно делать никаких проверок на предмет того, с чем мы работаем. Интерпретатор сделает это за нас.<br /><br />На этом наш урок закончен, на следующем занятии мы поговорим о инкапсуляции в php.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Инкапсуляция в PHP</title>
			<link>https://www.easyitway.com/tpost/den67h7zp1-inkapsulyatsiya-v-php</link>
			<amplink>https://www.easyitway.com/tpost/den67h7zp1-inkapsulyatsiya-v-php?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:27:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Инкапсуляция — это свойство объекта/класса регулировать доступ к определенным своим компонентам извне самого объекта/класса. </description>
			<turbo:content>
<![CDATA[<header><h1>Инкапсуляция в PHP</h1></header><div class="t-redactor__text">Как и обещал на предыдущем уроке cегодня мы поговорим на тему «инкапсуляция в php». И начнем конечно же с понятия инкапсуляции:</div><div class="t-redactor__text">Инкапсуляция — это свойство объекта/класса регулировать доступ к определенным своим компонентам извне самого объекта/класса. Например, на мониторе есть кнопки регулировки яркости — они в прямом доступе для пользователя. А есть микросхемы внутри — к ним доступ ограничен. Это и есть пример инкапсуляции.</div><div class="t-redactor__text">В программном смысле, инкапсуляция — это скрытие переменных в классе от пользователя, т.е. все переменные (свойства) класса делаются скрытыми (private), а методы открытыми (public). Прелесть данного подхода в том, что в методах можно вставить код для проверки всяких ошибок, и потом о них не думать, когда вызывается метод.</div><h4  class="t-redactor__h4">Уровни инкапсуляции:</h4><div class="t-redactor__text"><ul><li><strong>public</strong> – методы и свойства доступны извне объекта (открытые, или общедоступные);</li><li>Пример использования:</li></ul></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  class Page { // Объявляем класс
  
	public $title = &#039;Index Page&#039;; // Определяем уровень
}

$index = new Page();
echo $index-&gt;title; // Все прекрасно работает</code></pre><div class="t-redactor__text"><ul><li><strong>private</strong> – закрытые методы могут быть вызваны только в классе, где они были объявлены ( к ним нельзя обратиться из производных классов);</li></ul>Пример использования:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class human {
    private $age = 5;
    function say() {
      // внутри класса доступ к закрытым данным есть
      echo &quot;$this-&gt;age&quot;;
    }   
  }
   
  $obj = new human;
   
  // напрямую из вызывающей программы доступа к закрытым данным нет
  echo &quot;$obj-&gt;age&quot;;  // Ошибка! доступ закрыт!
   
  // однако с помощью метода можно выводить закрытые данные
  $obj-&gt;say();       // Допустимо</code></pre><div class="t-redactor__text"><ul><li><strong>protected</strong> – защищённые методы могут вызываться только из того же класса или его производных классов.</li></ul>Пример использования:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">class Page { // Объявляем класс
	protected $title = &#039;Index Page&#039;; // Уровень доступа

	public  function getTitle()  {
		return $this-&gt;title;
	}
}

$index = new Page();
//приведет к ошибке
echo $index-&gt;title;</code></pre><div class="t-redactor__text">Таким образом, если мы в примере с уровнем «public», объявим свойство $title, используя спецификатор доступа protected — попытка обращения к нему, через объект, незамедлительно приведет к ошибке.</div><h4  class="t-redactor__h4">Зачем они нужны?</h4><div class="t-redactor__text">Уровни инкапсуляции, или как их еще называют, ключевые слова определяющие область видимости, позволяют предоставлять доступ только к тем элементам класса, которые необходимы для конкретного клиента. Соответственно контроль доступа, благодаря которому можно запретить доступ к некоторым элементам класса, помогает избежать не правильной, работы приложения в целом.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Пространство имен PHP</title>
			<link>https://www.easyitway.com/tpost/hy6kuompo1-prostranstvo-imen-php</link>
			<amplink>https://www.easyitway.com/tpost/hy6kuompo1-prostranstvo-imen-php?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:29:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Пространство имён — это некоторое хранилище, созданное для абстрактной группировки уникальных идентификаторов (имён)</description>
			<turbo:content>
<![CDATA[<header><h1>Пространство имен PHP</h1></header><div class="t-redactor__text">Пространство имён — это некоторое хранилище, созданное для абстрактной группировки уникальных идентификаторов (имён) т.е. если использовать пространства имён, то можно подключать сторонние библиотеки и не бояться, что там будут такие же имена, как и в вашем коде.<br /><br />Пространства имен объявляются с помощью зарезервированного слова «namespace». Файл, содержащий пространство имен, должен содержать его объявление в начале перед любым другим кодом, кроме зарезервированного слова declare.<br /><br />Объявление единого пространства имен:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }</code></pre><div class="t-redactor__text">Только выражение declare может находиться перед объявлением пространства имен для указания кодировки файла.<br /><br />Так же как файлы и каталоги, пространства имен PHP позволяют создавать иерархию имен. Таким образом, имя пространства может быть определено с подуровнями:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">namespace MyProject\Sub\Level;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }</code></pre><h4  class="t-redactor__h4">Теория относительности</h4><div class="t-redactor__text">PHP всегда работает относительно текущего пространства имен. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">namespace Model;
$user = new User();</code></pre><div class="t-redactor__text">Добавив директиву пространства имен, мы автоматически отнесли исполнение скрипта к этому пространству. Теперь, при создании объекта типа User, мы получаем экземпляр класса из пространства имен Model. В этом и заключается относительность. Но чтобы создать первый класс User существует маневр для использования классов принадлежащих к глобальному пространству. Надо просто добавить обратный слеш «\» к имени класса. По этому символу PHP определяет в каком пространстве имен искать указанный класс.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$user = new \User();</code></pre><div class="t-redactor__text">Чтобы каждый раз не ставить символ обратного слеша «\» разработчики PHP позаботились об этом и предоставили такую директиву, как use. При помощи этой директивы можно перемещать класс из одного пространства в другое:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">namespace Model;

use Auth\Member;

$member = new Member();</code></pre><div class="t-redactor__text">Еще есть одна хорошая директива «as» с её помощью можно задать нужному классу имя и обращаться к нему по имени. Такую директиву можно применить при использовании одноименных классов. Пример использования:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">namespace Model;

use Auth\Member as AuthMember;

$member = new AuthMember();</code></pre><div class="t-redactor__text">При помощи use можно подключить сколько угодно классов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">namespace Model;

use Auth\User;
use Blog\Post;
use Blog\Tag;
use Api\User as ApiUser;</code></pre><h4  class="t-redactor__h4">Структура</h4><div class="t-redactor__text">Пространства имен помогают не только избежать конфликтов, но и структурировать проект. Допустим, вы создаете библиотеку и при этом не хотите причинить вреда уже написанному коду пользователя. Так можно обойти все связанные с этим проблемы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">MyNamespace\Blog\Content\Post
MyNamespace\Blog\Content\Page
MyNamespace\Blog\Tag</code></pre><div class="t-redactor__text">Нужно использовать своё имя для пространства имён, чтобы разъединить код библиотеки и код пользователя, который будет её использовать. Внутри корневого пространства имен своей библиотеки нужно использовать другие подпространства для логического деления функционала.</div><h4  class="t-redactor__h4">Константа __NAMESPACE__</h4><div class="t-redactor__text">__NAMESPACE__ это строка PHP, которая всегда возвращает текущее имя пространства имён. В глобальном пространстве она будет всегда пустой строкой.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">namespace App\Lib1;
echo __NAMESPACE__; // outputs: App\Lib1</code></pre><div class="t-redactor__text">Её значение имеет выгоду во время отладки. Её также можно использовать чтобы динамически генерировать полные квалифицированные имена классов:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">namespace App\Lib1;

class MyClass {
	public function WhoAmI() {
		return __METHOD__;
	}
}

$c = __NAMESPACE__ . &#039;\\MyClass&#039;;
$m = new $c;
echo $m-&gt;WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI</code></pre><h4  class="t-redactor__h4">В заключении…</h4><div class="t-redactor__text">Cледуйте следующим правилам что применять пространства имен правильно и использовать только там где необходимо.</div><div class="t-redactor__text"><ul><li>Используйте уникальный корень для пространства имен;</li><li>Используйте только одно пространство имен в каждом файле;</li><li>Проверьте наличие в пространстве имен каждого класса/интерфейса;</li><li>Поставьте каждый класс/интерфейс в собственный файл и ничего больше туда не добавляйте;</li><li>Не добавляйте функции в пространство имен.</li></ul></div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>PHP. Работа с файлами</title>
			<link>https://www.easyitway.com/tpost/6xoi4joag1-php-rabota-s-failami</link>
			<amplink>https://www.easyitway.com/tpost/6xoi4joag1-php-rabota-s-failami?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:34:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Под работой с файлами в PHP подразумевается чтение из файла и запись в файл различной информации. Работать с файлами в PHP приходится много, поэтому любой программист обязан уметь считывать из файла и записывать в файл. </description>
			<turbo:content>
<![CDATA[<header><h1>PHP. Работа с файлами</h1></header><div class="t-redactor__text">Под работой с файлами в PHP подразумевается чтение из файла и запись в файл различной информации. Работать с файлами в PHP приходится много, поэтому любой программист обязан уметь считывать из файла и записывать в файл. Работа с файлами не является сложной задачей, и я Вам помогу разобраться.<br /><br />Работа с файлами разделяется на 3 этапа:<br /><br /><strong>1. Открытие файла.</strong><br /><br /><strong>2. Манипуляции с данными.</strong><br /><br /><strong>3. Закрытие файла.</strong><br /><br />Прежде чем работать с файлом, желательно убедитесь в том, что он существует. Для решения этой задачи обычно используются две функции: file_exists() и is_file().<br /><br /><strong>file_exists()</strong><br /><br />Функция filе_ехists() проверяет, существует ли заданный файл. Если файл существует, функция возвращает TRUE, в противном случае возвращается FALSE. Синтаксис функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">bool file_exists(string файл)</code></pre><div class="t-redactor__text">Пример проверки существования файла:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">if(! file_exists($filename)) :
  print &quot;File $filename не существует!&quot;;
endif:
  is_file()</code></pre><div class="t-redactor__text"><strong>is_file()</strong><br /><br />Функция is_file() проверяет существование заданного файла и возможность выполнения с ним операций чтения/записи. Синтаксис функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">bool is_file(string файл)</code></pre><div class="t-redactor__text">Пример проверки существования файла и возможность операций с ним:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$file = &quot;Coolfile.txt&quot;;

if(is_file($file)) :
  print &quot;Файл $file является доступным, операции разрешены!&quot;;
else :
  print &quot;Файл $file не существует, или он не является доступным файлом!&quot;;
endif:</code></pre><div class="t-redactor__text">Существование файлов мы проверили, теперь приступим к работе с файлами.</div><h4  class="t-redactor__h4">Открытие и закрытие файла</h4><div class="t-redactor__text">Для того чтобы открыть файл в среде PHP используется функция fopen(). Обязательными параметрами этой функции является имя файла и режим файла.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$fp = fopen(&#039;counter.txt&#039;, &#039;r+&#039;); // r+ - режим файла</code></pre><div class="t-redactor__text">Согласно документации PHP выделяют следующие виды режимов файлов:<br /><br /><ul><li><strong>r</strong> – открытие файла только для чтения.</li><li><strong>r+</strong> — открытие файла одновременно на чтение и запись.</li><li><strong>w</strong> – создание нового пустого файла. Если на момент вызова уже существует такой файл, то он уничтожается.</li><li><strong>w+</strong> — аналогичен r+, только если на момент вызова фай такой существует, его содержимое удаляется.</li><li><strong>a</strong> – открывает существующий файл в режиме записи, при этом указатель сдвигается на конец файла.</li><li><strong>a+</strong> — открывает файл в режиме чтения и записи при этом указатель сдвигается на конец файла. Содержимое файла не удаляется.</li></ul><br />Функция <strong>fclose()</strong> закрывает файл с заданным манипулятором. При успешном закрытии возвращается TRUE, при неудаче — FALSE. Синтаксис функции:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int fclose(int манипулятор)</code></pre><div class="t-redactor__text">Функция fclose() успешно закрывает только те файлы, которые были ранее открыты функциями fopen() или fsockopen(). Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$file = &quot;user.txt&quot;;

if(file_exists($file)) :
  $fh = fopen($file, &quot;r&quot;);
  // Выполнить операции с файлом

  fclose($fh);
else :
  print &quot;Файл $file не существует!&quot;;
endif;</code></pre><h4  class="t-redactor__h4">Манипуляции с данными файла</h4><div class="t-redactor__text">Записывать данные в файл можно при помощи функции <strong>fwrite()</strong>. Функция принимает 2 обязательных параметра и 1 необязательный. В качестве обязательных параметров выступает дескриптор файла и режим файла. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$fp = fopen(&quot;counter.txt&quot;, &quot;a&quot;); // Открываем файл в режиме записи 
$mytext = &quot;Это строку необходимо нам записать\r\n&quot;; // Исходная строка
$test = fwrite($fp, $mytext); // Запись в файл
if ($test) echo &#039;Данные в файл успешно занесены.&#039;;
else echo &#039;Ошибка при записи в файл.&#039;;
fclose($fp); //Закрытие файла</code></pre><div class="t-redactor__text">Функция <strong>fread()</strong> читает из файла, заданного файловым манипулятором, заданное количество байт. Синтаксис функции</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int fread(int манипулятор, int длина)</code></pre><div class="t-redactor__text">Манипулятор должен ссылаться на открытый файл, доступный для чтения. Чтение прекращается после прочтения заданного количества байт или при достижении конца файла. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$fp = fopen(&quot;counter.txt&quot;, &quot;r&quot;); // Открываем файл в режиме чтения
if ($fp) echo fread($fp);
elseecho &quot;Ошибка при открытии файла&quot;;</code></pre><h4  class="t-redactor__h4">filesize()</h4><div class="t-redactor__text">Функция filesize() возвращает размер (в байтах) файла с заданным именем или FALSE в случае ошибки. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$fs = filesize(&quot;pastry.txt&quot;); print &quot;Pastry.txt состовляет $fs байт.&quot;;</code></pre><h4  class="t-redactor__h4">Чтение файла в массив</h4><div class="t-redactor__text">Функция <strong>file()</strong> загружает все содержимое файла в индексируемый массив. Каждый элемент массива соответствует одной строке файла. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$file_array = file( &quot;pastry.txt&quot; );

while( list( $line_num. $line ) = eacht($file_array ) ):
  print &quot;&lt;b&gt;Line $line_num:&lt;/b&gt; &quot;, htmlspecialchars($line ), &quot;&lt;br&gt;\n&quot;
endwhile;</code></pre><h4  class="t-redactor__h4">Запуск внешних программ</h4><div class="t-redactor__text">Сценарии РНР также могут выполнять программы, находящиеся на сервере. Такая возможность особенно часто используется при администрировании системы через web-браузер, а также для более удобного получения сводной информации о системе.</div><div class="t-redactor__text">Функция <strong>ехес()</strong> запускает заданную программу и возвращает последнюю строку ее выходных данных. Синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">string exec(string команда [, string массив [, int возврат]])</code></pre><h4  class="t-redactor__h4">Копирование и переименование файлов</h4><div class="t-redactor__text">К числу других полезных системных функций, которые могут выполняться в сценариях РНР, относятся копирование и переименование файлов на сервере. Эти операции выполняются двумя функциями: сору() и rename().</div><h4  class="t-redactor__h4">Функция сору().</h4><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int copy(string источник, string приемник)</code></pre><div class="t-redactor__text">Функция <strong>сору()</strong> пытается скопировать файл источник в файл приемник; в случае успеха возвращается TRUE, а при неудаче — FALSE. Если файл приемник не существует, функция сору() создает его. Следующий пример показывает, как создать резервную копию файла при помощи функции сору():</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$data_file = &quot;datal.txt&quot;;
copy($data_file. $data_file&#039;.bak&#039;) or die(&quot;Could not copy $data_file&quot;);</code></pre><h4  class="t-redactor__h4">rename()</h4><div class="t-redactor__text">Функция <strong>rename()</strong> переименовывает файл. В случае успеха возвращается TRUE, a при неудаче — FALSE. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$data_file = &quot;datal.txt&quot;;
rename($data file, $datafile&#039;.old&#039;) or die(&quot;Невозможно переименовать $data файл&quot;);</code></pre><h4  class="t-redactor__h4">Удаление файлов</h4><div class="t-redactor__text">Функция <strong>unlink()</strong> удаляет файл с заданным именем. Синтаксис:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int unlink(string файл)</code></pre><div class="t-redactor__text">На этом наш урок закончен. Я постарался подробно в примерах объяснить как работать с файлами в php. Удачи!!.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>PHP. Динамическое создание страниц</title>
			<link>https://www.easyitway.com/tpost/d4c60od3l1-php-dinamicheskoe-sozdanie-stranits</link>
			<amplink>https://www.easyitway.com/tpost/d4c60od3l1-php-dinamicheskoe-sozdanie-stranits?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:39:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Статические сайты состоят из статических web-страниц. Это означает, что независимо от действий пользователя страница всегда выглядит одинаково.</description>
			<turbo:content>
<![CDATA[<header><h1>PHP. Динамическое создание страниц</h1></header><div class="t-redactor__text">В сети Интернет существует огромное количество web-сайтов. Все эти сайты можно разделить на два типа: статические и динамические.</div><div class="t-redactor__text">Сегодня мы поговорим о создании динамических страниц, но сперва я хотел бы Вам рассказать что такое статический и динамический сайт (страница).</div><h4  class="t-redactor__h4">Статические сайты</h4><div class="t-redactor__text">Статические сайты состоят из статических web-страниц. Это означает, что независимо от действий пользователя страница всегда выглядит одинаково.</div><div class="t-redactor__text">Такие страницы хранятся на сервере как документы HTML. Верстаются статические страницы вручную. Если нужно изменить содержимое страницы, то приходится редактировать код HTML у каждой страницы.</div><div class="t-redactor__text"><strong>Достоинства:</strong></div><div class="t-redactor__text"><ul><li>Простота и дешевизна создания, нетребовательность к аппаратным ресурсам;</li><li>Минимальная нагрузка на web-сервер.</li></ul></div><div class="t-redactor__text"><strong>Недостатки:</strong></div><div class="t-redactor__text"><ul><li>Большие временные затраты на редактирование контента;</li><li>Нецелесообразность использования в крупных проектах.</li></ul></div><h4  class="t-redactor__h4">Динамические сайты</h4><div class="t-redactor__text">Динамические сайты состоят из динамических web-страниц, которые могут реагировать на действия пользователя и изменяться. Такие страницы формируются web-сервером из нескольких файлов (шаблонов). Вся информация хранится в базе данных.</div><div class="t-redactor__text">Когда пользователь запрашивает страницу, соответствующая информация извлекается из базы, вставляется в шаблон, образуя web-страницу, и пересылается web-сервером в пользовательский браузер.</div><div class="t-redactor__text">Таким образом, при обновлении содержимого сайта, необходимо просто добавить текст для новой страницы, который затем вставляется в базу данных с помощью определенного механизма.</div><div class="t-redactor__text"><strong>Достоинства:</strong></div><div class="t-redactor__text"><ul><li>Управление контентом производится через специальные формы, где можно легко добавлять, редактировать и удалять информацию;</li><li>Максимальная оперативность при добавлении нового контента на сайт;</li><li>При добавлении или редактировании контента не требуется специальных знаний из области web-мастеринга (HTML, CSS);</li><li>Возможность создания крупных многофункциональных проектов;</li><li>Большие возможности для раскрутки.</li></ul></div><div class="t-redactor__text"><strong>Недостатки:</strong></div><div class="t-redactor__text"><ul><li>Высокая стоимость создания и обслуживания;</li><li>Нужно обладать соответствующими знаниями для поддержания работоспособности сайта.</li></ul></div><div class="t-redactor__text">Лучше всего делать сайт с помощью динамических страниц т.к. это лучший и удобный выбор. Ну а теперь поговорим о создании динамических страниц.</div><h4  class="t-redactor__h4">Простые ссылки</h4><div class="t-redactor__text">Прежде чем изучать язык программирования PHP вы уже должны знать HTML и конечно же создание гиперссылок. Хотелось бы Вам напомнить:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;а href = &quot;example.php&quot;&gt;Пример гиперссылки.&lt;/a&gt;</code></pre><div class="t-redactor__text">Если щелкнуть по ссылке, в браузере будет загружена страница с именем example.php. Теперь посмотрим как, можно воспользоваться переменной для построения динамической ссылки:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$link = &quot;example.php&quot;;

print &quot;&lt;а href = \&quot;$link\&quot;&gt;Пример динамической гиперссылки.&lt;/a&gt; &lt;br&gt;\n&quot;</code></pre><div class="t-redactor__text">Вот так просто создается динамическая гиперссылка с помощью языка php.</div><h4  class="t-redactor__h4">Процесс создания динамической страницы</h4><div class="t-redactor__text">Процесс создания динамической страницы состоит из нескольких этапов:</div><div class="t-redactor__text">Сверстаем каркас страницы. Назовем страницу <strong>index.php</strong> — она будет состоять из частей: шапка (header), подвал (footer), левое меню (leftmenu).</div><div class="t-redactor__text">В данном примере рассмотрим верстку страниц на основе таблиц, но можно использовать и блочную версту.</div><div class="t-redactor__text">1. Формируем файл <strong>header.php.</strong></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Динамическая страница на PHP.&lt;/title&gt;
&lt;meta name=&quot;description&quot; content=&quot;краткое описание страницы&quot;&gt;
&lt;meta name=&quot;keywords&quot; content=&quot;Динамическая страница страница главная&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;table width=&quot;650px&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; align=&quot;center&quot; bordercolor=&quot;313233&quot; bgcolor=&quot;#cbe3ec&quot;&gt;
&lt;tr&gt;
&lt;td&gt;&lt;p align=&quot;center&quot;&gt;Шапка сайта&lt;/p&gt;&lt;/br&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</code></pre><div class="t-redactor__text">2. Формируем файл <strong>leftmenu.php.</strong></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;td colspan=&quot;2&quot; style=&quot;font-size: 14px; font-family: Arial&quot; bgcolor=&quot;#ecf8fc&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Ссылка 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Ссылка 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Ссылка 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Ссылка 4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#&quot;&gt;Ссылка 5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;</code></pre><div class="t-redactor__text">3. Формируем файл <strong>footer.php.</strong></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;table width=&quot;650px&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; align=&quot;center&quot; bordercolor=&quot;313233&quot; bgcolor=&quot;#cbe3ec&quot;&gt;
&lt;tr&gt;
&lt;td&gt;&lt;p align=&quot;center&quot;&gt;Подвал сайта&lt;/p&gt;&lt;/br&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><div class="t-redactor__text">Создайте папку под названием <strong>template</strong>, в которую скопируйте полученные файлы. При необходимости редактирования шапки, левого меню или подвала сайта, Вы будете знать, что шаблоны этих частей сайта находятся в данной папке.<br /><br />Подключим полученные файлы (шаблоны) к сайту с помощью инструкции include на примере страницы index.php.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;!-- начало хедера (header.php) --&gt;
&lt;?php include (&quot;template/header.php&quot;);?&gt;
&lt;!-- конец хедера --&gt;

&lt;table width=&quot;650px&quot; height=&quot;150px&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; align=&quot;center&quot; bordercolor=&quot;313233&quot;&gt;
&lt;tr&gt;

&lt;!-- Начало блока левого меню (leftmenu.php) --&gt;
&lt;?php include (&quot;template/leftmenu.php&quot;);?&gt;
&lt;!-- Конец блока левого меню --&gt;

&lt;!-- Начало основного блока --&gt;
&lt;td&gt;&lt;h2 align=&quot;center&quot; style=&quot;color:#0595ca;&quot;&gt;Привет!&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;Это первая динамическая страница на PHP.&lt;/p&gt;
&lt;/td&gt;
&lt;!-- Конец основного блока --&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;!-- начало футера (footer.php) --&gt;
&lt;?php include (&quot;template/footer.php&quot;);?&gt;
&lt;!-- Конец футера --&gt;</code></pre><div class="t-redactor__text">Вот так страница index.php — это динамическая страница, она будет формироваться из нескольких файлов (шаблонов).<br /><br />Таких шаблонов можно сделать любое количество. При необходимости изменения какой-либо части сайта достаточно найти нужный файл шаблона и отредактировать его.<br /><br />На этом создание динамических страниц окончено. Думаю вы поняли смысл и практичность динамических сайтов и на основе примера сможете создать большой проект. Да и не забывайте комментировать Ваш код — это очень важно друзья! Удачи Вам!<br /><br /><strong><em>P.S. Небольшие изменения от 06.07.2019 года:</em></strong><br /><br />Так как программирование развивается всегда поэтому и программист должен развиваться со скоростью света.<br /><br />Табличная верстка показанная выше в наше время мало применяется на практике и необходима только для изучения начинающим программистам.<br /><br />Если вы хотите создавать новые и эффективные web-сайты, тогда рекомендуем использовать не табличную верстку, а блочную верстку. Рассмотрим подробнее.<br /><br />Таблицы придуманы именно для вывода табличных данных, а не для разметки элементов страницы. То, что расположено в таблице:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;table&gt;
  &lt;tr&gt;
    &lt;td&gt;текст&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;</code></pre><div class="t-redactor__text">может быть представлено в виде блочной (дивовой) верстки:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;div&gt;текст&lt;/div&gt;</code></pre><div class="t-redactor__text">это занимает гораздо меньший объем дискового пространства.<br /><br />Рассмотрим преимущества блочной верстки по сравнению с табличной:<br /><br /><ol><li>Существенное уменьшение размера страницы, как правило в 2–3 раза, что значительно уменьшает время загрузки web-сайта. При этом незначительно вырастет размер <a href="https://it-black.ru/category/rubriki/samouchitel-po-css/" target="_blank" rel="noreferrer noopener">CSS</a>-файла, но, благодаря тому, что он единожды кэшируется браузером юзера и при обращении к другим страницам считывается уже с его компьютера, в результате сайт грузится гораздо быстрее, чем табличный.</li><li>Значительно удобнее менять оформление страниц сайта, вынесенное в CSS-файл. При этом практически отсутствует необходимость редактирования <a href="https://it-black.ru/category/rubriki/html/" target="_blank" rel="noreferrer noopener">HTML</a>-кода.</li><li>Благодаря возможностям блочной верстки можно добиться того, что в коде сначала пойдет основной контент страницы, а только потом шапка, левая и/или правая колонки. При этом внешний вид страницы совершенно не изменится.</li><li>Визуально приятна прозрачность кода блочной страницы – нет никаких нагромождений тегов, все очень красиво и компактно.</li></ol></div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Формы в PHP</title>
			<link>https://www.easyitway.com/tpost/vgoj6t0fx1-formi-v-php</link>
			<amplink>https://www.easyitway.com/tpost/vgoj6t0fx1-formi-v-php?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:42:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>HTML-формы позволяют передавать введенные пользователем данные на сервер, где их можно дополнительно обработать. </description>
			<turbo:content>
<![CDATA[<header><h1>Формы в PHP</h1></header><div class="t-redactor__text">HTML-формы позволяют передавать введенные пользователем данные на сервер, где их можно дополнительно обработать. Обслуживание форм выполняется в два этапа. Сначала форма должна быть представлена пользователю, который заполнит ее своими данными и затем отправит на сервер.</div><div class="t-redactor__text">У каждой формы есть целевая веб-страница, которая должна быть загружена для обработки данных, отправленных пользователем. PHP-код просто проверяет наличие данных в форме, чтобы определить, вызывать ли ему вновь сценарий для создания формы или начать обработку полученных данных. Я расскажу все известные формы применяемые в php для создания сайтов.</div><h4  class="t-redactor__h4">Создание формы</h4><div class="t-redactor__text">Одна страница может содержать несколько форм, поэтому необходимы средства, которые позволяли бы отличить одну форму от другой. Более того, мы должны как-то сообщить форме, куда следует перейти, когда пользователь выполняет действие с формой. Обе задачи решаются заключением форм в следующие теги HTML:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;form action = действие method = &quot;метод&quot; - элементы формы -&lt;/form&gt;</code></pre><div class="t-redactor__text">В тегах форм указываются два важных элемента: действие и метод. Действие указывает, какой сценарий должен обрабатывать форму, а метод определяет способ передачи данных этому сценарию. Существует два метода:</div><h4  class="t-redactor__h4">Метод GET</h4><div class="t-redactor__text">Этот метод предусматривает передачу параметров с предыдущей страницы на следующую в составе строки запроса, которая представлена в формате универсального идентификатора ресурса URL.</div><div class="t-redactor__text">При использовании метода GET для обработки формы к URL, обозначенному с помощью атрибута action формы, после разделителя добавляется в виде вопросительного знака указанное имя (имена) и значение (значения) переменной, после чего вся эта строка передается обрабатывающему веб-серверу.</div><h4  class="t-redactor__h4">Метод POST</h4><div class="t-redactor__text">Предпочтительным методом отправки данных формы является POST. Набор данных формы включается в тело формы при перенаправлении формы к интерпретатору PHP.</div><div class="t-redactor__text">Метод POST более безопасен, чем GET. Посетитель может столь же успешно просматривать переменные и данные, отправляемые с помощью метода POST, как и с помощью метода GET.</div><div class="t-redactor__text">Единственное различие состоит в том, что в первом случае передаваемые данные не обнаруживаются в адресной строке. Но это не означает, что они скрыты. Данные, отправленные с помощью метода POST, могут просматриваться и модифицироваться пользователем веб-сайта.</div><div class="t-redactor__text">Данные передаваемой формы становятся в большей или меньшей степени безопасными, только если запрос защищен с использованием SSL, TLS или какого-то другого способа шифрования. Но к конечному пользователю или посетителю данные все равно поступают в открытом виде, поэтому для него так или иначе остается возможность просматривать и изменять данные.</div><div class="t-redactor__text">C помощью протокола SSL осуществляется просто шифрование данных, передаваемых по сети, что не позволяет рассматривать данные в открытом виде на этапе их прохождения от отправителя к получателю.</div><h4  class="t-redactor__h4">Флажок (checkbox)</h4><div class="t-redactor__text">Флажки checkbox предлагают пользователю ряд вариантов, и разрешает выбор нескольких из них. Группа флажков состоит из элементов &lt;input&gt;, имеющих одинаковые атрибуты name и type (checkbox).</div><div class="t-redactor__text">Если элемент выбран, то сценарию поступит строка имя=значение, в противном случае в обработчик формы не передаст ничего, т.е. не выбранные флажки вообще никак не проявляют себя в переданном наборе данных.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;input name=&quot;Имя переключателя&quot; type=&quot;Тип&quot; value=&quot;Значение&quot;&gt;</code></pre><div class="t-redactor__text">Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;input name=&quot;mycolor&quot; type=&quot;checkbox&quot; value=&quot;red&quot; checked&gt; Красный(выбран по умолчанию) 
&lt;input name=&quot;mycolor&quot; type=&quot;checkbox&quot; value=&quot;blue&quot;&gt; Синий 
&lt;input name=&quot;mycolor&quot; type=&quot;checkbox&quot; value=&quot;black&quot;&gt; Черный 
&lt;input name=&quot;mycolor&quot; type=&quot;checkbox&quot; value=&quot;white&quot;&gt; Белый</code></pre><h4  class="t-redactor__h4">Переключатель (radio)</h4><div class="t-redactor__text">Переключатели radio предлагают пользователю ряд вариантов, но разрешает выбрать только один из них. Переключатель (radio) имеет атрибуты name, type и value. Атрибут name задает имя переключателя, type задает тип radio, а атрибут value задает значение.</div><div class="t-redactor__text">Если пользователь выберет переключатель, то сценарию будет передана строка имя=значение. При необходимости можно указать параметр checked, который указывает на то, что переключатель будет иметь фокус (т.е. будет отмечен по умолчанию) при загрузке страницы. Переключатели также можно объединять в группы, для этого они должны иметь одно и тоже имя.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;input name=&quot;Имя переключателя&quot; type=&quot;Тип&quot; value=&quot;Значение&quot;&gt;</code></pre><div class="t-redactor__text">Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> &lt;input name=&quot;mycolor&quot; type=&quot;radio&quot; value=&quot;white&quot;&gt; Белый 
  &lt;input name=&quot;mycolor &quot; type=&quot;radio&quot; value=&quot;green&quot; checked&gt; Зеленый (выбран по умолчанию) 
  &lt;input name=&quot;mycolor &quot; type=&quot;radio&quot; value=&quot;blue&quot;&gt; Синий 
  &lt;input name=&quot;mycolor &quot; type=&quot;radio&quot; value=&quot;red&quot;&gt; Красный 
  &lt;input name=&quot;mycolor &quot; type=&quot;radio&quot; value=&quot;black&quot;&gt; Черный</code></pre><h4  class="t-redactor__h4">Текстовое поле (text)</h4><div class="t-redactor__text">Текстовое поле позволяет пользователям вводить различную информацию. При создании обычного текстового поля размером size и максимальной допустимой длины maxlength символов, атрибут type принимает значение text.</div><div class="t-redactor__text">Если указан параметр value, то поле будет содержать отображать value-текст. При создании поля нельзя забывать указывать имя поля, т.к. этот атрибут является обязательным. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;input type=&quot;text&quot; name=&quot;txtName&quot; size=&quot;10&quot; maxlength=&quot;5&quot; value=&quot;Текст по умолчанию&quot;&gt;</code></pre><h4  class="t-redactor__h4">Поле для ввода пароля (password)</h4><div class="t-redactor__text">Полностью аналогичен текстовому полю, за исключением того что символы, набираемые пользователем, не будут отображаться на экране. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;input type=&quot;password&quot; name=&quot;txtName&quot; size=&quot;10&quot; maxlength=&quot;5&quot;&gt;</code></pre><h4  class="t-redactor__h4">Многострочное поле ввода текста (textarea)</h4><div class="t-redactor__text">Многострочное поле ввода текста позволяет отправлять не одну строку, а сразу несколько. По умолчанию тег создает пустое поле шириной в 20 символов и состоящее из двух строк. Многострочное поле ввода текста начинается с парных тегов &lt;textarea&gt;&lt;/textarea&gt;. Тэг name задает имя многострочного поля.</div><div class="t-redactor__text">Также можно указать ширину поля(cols) и число строк(rows). При необходимости можно указать атрибут readonly, который запрещает редактировать, удалять и изменять текст, т.е. текст будет предназначен только для чтения.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;textarea name=&quot;Имя поля&quot; cols=&quot;Ширина поля &quot; rows=&quot;Число строк&quot;&gt;Текст&lt;/textarea&gt;</code></pre><h4  class="t-redactor__h4">Скрытое текстовое поле</h4><div class="t-redactor__text">Позволяет передавать сценарию какую то служебную информацию, не отображая её на странице. Скрытое поле начинается с тега &lt;input&gt;, атрибуты которого являются name, type и value. Атрибут name задает имя поля, type определяет тип поля, а атрибут value задает значение поля. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;input name=&quot;email&quot; type=&quot;hidden&quot; value=&quot;Walls.234@mail.ru&quot;&gt;</code></pre><h4  class="t-redactor__h4">Кнопка отправки формы (submit)</h4><div class="t-redactor__text">Служит для отправки формы сценарию. При создании кнопки для отправки формы необходимо указать 2 атрибута: type=»submit» и value=»Текст кнопки». Атрибут name необходим если кнопка не одна, а несколько и все они созданы для разных операций, например кнопки «Сохранить», «Удалить», «Редактировать» и т.д. После нажатия на кнопку сценарию передается строка имя=текст кнопки.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;input type=&quot;Тип&quot; name=&quot;Имя кнопки&quot; value=&quot;Текст кнопки&quot;&gt;</code></pre><h4  class="t-redactor__h4">Кнопка для загрузки файлов (browse)</h4><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Кнопка служит для реализации загрузки файлов на сервер. 
Объект browse начитается с парных тегов &amp;lt;form&amp;gt;&amp;lt;/form&amp;gt;. 
Начинающий тэг &amp;lt;form&amp;gt; содержит необходимый атрибут encrypt. 
Атрибут encrypt принимает значение multipart/form-data, который извещает сервер о том, 
что вместе с обычной информацией посылается и файл. При создании текстового поля также необходимо указать тип файла – «file». Пример:</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;form enctype=&quot;multipart/form-data&quot; action=&quot;file.php&quot; method=&quot;post&quot;&gt; 
Загрузить: &lt;input name=&quot;my_file&quot; type=&quot;file&quot;&gt; 
  &lt;input type=&quot;submit&quot; value=&quot;Отправить&quot;&gt; 
&lt;/form&gt;</code></pre><h4  class="t-redactor__h4">Рамка (fieldset)</h4><div class="t-redactor__text">Объект fieldset позволяет нарисовать рамку вокруг объектов. Имеет закрывающий тэг &lt;/fieldset&gt;. Заголовок указывается в тэгах &lt;legend&gt;&lt;/legend&gt;. Основное назначение объекта – задание различных стилей оформления. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;fieldset&gt; 
&lt;legend&gt;Наш новый урок по языку php.&lt;/legend&gt; 
Текст, который будет помещен внутри рамки.
&lt;/fieldset&gt;</code></pre><h4  class="t-redactor__h4">Обработка формы</h4><div class="t-redactor__text">Для начала создадим форму на HTML:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;Форма&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;form name = &#039;myform&#039; action = &#039;req.php&#039; method = &#039;post&#039;&gt;
    Ваш логин: &lt;input type = &#039;text&#039; name = &#039;login&#039; /&gt;
    &lt;br /&gt;
    Ваш пароль: &lt;input type = &#039;password&#039; name = &#039;pass&#039; /&gt;
    &lt;br /&gt;
    &lt;input type = &#039;submit&#039; value = &#039;Войти&#039; /&gt;
  &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><div class="t-redactor__text">Это пример классической формы авторизации пользователя. Мы уже рассмотрели два метода это GET и POST. Соответственно, в PHP существуют два массива: $_GET и $_POST, которые содержат данные, полученные каждым из этих методов. Также есть массив $_REQUEST, который содержит данные $_GET и $_POST одновременно. Теперь обработаем данные. Реализуем простой скрипт (в файле «req.php»):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
  $login = $_POST[&#039;login&#039;];
  $pass = $_POST[&#039;pass&#039;];
  if (($login == &quot;Admin&quot;) &amp;&amp; ($pass == &quot;AdminPass&quot;))
    echo &quot;Привет, Admin!&quot;;
  else echo &quot;Доступ закрыт&quot;;
?&gt;</code></pre><div class="t-redactor__text">В данном скрипте мы получаем данные, полученные из формы методом POST (из массива $_POST). Дальше проверяем логин и пароль и выводим: «Привет, Admin!» или «Доступ закрыт». Аналогично, считываются и обрабатываются абсолютно любые данные из форм. Нужно только знать имя переменной и дальше использовать массивы $_POST, $_GET и $_REQUEST.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Cookie и отслеживание сеанса</title>
			<link>https://www.easyitway.com/tpost/aoej5sznu1-cookie-i-otslezhivanie-seansa</link>
			<amplink>https://www.easyitway.com/tpost/aoej5sznu1-cookie-i-otslezhivanie-seansa?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:47:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Cookie-файл — это небольшой фрагмент информации, который хранится на клиентском компьютере (либо в памяти приложения браузера, либо в виде небольшого файла, записанного на жесткий диск компьютера пользователя).</description>
			<turbo:content>
<![CDATA[<header><h1>Cookie и отслеживание сеанса</h1></header><h4  class="t-redactor__h4">Начнем с cookie</h4><div class="t-redactor__text">Cookie-файл — это небольшой фрагмент информации, который хранится на клиентском компьютере (либо в памяти приложения браузера, либо в виде небольшого файла, записанного на жесткий диск компьютера пользователя). Cookie-файл содержит данные в виде пар «имя-значение».</div><div class="t-redactor__text">Под термином «установка cookie-файла» подразумевается связывание имени со значением и сохранение данных, представляющих пару «имя-значение» на клиентском компьютере. Под термином «получение, или чтение cookie-файла» подразумевается использование имени для выборки значения.</div><div class="t-redactor__text">Вследствие того, что cookie обычно связываются с конкретным пользователем, в них часто сохраняется уникальный идентификатор пользователя (UIN). Этот идентификатор заносится в базу данных на сервере и используется в качестве ключа для выборки из базы всей информации, связанной с этим идентификатором.</div><h4  class="t-redactor__h4">Компоненты cookie</h4><div class="t-redactor__text">В cookie хранятся компоненты, при помощи которых разработчик может ограничивать использование cookie с позиций домена, пути, срока действия и безопасности. Ниже приведены описания различных компонентов cookie:</div><div class="t-redactor__text"><ul><li><strong>Имя</strong> — имя cookie является обязательным параметром, по которому программа ссылается на cookie. Можно провести аналогию между именем cookie и именем переменной.</li><li><strong>Значение</strong> — фрагмент данных, связанный с именем cookie. В этих данных может храниться любая информация — идентификатор пользователя, цвет фона, текущая дата.</li><li><strong>Срок действия</strong> — дата, определяющая продолжительность существования cookie. Как только текущая дата и время превосходят заданный срок действия, cookie становится недействительным и перестает использоваться. В соответствии со спецификацией cookie устанавливать срок действия для cookie необязательно.</li><li><strong>Домен</strong> — домен, который создал cookie и может читать его значение. Если домен состоит из нескольких серверов и доступ к cookie должен быть разрешен всем серверам, то имя домена можно задать в форме .phprecipes.com. В этом случае все потенциальные домены третьего уровня, принадлежащие сайту PHPrecipes (например, wap.phprecipes.com или news.phprecipes.com), смогут работать с cookie. По соображениям безопасности cookie могут устанавливаться только для домена сервера, пытающегося создать cookie.</li><li><strong>Путь</strong> — URL, с которого предоставляется доступ к cookie. Любые попытки получения доступа к cookie за пределами этого пути пресекаются. Данный компонент необязателен; если он не задан, по умолчанию используется путь к документу, создавшему cookie.</li><li><strong>Безопасность</strong> — параметр, показывающий, допускается ли чтение cookie в небезопасной среде. По умолчанию используется значение FALSE.</li></ul></div><h4  class="t-redactor__h4">Cookie и РНР</h4><div class="t-redactor__text">Чтобы задать значение cookie в РНР нужно просто использовать стандартную функция setcookie( ). Функция сохраняет cookie на компьютере пользователя. Синтаксис функции setcookie( ):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int setcookie (string имя [string значение [, int дата [, string путь [, string домен [, int безопасность]]]]])</code></pre><div class="t-redactor__text">Ниже приведены параметры функции. Все эти параметры, кроме первого, являются необязательными:</div><div class="t-redactor__text"><ul><li><strong>name</strong> — имя cookie-файла (аналогичное имени переменной).</li><li><strong>value</strong> — значение, которое должно быть сохранено в cookie-файле (аналогично значению, которое должно было быть присвоено переменной). Если этот параметр не задан, то cookie-файл, указанный в качестве первого параметра, удаляется.</li><li><strong>expire</strong> — значение, определяющее, когда должен истечь срок существования данного cookie-файла. Значение 0 (применяемое по умолчанию) указывает, что cookie-файл должен существовать до закрытия программы браузера. Любое другое целое число интерпретируется как абсолютное значение времени в секундах, когда cookie-файл должен стать недействительным.</li><li><strong>path</strong> — в случае, предусматриваемом по умолчанию, рассматриваемый cookie-файл может считываться (и устанавливаться) на любой странице, при формировании которой сценарий обращается к указанному подкаталогу корневого каталога документов веб. Возможность задать путь к подкаталогу (например, «/forum/») позволяет подчеркнуть различия между cookie-файлами, имеющими одинаковое имя, но устанавливаемыми на других сайтах или в других подобластях веб-сервера (в данном примере предполагается, что cookie-файл будет действительным только в области forum). В обозначении пути должна обязательно присутствовать заключительная косая черта.</li><li><strong>httponly</strong> — Cookie-файлы, заданные с этим флагом, передаются только с помощью запросов протокола HTTP. Значением по умолчанию является FALSE.</li><li><strong>domain</strong> — в случае, предусматриваемом по умолчанию, проверка домена, доступа к которому требует клиент, не производится. Если же данный параметр не пуст, то имя домена должно совпадать с ним.</li><li><strong>secure</strong> — значением по умолчанию является 0 (false). Если этот параметр равен 1, или true, то cookie-файл будет передаваться только через соединение с защищенным сокетом (иначе говоря, по протоколу SSL или HTTPS).</li></ul></div><h4  class="t-redactor__h4">Удаление cookie-файлов</h4><div class="t-redactor__text">Чтобы удалить cookie-файлы нужно вызвать функцию setcookie() точно с такими же параметрами, как и при установке cookie-файла, за исключением самого значения, которое должно быть задано в виде пустой строки.</div><div class="t-redactor__text">Такой вызов не приводит к тому, что устанавливается cookie-файл со значением, равным пустой строке, а фактически влечет за собой удаление cookie-файла. Следует учитывать, что, если при установке cookie-файла использовались параметры с указанием пути или домена, эти параметры необходимо также применять для отмены установки cookie-файла.</div><h4  class="t-redactor__h4">Уникальные идентификаторы</h4><div class="t-redactor__text">В РНР предусмотрено простое средство для создания уникальных UIN — встроенная функция uniqid(). Это функция генерирует уникальный идентификатор из 13 символов, значение которого основано на текущем времени. Синтаксис функции uniqid( ):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int uniqid(string префикс [б boolean дополнение])</code></pre><div class="t-redactor__text">В параметре префикс передается строка, с которой должен начинаться UIN. Поскольку этот параметр является обязательным, при вызове необходимо передать хотя бы пустую строку.<br /><br />Если необязательный параметр дополнение равен TRUE, функция uniqid( ) генерирует UIN из 23 символов. Чтобы быстро создать уникальный идентификатор, достаточно при вызове uniqid( ) передать один параметр — пустую строку:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$uniq_id = uniqid(&quot; &quot;);

// Генерируется строка из 13 символов - например. &#039;39b3209ce8ef2&#039;

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

$uniq_id = uniqid(&quot;php&quot;, FALSE):

// Генерируется строка из 16 символов - например. &#039;php39b3209ce8ef2&#039;</code></pre><h4  class="t-redactor__h4">Отслеживание сеанса</h4><div class="t-redactor__text">Сеансом (session) называется период времени, который начинается с момента прихода пользователя на сайт и завершается, когда пользователь покидает сайт.</div><div class="t-redactor__text">В течение сеанса часто возникает необходимость в сохранении различных переменных, которые бы «сопровождали» пользователя при перемещениях на сайте, чтобы вам не приходилось вручную кодировать многочисленные скрытые поля или переменные, присоединяемые к URL.</div><div class="t-redactor__text">Чтобы начать сеанс, нужно добавить в начало PHP-сценария вызов функции <strong>session_start()</strong> – лишь после этого появится возможность сохранять и получать данные, принадлежащие сеансу.</div><div class="t-redactor__text">Функцию <strong>session_start()</strong> следует вызвать до вызова функции <strong>header()</strong> и вообще до того, как браузеру клиента будет отправлена хоть какая-нибудь информация, в противном случае сеанс может работать некорректно.</div><div class="t-redactor__text">Обращение к переменным сеанса заключается в использовании суперглобальной переменной $_SESSION с подстановкой имени требуемой переменной в квадратных скобках.</div><div class="t-redactor__text">В примере ниже показан простой счетчик просмотра страницы за один сеанс (для простоты этот пример основан на обновлении одной и той же страницы несколько раз, однако, ни что не ограничивает в применении сеансов на нескольких страницах, но не забывайте добавлять на каждую из них вызов метода session_start()):</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">if (!isset($_SESSION[&#039;count_view&#039;]))
{
	echo &#039;&lt;h1&gt;Вы в первый раз посещаете данную страницу.&lt;/h1&gt;&#039;;
	$_SESSION[&#039;count_view&#039;] = 1;
}
else
{
	++$_SESSION[&#039;count_view&#039;];
	echo &#039;&lt;h1&gt;Количество посещений вами этой страницы за 1 сеанс: &#039;
	    .$_SESSION[&#039;count_view&#039;].&#039;&lt;/h1&gt;&#039;;
}</code></pre><h4  class="t-redactor__h4">Завершение сеанса</h4><div class="t-redactor__text">Есть моменты, когда требуется преждевременно завершить сеанс. Например, если есть на странице кнопка или гиперссылка выхода из системы.</div><div class="t-redactor__text">Выход из системы фактически означает завершение сеанса работы с пользователем. Завершают сеанс с помощью функции <strong>session_destroy()</strong>. Сеанс предварительно должен быть открыт, чтобы было что завершать.</div><div class="t-redactor__text">Завершение сеанса не означает, что его переменные станут недоступными для текущего PHP-сценария.</div><div class="t-redactor__text">В примере ниже приведен простой сценарий, который закрывает сеанс, делая при этом его переменные недоступными для остальной части PHP-сценария:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">session_start();

// Выполнить какие-либо действия в рамках сеанса
$_SESSION[&#039;username&#039;] = &#039;Alex&#039;;

// Завершить сеанс работы с сайтом
session_destroy();

echo &quot;В этот момент мы все еще можем увидеть значение имени пользователя: &quot;
     .$_SESSION[&#039;username&#039;].&quot;&lt;br&gt;&quot;;

// Уничтожить значение в массиве $_SESSION
unset($_SESSION[&#039;username&#039;]);

if (empty($_SESSION[&#039;username&#039;])) 
{
    echo &quot;Теперь переменная \$_SESSION[&#039;username&#039;] является пустой&quot;;
}</code></pre><h4  class="t-redactor__h4">Сборка мусора</h4><div class="t-redactor__text">Сборка мусора (garbage collection) – это то, что должно произойти с содержимым сеанса на стороне сервера после завершения сеанса или по достижению предельного времени отсутствия активности.</div><div class="t-redactor__text">Если сервер не будет периодически удалять информацию о старых сеансах, она будет накапливаться до бесконечности, занимая дисковое пространство и мешая работе сервера. Сборка мусора производится автоматически, при выполнении этой операции удаляются все данные устаревших сеансов.</div><div class="t-redactor__text">В PHP можно регулировать нагрузку на механизм сборки мусора, чтобы не удалять старые файлы сеансов при каждом обращении к сеансу.</div><div class="t-redactor__text">По умолчанию предельное время жизни файлов сеанса составляет 1440 с, или 24 мин. Для очень надежных сайтов это время не слишком велико, однако в PHP есть ряд параметров, управляющих удалением мусора.</div><div class="t-redactor__text">Файл сеанса может быть удален по истечении заданного интервала времени, но он может продолжать свое существование на диске сервера и дольше – все зависит от количества созданных сеансов. В файле инициализации PHP (php.ini) отношение к сборке мусора имеют следующие параметры:</div><div class="t-redactor__text"><ul><li>session.gc_maxlifetime (значение по умолчанию 1440);</li><li>session.gc_probability (значение по умолчанию 1);</li><li>session.gc_divisor (значение по умолчанию 100).</li></ul></div><div class="t-redactor__text">В этих переменных символы gc означают garbage collector (сборщик мусора). Если на сервере достаточно дискового пространства, можно увеличить предельное время ожидания, чтобы предотвратить завершение большинства или даже всех сеансов до закрытия браузера.</div><div class="t-redactor__text">Однако во многих случаях требуется ограничить предельную продолжительность сеанса – этого можно добиться, изменив срок хранения cookie.</div><div class="t-redactor__text">Чтобы определить, пора ли запускать сборщик мусора, интерпретатор PHP генерирует случайное число в диапазоне от 0 до 1. Если полученное число меньше, чем дробная часть отношения session.gc_probability / session.gc_divisor, запускается сборщик мусора.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Работа с FTP средствами PHP</title>
			<link>https://www.easyitway.com/tpost/l13j4pd731-rabota-s-ftp-sredstvami-php</link>
			<amplink>https://www.easyitway.com/tpost/l13j4pd731-rabota-s-ftp-sredstvami-php?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:49:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Протокол FTP (File Transfer Protocol — протокол передачи файлов) — один из старейших протоколов Интернета, предназначенный для передачи файлов между двумя хостами.</description>
			<turbo:content>
<![CDATA[<header><h1>Работа с FTP средствами PHP</h1></header><div class="t-redactor__text">Протокол FTP (File Transfer Protocol — протокол передачи файлов) — один из старейших протоколов Интернета, предназначенный для передачи файлов между двумя хостами.<br /><br />При работе с FTP выполняются следующие стандартные действия:<br /><br /><ul><li>соединение с удаленным FTP-сервером;</li><li>регистрация на FTP-сервере;</li><li>загрузка файлов с сервера или на сервер;</li><li>закрытие соединения.</li></ul><br />Работа с FTP начинается с открытия «потока» (stream) и делается это функцией «ftp_connect()»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ftp_connect(&quot;имя хоста&quot;,&quot;порт&quot;,&quot;timeout&quot;);</code></pre><div class="t-redactor__text">Вместо «имя хоста» пропиcываем имя сайта, к которому хотим подключиться. В параметре «порт» указываем ftp-порт удаленного сервера (обычно «21»), а в «timeout» — на какое время (в секундах) хотим открыть соединение. Результат выполнения функции нужно присвоить какой-либо переменной, в нашем примере это переменная $open:</div><h4  class="t-redactor__h4">Регистрация на FTP-сервере</h4><div class="t-redactor__text">Зарегистрироваться на сервере очень просто и поможет нам в этом функция «ftp_login».</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">bool ftp_login ( resource connect, string username, string password )</code></pre><div class="t-redactor__text">Функция принимает три параметра: дескриптор FTP-соединения, возвращаемый функцией ftp_connect, имя пользователя и пароль. Пример регистрации на FTP-сервере:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> $user = &quot;admin&quot;; 
 $password = &quot;password1&quot;; 
 $result = ftp_login( $connect, $user, $password ); </code></pre><h4  class="t-redactor__h4">Загрузка файлов с сервера</h4><div class="t-redactor__text">Загрузка файлов с сервера осуществляется при помощи функции «ftp_get»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">bool ftp_get ( resource connect, string local_file,
                 string remote_file, int mode );</code></pre><div class="t-redactor__text">Пример загрузки файлов с сервера:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> $local_file = &quot;/admin/local.txt&quot;; 
 $remote_file = &quot;remote.txt&quot;; 
 ftp_get( $connect, $local_file, $remote_file, FTP_BINARY ); </code></pre><h4  class="t-redactor__h4">Закрытие соединения</h4><div class="t-redactor__text">Закрыть FTP-соединение можно с помощью функции «ftp_close», принимающей в качестве единственного параметра дескриптор FTP-соединения:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> bool ftp_close ( resource connect );</code></pre><h4  class="t-redactor__h4">Удаление файлов с сервера</h4><div class="t-redactor__text">Удалить файл с FTP-сервера можно с помощью функции «ftp_delete»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">bool ftp_delete ( resource connect, string remote_file );</code></pre><div class="t-redactor__text"><ul><li><strong>connect</strong> — дескриптор соединения</li><li><strong>remote_file</strong> — имя удаляемого файла</li></ul></div><h4  class="t-redactor__h4">Создание каталога на сервере</h4><div class="t-redactor__text">Новый каталог можно создать, используя функцию «ftp_mkdir»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">string ftp_mkdir ( resource connect, string directory );</code></pre><div class="t-redactor__text">Эта функция возвращает имя созданного каталога или false в случае неудачи. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$dir = &quot;images&quot;; 
$created_dir = ftp_mkdir( $connect, $dir ); </code></pre><h4  class="t-redactor__h4">Удаление каталогов</h4><div class="t-redactor__text">Для удаления каталогов применяется функция «ftp_rmdir»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">bool ftp_rmdir ( resource connect, string directory );</code></pre><h4  class="t-redactor__h4">Переименование файлов</h4><div class="t-redactor__text">Переименовать файлы на FTP-сервере можно с помощью функции «ftp_rename»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">bool ftp_rename ( resource connect, string from, string to );</code></pre><h4  class="t-redactor__h4">Узнать размер файла</h4><div class="t-redactor__text">Функция «ftp_size()» возвращает размер файла, либо значение «-1» в случае неудачи:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">echo ftp_size($open, &quot;test.txt&quot;); </code></pre><div class="t-redactor__text">Я не стал описывать все функции поэтому советую посетить отличный сайт где можно посмотреть все функции для работы с FTP: <a href="http://php.net/manual/ru/book.ftp.php" target="_blank" rel="noreferrer noopener">php.net</a>. Также хочу посоветовать пользоваться проверенным бесплатным FTP клиентом называется он <a href="http://filezilla.ru/" target="_blank" rel="noreferrer noopener">Filezilla</a>. Я сам им пользуюсь, он очень прост и удобен в использовании.</div><h4  class="t-redactor__h4">Для чего нужен FTP-клиент?</h4><div class="t-redactor__text">FTP-клиент — программа для упрощения доступа к FTP серверу. В зависимости от назначения может либо предоставлять пользователю простой доступ к удалённому FTP-серверу в режиме текстовой консоли, беря на себя только работу по пересылке команд пользователя и файлов, либо отображать файлы на удалённом сервере как если бы они являлись частью файловой системы компьютера пользователя, либо и то и другое.</div><div class="t-redactor__text">В последних двух случаях FTP-клиент берёт на себя задачу интерпретации действий пользователя в команды протокола FTP, тем самым давая возможность использовать протокол передачи файлов без ознакомления со всеми его премудростями.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Проверка корректности данных</title>
			<link>https://www.easyitway.com/tpost/0sa0jdr5a1-proverka-korrektnosti-dannih</link>
			<amplink>https://www.easyitway.com/tpost/0sa0jdr5a1-proverka-korrektnosti-dannih?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:54:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Проверке корректности данных, вводимых пользователем необходимо уделять достаточно большое внимание, поскольку необработанные ошибки, возникающие при неправильном вводе данных, приводят к ошибкам в работе скрипта. </description>
			<turbo:content>
<![CDATA[<header><h1>Проверка корректности данных</h1></header><div class="t-redactor__text">Проверке корректности данных, вводимых пользователем необходимо уделять достаточно большое внимание, поскольку необработанные ошибки, возникающие при неправильном вводе данных, приводят к ошибкам в работе скрипта. Например, мы создаём форму для отправки пользователем письма, при этом адрес электронной почты необходимо вводить пользователю. В этом случае, для корректной работы программы мы должны сделать две вещи:</div><div class="t-redactor__text"><ul><li>Проверить, что поле, в которое заносится электронный адрес непустое (поскольку пользователь может просто забыть ввести адрес, и, если этот случай необработан, возникнет ошибочная ситуация);</li><li>Проверить соответствие введенного адреса с помощью регулярного выражения.</li></ul></div><h4  class="t-redactor__h4">Проверка на пустоту поля</h4><div class="t-redactor__text">Проверка того, что пользователь ввел данные, может осуществляться, с помощью функции <strong>isset:</strong></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
  $name = $_POST[&#039;name&#039;];
  if (!isset($name))
  {
    // если переменная $name не существует, просим повторить ввод имени
?&gt;
    &lt;h1&gt;Пожалуйста введите ваше имя!&lt;/h1&gt;
    &lt;!-- далее следует HTML-код формы, в которой вводится имя --&gt;
&lt;?php
  }
  else
  {
    -
  }
?&gt;</code></pre><div class="t-redactor__text">На практике удобно сначала проверить, не пустой ли <strong>action</strong> формы, а потом уже проверять различные его составляющие: поле имя, e-mail и т.д. К примеру:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
  $action = $_POST[&quot;action&quot;];
  if (!empty($action)) 
  {
    if (empty($name)) 
    {
     // код, для случая, когда не введено имя
    }
    if (empty($email))
    {
       // код, для случая, когда не введен e-mail
    }
  // дальнейший код скрипта
  }
  if (empty($action)) 
  {
?&gt;
  &lt;!-- здесь пишем HTML-код формы, в которой вводится информация --&gt;
&lt;?php
  }
?&gt;</code></pre><h4  class="t-redactor__h4">Проверка допустимости вводимых данных</h4><div class="t-redactor__text">Представим что нам надо проверить данные формы обратной связи. Как правило, такая проверка осуществляется при помощи регулярных выражений. Рассмотрим пример, в котором создается регулярное выражение для проверки адреса электронной почты.</div><div class="t-redactor__text">Адрес должен иметь вид Walls.234@mail.ru. У адреса две составляющие — имя пользователя и имя домена, которые разделены знаком «@». В имени пользователя могут присутствовать буквы нижнего и верхнего регистров, цифры, знаки подчеркивания, минуса и точки.</div><div class="t-redactor__text">Для проверки разделителя между именем пользователя и именем домена в выражение требуется добавить +@. Регулярное выражение, проверяющее имя пользователя и наличие разделителя имеет вид:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&quot;/[0-9a-z_]+@[0-9a-z_^\.]&quot;</code></pre><div class="t-redactor__text">Для проверки доменного имени добавляем выражение:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&quot;\.[a-z]{2,3}/i&quot;</code></pre><div class="t-redactor__text">Объединяя эти выражения, получаем регулярное выражение для проверки адресов электронной почты:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&quot;/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i&quot;</code></pre><h4  class="t-redactor__h4">Проверка файлов</h4><div class="t-redactor__text">Для файловых полей используются те же самые проверки, что и для обычных, однако они применяются уже не к собственно содержимому поля, а к массиву <strong>$_FILES</strong>, поэтому инструкции для файловых полей должны иметь специальную структуру. Рассмотрим в качестве примера следующую HTML-форму:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;form method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&gt;
    ...
    &lt;input type=&quot;file&quot; name=&quot;photo&quot;&gt;
    ...
&lt;/form&gt;</code></pre><div class="t-redactor__text">Массив <strong>$_FILES</strong> для такой формы в случае успешной загрузки файла будет иметь такой вид:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Array
{
    [photo] =&gt; Array
        {
            [name] =&gt; britney 100x100.jpg
            [type] =&gt; image/jpeg
            [tmp_name] =&gt; /tmp/php1AD.tmp
            [error] =&gt; 0
            [size] =&gt; 2752
        }

}</code></pre><div class="t-redactor__text">Чтобы сделать загрузку файла обязательной, в список инструкций нужно добавить элемент «*»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&#039;photo&#039; =&gt; array{
        &#039;*&#039; =&gt; &#039;Нужно загрузить файл.&#039;,
        &#039;name&#039; =&gt; array{
                &#039;/\.(jpeg|png)$/i&#039; =&gt; &#039;Файл должен быть в формате JPEG или PNG.&#039;,
                // Для такой проверки можно было использовать и type 
                // принципиальной разницы нет, т.к. элемент type
                // генерируется сервером на основе расширения файла.
            },
        &#039;size&#039; =&gt; array{
                &#039;&lt; &#039; . (1024 * 1024) =&gt; &#039;Файл {*name*} слишком большой, максимум - 1 Мб.&#039;,
                // Метка {*name*} заменится на исходное имя загруженного файла  
            },
    }</code></pre><div class="t-redactor__text">Если проверка на загрузку как таковую является единственной, инструкцию для поля можно записывать в сокращенной форме:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&#039;photo&#039; =&gt; &#039;Нужно загрузить файл.&#039;</code></pre><h4  class="t-redactor__h4">Проверка изображений</h4><div class="t-redactor__text">Если предполагается загрузка изображения, можно выполнить ряд проверок некоторых его свойств, используя для этого специальный тип инструкций файлового поля. Это обычные инструкции, которые будут анализировать данные, полученные с помощью функции <strong>getimagesize()</strong>. В результате своей работы она возвращает массив следующего вида:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">Array
{
    [0] =&gt; 450
    [1] =&gt; 675
    [2] =&gt; 2
    [3] =&gt; width=&quot;450&quot; height=&quot;675&quot;
    [bits] =&gt; 8
    [channels] =&gt; 3
    [mime] =&gt; image/jpeg
}</code></pre><div class="t-redactor__text">Предположим, нужно убедиться, что изображение нужного типа, и, кроме того, ограничить его максимальные размеры форматом 2048х1536. Чтобы выполнить все эти проверки, нужно включить в инструкции для файлового поля специальный элемент — «image»:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&#039;photo&#039; =&gt; array{
        &#039;image&#039; =&gt; array{
                &#039;*&#039; =&gt; &#039;Файл &quot;{*name*}&quot; не является изображением или поврежден.&#039;,
                &#039;mime&#039; =&gt; array{
                        &#039;/jpeg|png/&#039; =&gt; &#039;Изображение должно быть в формате JPEG или PNG.&#039;
                        // Нужно сказать, что getimagesize() устанавливает mime-type файла
                        // на основе анализа его содержимого (определяется верно даже 
                        // при неправильном расширении), поэтому для проверки типа изображения 
                        // лучше использовать результат работы getimagesize(), 
                        // а не содержимое $_FILES.
                    },
                &#039;width&#039; =&gt; array{
                        &#039;&lt;= 2048&#039; =&gt; &#039;Ширина изображения не должна превышать 2048 px.&#039;, 
                    },
                &#039;height&#039; =&gt; array{
                        &#039;&lt;= 1536&#039; =&gt; &#039;Высота изображения не должна превышать 1536 px.&#039;,
                    },
            },
    }</code></pre><div class="t-redactor__text">Ключи «width» и «height» используются в качестве псевдонимов для ключей 0 и 1 исходного массива от <strong>getimagesize()</strong>.<br /><br />Вот именно с помощью таких проверок в php можно защитить от несанкцианированного доступа на Ваш сайт, а также от непонимающих и забывающих вводить нужные данные пользователей.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>PHP и MySQL. Совместная работа</title>
			<link>https://www.easyitway.com/tpost/l8ytvex9m1-php-i-mysql-sovmestnaya-rabota</link>
			<amplink>https://www.easyitway.com/tpost/l8ytvex9m1-php-i-mysql-sovmestnaya-rabota?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 15:57:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>MySQL – это одна из самых популярных и распространенных СУБД (система управления базами данных) в интернете.</description>
			<turbo:content>
<![CDATA[<header><h1>PHP и MySQL. Совместная работа</h1></header><h4  class="t-redactor__h4">Что такое MySQL?</h4><div class="t-redactor__text"><strong>MySQL</strong> – это одна из самых популярных и распространенных СУБД (система управления базами данных) в интернете.</div><div class="t-redactor__text">Она не предназначена для работы с большими объемами информации, ее применение идеально подходит для интернет сайтов, как небольших, так и достаточно крупных. MySQL отличается хорошей скоростью работы, надежностью и гибкостью.</div><div class="t-redactor__text">СУБД MySQL — одна из множества баз данных, поддерживаемых в PHP. Система MySQL распространяется бесплатно и обладает достаточной мощностью для решения реальных задач.</div><div class="t-redactor__text">SQL — Structured Query Language, что означает структурированный язык запросов. Этот язык является стандартным средством для доступа к различным базам данных.</div><div class="t-redactor__text">Наиболее популярным приложением по созданию и работе с базами данных MySQL является программа <a href="https://www.phpmyadmin.net/" target="_blank" rel="noreferrer noopener">phpMyAdmin</a>.</div><div class="t-redactor__text">PhpMyAdmin это Web-приложение с открытым кодом, написанное на языке PHP и представляющее собой Web-интерфейс для администрирования баз данных MySQL. С помощью программы phpMyAdmin можно создавать, удалять и редактировать таблицы базы данных, выполнять отдельные SQL-запросы, создавать и удалять пользователей, изменять их привилегии.</div><div class="t-redactor__text">Программа phpMyAdmin также позволяет через Web-браузер осуществлять администрирование сервера MySQL, запускать команды SQL по работе с содержимым таблиц баз данных, управлять СУБД MySQL без непосредственного ввода SQL команд, предоставляя дружественный пользовательский интерфейс.</div><h4  class="t-redactor__h4">Создание базы данных MySQL</h4><div class="t-redactor__text">Создание новой базы данных MySQL осуществляется при помощи SQL-команды <strong>CREATE DATABASE</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">CREATE DATABASE IF NOT EXISTS `base`
	DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin</code></pre><h4  class="t-redactor__h4">Создание таблицы MySQL</h4><div class="t-redactor__text">Создание новой таблицы осуществляется при помощи SQL-команды <strong>CREATE TABLE</strong>. Например, таблица books для книжного магазина будет содержать пять полей: ISBN, автор, название, цена и количество экземпляров:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">CREATE TABLE books (ISBN CHAR(13) NOT NULL, 
                    PRIMARY KEY (ISBN),
                    author VARCHAR(30), 
                    title VARCHAR(60), 
                    price FLOAT(4,2),
                    quantity TINYINT UNSIGNED);</code></pre><div class="t-redactor__text">Добавление данных в эту таблицу осуществляется при помощи SQL-команды <strong>INSERT</strong>. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">INSERT INTO books ( ISBN, author, title, price, quantity ) 
           VALUES (&#039;5-8459-0184-7&#039;, &#039;Привет&#039;, 
                   &#039;Освой самостоятельно PHP5 за 24 часа&#039;, &#039;129&#039;, &#039;5&#039;);</code></pre><div class="t-redactor__text">Для извлечения данных из таблицы служит оператор <strong>SELECT</strong>. Он извлекает данные из базы, выбирая строки, которые отвечают заданному критерию поиска. Оператор SELECT сопровождает немалое количество опций и вариантов использования.<br /><br />Символ * означает, что необходимы все поля:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT * FROM books;</code></pre><div class="t-redactor__text">Для получения доступа только к некоторому полю следует указать его имя в инструкции SELECT:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">SELECT author, title, price FROM books;</code></pre><div class="t-redactor__text">Для удаления строк из базы данных используется оператор <strong>DELETE</strong>. Ненужные строки указываются при помощи конструкции WHERE. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">DELETE FROM books WHERE quantity = 0;</code></pre><h4  class="t-redactor__h4">Связь PHP с MySQL</h4><div class="t-redactor__text">Чтобы получить доступ к базе данных из Web, используя PHP, надо сделать основные шаги:</div><div class="t-redactor__text"><ul><li>Подключение к серверу MySQL.</li><li>Выбор базы данных.</li><li>Выполнение запроса к базе данных.</li><li>Получение результата запроса.</li><li>Отсоединение от базы данных.</li></ul></div><div class="t-redactor__text">Для подключения к серверу базы данных в PHP есть очень хорошая функция <strong>mysqli_connect()</strong>. Ее аргументы: имя компьютера, имя пользователя и пароль.</div><div class="t-redactor__text">Если PHP используется в сочетании с сервером Apache, то можно воспользоваться функцией <strong>mysqli_pconnect()</strong>.</div><div class="t-redactor__text">В этом случае соединение с сервером не исчезает после завершения работы программы или вызова функции <strong>mysqli_close()</strong>. Функции mysql_connect() и mysqli_pconnect() возвращают идентификатор подключения, если все прошло успешно. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$link = mysqli_pconnect ();
if ( !$link ) die (&quot;Невозможно подключение к MySQL&quot;);</code></pre><div class="t-redactor__text">После того, как соединение с сервером MySQL установлено, нужно выбрать базу данных. Для этого используется функция <strong>mysqli_select_db()</strong>. Ее аргумент: имя базы данных. Функция возвращает true, если указанная база данных существует и доступ к ней возможен. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$db = &quot;sample&quot;;
mysqli_select_db ( $db ) or die (&quot;Невозможно открыть $db&quot;);</code></pre><div class="t-redactor__text"><strong>mysqli_close</strong> — эта функция разрывает соединение с сервером MySQL, и возвращает true при успешном выполнении операции и false в противном случае. Функция принимает в качестве аргумента дескриптор соединения с базой данных, возвращаемый функцией mysql_connect. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// устанавливаем соединение с базой данных 
$dbcnx = mysqli_connect($dblocation, $dbuser, $dbpasswd); 
if (!$dbcnx) 
{
  // Выводим предупреждение
  echo (&quot;&lt;P&gt;В настоящий момент сервер базы данных не доступен, поэтому 
  корректное отображение страницы невозможно.&lt;/P&gt;&quot;); 
  // Завершаем работу в случае неудачи
  exit();
}
if(mysqli_close($dbcnx)) // разрываем соединение
{
  echo(&quot;Соединение с базой данных прекращено&quot;);
}
else
{
  echo(&quot;Не удалось завершить соединение&quot;);
}</code></pre><div class="t-redactor__text">Для добавления, удаления, изменения и выбора данных нужно сконструировать и выполнить запрос SQL. Для этого в языке PHP существует функция <strong>mysqli_query()</strong>. Ее аргумент: строка с запросом. Функция возвращает идентификатор запроса. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$db = &quot;sample&quot;;
$link = mysqli_pconnect ();
if ( !$link )
   die (&quot;Невозможно подключение к MySQL&quot;);
mysqli_select_db ( $db ) or die (&quot;Невозможно открыть $db&quot;);
$query = &quot;INSERT INTO books 
          VALUES (&#039;966-7393-80-1&#039;, &#039;Аллен Вайк&#039;, 
          &#039;PHP. Справочник&#039;, &#039;213&#039;, &#039;4&#039;)&quot;;
mysqli_query ( $query );
mysqli_close ( $link );</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Безопасность Cookie</title>
			<link>https://www.easyitway.com/tpost/yf0ug2jtk1-bezopasnost-cookie</link>
			<amplink>https://www.easyitway.com/tpost/yf0ug2jtk1-bezopasnost-cookie?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 16:00:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Смысл cookie в том, что это очень маленькие файлы, которые сохраняются браузером на диске в определённом месте. Файлы позволяют сайтам хранить на диске пользователя информацию, чтобы персонализировать сайт.</description>
			<turbo:content>
<![CDATA[<header><h1>Безопасность Cookie</h1></header><div class="t-redactor__text">В статье по самоучителю PHP я уже рассказывал о cookie, но сегодня я хочу продолжить эту тему и рассказать Вам о безопасности этих «печенюшках».</div><div class="t-redactor__text">Да-да, именно «печенюшек» или как их еще называют «плюшки». Никакого отношения к реальному значению файла этот перевод не имеет.</div><div class="t-redactor__text">Смысл cookie в том, что это очень маленькие файлы, которые сохраняются браузером на диске в определённом месте. Файлы позволяют сайтам хранить на диске пользователя информацию, чтобы персонализировать сайт.</div><div class="t-redactor__text">Так как в целях безопасности браузер не должен иметь доступа к компьютеру, то разработчики придумали безопасное решение в виде cookies. И решение действительно хорошее при правильном подходе.</div><h4  class="t-redactor__h4">Как лучше работать с cookie?</h4><div class="t-redactor__text">Работу с cookies лучше всего реализовать в самом начале файла сценария. Если до PHP-кода, устанавливающего cookie, будет присутствовать HTML-код, то на странице может появиться сообщение об ошибке.</div><div class="t-redactor__text">Чтобы не столкнуться с такой ошибкой, всегда надо писать код использования сеанса установки cookie в самом начале, до HTML-кода и до подключения файлов с помощью <strong>require</strong> или <strong>include</strong>, где также может быть HTML-код, из-за которого произойдет ошибка сохранения параметров на диске пользователя.</div><h4  class="t-redactor__h4">Собственно о самой безопасности</h4><div class="t-redactor__text">Файлы cookies абсолютно небезопасны для хранения важной информации, и им доверять нельзя. Для своей же безопасности рекомендуется <strong>не хранить ничего приватного в них</strong>, что может повлиять на безопасность пользователя в системе и на безопасность сервера.</div><div class="t-redactor__text">Способы завладения чужими файлами cookies:</div><div class="t-redactor__text"><ul><li>ошибки в Web-браузере;</li><li>ошибки в сценариях, позволяющие встроить JavaScript-код в HTML-форму;</li><li>троянские программы.</li></ul></div><div class="t-redactor__text">И еще <a href="https://it-black.ru/kto-takiye-khakery/" target="_blank" rel="noreferrer noopener">хакер</a> может подделать файл. Для этого он производит те же действия, которые может выполнить пользователь, и в результате на диске взломщика появляется файл cookie. После этого он подделывает cookie таким образом, чтобы он соответствовал другому пользователю.</div><div class="t-redactor__text">Злоумышленник регистрирует на почтовом сервере свой ящик и получает cookie. Далее он меняет файл cookie чтобы система приняла его за другого пользователя. Вот и все! Это очень просто сделать если вы не обезопасите себя! т.к. всё это можно провернуть если вы сохраняете свои данные (логин, пароль) в куки и хакер их может спокойно добыть.</div><h4  class="t-redactor__h4">Cоветы для защиты</h4><div class="t-redactor__text">Вот несколько вариантов защиты от взлома куки. Какой вариант лучше для Вас решайте самостоятельно:</div><h4  class="t-redactor__h4">1. Очистить или удали cookie</h4><div class="t-redactor__text">Всегда есть возможность удалить историю браузера и куки.</div><h4  class="t-redactor__h4">2. Настройка параметров браузера</h4><div class="t-redactor__text">Некоторые браузеры, например <a href="https://www.mozilla.org/ru/firefox/new/" target="_blank" rel="noreferrer noopener">Firefox</a> и <a href="https://www.apple.com/ru/safari/" target="_blank" rel="noreferrer noopener">Safari</a>, предлагают большой контроль над информацией, отслеживаемой при помощи куки. Для установки таких параметров необходимо всего лишь зайти в настройки приватности браузера.</div><h4  class="t-redactor__h4">3. Использование надстроек</h4><div class="t-redactor__text">Есть вариант использовать надстройки для браузера, чтобы расширить возможности управления куки. Обычно в этих программах масса настроек и выбора параметров.</div><h4  class="t-redactor__h4">4. Здравый смысл</h4><div class="t-redactor__text">Когда используете общественные компьютеры не вводите личную информацию, которая может быть сохранена в куки, и всегда убеждайтесь, что вышли из вашего аккаунта.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Регулярные выражения в PHP</title>
			<link>https://www.easyitway.com/tpost/8ldnrlgtb1-regulyarnie-virazheniya-v-php</link>
			<amplink>https://www.easyitway.com/tpost/8ldnrlgtb1-regulyarnie-virazheniya-v-php?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 16:02:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Регулярные выражения представляют собой шаблон и призваны проверить, соответствует ли ему строка.</description>
			<turbo:content>
<![CDATA[<header><h1>Регулярные выражения в PHP</h1></header><div class="t-redactor__text">Регулярные выражения (regular expressions) — это достаточно сложная, но интересная функциональная возможность PHP, которая позволяет выполнить основные и самые необходимые проверки переменных или произвести манипуляции над строками. Регулярные выражения представляют собой шаблон и призваны проверить, соответствует ли ему строка.</div><div class="t-redactor__text">Язык PHP поддерживает два типа регулярных выражений — стандартные POSIX и Perl.</div><h4  class="t-redactor__h4">Функции регулярных выражений PHP</h4><h4  class="t-redactor__h4">Функция ereg()</h4><div class="t-redactor__text">Функция ereg() ищет в строке соответствие регулярному выражению. В общем виде она выглядит следующим образом:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int ereg(
  string pattern,
  string string
  [, array regs] )</code></pre><div class="t-redactor__text">У функции три параметра, первые два из которых являются обязательными:</div><div class="t-redactor__text"><ul><li>pattern — регулярное выражение;</li><li>string — строка, в которой происходит поиск;</li><li>regs — переменная, в которую будет помещен массив найденных значений.</li></ul></div><h4  class="t-redactor__h4">Функция eregi()</h4><div class="t-redactor__text">Функция eregi() идентична ereg(), но при поиске нечувствительна к регистру букв. Параметры у обеих функций одинаковы.</div><h4  class="t-redactor__h4">Функция ereg_replace()</h4><div class="t-redactor__text">Эта функция ищет в строке регулярное выражение и заменяет его новым значением:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">int ereg_replace(
  string pattern,
  string replacement,
  string string)</code></pre><div class="t-redactor__text">Параметры функции:</div><div class="t-redactor__text"><ul><li>pattern — регулярное выражение;</li><li>replacement — новое значение;</li><li>string — строка, в которой происходит поиск.</li></ul></div><h4  class="t-redactor__h4">Функция eregi_replace()</h4><div class="t-redactor__text">Функция eregi_replace() идентична ereg_replace(), но игнорирует регистр. Параметры у обеих функций одинаковы.</div><h4  class="t-redactor__h4">Функция split()</h4><div class="t-redactor__text">Функция split() разбивает строку в соответствии с регулярным выражением и возвращает массив строк. В общем виде она выглядит так:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">array split(
  string pattern,
  string string
  [, int limit] )</code></pre><div class="t-redactor__text">Параметры функции:</div><div class="t-redactor__text"><ul><li>pattern — регулярное выражение;</li><li>string — строка, в которой происходит поиск;</li><li>limit — ограничение количества найденных значений.</li></ul></div><h4  class="t-redactor__h4">Функция spliti()</h4><div class="t-redactor__text">Функция spliti() идентична split(), но чувствительна к регистру букв во время поиска регулярного выражения.</div><h4  class="t-redactor__h4">Использование регулярных выражений</h4><div class="t-redactor__text">Рассмотрим простейший пример, в котором символы «BI» в строке заменяются HTML-тегами</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;B&gt;&lt;I&gt;:</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$text= &quot;BI Hello world from PHP&quot;;
$newtext = eregi_replace(&quot;BI&quot;, &quot;&lt;B&gt;&lt;I&gt;&quot;, $text);
echo($newtext);</code></pre><div class="t-redactor__text">В виде регулярного выражения может выступать классическая подстройка, которую нужно найти.<br /><br />Усложни задачу. Допустим, что нужно найти подстройку «BI» или «IB». Для этого можно разделить искомые подстройки символов вертикальной черты:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$text= &quot;BI Hello world from PHP&quot;;
$newtext = eregi_replace(&quot;BI|IB&quot;, &quot;&lt;B&gt;&lt;I&gt;&quot;, $text);
echo($newtext);</code></pre><div class="t-redactor__text">Вертикальная черта выступает в роли логического ИЛИ, и функция ищет любое из значений слева или справа от черты. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$text= &quot;BI IB IBB Hello world from PHP&quot;;
$newtext = eregi_replace(&quot;BI|IB|IBB&quot;, &quot;replaced&quot;, $text);
echo($newtext);</code></pre><h4  class="t-redactor__h4">Примеры регулярных выражений</h4><div class="t-redactor__text">1. Удаляем определённую ссылку в переменной text</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$text = preg_replace(&quot;~&lt;a href=\&quot;http://www\.aaa\&quot;&gt;[^&lt;]+?&lt;/a&gt;~&quot;,&#039;&#039;,$text);</code></pre><div class="t-redactor__text">2. Удаляем комментарии в переменной text</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$text = preg_replace(&#039;#&lt;!--.*--&gt;#sUi&#039;, &#039;&#039;, $text);</code></pre><div class="t-redactor__text">3. Удаляем спецсимволы</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$text = preg_replace (&quot;~(\\\|\*|\?|\[|\?|\]|\(|\\\$|\))~&quot;, &quot;&quot;,$text);</code></pre><div class="t-redactor__text">4. Удаляем всё, что между</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt; &gt;

$text = preg_replace(&#039;/(&lt;([^&gt;]+)&gt;)/U&#039;, &#039;&#039;, $text);</code></pre><div class="t-redactor__text">5. Удаляем конкретные символы из строки</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$text = str_replace(&#039;#39;&#039;, &#039;&#039;, $text); // удаляем одинарные кавычки
$text = str_replace(&#039;&quot;&#039;, &#039;&#039;, $text); // удаляем двойные кавычки
$text = str_replace(&#039;&amp;&#039;, &#039;&#039;, $text); // удаляем амперсанд
$text = preg_replace(&#039;/([?!:^~|@№$–=+*&amp;%.,;\[\]&lt;&gt;()_—«»#\/]+)/&#039;, &#039;&#039;, $text); // удаляем недоспустимые символы</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Функция md5 в PHP</title>
			<link>https://www.easyitway.com/tpost/pglsfti1k1-funktsiya-md5-v-php</link>
			<amplink>https://www.easyitway.com/tpost/pglsfti1k1-funktsiya-md5-v-php?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 17:52:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>MD5 (Message Digest 5) — 128-битный алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом из Массачусетского технологического института в 1991 году. </description>
			<turbo:content>
<![CDATA[<header><h1>Функция md5 в PHP</h1></header><div class="t-redactor__text">В этой статье я решил затронуть тему <strong>MD5</strong> хэширования. Самый простой пример использования MD5 хэша — это шифрование паролей пользователей. Ведь не секрет, что если хранить пароли в открытом виде в базе данных, то при её утере, все пароли пользователей будут украдены. И вот тут на помощь приходит функция хэширования в PHP.<br /><br />MD5 (Message Digest 5) — 128-битный алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом из Массачусетского технологического института в 1991 году. Предназначен для создания «отпечатков» или дайджестов сообщения произвольной длины и последующей проверки их подлинности.<br /><br />Функция MD5 хэширования в PHP называется <strong>md5()</strong>. Принимает функция одну строку, которую необходимо зашифровать. Пример использования md5():</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$str = &#039;яблоко&#039;;

if (md5($str) === &#039;1afa148eb41f2e7103f21410bf48346c&#039;) {
    echo &quot;Вам зеленое или красное яблоко?&quot;;
}
?&gt;</code></pre><div class="t-redactor__text">Пример скрипта проверки логина и пароля:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
  $login = &quot;DemoAdmin&quot;;
  $password = &quot;48503dfd59720bd5ff56c102065a52d7&quot;; //В реальности считывается из БД
  if (($_GET[&#039;login&#039;] == $login) &amp;&amp; (md5($_GET[&#039;password&#039;]) == $password)) echo &quot;Привет, Хозяин!&quot;;
  else echo &quot;Ты не Хозяин!&quot;;
?&gt;</code></pre><h4  class="t-redactor__h4">Свойства md5 хеширования</h4><div class="t-redactor__text"><ul><li>MD5-хэш содержит 32 символа;</li><li>MD5-хэш уникален для каждой строки;</li><li>Процесс MD5-хэширования необратим;</li><li>Процесс MD5-хэширования достаточно медлителен.</li></ul></div><h4  class="t-redactor__h4">Немного безопасности</h4><div class="t-redactor__text">Достоинства хеширования заключается в том, что хакеру сложно узнать реальный пароль, который нужно вводить. Обратное преобразование можно сделать только банальным перебором. Нужно запускать цикл, который будет хешировать все допустимые значения и сравнивать результат с нужной хеш-суммой.</div><div class="t-redactor__text">Вроде сложно? Но есть одна проблема — хеши статичны. Хакер может один раз сгенерировать одну большую таблицу, в которой будут находиться все возможные значения и соответствующие им хеши. Найти пароль таким образом очень просто.</div><div class="t-redactor__text">Чтобы хакеру не было так просто задачу можно и нужно усложнить. Просто перед шифрованием надо добавлять к паролю какой-то символ или строку:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$pass = md5($_GET[password].&quot;sjwsffr241&quot;);</code></pre><div class="t-redactor__text">Теперь таблица хакера бесполезна. Хакеру придется генерировать новую таблицу, в которой все значения перед хешированием тоже объединяются с этой бессмысленной строкой.<br /><br />Строка, которую мы добавили к паролю перед шифрованием, называется «солью». Мы ка бы «подсалили» шифруемый текст и сделали его безопасным.<br /><br />Теперь, чтобы самому проверить введеный пользователем пароль на соответствие этому хешу, делаем так:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$query = mysqli_qyery(SELECT * FROM Users WHERE (name = &#039;$_GET[name] &quot;.
&quot;AND pass = &quot; . md5($_GET[password].&quot;sjwsffr241&quot;) . &quot;&#039;&quot;);</code></pre><div class="t-redactor__text">Если у Вас небольшой сайт, то этой защиты будет достаточно, потому что хакер не будет надрываться ради единичного взлома. Но если это большой сайт или форум, то хакер может потратить время и сгенерировать таблицу, в которой будут все возможные хеши для строк, объеденённых с «солью» sjwsffr241.<br /><br />В этом случае можно для каждого пароля случайным образом генерировать свою «соль» и использовать её. Например:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$salt = сгенерировать значение;
$password = md5($_GET[password].$salt);

$query = mysqli_qyery(INSERT INTO users (name, password, salt) &quot;.
&quot;VALUES (&#039;$_GET[name]&#039;, &quot;$password&quot;, $salt&#039;)&quot;;</code></pre><div class="t-redactor__text">Теперь проверка пользователя может выглядеть так:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$_GET[users] = addslashes($_GET[users]);
$result = mysqli_query(&quot;SELECT salt FROM Users WHERE
         name = &#039;$_GET[name]&#039;&quot;);

if (list($salt) = mysqli_fetch_row($result))
{
$query = mysqli_query(&quot;SELECT * FROM Users WHERE (name = &#039;$_GET[name] &quot;.
&quot;AND password = &#039;&quot; . md5($_GET[password].&quot;$salt&quot;) . &quot;&#039;&quot;);
$rows = mysqli_num_rows($query);
if ($rows == 1)
  {
// Пользователь есть в БД
  }
}
else
  die &quot;Пароль неверен!&quot;;</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>CAPTCHA</title>
			<link>https://www.easyitway.com/tpost/gt4583mi21-captcha</link>
			<amplink>https://www.easyitway.com/tpost/gt4583mi21-captcha?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 17:56:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>CAPTCHA расшифровывается как Completely Automated Public Turing test to tell Computers and Humans Apart, что в переводе означает «полностью автоматизированный публичный тест Тьюринга</description>
			<turbo:content>
<![CDATA[<header><h1>CAPTCHA</h1></header><div class="t-redactor__text">В данной статье вы можете познакомиться с интересным и актуальным способом защиты от роботов в Интернете и научитесь реализовывать его на языке PHP.</div><h4  class="t-redactor__h4">Что такое CAPTCHA?</h4><div class="t-redactor__text"><a href="http://www.captcha.ru/" target="_blank" rel="noreferrer noopener"><strong>CAPTCHA</strong></a> расшифровывается как Completely Automated Public Turing test to tell Computers and Humans Apart, что в переводе означает «полностью автоматизированный публичный тест Тьюринга для различия компьютеров и людей» — компьютерный тест, используемый для того, чтобы определить, кем является пользователь системы: человеком или компьютером.</div><div class="t-redactor__text">Термин появился в 2000 году. Основная идея теста: предложить пользователю такую задачу, которая с лёгкостью решается человеком, но крайне сложна и трудоёмка для компьютера.</div><div class="t-redactor__text">CAPTCHA является очень эффективным методом защиты от накрутки, флуда или спама. После каждой попытки проголосовать, пользователю приходиться в очередной раз вводить код или отвечать на вопрос, поэтому, чтобы отдать 1000 голосов за интересующий ответ, придется 1000 раз проходить тест.</div><div class="t-redactor__text">В реальных проектах я рекомендую использовать <a href="https://www.google.com/recaptcha/intro/v3beta.html" target="_blank" rel="noreferrer noopener">Google Captcha</a>. Данная компания разработала достаточно хороший API, который можно использовать для того, чтобы обеспечить защиту своих сайтов.</div><h4  class="t-redactor__h4">Пример реализации на PHP</h4><div class="t-redactor__text">Для примера сделаем «капчу» цифрами, нарисованными на картинке, и добавим на неё шум. Для этого в PHP можно программно создать картинку и нарисовать на ней цифры и шум. Примеры выбора шума:</div><div class="t-redactor__text"><ul><li>Можно покрыть цифры и фон точками, только точек для создания полноценного шума понадобится очень много;</li><li>Для создания шума можно использовать графический алгоритм, примерно как в Adobe Photoshop есть фильтр для превращения картинки в шум;</li><li>Можно заранее подготовить картинку с шумом и рисовать секретный код на её поверхности. Но из-за того что картинка фона статична, вполне реально написать сценарий, который программно будет очищать изображение от шума;</li><li>Можно нарисовать несколько линий поверх секретного кода. И также злоумышленник может написать сценарий, который будет распознавать линии на изображении и удалять их.</li></ul></div><div class="t-redactor__text">Если Ваш сайт очень популярен, тогда надо создавать более серьезную и сложную «капчу» я же для примера возьму последний способ создания теста на сайте. И так создадим файл captcha.php и запишем в него содержимое листинга:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
session_start();//Запуск сессии
header(&quot;Content-type: image/png&quot;); 
$img = imagecreatetruecolor(130,24) or die(&#039;Cannot create image&#039;);  

imagefill($img, 0, 0, 0xFFFFFF);

$x=0;
$i=1;
$sum = &quot;&quot;;
while ($i++ &lt;= 5) {
 imagettftext($img, rand(14,18), rand(-12,12), $x=$x+20,  15+rand(0,5),
 imagecolorallocate($img,rand(0,$i*25),rand(0,$i*25),rand(0,$i*25)), &quot;arial.ttf&quot;, $rnd=rand(0,9)); 
 $sum = $sum.(string)$rnd; //шрифт arial.ttf или любой другой должен лежать в папке с этим файлом
 imageline($img, 0, rand(0,24), 130, rand(0,40), $DDDDDD);
}
$_SESSION[secret_number] = $sum;

imagepng($img);
imagedestroy($img);
?&gt;</code></pre><div class="t-redactor__text">Рассмотрим код подробно. Сразу после запуска сеанса мы вызываем функцию header(). Сделать это следует до вывода какой бы то ни было информации, потому что она задает заголовок последующих данных.<br /><br />В header() указываем в качестве параметра "Content-type: image/png". Данный тип заголовка определяет картинку в формате PNG, и именно её мы должны сгенерировать в сценарии.<br /><br />Далее вызывается функция imagecreatetruecolor(), которая создает картинку в памяти сервера. В качестве параметров передаются требуемые ширина и высота картинки. Функция imagefill() заполняет всю область картинки белым цветом.<br /><br />После создания фона запускаем цикл из пяти шагов, на каждом шаге которого рисуем одну случайную цифру и линию со случайными координатами. В том же цикле добавляем к переменной $sum нарисованную цифру. В этой переменной собираем сгенерированный код защиты в одно целое.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Создание страницы опроса качества предоставляемых услуг на PHP</title>
			<link>https://www.easyitway.com/tpost/i9zc9epb41-sozdanie-stranitsi-oprosa-kachestva-pred</link>
			<amplink>https://www.easyitway.com/tpost/i9zc9epb41-sozdanie-stranitsi-oprosa-kachestva-pred?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 17:59:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>В этой статье мы создадим динамическую страницу опроса качества предоставлемых услуг. </description>
			<turbo:content>
<![CDATA[<header><h1>Создание страницы опроса качества предоставляемых услуг на PHP</h1></header><div class="t-redactor__text">В этой статье мы создадим динамическую страницу опроса качества предоставлемых услуг. Использовать будем язык программирования PHP и базу данных MySQL, а также язык гипертекстовой разметки (HTML) и каскадные стили таблиц (CSS). В качестве локального сервера будем использовать XAMPP. Интерфейс будущей странички:</div><img src="https://static.tildacdn.com/tild3830-6364-4530-a364-376262623332/sozdanie-stranicy-op.jpg"><h4  class="t-redactor__h4">1. Создание базы данных</h4><div class="t-redactor__text">Создаем базу данных в интерфейсе «phpAdmin». Базу данных называете как вам угодно, в <strong>«Сравнение»</strong> выбираем <strong>«utf8_general_ci»</strong>:</div><img src="https://static.tildacdn.com/tild6666-6431-4834-b037-613739646466/sozdanie-stranicy-op.jpg"><div class="t-redactor__text">Создаем таблицу с 6 столбцами:</div><img src="https://static.tildacdn.com/tild6337-3266-4537-b931-326430313732/sozdanie-stranicy-op.jpg"><div class="t-redactor__text">Заполняем столбцы таблицы:</div><img src="https://static.tildacdn.com/tild3937-6362-4139-b565-633430316134/sozdanie-stranicy-op.jpg"><div class="t-redactor__text"><ul><li><strong>id</strong> — уникальный идентификатор отзыва;</li><li><strong>name</strong> — имя пользователя;</li><li><strong>email</strong> — E-mail пользователя;</li><li><strong>date</strong> — дата и время опубликованного отзыва;</li><li><strong>rating</strong> — столбец для хранения рейтинга от пользователя;</li><li><strong>message</strong> — отзыв пользователя.</li></ul></div><h4  class="t-redactor__h4">2. Соединение с базой данных</h4><div class="t-redactor__text">На локальном сервере XAMPP в папке <strong>«htdocs»</strong> создаем папку нашего будущего проекта. В этой папке создаем первый php файл <strong>«db.php»</strong>. Он нужен для соединения с базой данных. Чтобы будущие отзывы сохранялись в нашей созданной таблице. Листинг файла db.php:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php 

$dblocation = &#039;localhost&#039;; // имя хоста
$database = &#039;site_comment&#039;; // имя базы данных 
$dbuser = &#039;root&#039;; // имя пользователя
$dbpasswd = &#039;&#039;; // пароль пользователя

// устанавливаем соединение с базой данных 

$link = mysqli_connect($dblocation, $dbuser, $dbpasswd, $database) or die(&quot;Не могу подключиться&quot;);  
mysqli_select_db($link, $database) or die (&#039;Не могу выбрать БД&#039;);

//установка кодировки
$link-&gt;set_charset(&quot;utf8&quot;);
?&gt;</code></pre><div class="t-redactor__text">Здесь мы создаем переменные и в них прописываем данные для соединения базы данных. Имя пользователя для соединения базы данных устанавливается по умолчанию, конечно если в phpMyAdmin вы их не меняли. Далее мы с помощью функции <strong>mysqli_connect</strong> устанавливаем соединение с нашей базой данных.</div><h4  class="t-redactor__h4">3. Создание формы приложения</h4><div class="t-redactor__text">С помощью HTML и CSS создаем нужную форму приложения. В папке проекта создаем PHP файл и называем его «form.php». Листинг файла:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Отзывы о продукте&lt;/title&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;css/style.css&quot;&gt; // подключение стилей
&lt;meta content=&quot;text/html; charset=utf-8&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;h2&gt;Отзыв о продукте&lt;/h2&gt;
&lt;h3&gt;Все поля обязательны для заполнения&lt;/h3&gt;
&lt;br&gt;
&lt;div class=&quot;send&quot;&gt; 
&lt;form method=&quot;post&quot; action=&quot;index.php&quot; id=&quot;review&quot;&gt;   
&lt;h3&gt;Оцените продукт&lt;/h3&gt;
&lt;div class=&quot;rating&quot;&gt;
&lt;input type=&quot;radio&quot; class=&quot;rating&quot; id=&quot;star5&quot; name=&quot;rating&quot; value=&quot;5&quot; /&gt;&lt;label for=&quot;star5&quot;&gt;&lt;/label&gt;
&lt;input type=&quot;radio&quot; class=&quot;rating&quot; id=&quot;star4&quot; name=&quot;rating&quot; value=&quot;4&quot; /&gt;&lt;label for=&quot;star4&quot;&gt;&lt;/label&gt;
&lt;input type=&quot;radio&quot; class=&quot;rating&quot; id=&quot;star3&quot; name=&quot;rating&quot; value=&quot;3&quot; /&gt;&lt;label for=&quot;star3&quot;&gt;&lt;/label&gt;
&lt;input type=&quot;radio&quot; class=&quot;rating&quot; id=&quot;star2&quot; name=&quot;rating&quot; value=&quot;2&quot; /&gt;&lt;label for=&quot;star2&quot;&gt;&lt;/label&gt;
&lt;input type=&quot;radio&quot; class=&quot;rating&quot; id=&quot;star1&quot; name=&quot;rating&quot; value=&quot;1&quot; /&gt;&lt;label for=&quot;star1&quot;&gt;&lt;/label&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;input type=&quot;text&quot; name=&quot;name&quot; placeholder=&quot;Ваше имя&quot; required&gt;
&lt;input type=&quot;email&quot; name=&quot;email&quot; placeholder=&quot;Ваш E-mail&quot; required&gt;
&lt;input type=&quot;date&quot; name=&quot;date&quot; hidden=&quot;true&quot;&gt;
&lt;textarea name=&quot;message&quot; placeholder=&quot;Сообщение&quot;&gt;&lt;/textarea required&gt;
&lt;input type=&quot;submit&quot; name=&quot;add&quot; value=&quot;Оставить отзыв&quot;&gt;
&lt;/form&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><div class="t-redactor__text">Форма будет обрабатываться с помощью метода POST. Обработчик формы будет в файле <strong>«index.php»</strong> мы его создадим позже.<br /><br />В папке проекта создаем папку с именем <strong>«CSS»</strong> и в этой папке создаем файл для стилей с именем <strong>«style.css»</strong> и записываем стили для формы:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">  /* CSS для формы */

* {
  margin: 0;
  padding: 0;
}

body {
  font-size: 1.2em;
  background-color: #fff;
  color: #555;
}

p {
  padding: 0 0 20px 0;
  line-height: 1.7em;
} 

input, textarea {
  outline: none;
  border: none;
  border: solid 1px #f2f2f2;
}

h3, h2 {
  font: normal 85% &#039;century gothic&#039;, arial;
  margin: 0 0 0 0;
  padding: 3px 0 5px 0;
  color: #000;
}

h2 {
  font-size: 140%;
}

hr {
  color: black;
}


.content {
  text-align: left;
  width: 30%;
  padding: 1% 0 0 5px;
  margin: 0 0 0 27%;
  float: left;
}

.reviews {
  margin-bottom: 4%;
  font-size: 0.9em;
  text-align: left;
  width: 30%;
  padding: 1% 0 0 5px;
  margin: 0 0 0 27%;
  float: left;
}

.reviews .review_text {

  background-color: #f2f2f2;
  color: black;
  padding: 1%;
  border-radius: 5px;
  border: solid 1px;
  width: 160%;
  height: 11%;
  padding-top: 2%;
  bottom: 2%;
  padding-left: 2%;
}

.send {

  margin-bottom: 4%;
}

.send input[type=&quot;text&quot;], input[type=&quot;email&quot;], textarea {

  border: solid 1px #000000;
  margin-bottom: 2%;
}

.send input[type=&quot;text&quot;], [type=&quot;email&quot;] {

  width: 38%;
  color: #5d5d5d;
  width: 46%;
  padding: 8px;
  border-radius: 5px;
}

.send textarea {

  width: 163%;
  height: 20%;
  border-radius: 5px;
}

.send input[type=&quot;submit&quot;] {

  background-color: #b5c1f3;
  padding: 2%;
  color: black;
  border-radius: 5px;
  cursor:pointer;
}

  /* CSS для рейтинга (звезды) */

.rating {
    float:left;
}

.rating:not(:checked) &gt; input {
    position:absolute;
    top:-9999px;
    clip:rect(0,0,0,0);
}

.rating:not(:checked) &gt; label {
    float:right;
    width:1em;
    padding:0 .1em;
    overflow:hidden;
    white-space:nowrap;
    cursor:pointer;
    font-size:140%;
    line-height:1.2;
    color:#ddd;
    text-shadow:1px 1px #bbb, 2px 2px #666, .1em .1em .2em rgba(0,0,0,.5);
}

.rating:not(:checked) &gt; label:before {
    content: &#039;★ &#039;;
}

.rating &gt; input:checked ~ label {
    color: #f70;
    text-shadow:1px 1px #c60, 2px 2px #940, .1em .1em .2em rgba(0,0,0,.5);
}

.rating:not(:checked) &gt; label:hover,
.rating:not(:checked) &gt; label:hover ~ label {
    color: gold;
    text-shadow:1px 1px goldenrod, 2px 2px #B57340, .1em .1em .2em rgba(0,0,0,.5);
}

.rating &gt; input:checked + label:hover,
.rating &gt; input:checked + label:hover ~ label,
.rating &gt; input:checked ~ label:hover,
.rating &gt; input:checked ~ label:hover ~ label,
.rating &gt; label:hover ~ input:checked ~ label {
    color: #ea0;
    text-shadow:1px 1px goldenrod, 2px 2px #B57340, .1em .1em .2em rgba(0,0,0,.5);
}

.rating &gt; label:active {
    position:relative;
    top:2px;
    left:2px;
}</code></pre><h4  class="t-redactor__h4">4. Вывод комментариев</h4><div class="t-redactor__text">В самом вверху файла <strong>«form.php»</strong> пишем код для соединения базы данных:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php include_once &#039;db.php&#039;; ?&gt;</code></pre><div class="t-redactor__text">После тега <strong>body</strong> в файле <strong>«form.php»</strong> добавлеям код для вывода комментариев из базы данных:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}"> &lt;?php $result = mysqli_query($link, &quot;SELECT * FROM `otzivi` ORDER BY id DESC&quot;) ?&gt; 
 &lt;?php while($res = mysqli_fetch_assoc($result)) { ?&gt;

&lt;div class=&quot;reviews&quot;&gt;
  
&lt;div class=&quot;review_text&quot;&gt;
&lt;b&gt;Имя:&lt;/b&gt; &lt;?= $res[&#039;name&#039;] ?&gt; | &lt;b&gt;Дата:&lt;/b&gt; &lt;?= date(&quot;d.m.y | &lt;b&gt;Время:&lt;/b&gt; H.i&quot;, strtotime($res[&#039;date&#039;])) ?&gt; | &lt;b&gt;Оценка:&lt;/b&gt; &lt;?= $res[&#039;rating&#039;] ?&gt;/5
&lt;hr&gt;
&lt;br&gt;
&lt;?= $res[&#039;message&#039;] ?&gt; &lt;br&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;?php } ?&gt;</code></pre><div class="t-redactor__text">Здесь мы создаем переменную <strong>$result</strong> и с помощью функции <strong>mysqli_query</strong> и оператора <strong>SELECT</strong> вытаскиваем из базы данных все комментарии и сортируем их по id (новые отзывы сверху).<br /><br />Далее с помощью <strong>while</strong> и функции <strong>mysqli_fetch_assoc</strong> мы заносим данные в html теги для того, чтобы пользователь видел все отзывы о продукте. Если в базе данных не будет отзывов страничка будет пустая.<br /><br />С помощью переменной <strong>$res</strong> выводим все данные в нужном нам порядке.<br /><br />Полный листинг файла <strong>«form.php»</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php include_once &#039;db.php&#039;; ?&gt;

&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Отзывы о продукте&lt;/title&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;css/style.css&quot;&gt;
&lt;meta content=&quot;text/html; charset=utf-8&quot;&gt;
&lt;/head&gt;
&lt;body&gt;

 &lt;?php $result = mysqli_query($link, &quot;SELECT * FROM `otzivi` ORDER BY id DESC&quot;) ?&gt; 
 &lt;?php while($res = mysqli_fetch_assoc($result)) { ?&gt;

&lt;div class=&quot;reviews&quot;&gt;
  
&lt;div class=&quot;review_text&quot;&gt;
&lt;b&gt;Имя:&lt;/b&gt; &lt;?= $res[&#039;name&#039;] ?&gt; | &lt;b&gt;Дата:&lt;/b&gt; &lt;?= date(&quot;d.m.y | &lt;b&gt;Время:&lt;/b&gt; H.i&quot;, strtotime($res[&#039;date&#039;])) ?&gt; | &lt;b&gt;Оценка:&lt;/b&gt; &lt;?= $res[&#039;rating&#039;] ?&gt;/5
&lt;hr&gt;
&lt;br&gt;
&lt;?= $res[&#039;message&#039;] ?&gt; &lt;br&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;?php } ?&gt;

&lt;div class=&quot;content&quot;&gt;
&lt;h2&gt;Отзыв о продукте&lt;/h2&gt;
&lt;h3&gt;Все поля обязательны для заполнения&lt;/h3&gt;
&lt;br&gt;
&lt;div class=&quot;send&quot;&gt; 
&lt;form method=&quot;post&quot; action=&quot;index.php&quot; id=&quot;review&quot;&gt;   
&lt;h3&gt;Оцените продукт&lt;/h3&gt;
&lt;div class=&quot;rating&quot;&gt;
&lt;input type=&quot;radio&quot; class=&quot;rating&quot; id=&quot;star5&quot; name=&quot;rating&quot; value=&quot;5&quot; /&gt;&lt;label for=&quot;star5&quot;&gt;&lt;/label&gt;
&lt;input type=&quot;radio&quot; class=&quot;rating&quot; id=&quot;star4&quot; name=&quot;rating&quot; value=&quot;4&quot; /&gt;&lt;label for=&quot;star4&quot;&gt;&lt;/label&gt;
&lt;input type=&quot;radio&quot; class=&quot;rating&quot; id=&quot;star3&quot; name=&quot;rating&quot; value=&quot;3&quot; /&gt;&lt;label for=&quot;star3&quot;&gt;&lt;/label&gt;
&lt;input type=&quot;radio&quot; class=&quot;rating&quot; id=&quot;star2&quot; name=&quot;rating&quot; value=&quot;2&quot; /&gt;&lt;label for=&quot;star2&quot;&gt;&lt;/label&gt;
&lt;input type=&quot;radio&quot; class=&quot;rating&quot; id=&quot;star1&quot; name=&quot;rating&quot; value=&quot;1&quot; /&gt;&lt;label for=&quot;star1&quot;&gt;&lt;/label&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;input type=&quot;text&quot; name=&quot;name&quot; placeholder=&quot;Ваше имя&quot; required&gt;
&lt;input type=&quot;email&quot; name=&quot;email&quot; placeholder=&quot;Ваш E-mail&quot; required&gt;
&lt;input type=&quot;date&quot; name=&quot;date&quot; hidden=&quot;true&quot;&gt;
&lt;textarea name=&quot;message&quot; placeholder=&quot;Сообщение&quot; required&gt;&lt;/textarea&gt;
&lt;input type=&quot;submit&quot; name=&quot;add&quot; value=&quot;Оставить отзыв&quot;&gt;
&lt;/form&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h4  class="t-redactor__h4">5. Обработка формы</h4><div class="t-redactor__text">В папке проекта создаем файл <strong>«index.php»</strong> для отправки отзывов в базу данных, но только если пользователь их введет и нажмет на кнопку <strong>«Оставить отзыв»</strong>. Листинг файла:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php 
include_once &#039;db.php&#039;;

if (isset($_POST[&#039;add&#039;])) {

// преобразуем специальные символы в текст

$name = htmlspecialchars($_POST[&#039;name&#039;]);
$email = htmlspecialchars($_POST[&#039;email&#039;]);
$message = htmlspecialchars($_POST[&#039;message&#039;]);
$rating = htmlspecialchars($_POST[&#039;rating&#039;]);

// заносим данные из формы в переменные и проверяем на ошибки

$name = strip_tags(trim($_POST[&#039;name&#039;]));
$email = strip_tags(trim($_POST[&#039;email&#039;]));
$message = strip_tags(trim($_POST[&#039;message&#039;]));
$rating = strip_tags(trim($_POST[&#039;rating&#039;]));
$date = $_POST[&#039;date&#039;];

// заносим дату и время отзыва
$date = date(&#039;Y-m-d H:i&#039;);

// проверка введенных данных

if($name != &#039;&#039; AND $email != &#039;&#039; AND $message != &#039;&#039;){ if (!preg_match(&quot;/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i&quot;, $email)) {$err = &#039;Неверно введен е-mail.&#039;;}

// отправка данных в бд

mysqli_query($link, &quot; INSERT INTO otzivi (name, email, message, date, rating) VALUES (&#039;$name&#039;, &#039;$email&#039;, &#039;$message&#039;, &#039;$date&#039;, &#039;$rating&#039;)&quot;);

// закрываем сеанс 

mysqli_close($link);

//редирект

header (&quot;location: index.php&quot;);
   }
}

include_once &#039;form.php&#039;;
?&gt;</code></pre><div class="t-redactor__text">Здесь для начала мы подключаем файл <strong>«db.php»</strong>. Создаем оператор <strong>if</strong> c именем <strong>«add»</strong> чтобы при нажатии кнопки данные обрабатывались с помощью кода в этом операторе.<br /><br />Функция <strong>isset</strong> — определяет, установлена ли переменная.<br /><br />Потом преобразуем все вводимые специальные символы в текст функцией <strong>htmlspecialchars</strong>. Это нужно для безопасности.<br /><br />Функция <strong>htmlspecialchars</strong> нужна при отображении данных, введенных пользователем, которые могут содержать нежелательные HTML тэги в нашей форме.<br /><br />Далее заносим данные из формы в созданные нами переменные и проверяем на ошибки.<br /><br />Функция <strong>strip_tags</strong> — удаляет HTML и PHP тэги из строки, а функция <strong>trim</strong> — удаляет пробелы из начала и конца строки.<br /><br />Дальше записываем нужный формат даты и проводим проверку введенных данных в форме HTML. Это нужно чтобы пользователь смог ввести только правильный E-mail адрес.<br /><br />С помощью функции <strong>mysqli_query</strong> и оператора <strong>INSERT</strong> заносим введенные и проверенные данные в базу данных и завершем сеанс работы с ней. На последнем этапе делаем редирект на наш файл — это нужно для того чтобы пользователь остался на этой странице после отправки отзыва.<br /><br />Чтобы форма корректно отображалась в нужном месте в конце файла <strong>«index.php»</strong> делаем подключение файла <strong>«form.php»</strong>.<br /><br />После этого можно запустить страничку в браузере и проверить результат работы. Если Вы правильно записали, тогда все должно работать идеально, но если есть ошибки значит проверьте правильность кода.<br /><br />На этом мы заканчиваем создание страницы опроса качества предоставляемых услуг на PHP. В комментариях жду Ваших предложений по доработке этого приложения. Удачи в разработке!</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>PHP: PDO, работа с MySQL</title>
			<link>https://www.easyitway.com/tpost/zzc1l0cmg1-php-pdo-rabota-s-mysql</link>
			<amplink>https://www.easyitway.com/tpost/zzc1l0cmg1-php-pdo-rabota-s-mysql?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 18:05:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>PDO – PHP Data Objects – это прослойка, которая предлагает универсальный способ работы с несколькими базами данных.</description>
			<turbo:content>
<![CDATA[<header><h1>PHP: PDO, работа с MySQL</h1></header><div class="t-redactor__text"><strong>PDO – PHP Data Objects</strong> – это прослойка, которая предлагает универсальный способ работы с несколькими базами данных.</div><div class="t-redactor__text">Смысл PDO в том, что отсутствует привязка к конкретной системе управления базами данных. PDO поддерживает СУБД: MySQL, PostgreSQL, SQLite, Oracle, Microsoft SQL Server и другие.</div><h4  class="t-redactor__h4">Почему стоит использовать PDO</h4><div class="t-redactor__text">Функции mysql в PHP для работы с БД давно уже устарели, на сегодняшний день желательно использовать mysqli или PDO (PHP Data Objects). Кроме того, mysqli — эта библиотека, которая по большому счёту, не предназначена для использования напрямую в коде.</div><div class="t-redactor__text">При работе с mysqli следует также помнить об обеспечении безопасности вашего приложения, в частности о защите от SQL-инъекций. В случае использования PDO (с его подготовленными запросами), такая защита идёт уже «из коробки», главное правильно применить необходимые методы.</div><h4  class="t-redactor__h4">Подключение</h4><div class="t-redactor__text">Способы подключения к разным СУБД могут незначительно отличаться. Рассмотрим примеры подключения к наиболее популярным из них:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">try {  
  # MS SQL Server и Sybase через PDO_DBLIB  
  $DBH = new PDO(&quot;mssql:host=$host;dbname=$dbname&quot;, $user, $pass);  
  $DBH = new PDO(&quot;sybase:host=$host;dbname=$dbname&quot;, $user, $pass);  
  
  # MySQL через PDO_MYSQL  
  $DBH = new PDO(&quot;mysql:host=$host;dbname=$dbname&quot;, $user, $pass);  
  
  # SQLite  
  $DBH = new PDO(&quot;sqlite:my/database/path/database.db&quot;);  
}  
catch(PDOException $e) {  
    echo $e-&gt;getMessage();  
}</code></pre><div class="t-redactor__text">В блок try/catch – всегда стоит оборачивать все PDO-операции и использовать механизм исключений.</div><h4  class="t-redactor__h4">Исключения и PDO</h4><div class="t-redactor__text">PDO умеет выбрасывать исключения при ошибках, поэтому все должно находиться в блоке try/catch. Сразу после создания подключения, PDO можно перевести в любой из трех режимов ошибок:</div><h4  class="t-redactor__h4">PDO::ERRMODE_SILENT</h4><div class="t-redactor__text">Это режим по умолчанию. Примерно то же самое, что используется для отлавливания ошибок в расширениях mysql и mysqli. Следующие два режима больше подходят для DRY программирования.</div><h4  class="t-redactor__h4">PDO::ERRMODE_WARNING</h4><div class="t-redactor__text">Этот режим вызовет стандартный Warning и позволит скрипту продолжить выполнение. Удобен при отладке.</div><h4  class="t-redactor__h4">PDO::ERRMODE_EXCEPTION</h4><div class="t-redactor__text">Он выбрасывает исключение, что позволяет обрабатывать ошибки и скрывать необходимую информацию.</div><h4  class="t-redactor__h4">PDO и MySQL</h4><div class="t-redactor__text">Рассмотрим пример подключения базы данных MYSQL</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Создаем константы
define(&quot;HOST&quot;, &quot;localhost&quot;);
define(&quot;DBNAME&quot;, &quot;сюда вносим имя БД&quot;);
define(&quot;DBUSER&quot;, &quot;сюда вносим имя пользователя от БД&quot;);
define(&quot;DBPASSWORD&quot;, &quot;сюда вносим пароль пользователя от БД&quot;);

// Подключаемся к базе данных через PDO
try {
	$mysql = new PDO(&#039;mysql:host=&#039; . HOST . &#039;;dbname=&#039; . DBNAME, DBUSER, DBPASSWORD,
    array(PDO::MYSQL_ATTR_INIT_COMMAND =&gt; &quot;SET NAMES utf8&quot;));
} catch (PDOException $e) {
	print &quot;Возникла ошибка соединения!: &quot; . $e-&gt;getMessage() . &quot;&lt;br/&gt;&quot;;
	die();
}</code></pre><h4  class="t-redactor__h4">Подготовленные и прямые запросы</h4><div class="t-redactor__text">В PDO существует два способа выполнения запросов:</div><h4  class="t-redactor__h4">Прямые запросы</h4><div class="t-redactor__text"><strong>query()</strong> используется для операторов, которые не вносят изменения, например SELECT. Возвращает объект PDOStatemnt, из которого с помощью методов fetch() или fetchAll извлекаются результаты запроса.</div><div class="t-redactor__text">exec() используется для операторов INSERT, DELETE, UPDATE. Возвращает число обработанных запросом строк.</div><div class="t-redactor__text">Прямые запросы используются только в том случае, если в запросе отсутствуют переменные и есть уверенность, что запрос безопасен и правильно экранирован.</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$stmt = $db-&gt;query(&quot;SELECT * FROM categories&quot;);
while ($row = $stmt-&gt;fetch())
{
  echo &#039;&lt;pre&gt;&#039;;
  print_r($row);
}</code></pre><h4  class="t-redactor__h4">Подготовленные запросы</h4><div class="t-redactor__text">Если же в запрос передаётся хотя бы одна переменная, то этот запрос в обязательном порядке должен выполняться только через подготовленные выражения.</div><div class="t-redactor__text">Это обычный SQL запрос, в котором вместо переменной ставится специальный маркер — плейсхолдер. PDO поддерживает позиционные плейсхолдеры (?), для которых важен порядок передаваемых переменных, и именованные (:name), для которых порядок не важен. Примеры:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$sql = &quot;SELECT name FROM categories WHERE id = ?&quot;;
$sql = &quot;SELECT name FROM categories WHERE name = :name&quot;;</code></pre><div class="t-redactor__text">Чтобы выполнить такой запрос, сначала его надо подготовить с помощью метода prepare(). Она также возвращает PDO statement, но ещё без данных.<br /><br />Чтобы их получить, надо исполнить этот запрос, предварительно передав в него наши переменные. Передать можно двумя способами: Чаще всего можно просто выполнить метод execute(), передав ему массив с переменными:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$stmt = $pdo-&gt;prepare(&quot;SELECT `name` FROM categories WHERE `id` = ?&quot;);
$stmt-&gt;execute([$id]);
 
$stmt = $pdo-&gt;prepare(&quot;SELECT `name` FROM categories WHERE `name` = :name&quot;);
$stmt-&gt;execute([&#039;name&#039; =&gt; $name]);</code></pre><div class="t-redactor__text">Далее мы рассмотрим методы PDO для получения данных.</div><h4  class="t-redactor__h4">Метод fetch()</h4><div class="t-redactor__text">Метод fetch() служит для последовательного получения строк из БД. Этот метод является аналогом функции mysq_fetch_array() и ей подобных, но действует по-другому: вместо множества функций здесь используется одна, но ее поведение задается переданным параметром. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$id = 1;
$stmt = $db-&gt;prepare(&quot;SELECT * FROM categories WHERE `id` = ?&quot;);
$stmt-&gt;execute([$id]);
while ($row = $stmt-&gt;fetch(PDO::FETCH_LAZY)) {
    echo &#039;Category name: &#039;.$row-&gt;name;
}</code></pre><h4  class="t-redactor__h4">Метод fetchColumn()</h4><div class="t-redactor__text">Также у PDO есть метод для получения значения единственной колонки. Очень удобно, если мы запрашиваем только одно поле — в этом случае значительно сокращается количество кода. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$id = 1;
$stmt = $db-&gt;prepare(&quot;SELECT `name` FROM categories WHERE `id` = ?&quot;);
$stmt-&gt;execute([$id]);
$name = $stmt-&gt;fetchColumn();
echo &#039;Category name: &#039;.$name;</code></pre><h4  class="t-redactor__h4">Метод fetchAll()</h4><div class="t-redactor__text">PDOStatement::fetchAll — Возвращает массив, содержащий все строки результирующего набора. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$data = $db-&gt;query(&quot;SELECT * FROM categories&quot;)-&gt;fetchAll(PDO::FETCH_ASSOC);
foreach ($data as $k =&gt; $v){
  echo &#039;Category name: &#039;.$v[&#039;name&#039;].&#039;&lt;br&gt;&#039;;
}</code></pre><h4  class="t-redactor__h4">Insert, Update и delete</h4><div class="t-redactor__text">Вставка новых, обновление и удаление существующих данных являются одними из наиболее частых операций с БД. В случае с PDO этот процесс обычно состоит из двух шагов. Рассмотрим примеры:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Добавление записей
$name = &#039;Новая категория&#039;;
$query = &quot;INSERT INTO `categories` (`name`) VALUES (:name)&quot;;
$params = [
    &#039;:name&#039; =&gt; $name
];
$stmt = $pdo-&gt;prepare($query);
$stmt-&gt;execute($params);</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Изменение записей
$id = 1;
$name = &#039;Изменённая запись&#039;;
$query = &quot;UPDATE `categories` SET `name` = :name WHERE `id` = :id&quot;;
$params = [
    &#039;:id&#039; =&gt; $id,
    &#039;:name&#039; =&gt; $name
];
$stmt = $pdo-&gt;prepare($query);
$stmt-&gt;execute($params);</code></pre><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Удаление записей
$id = 1;
$query = &quot;DELETE FROM `categories` WHERE `id` = ?&quot;;
$params = [$id];
$stmt = $pdo-&gt;prepare($query);
$stmt-&gt;execute($params);</code></pre>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Безопасное хеширование паролей в PHP</title>
			<link>https://www.easyitway.com/tpost/t6ft7dx421-bezopasnoe-heshirovanie-parolei-v-php</link>
			<amplink>https://www.easyitway.com/tpost/t6ft7dx421-bezopasnoe-heshirovanie-parolei-v-php?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 18:09:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Такие хеширующие алгоритмы как MD5, SHA1 и SHA256 были спроектированы очень быстрыми и эффективными.</description>
			<turbo:content>
<![CDATA[<header><h1>Безопасное хеширование паролей в PHP</h1></header><div class="t-redactor__text">Такие хеширующие алгоритмы как MD5, SHA1 и SHA256 были спроектированы очень быстрыми и эффективными. При наличии современных технологий и оборудования, стало довольно просто выяснить результат этих алгоритмов методом «грубой силы» для определения оригинальных вводимых данных.</div><div class="t-redactor__text">Из-за той скорости, с которой современные компьютеры могут «обратить» эти хеширующие алгоритмы, многие профессионалы компьютерной безопасности строго не рекомендуют использовать их для хеширования паролей.</div><div class="t-redactor__text">С PHP 5.5 появилось API хеширования паролей, которое безопасно работает и с хешированием и с проверкой паролей.</div><div class="t-redactor__text">API хеширования паролей предоставляет простую в использовании обертку функции crypt() и некоторых других алгоритмов хеширования пароля для легкого создания и управления паролями.</div><div class="t-redactor__text">Для сборки этого расширения не требуются внешние библиотеки. Для хеширования паролей через Argon2 требуется «<a href="https://github.com/P-H-C/phc-winner-argon2" target="_blank" rel="noreferrer noopener">libargon2</a>«. Начиная с PHP 7.3.0, требуется libargon2 версии 20161029 или выше.</div><div class="t-redactor__text">Хэш API состоит из следующих функций:</div><div class="t-redactor__text"><ol><li><strong>password_get_info</strong> — Возвращает информацию о заданном хеше.</li><li><strong>password_hash</strong> — Создает хеш пароля.</li><li><strong>password_needs_rehash</strong> — Проверяет, что указанный хеш соответствует заданным опциям.</li><li><strong>password_verify</strong> — Проверяет, соответствует ли пароль хешу.</li></ol></div><h4  class="t-redactor__h4">password_hash()</h4><div class="t-redactor__text">Функция password_hash() упрощает процесс настолько, насколько это возможно. Если вам нужно создать хэш пароля, вызовите эту функцию и запишите значение в базу данных. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$hash = password_hash($passwod, PASSWORD_DEFAULT);</code></pre><div class="t-redactor__text">Первый параметр — это строка представляющая собой пароль; второй — алгоритм, который будет применён.</div><div class="t-redactor__text">В данный момент поддерживаются следующие алгоритмы:</div><div class="t-redactor__text"><strong>PASSWORD_DEFAULT</strong> — используется алгоритм bcrypt (по умолчанию с PHP 5.5.0).</div><div class="t-redactor__text"><strong>PASSWORD_BCRYPT</strong> — использует алгоритм CRYPT_BLOWFISH. Генерирует стандартный хеш, совместимый с генерированным функцией crypt() с использованием идентификатора «$2y$». В результате будет сгенерирована строка длиной 60 символов, или FALSE в случае возникновения ошибки.</div><div class="t-redactor__text"><strong>PASSWORD_ARGON2I</strong> — Использовать алгоритм хеширования Argon2i. Этот алгоритм доступен только если PHP собран с поддержкой Argon2.</div><div class="t-redactor__text"><strong>PASSWORD_ARGON2ID</strong> — Использовать алгоритм хеширования Argon2id. Этот алгоритм доступен только если PHP собран с поддержкой Argon2.</div><div class="t-redactor__text">Если вы используете <strong>PASSWORD_DEFAULT</strong>, то знайте, что на выходе получите строку из более 60 символов. Она может быть и больше, особенно, при использовании других алгоритмов, так что в таблице размер поля можете выставить 255.</div><div class="t-redactor__text">Важно понять, что вам самим не нужно передавать соль или параметр cost (стоимость — количество раундов подготовки ключей). Новый API сделает это за вас.</div><h4  class="t-redactor__h4">password_verify()</h4><div class="t-redactor__text">Функция password_verify() принимает пароль в обычном виде и его хэш. В зависимости от результатов проверки, возвращает true или false. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">if (password_verify($password, $hash)) {
    // Успех!
}
else {
    // Провал
}
// password - полученный пароль от пользователя
// hash - хеш хранящийся в базе данных</code></pre><h4  class="t-redactor__h4">password_needs_rehash()</h4><div class="t-redactor__text">Если необходимо обновить параметры соли или стоимости, то в этом случае, можно воспользоваться функцией password_needs_rehash() для проверки данного факта:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">if (password_needs_rehash($hash, PASSWORD_DEFAULT, [&#039;cost&#039; =&gt; 12])) {
// необходимо создать хэш пароля ещё раз
$hash = password_hash($password, PASSWORD_DEFAULT, [&#039;cost&#039; =&gt; 12]);
}</code></pre><div class="t-redactor__text">Данную операцию можно делать при входе пользователя в систему, ведь только тогда у нас есть доступ к паролю в явном виде.</div><h4  class="t-redactor__h4">password_get_info()</h4><div class="t-redactor__text">password_get_info() возвращает параметры хеширования:</div><div class="t-redactor__text"><ol><li><strong>algo</strong> – константа с названием алгоритма</li><li><strong>algoName</strong> – название алгоритма</li><li><strong>options</strong> – различные настройки</li></ol></div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Библиотека RedBeanPHP</title>
			<link>https://www.easyitway.com/tpost/aitk7tj521-biblioteka-redbeanphp</link>
			<amplink>https://www.easyitway.com/tpost/aitk7tj521-biblioteka-redbeanphp?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 18:11:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>RedBeanPHP — это мощная ORM для PHP, которая значительно упрощает работу с базами данных.</description>
			<turbo:content>
<![CDATA[<header><h1>Библиотека RedBeanPHP</h1></header><div class="t-redactor__text"><strong>RedBeanPHP</strong> — это мощная ORM для PHP, которая значительно упрощает работу с базами данных.</div><div class="t-redactor__text">ORM или Object-relational mapping (Объектно-реляционное отображение) — это технология программирования, которая позволяет преобразовывать несовместимые типы моделей в ООП, в частности, между хранилищем данных и объектами программирования.</div><div class="t-redactor__text">ORM используется для упрощения процесса сохранения объектов в реляционную базу данных и их извлечения, при этом ORM сама заботится о преобразовании данных между двумя несовместимыми состояниями.</div><h4  class="t-redactor__h4">Установка библиотеки</h4><div class="t-redactor__text">Библиотека состоит из одного файла. Для работы необходимо расширение PDO. Библиотека поддерживает такие БД, как: MySQL, SQLite и Postgres.</div><div class="t-redactor__text">Скачать библиотеку можно с официального сайта: «<a href="https://redbeanphp.com/index.php" target="_blank" rel="noreferrer noopener">redbeanphp.com</a>«. Перейдя на сайт, для скачивания библиотеки зайдите во вкладку «Download». На момент написания статьи авторы библиотеки рекомендуют скачивать версию 5.4:</div><img src="https://static.tildacdn.com/tild3461-3565-4230-a130-373936333035/redbeanphp_1.png"><div class="t-redactor__text">После скачивания файла, распакуйте его и поместите в ваш проект. С помощью require подключите её в проект. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">require &quot;libs/rb-mysql.php&quot;;</code></pre><h4  class="t-redactor__h4">Подключение</h4><div class="t-redactor__text">В проекте создаём файл db.php и подключаемся к БД MySQL:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">require &quot;libs/rb-mysql.php&quot;;

// localhost - host по умолчанию
// dbname - имя базы данных
// root - логин
// после логина идет пароль

R::setup( &#039;mysql:host=localhost;dbname=register_rb&#039;,
        &#039;root&#039;, &#039;&#039; );

// Если после пароля поставить true, тогда функция создания таблиц на лету будет включена
// Если после пароля поставить false, тогда функция создания таблиц на лету будет отключена

// Проверка подключения к БД
if(!R::testConnection()) die(&#039;No DB connection!&#039;);</code></pre><div class="t-redactor__text">Если у Вас другая БД, тогда можете зайти на официальный сайт библиотеки на вкладку «<a href="https://redbeanphp.com/index.php?p=/connection" target="_blank" rel="noreferrer noopener">Connection</a>» и там найдете примеры подключения к другим БД.</div><h4  class="t-redactor__h4">Создание таблиц и записей</h4><div class="t-redactor__text">В RedBeanPHP есть уникальная способность создавать таблицы на лету и заносить в них необходимые записи (как включать или отключать эту способность я написал в примере выше). Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Создаем таблицу users
$user = R::dispense(&#039;users&#039;);

// добавляем в таблицу необходимые записи
$user-&gt;login = $data[&#039;login&#039;];
$user-&gt;email = $data[&#039;email&#039;];
$user-&gt;name = $data[&#039;name&#039;];
$user-&gt;family = $data[&#039;family&#039;];

// Сохраняем таблицу
R::store($user);</code></pre><h4  class="t-redactor__h4">Удаление записей</h4><div class="t-redactor__text">Удаление из БД делается так:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// одна запись
R::trash( $book );

// Удалить записи с ID = 6, 7
$ids = [6, 7];
R::trashBatch(&#039;book&#039;, $ids);

// все записи
R::wipe( &#039;book&#039; );</code></pre><h4  class="t-redactor__h4">Чтение данных</h4><div class="t-redactor__text">Если нужно получить данные без каких-либо условий, то легче это сделать методами <strong>load()</strong> и <strong>loadAll()</strong>. Пример:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Получаем все записи, ID которых указаны в массиве ids
$ids = [1,2,3];
$books = R::loadAll(&#039;book&#039;, $ids);
foreach ($books as $book){
  echo $book-&gt;title.&#039;&lt;br/&gt;&#039;;
}
 
// Получаем одну запись по её ID
$id = 1;
$books = R::load(&#039;books&#039;, $id);
echo $books-&gt;title;</code></pre><h4  class="t-redactor__h4">Обновление записи</h4><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$id = 1;
// Загружаем объект с ID = 1
$book = R::load(&#039;book&#039;, $id);

// Обращаемся к свойству объекта и назначаем ему новое значение
$book-&gt;price = 210;

// Сохраняем объект
R::store($book);</code></pre><h4  class="t-redactor__h4">Поиск данных</h4><div class="t-redactor__text">Если вы не знаете идентификатор бина, вы можете искать бины, используя метод <strong>find()</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$min_price = 250;
$books = R::find(&#039;book&#039;, &#039;price &gt; ?&#039;, [$min_price]);
 
$search = &#039;строка&#039;;
$books = R::find(&#039;book&#039;, &#039;author LIKE ?&#039;, [&quot;%$search%&quot;]);
 
$id = 1;
$min_price = 300;
$books = R::find(&#039;book&#039;, &#039;id &gt; :id AND price &lt; :price&#039;, [&#039;:price&#039; =&gt; $min_price, &#039;:id&#039; =&gt; $id]);
 
$ids = [1, 3, 5];
$books = R::find(&#039;book&#039;, &#039;id IN (&#039; . R::genSlots($ids) . &#039;)&#039;, $ids);</code></pre><div class="t-redactor__text">Если необходимо получить только одну запись, используем метод <strong>findOne()</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$id = 1;
$book = R::findOne(&#039;book&#039;, &#039;id = ?&#039;, [$id]);
 
$title = &#039;гостья из будущего&#039;;
$book = R::findOne(&#039;book&#039;, &#039;title = ?&#039;, [$title]);</code></pre><div class="t-redactor__text">Если необходимо получить все данные без особых условий, используем метод <strong>findAll()</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">$books = R::findAll(&#039;book&#039;);
 
$limit = 5;
$books = R::findAll(&#039;book&#039;, &#039;ORDER BY id ASC LIMIT ?&#039;, [$limit]);</code></pre><div class="t-redactor__text">На этом наше небольшое знакомство с данной библиотекой окончено, но вы можете зайти на официальный сайт библиотеки и изучить официальную документацию.</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Создание системы регистрации и авторизации на PHP</title>
			<link>https://www.easyitway.com/tpost/ycv2slf8y1-sozdanie-sistemi-registratsii-i-avtoriza</link>
			<amplink>https://www.easyitway.com/tpost/ycv2slf8y1-sozdanie-sistemi-registratsii-i-avtoriza?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 18:18:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>В этой статье мы создадим систему регистрации и авторизации. Что нам понадобиться для написания такой системы:</description>
			<turbo:content>
<![CDATA[<header><h1>Создание системы регистрации и авторизации на PHP</h1></header><div class="t-redactor__text">В этой статье мы создадим систему регистрации и авторизации. Что нам понадобиться для написания такой системы:</div><div class="t-redactor__text"><ol><li>Язык программирования PHP;</li><li>Библиотека RedBeanPHP для соединения с базой данных;</li><li>Язык гипертекстовой разметки (HTML);</li><li>Каскадные стили таблиц (CSS);</li><li>Фреймворк Bootstrap;</li><li>Функции API для хеширования паролей;</li><li>Локальный сервер XAMPP;</li></ol></div><h4  class="t-redactor__h4">1. Создание базы данных</h4><div class="t-redactor__text">Создаем базу данных в интерфейсе «<a href="https://php-myadmin.ru/" target="_blank" rel="noreferrer noopener">phpAdmin</a>«. Базу данных называете как вам угодно, в <strong>«Сравнение»</strong> выбираем <strong>«utf8_general_ci»</strong>:</div><img src="https://static.tildacdn.com/tild6665-6237-4636-b037-653661353264/register_avt_php_1.jpg"><div class="t-redactor__text">Таблицу создавать не надо, т.к. таблица будет создаваться при регистрации пользователя.</div><h4  class="t-redactor__h4">2. Соединение с базой данных</h4><div class="t-redactor__text">На локальном сервере XAMPP в папке «htdocs» создаем папку нашего будущего проекта. В этой папке создаем первый php файл «db.php». Он нужен для соединения с базой данных.</div><div class="t-redactor__text">Так как мы будем пользоваться библиотекой RedBeanPHP, тогда надо скачать библиотеку и подключить к проекту. Мы создадим в папке проекта папку «libs» и туда закинем библиотеку. Листинг файла <strong>db.php</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
// Подключаем библиотеку RedBeanPHP
require &quot;libs/rb-mysql.php&quot;;

// Подключаемся к БД
R::setup( &#039;mysql:host=localhost;dbname=register&#039;,
        &#039;root&#039;, &#039;&#039; );

// Проверка подключения к БД
if(!R::testConnection()) die(&#039;No DB connection!&#039;);

session_start(); // Создаем сессию для авторизации
?&gt;</code></pre><div class="t-redactor__text">Имя пользователя для соединения c базой данных устанавливается по умолчанию (XAMPP), конечно если в phpMyAdmin вы их не меняли.</div><h4  class="t-redactor__h4">3. Создание шапки и подвала проекта</h4><div class="t-redactor__text">Создадим два файла и назовём их «header.php» и «footer.php». Мы их будем подключать к нашим будущим формам. В статье «PHP. Динамическое создание страниц» можно изучить для чего это необходимо. Листинг файла <strong>header.php</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ru&quot;&gt;
&lt;head&gt;
	&lt;title&gt;&lt;?php echo $title; ?&gt;&lt;/title&gt;
	&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/bootstrap.min.css&quot;&gt;
	&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/style.css&quot;&gt;
	&lt;meta content=&quot;text/html; charset=utf-8&quot;&gt;
&lt;/head&gt;
&lt;body&gt;</code></pre><div class="t-redactor__text">Это обычная шапка проекта. Для подключения стилей создайте в проекте папку «css» и в ней создайте файл style.css, а также скачайте файл фреймворка Bootstrap и закиньте его в эту папку.<br /><br />Переменная $title необходима для изменения названия страниц на разных формах (т.к. в проекте будет больше одной формы). Листинг файла <strong>footer.php</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;/body&gt;
&lt;/html&gt;</code></pre><div class="t-redactor__text">Листинг файла <strong>style.css</strong>:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">form, h2, p{
	width: 500px;
	margin-left: 300px;
}</code></pre><h4  class="t-redactor__h4">4. Создание форм</h4><div class="t-redactor__text">С помощью HTML, CSS и Bootstrap создадим необходимые формы приложения. В папке проекта создаем форму регистрации. Файл назовём <strong>«signup.php»</strong>. Листинг файла:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php 
$title=&quot;Форма регистрации&quot;; // название формы
require __DIR__ . &#039;/header.php&#039;; // подключаем шапку проекта
require &quot;db.php&quot;; // подключаем файл для соединения с БД
?&gt;

&lt;div class=&quot;container mt-4&quot;&gt;
		&lt;div class=&quot;row&quot;&gt;
			&lt;div class=&quot;col&quot;&gt;
	   &lt;!-- Форма регистрации --&gt;
		&lt;h2&gt;Форма регистрации&lt;/h2&gt;
		&lt;form action=&quot;signup.php&quot; method=&quot;post&quot;&gt;
			&lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;login&quot; id=&quot;login&quot; placeholder=&quot;Введите логин&quot;&gt;&lt;br&gt;
			&lt;input type=&quot;email&quot; class=&quot;form-control&quot; name=&quot;email&quot; id=&quot;email&quot; placeholder=&quot;Введите Email&quot;&gt;&lt;br&gt;
			&lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;name&quot; id=&quot;name&quot; placeholder=&quot;Введите имя&quot; required&gt;&lt;br&gt;
			&lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;family&quot; id=&quot;family&quot; placeholder=&quot;Введите фамилию&quot; required&gt;&lt;br&gt;
			&lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;password&quot; id=&quot;password&quot; placeholder=&quot;Введите пароль&quot;&gt;&lt;br&gt;
			&lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;password_2&quot; id=&quot;password_2&quot; placeholder=&quot;Повторите пароль&quot;&gt;&lt;br&gt;
			&lt;button class=&quot;btn btn-success&quot; name=&quot;do_signup&quot; type=&quot;submit&quot;&gt;Зарегистрировать&lt;/button&gt;
		&lt;/form&gt;
		&lt;br&gt;
		&lt;p&gt;Если вы зарегистрированы, тогда нажмите &lt;a href=&quot;login.php&quot;&gt;здесь&lt;/a&gt;.&lt;/p&gt;
		&lt;p&gt;Вернуться на &lt;a href=&quot;index.php&quot;&gt;главную&lt;/a&gt;.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;
	&lt;/div&gt;
&lt;?php require __DIR__ . &#039;/footer.php&#039;; ?&gt; &lt;!-- Подключаем подвал проекта --&gt;</code></pre><div class="t-redactor__text">Итоговый дизайн формы регистрации:</div><img src="https://static.tildacdn.com/tild3066-3233-4039-b263-306532613065/register_avt_php_2.jpg"><div class="t-redactor__text">В папке проекта создаем форму авторизации. Файл назовём <strong>«login.php»</strong>. Листинг файла:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php 
$title=&quot;Форма авторизации&quot;; // название формы
require __DIR__ . &#039;/header.php&#039;; // подключаем шапку проекта
require &quot;db.php&quot;; // подключаем файл для соединения с БД
?&gt;

&lt;div class=&quot;container mt-4&quot;&gt;
		&lt;div class=&quot;row&quot;&gt;
			&lt;div class=&quot;col&quot;&gt;
		&lt;!-- Форма авторизации --&gt;
		&lt;h2&gt;Форма авторизации&lt;/h2&gt;
		&lt;form action=&quot;login.php&quot; method=&quot;post&quot;&gt;
			&lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;login&quot; id=&quot;login&quot; placeholder=&quot;Введите логин&quot; required&gt;&lt;br&gt;
			&lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;password&quot; id=&quot;pass&quot; placeholder=&quot;Введите пароль&quot; required&gt;&lt;br&gt;
			&lt;button class=&quot;btn btn-success&quot; name=&quot;do_login&quot; type=&quot;submit&quot;&gt;Авторизоваться&lt;/button&gt;
		&lt;/form&gt;
		&lt;br&gt;
		&lt;p&gt;Если вы еще не зарегистрированы, тогда нажмите &lt;a href=&quot;signup.php&quot;&gt;здесь&lt;/a&gt;.&lt;/p&gt;
		&lt;p&gt;Вернуться на &lt;a href=&quot;index.php&quot;&gt;главную&lt;/a&gt;.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;
	&lt;/div&gt;

&lt;?php require __DIR__ . &#039;/footer.php&#039;; ?&gt; &lt;!-- Подключаем подвал проекта --&gt;</code></pre><div class="t-redactor__text">Итоговый дизайн формы авторизации:</div><img src="https://static.tildacdn.com/tild3433-6233-4131-a631-623361663131/register_avt_php_3.jpg"><div class="t-redactor__text">Формы будут обрабатываться с помощью метода POST. Обработка форм будет в файлах с формами.</div><h4  class="t-redactor__h4">5. Обработка формы регистрации</h4><div class="t-redactor__text">В файле <strong>«signup.php»</strong> после подключения файла с базой данных пишем код описанный ниже. Чтобы понять код читайте комментарии к нему. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Создаем переменную для сбора данных от пользователя по методу POST
$data = $_POST;

// Пользователь нажимает на кнопку &quot;Зарегистрировать&quot; и код начинает выполняться
if(isset($data[&#039;do_signup&#039;])) {

        // Регистрируем
        // Создаем массив для сбора ошибок
	$errors = array();

	// Проводим проверки
        // trim — удаляет пробелы (или другие символы) из начала и конца строки
	if(trim($data[&#039;login&#039;]) == &#039;&#039;) {

		$errors[] = &quot;Введите логин!&quot;;
	}

	if(trim($data[&#039;email&#039;]) == &#039;&#039;) {

		$errors[] = &quot;Введите Email&quot;;
	}


	if(trim($data[&#039;name&#039;]) == &#039;&#039;) {

		$errors[] = &quot;Введите Имя&quot;;
	}

	if(trim($data[&#039;family&#039;]) == &#039;&#039;) {

		$errors[] = &quot;Введите фамилию&quot;;
	}

	if($data[&#039;password&#039;] == &#039;&#039;) {

		$errors[] = &quot;Введите пароль&quot;;
	}

	if($data[&#039;password_2&#039;] != $data[&#039;password&#039;]) {

		$errors[] = &quot;Повторный пароль введен не верно!&quot;;
	}
         // функция mb_strlen - получает длину строки
        // Если логин будет меньше 5 символов и больше 90, то выйдет ошибка
	if(mb_strlen($data[&#039;login&#039;]) &lt; 5 || mb_strlen($data[&#039;login&#039;]) &gt; 90) {

	    $errors[] = &quot;Недопустимая длина логина&quot;;

    }

    if (mb_strlen($data[&#039;name&#039;]) &lt; 3 || mb_strlen($data[&#039;name&#039;]) &gt; 50){
	    
	    $errors[] = &quot;Недопустимая длина имени&quot;;

    }

    if (mb_strlen($data[&#039;family&#039;]) &lt; 5 || mb_strlen($data[&#039;family&#039;]) &gt; 50){
	    
	    $errors[] = &quot;Недопустимая длина фамилии&quot;;

    }

    if (mb_strlen($data[&#039;password&#039;]) &lt; 2 || mb_strlen($data[&#039;password&#039;]) &gt; 8){
	
	    $errors[] = &quot;Недопустимая длина пароля (от 2 до 8 символов)&quot;;

    }

    // проверка на правильность написания Email
    if (!preg_match(&quot;/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i&quot;, $data[&#039;email&#039;])) {

	    $errors[] = &#039;Неверно введен е-mail&#039;;
    
    }

	// Проверка на уникальность логина
	if(R::count(&#039;users&#039;, &quot;login = ?&quot;, array($data[&#039;login&#039;])) &gt; 0) {

		$errors[] = &quot;Пользователь с таким логином существует!&quot;;
	}

	// Проверка на уникальность email

	if(R::count(&#039;users&#039;, &quot;email = ?&quot;, array($data[&#039;email&#039;])) &gt; 0) {

		$errors[] = &quot;Пользователь с таким Email существует!&quot;;
	}


	if(empty($errors)) {

		// Все проверено, регистрируем
		// Создаем таблицу users
		$user = R::dispense(&#039;users&#039;);

                // добавляем в таблицу записи
		$user-&gt;login = $data[&#039;login&#039;];
		$user-&gt;email = $data[&#039;email&#039;];
		$user-&gt;name = $data[&#039;name&#039;];
		$user-&gt;family = $data[&#039;family&#039;];

		// Хешируем пароль
		$user-&gt;password = password_hash($data[&#039;password&#039;], PASSWORD_DEFAULT);

		// Сохраняем таблицу
		R::store($user);
        echo &#039;&lt;div style=&quot;color: green; &quot;&gt;Вы успешно зарегистрированы! Можно &lt;a href=&quot;login.php&quot;&gt;авторизоваться&lt;/a&gt;.&lt;/div&gt;&lt;hr&gt;&#039;;

	} else {
                // array_shift() извлекает первое значение массива array и возвращает его, сокращая размер array на один элемент. 
		echo &#039;&lt;div style=&quot;color: red; &quot;&gt;&#039; . array_shift($errors). &#039;&lt;/div&gt;&lt;hr&gt;&#039;;
	}
}</code></pre><div class="t-redactor__text">Как видите наша регистрация безопасна на 100% т.к. есть множество различных проверок и хеширование пароля. Зарегистрировать двух пользователей с одинаковым логином и Email невозможно. Вы можете добавить и другие проверки при регистрации.</div><h4  class="t-redactor__h4">6. Обработка формы авторизации</h4><div class="t-redactor__text">В файле <strong>«login.php»</strong> после подключения файла с базой данных пишем код описанный ниже. Чтобы понять код читайте комментарии к нему. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// Создаем переменную для сбора данных от пользователя по методу POST
$data = $_POST;

// Пользователь нажимает на кнопку &quot;Авторизоваться&quot; и код начинает выполняться
if(isset($data[&#039;do_login&#039;])) { 

 // Создаем массив для сбора ошибок
 $errors = array();

 // Проводим поиск пользователей в таблице users
 $user = R::findOne(&#039;users&#039;, &#039;login = ?&#039;, array($data[&#039;login&#039;]));

 if($user) {

 	// Если логин существует, тогда проверяем пароль
 	if(password_verify($data[&#039;password&#039;], $user-&gt;password)) {

 		// Все верно, пускаем пользователя
 		$_SESSION[&#039;logged_user&#039;] = $user;
 		
 		// Редирект на главную страницу
                header(&#039;Location: index.php&#039;);

 	} else {
    
    $errors[] = &#039;Пароль неверно введен!&#039;;

 	}

 } else {
 	$errors[] = &#039;Пользователь с таким логином не найден!&#039;;
 }

if(!empty($errors)) {

		echo &#039;&lt;div style=&quot;color: red; &quot;&gt;&#039; . array_shift($errors). &#039;&lt;/div&gt;&lt;hr&gt;&#039;;

	}

}</code></pre><h4  class="t-redactor__h4">7. Создание главного файла приложения</h4><div class="t-redactor__text">Все формы и обработчики форм мы написали, а теперь создадим главный файл где будет отображаться приветствие пользователя, когда он будет авторизован. Файл назовём <strong>«index.php»</strong>. Листинг:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php
$title=&quot;Главная страница&quot;; // название формы
require __DIR__ . &#039;/header.php&#039;; // подключаем шапку проекта
require &quot;db.php&quot;; // подключаем файл для соединения с БД
?&gt;

&lt;div class=&quot;container mt-4&quot;&gt;
&lt;div class=&quot;row&quot;&gt;
&lt;div class=&quot;col&quot;&gt;
&lt;center&gt;
&lt;h1&gt;Добро пожаловать на наш сайт!&lt;/h1&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;!-- Если авторизован выведет приветствие --&gt;
&lt;?php if(isset($_SESSION[&#039;logged_user&#039;])) : ?&gt;
	Привет, &lt;?php echo $_SESSION[&#039;logged_user&#039;]-&gt;name; ?&gt;&lt;/br&gt;

&lt;!-- Пользователь может нажать выйти для выхода из системы --&gt;
&lt;a href=&quot;logout.php&quot;&gt;Выйти&lt;/a&gt; &lt;!-- файл logout.php создадим ниже --&gt;
&lt;?php else : ?&gt;

&lt;!-- Если пользователь не авторизован выведет ссылки на авторизацию и регистрацию --&gt;
&lt;a href=&quot;login.php&quot;&gt;Авторизоваться&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;signup.php&quot;&gt;Регистрация&lt;/a&gt;
&lt;?php endif; ?&gt;

&lt;?php require __DIR__ . &#039;/footer.php&#039;; ?&gt; &lt;!-- Подключаем подвал проекта --&gt;</code></pre><div class="t-redactor__text">Дизайн главной страницы если пользователь не авторизован:</div><img src="https://static.tildacdn.com/tild3733-3364-4232-b962-646131623931/register_avt_php_4-7.jpg"><div class="t-redactor__text">Дизайн главной страницы если пользователь авторизован:</div><img src="https://static.tildacdn.com/tild6234-3761-4630-a232-383465373266/register_avt_php_5-7.jpg"><div class="t-redactor__text">Теперь создадим последний файл в нашем проекте и назовём его <strong>«logout.php»</strong>. Он необходим для удаления сессии пользователя, когда он авторизован. Листинг файла:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">&lt;?php 
require __DIR__ . &#039;/header.php&#039;; // подключаем шапку проекта
require &quot;db.php&quot;; // подключаем файл для соединения с БД

// Производим выход пользователя
unset($_SESSION[&#039;logged_user&#039;]);

// Редирект на главную страницу
header(&#039;Location: index.php&#039;);

require __DIR__ . &#039;/footer.php&#039;; // Подключаем подвал проекта
?&gt;</code></pre><div class="t-redactor__text">После этого можно запустить страничку в браузере и проверить результат работы. Если Вы правильно записали, тогда все должно работать идеально, но если есть ошибки значит проверьте правильность кода.<br /><br />Структура проекта в виде дерева:</div><img src="https://static.tildacdn.com/tild3464-6530-4161-b736-656635336661/register_avt_php_6.jpg"><div class="t-redactor__text">На этом мы заканчиваем создание системы регистрации и авторизации на PHP. В комментариях жду Ваших предложений по доработке этого приложения. Удачи в разработке!</div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Фреймворк Yii</title>
			<link>https://www.easyitway.com/tpost/obe3sz48v1-freimvork-yii</link>
			<amplink>https://www.easyitway.com/tpost/obe3sz48v1-freimvork-yii?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 18:27:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>Yii — это высокоэффективный основанный на компонентной структуре PHP-фреймворк для разработки масштабных веб-приложений. </description>
			<turbo:content>
<![CDATA[<header><h1>Фреймворк Yii</h1></header><div class="t-redactor__text"><a href="https://yiiframework.ru/" target="_blank" rel="noreferrer noopener">Yii</a> — это высокоэффективный основанный на компонентной структуре PHP-фреймворк для разработки масштабных веб-приложений. Он позволяет максимально применить концепцию повторного использования кода и может существенно ускорить процесс веб-разработки. Название Yii означает простой, эффективный и расширяемый.</div><div class="t-redactor__text">Yii можно использовать для разработки любого вида веб-приложений. Благодаря своей основе компонентов, архитектуре и сложной поддержки кэширования, фреймворк подходит для разработки крупномасштабных проектов, таких как порталы, форумы, системы управления контентом (CMS), систем электронной коммерции, RESTful веб-сервисов и т.д.</div><div class="t-redactor__text">Yii является full-stack фреймворком, предоставляя множество проверенных и готовых к использованию функций: построитель запросов и ActiveRecord для реляционных и NoSQL баз данных, RESTful API, поддержку многоуровневого кэширования и т.п.</div><h4  class="t-redactor__h4">История фреймворка</h4><div class="t-redactor__text">История Yii началась 1 января 2008 года, как проект по исправлению некоторых изъянов во фреймворке PRADO (PHP Rapid Application Development Object-oriented), ставшего в 2004 победителем «Zend PHP 5 coding contest».</div><div class="t-redactor__text">Фреймворк PRADO был попыткой перенести ASP.NET на платформу PHP, включая ViewState, PostBacks, Page_Load и OnClick, вследствие чего встречались участки кода просто скопированные из ASP.NET.</div><div class="t-redactor__text">В определенный момент основатель и разработчик ядра фреймворка PRADO — Цян Суэ понял, что PHP-фреймворк должен быть построен несколько по-другому. В октябре 2008 года, после более 10 месяцев закрытой разработки, вышла первая альфа-версия. 3 декабря 2008 был выпущен Yii 1.0.</div><div class="t-redactor__text">24 Марта 2020 вышел Yii 2.0.33. Исправлено 22 ошибки, сделано 4 улучшения. Релиз Yii 3 планируется в 2020 году.</div><h4  class="t-redactor__h4">Основные преимущества и возможности фреймворка</h4><div class="t-redactor__text"><ol><li>Обеспечивает высокую производительность относительно других php-фреймворков;</li><li>Основан на парадигме MVC (Модель-Представление-Контроллер);</li><li>Есть интерфейсы DAO и ActiveRecord для работы с базами данных (используется PDO);</li><li>Поддерживает интернационализацию;</li><li>Позволяет кешировать как страницы целиком, так и отдельные фрагменты;</li><li>Осуществляет перехват и обработка ошибок;</li><li>Имеет функционал работы с формами, обеспечивает их построение и валидацию;</li><li>Реализованы аутентификация и авторизация;</li><li>Удобен для реализации AJAX-интерфейсов, интегрируется с jQuery;</li><li>В фреймворк встроены генераторы базового PHP-кода для CRUD-операций (скаффолдинг);</li><li>Поддерживает темы оформления;</li><li>Имеет возможность подключения сторонних библиотек;</li><li>Работает с миграциями баз данных (генерация, применение и откат);</li><li>Позволяет осуществлять автоматическое тестирование и вести разработку в стиле TDD;</li><li>Поддерживает стиль REST.</li></ol></div><h4  class="t-redactor__h4">Требования PHP</h4><div class="t-redactor__text">Yii 2.0 требует PHP 5.4 или выше, по сравнению с Yii 1.1, который использует PHP версии 5.2. В результате, есть много различий на уровне языка.</div><div class="t-redactor__text"><ol><li>Namespaces;</li><li>Анонимные функции;</li><li>Короткий синтаксис массива;</li><li>Короткая запись открывающих и закрывающих php тегов;</li><li>SPL классы и интерфейсы;</li><li>Поздние статические привязки;</li><li>Дата и время;</li><li>Traits;</li><li>intl расширение PHP для интернационализации.</li></ol></div><h4  class="t-redactor__h4">Namespace</h4><div class="t-redactor__text">В Yii используются пространства имен, например, yii\web\Request. Имена присваиваются по структуре каталогов. Допустим, yii\web\Request указывает на то, что файл класса web/Request.php размещается в этом каталоге.</div><h4  class="t-redactor__h4">Компоненты и объекты</h4><div class="t-redactor__text">Yii содержит два основных класса: класса: yii\base\Object и yii\base\Component. Класс объекта это легкий базовый класс, который определяет свойства объекта с помощью геттеров и сеттереров (getters и setters). Компонент класса поддерживает события и поведение.</div><h4  class="t-redactor__h4">Версии</h4><div class="t-redactor__text">Существует две основных версии фреймворка — это 1.1 и 2.0. Вторая версия — это переписанный фреймворк с учетом последних технологий и протоколов (Composer, PSR, пространств имен и так далее).</div><h4  class="t-redactor__h4">Установка Yii</h4><div class="t-redactor__text">Фреймворк можно установить двумя способами: используя <a href="https://getcomposer.org/" target="_blank" rel="noreferrer noopener">Composer</a> или скачав архив. Первый способ предпочтительнее так как позволяет установить новые расширения или обновить Yii одной командой.</div><h4  class="t-redactor__h4">Установка при помощи Composer</h4><div class="t-redactor__text">Если Composer еще не установлен это можно сделать по инструкции на <a href="https://getcomposer.org/download/" target="_blank" rel="noreferrer noopener">getcomposer.org</a>. На Linux или Mac используйте следующую команду:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer</code></pre><div class="t-redactor__text">После установки Composer устанавливать Yii можно запустив следующую команду в командной строке:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">composer create-project --prefer-dist yiisoft/yii2-app-basic basic</code></pre><img src="https://static.tildacdn.com/tild3035-3161-4139-b839-393266653136/composer_1.png"><div class="t-redactor__text">Эта команда устанавливает последнюю стабильную версию Yii в директорию basic. Хранится данная директория будет в папке пользователя. Если вы используете локальный сервер XAMPP, тогда необходимо закинуть директорию basic в папку htdocs.</div><img src="https://static.tildacdn.com/tild6566-3964-4634-a164-393932383338/composer_2-768x422.png"><div class="t-redactor__text">По умолчанию</div><h4  class="t-redactor__h4">Установка из архива</h4><div class="t-redactor__text">Установка Yii из архива состоит из трёх шагов:</div><div class="t-redactor__text"><ol><li>Скачайте архив с <a href="https://www.yiiframework.com/download" target="_blank" rel="noreferrer noopener">yiiframework.com</a>;</li><li>Распакуйте скачанный архив в папку, доступную из Web.</li><li>В файле config/web.php добавьте секретный ключ в значение cookieValidationKey (при установке через Composer это происходит автоматически):</li></ol></div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
&#039;cookieValidationKey&#039; =&gt; &#039;enter your secret key here&#039;,</code></pre><h4  class="t-redactor__h4">Проверка установки</h4><div class="t-redactor__text">После установки приложение будет доступно по следующему URL:</div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">http://localhost/basic/web/index.php</code></pre><img src="https://static.tildacdn.com/tild3565-3739-4463-b130-386165626463/composer_3-768x407.png"><h4  class="t-redactor__h4">Плюсы фреймворка</h4><div class="t-redactor__text"><ol><li>Для русскоязычных разработчиков большим плюсом фреймворка, является хорошая документация, множество статей с примерами кода и сообщество;</li><li>Yii не показатель одного человека, фреймворк подкреплен сильной командой разработчиков ядра, а также большим сообществом профессионалов постоянно способствующих развитию Yii;</li><li>Yii способствует быстрому прототипированию веб-приложения. Он относится к инструментам RAID разработки;</li><li>Встроенный механизм создания виджетов представления, например, для размещения на сайте различных блоков: последние посты, категории, навигация, блоки рекламы и т.п;</li><li>Компонент приложения i18n позволяет производить автоматический перевод сообщений веб-приложения;</li><li>Встроенная поддержка автоматической валидации форм и вывода сообщений об ошибках на основе данных из моделей веб-приложения;</li><li>Механизм Active Record для построения реляционной обработки запросов базы данных;</li><li>Множество готовых расширений на Github и их установка через Composer;</li><li>Встроенные виджеты для отображения данных: DetailView (строки в таблице), ListView (Список), GridView (таблицы);</li><li>Встроенные механизмы для аутентификации, авторизации, регистрации пользователей;</li><li>Содержит встроенную и очень удобную debug панель.</li></ol></div><h4  class="t-redactor__h4">Минусы фреймворка</h4><div class="t-redactor__text"><ol><li>Слабая экосистема вокруг фреймворка среди англоязычного сегмента разработчиков. Сообщество слишком сильно размазано по разным местам: несколько форумов с небольшой активностью, <a href="https://stackoverflow.com/" target="_blank" rel="noreferrer noopener">stackoverflow</a> и т.п;</li><li>Хоть фреймворк и позволяет делать код простым, но далеко не элегантным. Если его синтаксис сравнивать с фреймворком <a href="https://laravel.ru/" target="_blank" rel="noreferrer noopener">Laravel</a>, то он уступает;</li><li>Yii отстает от языка, стандартов и других фреймворков. Новые обновления с действительно полезными функциями выходят не так часто;</li><li>Слишком большая связанность backend и frontend частей Yii2. Фреймворк предлагает использовать библиотеку jQuery и Bootstrap, которые встроены по умолчанию в ядро фреймворка;</li><li>Не очень гибкая система маршрутизации: нет возможности сгруппировать роуты.</li></ol></div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Установка и настройка phpMyAdmin</title>
			<link>https://www.easyitway.com/tpost/ncjuvrhfz1-ustanovka-i-nastroika-phpmyadmin</link>
			<amplink>https://www.easyitway.com/tpost/ncjuvrhfz1-ustanovka-i-nastroika-phpmyadmin?amp=true</amplink>
			<pubDate>Fri, 29 Dec 2023 18:30:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по PHP</category>
			<description>В этом видео мы установим и настроим программное обеспечение phpMyAdmin на Linux Mint.</description>
			<turbo:content>
<![CDATA[<header><h1>Установка и настройка phpMyAdmin</h1></header><div class="t-redactor__text">В этом видео мы установим и настроим программное обеспечение phpMyAdmin на Linux Mint.</div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/-di9u9H6pzM" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Установка и настройка PostgreSQL в macOS</title>
			<link>https://www.easyitway.com/tpost/lr8pvf6u81-ustanovka-i-nastroika-postgresql-v-macos</link>
			<amplink>https://www.easyitway.com/tpost/lr8pvf6u81-ustanovka-i-nastroika-postgresql-v-macos?amp=true</amplink>
			<pubDate>Thu, 25 Jan 2024 17:57:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы научимся устанавливать систему управления базами данных (СУБД) в операционной системе macOS. </description>
			<turbo:content>
<![CDATA[<header><h1>Установка и настройка PostgreSQL в macOS</h1></header><div class="t-redactor__text">В этом видео мы научимся устанавливать систему управления базами данных (СУБД) в операционной системе macOS. <br /><br />Данный урок является одним из курса по "Администрирование баз данных в СУБД PostgreSQL". Ссылка на курс: <a href="https://it-black.ru/course-postgresql" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-postgresql</a><br />Остальные курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course </a><br />Установка и настройка СУБД PostgreSQL на Windows 10: <a href="https://youtu.be/Banzbq2e9o8" target="_blank" rel="noreferrer noopener">https://youtu.be/Banzbq2e9o8</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/snLQ6GsxnLk" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Установка PostgreSQL 15 на Debian 12</title>
			<link>https://www.easyitway.com/tpost/fsbfumukd1-ustanovka-postgresql-15-na-debian-12</link>
			<amplink>https://www.easyitway.com/tpost/fsbfumukd1-ustanovka-postgresql-15-na-debian-12?amp=true</amplink>
			<pubDate>Sun, 28 Jan 2024 00:06:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы научимся устанавливать систему управления базами данных (СУБД) 15 версии в операционной системе Debian 12.</description>
			<turbo:content>
<![CDATA[<header><h1>Установка PostgreSQL 15 на Debian 12</h1></header><div class="t-redactor__text">В этом видео мы научимся устанавливать систему управления базами данных (СУБД) 15 версии в операционной системе Debian 12. <br /><br />Данный урок является одним из курса по теме "Администрирование баз данных в СУБД PostgreSQL". Ссылка на курс: <a href="https://it-black.ru/course-postgresql" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-postgresql</a><br /><br />Остальные курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/Sop5LPhyrGE" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Выборка данных с помощью запросов SELECT в PostgreSQL</title>
			<link>https://www.easyitway.com/tpost/yhmnbrgpr1-viborka-dannih-s-pomoschyu-zaprosov-sele</link>
			<amplink>https://www.easyitway.com/tpost/yhmnbrgpr1-viborka-dannih-s-pomoschyu-zaprosov-sele?amp=true</amplink>
			<pubDate>Wed, 31 Jan 2024 19:14:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы научимся выполнять запросы выборки данных из таблицы с помощью оператора SELECT в СУБД PostgreSQL. </description>
			<turbo:content>
<![CDATA[<header><h1>Выборка данных с помощью запросов SELECT в PostgreSQL</h1></header><div class="t-redactor__text">В этом видео мы научимся выполнять запросы выборки данных из таблицы с помощью оператора SELECT в СУБД PostgreSQL. <br /><br />Данный урок является одним из курса по теме "Администрирование баз данных в СУБД PostgreSQL". <br /><br />Ссылка на курс: <a href="https://it-black.ru/course-postgresql" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-postgresql </a><br />Остальные курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/NbizkHoi61Q" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Методы связывания таблиц в PostgreSQL (JOINS)</title>
			<link>https://www.easyitway.com/tpost/tsai7yp611-metodi-svyazivaniya-tablits-v-postgresql</link>
			<amplink>https://www.easyitway.com/tpost/tsai7yp611-metodi-svyazivaniya-tablits-v-postgresql?amp=true</amplink>
			<pubDate>Fri, 09 Feb 2024 00:17:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы научимся использовать объединения (JOINS) в СУБД PostgreSQL.</description>
			<turbo:content>
<![CDATA[<header><h1>Методы связывания таблиц в PostgreSQL (JOINS)</h1></header><div class="t-redactor__text">В этом видео мы научимся использовать объединения (JOINS) в СУБД PostgreSQL.</div><div class="t-redactor__text">Данный урок является одним из курса по теме "Администрирование баз данных в СУБД PostgreSQL". Ссылка на курс: <a href="https://it-black.ru/course-postgresql" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-postgresql</a></div><div class="t-redactor__text">Остальные курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/wv3r3JFYuIs" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Настройка логической репликации в PostgreSQL</title>
			<link>https://www.easyitway.com/tpost/sv1sa9at31-nastroika-logicheskoi-replikatsii-v-post</link>
			<amplink>https://www.easyitway.com/tpost/sv1sa9at31-nastroika-logicheskoi-replikatsii-v-post?amp=true</amplink>
			<pubDate>Tue, 19 Mar 2024 12:10:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>Логическая репликация PostgreSQL — это синхронизация копий без привязки к конкретному представлению данных на диске.</description>
			<turbo:content>
<![CDATA[<header><h1>Настройка логической репликации в PostgreSQL</h1></header><div class="t-redactor__text">В этом видео мы научимся настраивать логическую репликацию в СУБД PostgreSQL. <br /><br />Логическая репликация PostgreSQL — это синхронизация копий без привязки к конкретному представлению данных на диске. Не имеет значения архитектура процессора, платформа или версия СУБД. Синхронизация выполняется на основе идентификатора репликации — обычно это первичный ключ. <br /><br />Данный урок является одним из курса по теме "Администрирование баз данных в СУБД PostgreSQL". Ссылка на курс: <a href="https://it-black.ru/course-postgresql" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-postgresql</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/8-ziLutD_S0" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Создание, удаление баз данных и таблиц в Microsoft SQL Server 2022</title>
			<link>https://www.easyitway.com/tpost/x4jrludto1-sozdanie-udalenie-baz-dannih-i-tablits-v</link>
			<amplink>https://www.easyitway.com/tpost/x4jrludto1-sozdanie-udalenie-baz-dannih-i-tablits-v?amp=true</amplink>
			<pubDate>Sat, 30 Mar 2024 00:27:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы научимся создавать, удалять базы данных и таблицы в СУБД Microsoft SQL Server 2022.Данный урок является одним из курса по теме "Администрирование баз данных в СУБД Microsoft SQL Server".</description>
			<turbo:content>
<![CDATA[<header><h1>Создание, удаление баз данных и таблиц в Microsoft SQL Server 2022</h1></header><div class="t-redactor__text">В этом видео мы научимся создавать, удалять базы данных и таблицы в СУБД Microsoft SQL Server 2022. <br />Данный урок является одним из курса по теме "Администрирование баз данных в СУБД Microsoft SQL Server". <br /><br />Остальные курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course </a><br />Полный пакет всех курсов можно приобрести по ссылке: <a href="https://it-black.ru/course-package" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-package </a><br /><br />Поддержать проект: <br />ЮMoney: <a href="https://yoomoney.ru/fundraise/11K3EV3M872.240321" target="_blank" rel="noreferrer noopener">https://yoomoney.ru/fundraise/11K3EV3M872.240321 </a><br />Публичный адрес для получения BTC: bc1q20m6cfrxrr6kajnme7l5r55x8afef69rfr9hzc <br />Публичный адрес для получения ETH: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 <br />Публичный адрес для получения USDt: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 Публичный адрес для получения BNB: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 Спонсорство на Ютуб (если вы не в России): <a href="https://www.youtube.com/@it-black/membership" target="_blank" rel="noreferrer noopener">https://www.youtube.com/@it-black/membership</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/yvGkt_I3ZSs" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Условные выражения в PostgreSQL</title>
			<link>https://www.easyitway.com/tpost/pdhttgytt1-uslovnie-virazheniya-v-postgresql</link>
			<amplink>https://www.easyitway.com/tpost/pdhttgytt1-uslovnie-virazheniya-v-postgresql?amp=true</amplink>
			<pubDate>Mon, 08 Apr 2024 11:46:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы научимся использовать условные выражения в запросах СУБД PostgreSQL.</description>
			<turbo:content>
<![CDATA[<header><h1>Условные выражения в PostgreSQL</h1></header><div class="t-redactor__text">В этом видео мы научимся использовать условные выражения в запросах СУБД PostgreSQL.</div><div class="t-redactor__text">Условные выражения - это конструкции в языках программирования и запросов к базам данных, которые позволяют выполнять определенные действия в зависимости от выполнения определенного условия. В языке SQL, используемом для работы с базами данных, условные выражения обычно используются в операторе SELECT для фильтрации данных или выполнения различных действий в зависимости от значений полей.</div><div class="t-redactor__text">Данный урок является одним из курса по теме "Администрирование баз данных в СУБД PostgreSQL". Ссылка на курс: <a href="https://it-black.ru/course-postgresql" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-postgresql </a><br />Остальные курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course </a><br />Полный пакет всех курсов можно приобрести по ссылке: <a href="https://it-black.ru/course-package" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-package</a></div><div class="t-redactor__text">Поддержать проект: <br />ЮMoney: <a href="https://yoomoney.ru/fundraise/11K3EV3M872.240321" target="_blank" rel="noreferrer noopener">https://yoomoney.ru/fundraise/11K3EV3M872.240321 </a><br />Публичный адрес для получения BTC: bc1q20m6cfrxrr6kajnme7l5r55x8afef69rfr9hzc <br />Публичный адрес для получения ETH: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 <br />Публичный адрес для получения USDt: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 Публичный адрес для получения BNB: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 Спонсорство на Ютуб (если вы не в России): <a href="https://www.youtube.com/@it-black/membership" target="_blank" rel="noreferrer noopener">https://www.youtube.com/@it-black/membership</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/1N1sGkXF5xY" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Циклы в PostgreSQL</title>
			<link>https://www.easyitway.com/tpost/ck1c4eblc1-tsikli-v-postgresql</link>
			<amplink>https://www.easyitway.com/tpost/ck1c4eblc1-tsikli-v-postgresql?amp=true</amplink>
			<pubDate>Wed, 10 Apr 2024 11:55:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы научимся использовать циклы в запросах СУБД PostgreSQL.</description>
			<turbo:content>
<![CDATA[<header><h1>Циклы в PostgreSQL</h1></header><div class="t-redactor__text">В этом видео мы научимся использовать циклы в запросах СУБД PostgreSQL.</div><div class="t-redactor__text">Цикл — разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций. Также циклом может называться любая многократно исполняемая последовательность инструкций, организованная любым способом.</div><div class="t-redactor__text">Данный урок является одним из курса по теме "Администрирование баз данных в СУБД PostgreSQL". Ссылка на курс: <a href="https://it-black.ru/course-postgresql" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-postgresql</a><br /><br />Остальные курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course </a><br />Полный пакет всех курсов можно приобрести по ссылке: <a href="https://it-black.ru/course-package" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-package</a></div><div class="t-redactor__text">Поддержать проект: ЮMoney: <a href="https://yoomoney.ru/fundraise/11K3EV3M872.240321" target="_blank" rel="noreferrer noopener">https://yoomoney.ru/fundraise/11K3EV3M872.240321</a><br />Публичный адрес для получения BTC: bc1q20m6cfrxrr6kajnme7l5r55x8afef69rfr9hzc <br />Публичный адрес для получения ETH: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 <br />Публичный адрес для получения USDt: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 Публичный адрес для получения BNB: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 Спонсорство на Ютуб (если вы не в России): <a href="https://www.youtube.com/@it-black/membership" target="_blank" rel="noreferrer noopener">https://www.youtube.com/@it-black/membership</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/xm36it7TZ5Y" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Начало работы с Microsoft SQL Server 2022</title>
			<link>https://www.easyitway.com/tpost/z26gy90ar1-nachalo-raboti-s-microsoft-sql-server-20</link>
			<amplink>https://www.easyitway.com/tpost/z26gy90ar1-nachalo-raboti-s-microsoft-sql-server-20?amp=true</amplink>
			<pubDate>Thu, 18 Apr 2024 00:31:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы научимся создавать, удалять базы данных в СУБД Microsoft SQL Server 2022.</description>
			<turbo:content>
<![CDATA[<header><h1>Начало работы с Microsoft SQL Server 2022</h1></header><div class="t-redactor__text">В этом видео мы научимся создавать, удалять базы данных в СУБД Microsoft SQL Server 2022.</div><div class="t-redactor__text">Данный урок является одним из курса по теме "Администрирование баз данных в СУБД Microsoft SQL Server".</div><div class="t-redactor__text">Остальные курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course </a><br />Полный пакет всех курсов можно приобрести по ссылке: <a href="https://it-black.ru/course-package" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-package</a></div><div class="t-redactor__text">Поддержать проект: <br />ЮMoney: <a href="https://yoomoney.ru/fundraise/11K3EV3M872.240321" target="_blank" rel="noreferrer noopener">https://yoomoney.ru/fundraise/11K3EV3M872.240321</a><br />Публичный адрес для получения BTC: bc1q20m6cfrxrr6kajnme7l5r55x8afef69rfr9hzc <br />Публичный адрес для получения ETH: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 <br />Публичный адрес для получения USDt: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 Публичный адрес для получения BNB: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 Спонсорство на Ютуб (если вы не в России): <a href="https://www.youtube.com/@it-black/membership" target="_blank" rel="noreferrer noopener">https://www.youtube.com/@it-black/membership</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/NQr7r3LCv6k" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Обзор и установка Microsoft SQL Server 2022 на Windows</title>
			<link>https://www.easyitway.com/tpost/s7op6j5631-obzor-i-ustanovka-microsoft-sql-server-2</link>
			<amplink>https://www.easyitway.com/tpost/s7op6j5631-obzor-i-ustanovka-microsoft-sql-server-2?amp=true</amplink>
			<pubDate>Thu, 18 Apr 2024 15:43:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы установим СУБД Microsoft SQL Server 2022 на Windows 10.</description>
			<turbo:content>
<![CDATA[<header><h1>Обзор и установка Microsoft SQL Server 2022 на Windows</h1></header><div class="t-redactor__text">В этом видео мы установим СУБД Microsoft SQL Server 2022 на Windows 10.</div><div class="t-redactor__text">Данный урок является одним из курса по теме "Администрирование баз данных в СУБД Microsoft SQL Server".</div><div class="t-redactor__text">Остальные курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course</a><br />Полный пакет всех курсов можно приобрести по ссылке: <a href="https://it-black.ru/course-package" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-package</a></div><div class="t-redactor__text">Дополнительные ссылки: <br />Сайт для скачивания Microsoft SQL Server 2022 Express: <a href="https://www.microsoft.com/ru-ru/sql-server/sql-server-downloads" target="_blank" rel="noreferrer noopener">https://www.microsoft.com/ru-ru/sql-server/sql-server-downloads</a> <br />Microsoft SQL Managment Studio: <a href="https://learn.microsoft.com/ru-ru/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16" target="_blank" rel="noreferrer noopener">https://learn.microsoft.com/ru-ru/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16</a></div><div class="t-redactor__text">Поддержать проект:<br />ЮMoney: <a href="https://yoomoney.ru/fundraise/11K3EV3M872.240321" target="_blank" rel="noreferrer noopener">https://yoomoney.ru/fundraise/11K3EV3M872.240321</a><br />Публичный адрес для получения BTC: bc1q20m6cfrxrr6kajnme7l5r55x8afef69rfr9hzc<br />Публичный адрес для получения ETH: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59<br />Публичный адрес для получения USDt: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59<br />Публичный адрес для получения BNB: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59<br />Спонсорство на Ютуб (если вы не в России): <a href="https://www.youtube.com/@it-black/membership" target="_blank" rel="noreferrer noopener">https://www.youtube.com/@it-black/membership</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/8SrOOxAbdi8" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Установка и удаление MySQL Workbench на macOS</title>
			<link>https://www.easyitway.com/tpost/zd81ygbvo1-ustanovka-i-udalenie-mysql-workbench-na</link>
			<amplink>https://www.easyitway.com/tpost/zd81ygbvo1-ustanovka-i-udalenie-mysql-workbench-na?amp=true</amplink>
			<pubDate>Fri, 19 Apr 2024 21:54:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы научимся устанавливать и удалять СУБД MySQL Workbench на macOS. Данный урок является одним из курса по теме "Администрирование баз данных в СУБД MySQL Workbench".</description>
			<turbo:content>
<![CDATA[<header><h1>Установка и удаление MySQL Workbench на macOS</h1></header><div class="t-redactor__text">В этом видео мы научимся устанавливать и удалять СУБД MySQL Workbench на macOS. Данный урок является одним из курса по теме "Администрирование баз данных в СУБД MySQL Workbench".</div><div class="t-redactor__text">Остальные курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course </a><br />Полный пакет всех курсов можно приобрести по ссылке: <a href="https://it-black.ru/course-package" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-package</a></div><div class="t-redactor__text">Дополнительные ссылки: <br />Сайт для скачивания MySQL Community Server 8.3.0 Innovation: <a href="https://dev.mysql.com/downloads/mysql" target="_blank" rel="noreferrer noopener">https://dev.mysql.com/downloads/mysql </a>Сайт для скачивания MySQL Workbench 8.0.36: <a href="https://dev.mysql.com/downloads/workbench" target="_blank" rel="noreferrer noopener">https://dev.mysql.com/downloads/workbench</a></div><div class="t-redactor__text">Команды из видео: <br />1. Удаление всех директорий MySQL </div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">sudo rm /usr/local/mysql 
sudo rm -rf /usr/local/mysql* 
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*</code></pre><div class="t-redactor__text">2. Просмотр информации про MySQL </div><pre class="t-redactor__highlightcode"><code data-lang="{$la}">ps -ax | grep mysql</code></pre><div class="t-redactor__text">Поддержать проект: <br />ЮMoney: <a href="https://yoomoney.ru/fundraise/11K3EV3M872.240321" target="_blank" rel="noreferrer noopener">https://yoomoney.ru/fundraise/11K3EV3M872.240321</a><br />Публичный адрес для получения BTC: bc1q20m6cfrxrr6kajnme7l5r55x8afef69rfr9hzc <br />Публичный адрес для получения ETH: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 <br />Публичный адрес для получения USDt: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 Публичный адрес для получения BNB: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 Спонсорство на Ютуб (если вы не в России): <a href="https://www.youtube.com/@it-black/membership" target="_blank" rel="noreferrer noopener">https://www.youtube.com/@it-black/membership</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/ts6xbjALsWs" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Выборка данных с помощью команды SELECT в СУБД Microsoft SQL Server</title>
			<link>https://www.easyitway.com/tpost/4fl3r9raj1-viborka-dannih-s-pomoschyu-komandi-selec</link>
			<amplink>https://www.easyitway.com/tpost/4fl3r9raj1-viborka-dannih-s-pomoschyu-komandi-selec?amp=true</amplink>
			<pubDate>Wed, 12 Jun 2024 22:13:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы научимся делать выборку с помощью команды SELECT в СУБД Microsoft SQL Server 2022.</description>
			<turbo:content>
<![CDATA[<header><h1>Выборка данных с помощью команды SELECT в СУБД Microsoft SQL Server</h1></header><div class="t-redactor__text">В этом видео мы научимся делать выборку с помощью команды SELECT в СУБД Microsoft SQL Server 2022. <br />Данный урок является одним из курса по теме "Администрирование баз данных в СУБД Microsoft SQL Server". Ссылка на курс: <a href="https://it-black.ru/course-ms-sql" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-ms-sql </a><br />Остальные курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course </a><br />Полный пакет всех курсов можно приобрести по ссылке: <a href="https://it-black.ru/course-package" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-package</a><br /><br />Поддержать проект: <br />ЮMoney: <a href="https://yoomoney.ru/fundraise/11K3EV3M872.240321" target="_blank" rel="noreferrer noopener">https://yoomoney.ru/fundraise/11K3EV3M872.240321</a><br />Публичный адрес для получения BTC: bc1q20m6cfrxrr6kajnme7l5r55x8afef69rfr9hzc <br />Публичный адрес для получения ETH: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 <br />Публичный адрес для получения USDt: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 Публичный адрес для получения BNB: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 Спонсорство на Ютуб (если вы не в России): <a href="https://www.youtube.com/@it-black/membership" target="_blank" rel="noreferrer noopener">https://www.youtube.com/@it-black/membership</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/WK99x8q9BS4" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>UNION в Microsoft SQL Server</title>
			<link>https://www.easyitway.com/tpost/c7tgojsgf1-union-v-microsoft-sql-server</link>
			<amplink>https://www.easyitway.com/tpost/c7tgojsgf1-union-v-microsoft-sql-server?amp=true</amplink>
			<pubDate>Mon, 08 Jul 2024 11:19:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы научимся использовать операторы UNION и UNION ALL в СУБД Microsoft SQL Server 2022.</description>
			<turbo:content>
<![CDATA[<header><h1>UNION в Microsoft SQL Server</h1></header><div class="t-redactor__text">В этом видео мы научимся использовать операторы UNION и UNION ALL в СУБД Microsoft SQL Server 2022. <br /><br />Данный урок является одним из курса по теме "Администрирование баз данных в СУБД Microsoft SQL Server". Ссылка на курс: <a href="https://it-black.ru/course-ms-sql" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-ms-sql</a><br /><br />Остальные курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course</a><br />Полный пакет всех курсов можно приобрести по ссылке: <a href="https://it-black.ru/course-package" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-package</a><br /><br />Дополнительные ссылки: <br />Сайт для скачивания Microsoft SQL Server 2022 Express: <a href="https://www.microsoft.com/ru-ru/sql-server/sql-server-downloads" target="_blank" rel="noreferrer noopener">https://www.microsoft.com/ru-ru/sql-server/sql-server-downloads </a><br />Microsoft SQL Managment Studio: <a href="https://learn.microsoft.com/ru-ru/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16" target="_blank" rel="noreferrer noopener">https://learn.microsoft.com/ru-ru/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16</a><br /><br />Поддержать проект: <br />ЮMoney: <a href="https://yoomoney.ru/fundraise/11K3EV3M872.240321" target="_blank" rel="noreferrer noopener">https://yoomoney.ru/fundraise/11K3EV3M872.240321</a><br />Публичный адрес для получения BTC: bc1q20m6cfrxrr6kajnme7l5r55x8afef69rfr9hzc <br />Публичный адрес для получения ETH: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 <br />Публичный адрес для получения USDt: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 <br />Публичный адрес для получения BNB: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 Спонсорство на Ютуб (если вы не в России): <a href="https://www.youtube.com/@it-black/membership" target="_blank" rel="noreferrer noopener">https://www.youtube.com/@it-black/membership</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/uLC3BD11fhs" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Индексы в T-SQL</title>
			<link>https://www.easyitway.com/tpost/mo0ti70h71-indeksi-v-t-sql</link>
			<amplink>https://www.easyitway.com/tpost/mo0ti70h71-indeksi-v-t-sql?amp=true</amplink>
			<pubDate>Sun, 04 Aug 2024 14:44:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом видео мы научимся создавать индексы в СУБД Microsoft SQL Server 2022.</description>
			<turbo:content>
<![CDATA[<header><h1>Индексы в T-SQL</h1></header><div class="t-redactor__text">В этом видео мы научимся создавать индексы в СУБД Microsoft SQL Server 2022.<br /><br />Данный урок является одним из курса по теме "Администрирование баз данных в СУБД Microsoft SQL Server". Ссылка на курс: <a href="https://it-black.ru/course-ms-sql" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-ms-sql</a><br /><br />Остальные курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course </a><br />Полный пакет всех курсов можно приобрести по ссылке: <a href="https://it-black.ru/course-package" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-package</a><br /><br />Дополнительные ссылки: <br />Сайт для скачивания Microsoft SQL Server 2022 Express: <a href="https://www.microsoft.com/ru-ru/sql-server/sql-server-downloads" target="_blank" rel="noreferrer noopener">https://www.microsoft.com/ru-ru/sql-server/sql-server-downloads</a><br />Microsoft SQL Managment Studio: <a href="https://learn.microsoft.com/ru-ru/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16" target="_blank" rel="noreferrer noopener">https://learn.microsoft.com/ru-ru/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16</a><br /><br />Поддержать проект: ЮMoney: <a href="https://yoomoney.ru/fundraise/11K3EV3M872.240321" target="_blank" rel="noreferrer noopener">https://yoomoney.ru/fundraise/11K3EV3M872.240321</a><br />Публичный адрес для получения BTC: bc1q20m6cfrxrr6kajnme7l5r55x8afef69rfr9hzc <br />Публичный адрес для получения ETH: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 <br />Публичный адрес для получения USDt: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59 <br />Публичный адрес для получения BNB: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59<br />Спонсорство на Ютуб (если вы не в России): <a href="https://www.youtube.com/@it-black/membership" target="_blank" rel="noreferrer noopener">https://www.youtube.com/@it-black/membership</a></div><iframe width="100%" height="100%" src="https://www.youtube.com/embed/S7DmHXxll4I" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Введение в курс по 1С:Предприятие 8</title>
			<link>https://www.easyitway.com/tpost/a8p94onv01-vvedenie-v-kurs-po-1spredpriyatie-8</link>
			<amplink>https://www.easyitway.com/tpost/a8p94onv01-vvedenie-v-kurs-po-1spredpriyatie-8?amp=true</amplink>
			<pubDate>Fri, 07 Feb 2025 17:15:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>1С:Предприятие</category>
			<description>Курсы можно найти на странице: https://it-black.ru/course</description>
			<turbo:content>
<![CDATA[<header><h1>Введение в курс по 1С:Предприятие 8</h1></header><div class="t-redactor__text">Курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course</a><br />Купить курс "Администрирование Linux" можно по ссылке: <a href="https://it-black.ru/course-admin-linux" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-admin-linux</a><br />Настройка межсетевого экрана pfSense: <a href="https://it-black.ru/course-pfsense" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-pfsense</a><br /><p>Полный пакет всех курсов можно приобрести по ссылке: <a href="https://it-black.ru/course-package">https://it-black.ru/course-package</a></p><br />Поддержать проект:<br />ЮMoney: <a href="https://yoomoney.ru/fundraise/11K3EV3M872.240321" target="_blank" rel="noreferrer noopener">https://yoomoney.ru/fundraise/11K3EV3M872.240321</a><br />Публичный адрес для получения BTC: bc1q20m6cfrxrr6kajnme7l5r55x8afef69rfr9hzc<br />Публичный адрес для получения ETH: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59<br />Публичный адрес для получения USDt: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59<br />Публичный адрес для получения BNB: 0xce2Ce3A307a435a763B8831E7B0347728E8b7F59</div><div class="t-redactor__embedcode"><iframe width="720" height="405" src="https://rutube.ru/play/embed/c31be8365060fa910de0328550eeb6bc" frameBorder="0" allow="clipboard-write; autoplay" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></div>]]>
			</turbo:content>
		</item>
		<item turbo="true">
			<title>Установка и настройка PostgreSQL на Astra Linux</title>
			<link>https://www.easyitway.com/tpost/tjjofkvtb1-ustanovka-i-nastroika-postgresql-na-astr</link>
			<amplink>https://www.easyitway.com/tpost/tjjofkvtb1-ustanovka-i-nastroika-postgresql-na-astr?amp=true</amplink>
			<pubDate>Mon, 05 Jan 2026 21:56:00 +0300</pubDate>
			<author>Компьютер - это просто!</author>
			<category>Самоучитель по SQL</category>
			<description>В этом уроке мы научимся устанавливать и настраивать PostgreSQL на операционной системе Astra Linux. Данное видео подготовлено для курса "Администрирование Astra Linux". Купить курс можно по ссылке: https://it-black.ru/course-astra-linux</description>
			<turbo:content>
<![CDATA[<header><h1>Установка и настройка PostgreSQL на Astra Linux</h1></header><div class="t-redactor__text">В этом уроке мы научимся устанавливать и настраивать PostgreSQL на операционной системе Astra Linux. Данное видео подготовлено для курса "Администрирование Astra Linux". Купить курс можно по ссылке: <a href="https://it-black.ru/course-astra-linux" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-astra-linux</a><br /><br />Курсы можно найти на странице: <a href="https://it-black.ru/course" target="_blank" rel="noreferrer noopener">https://it-black.ru/course</a><br />Купить курс "Компьютерные сети" можно по ссылке: <a href="https://it-black.ru/pc-network" target="_blank" rel="noreferrer noopener">https://it-black.ru/pc-network</a><br />Купить курс "Администрирование Linux" можно по ссылке: <a href="https://it-black.ru/course-admin-linux" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-admin-linux</a><br />Настройка межсетевого экрана pfSense: <a href="https://it-black.ru/course-pfsense" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-pfsense</a><br />Полный пакет всех курсов можно приобрести по ссылке: <a href="https://it-black.ru/course-package" target="_blank" rel="noreferrer noopener">https://it-black.ru/course-package</a><br /><br />Поддержать проект:<br />ЮMoney: <a href="https://yoomoney.ru/fundraise/11K3EV3M872.240321" target="_blank" rel="noreferrer noopener">https://yoomoney.ru/fundraise/11K3EV3M872.240321</a></div><div class="t-redactor__embedcode"><iframe width="720" height="405" src="https://rutube.ru/play/embed/162ffe1401006d1d888d062f0ee66a6e"  allow="clipboard-write; autoplay" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></div>]]>
			</turbo:content>
		</item>
		</channel>
</rss>