Python Core Part II [407] Flashcards
В чем разница между методами и конструкторами?
В Python конструктор - это метод, который вызывается при создании экземпляра (инстанцировании) класса. Он имеет имя __init__ и может принимать параметры. Конструктор используется для инициализации объекта, задания начальных значений атрибутов объекта, и выполнения других операций, необходимых при создании объекта.
Методы, с другой стороны, являются функциями, которые могут выполнять определенные операции с объектом, изменять его состояние или возвращать результат. Они определяются внутри класса и могут вызываться на экземпляре объекта этого класса.
Таким образом, разница между конструкторами и методами заключается в том, что конструктор вызывается при создании экземпляра класса и используется для инициализации объекта, а методы вызываются на экземпляре класса и могут выполнять операции с объектом или возвращать результат.
Пример класса с конструктором и методом:
```py
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self): print(f"My name is {self.name} and I am {self.age} years old.")
Создать экземпляр класса Person и вызвать метод introduce()
person = Person(“Alice”, 25)
person.introduce()
~~~
Этот код создаст экземпляр класса Person с именем Alice и возрастом 25, а затем вызовет метод introduce(), который напечатает строку “My name is Alice and I am 25 years old.”
Методы:
+ Имя метода может быть любым.
+ По отношению к одному объекту один метод может быть вызван для ‘n’ членов строк
+ Методы используются для представления бизнес-логики для выполнения операций.
Конструктор:
+ Конструктор будет выполняться автоматически всякий раз, когда мы создаем объект.
+ Применительно к одному объекту один конструктор может быть выполнен только один раз
+ Конструкторы используются для определения и инициализации нестатической переменной.
Что такое инкапсуляция?
Инкапсуляция - это принцип объектно-ориентированного программирования, который позволяет скрыть внутреннюю реализацию класса от пользователя и защитить данные класса от прямого доступа.
В Python инкапсуляция реализуется с помощью использования двойных подчеркиваний перед именами атрибутов или методов класса, которые должны быть скрыты. Одинарное подчеркивание говорит о том, что атрибут не должен быть использован за пределами класса, но его можно получить. Двойное подчеркивание делает атрибут или метод частным (private).
Например, вот пример класса, который использует инкапсуляцию:
```py
class Person:
def __init__(self, name, age):
self.__name = name # приватный атрибут, имя
self.__age = age # приватный атрибут, возраст
def get_name(self): return self.\_\_name def get_age(self): return self.\_\_age def set_name(self, name): self.\_\_name = name def set_age(self, age): self.\_\_age = age ~~~
В этом примере класс Person имеет приватные атрибуты __name и __age, которые могут быть получены или изменены только через публичные get и set методы. Любая попытка прямого доступа к этим атрибутам извне класса приведет к ошибке.
Выполнение команд DML через программы Python?
Можно выполнять команды DML (Data Manipulation Language) в программе, используя различные библиотеки, такие как Psycopg2 для баз данных PostgreSQL или sqlite3 для баз данных SQLite. Эти библиотеки обеспечивают соединение с базой данных и методы для выполнения запросов к ней, включая запросы SELECT, INSERT, UPDATE и DELETE. Вот пример использования Psycopg2 для выполнения запроса INSERT в базу данных PostgreSQL:
```py
import psycopg2
conn = psycopg2.connect(“dbname=mydatabase user=myuser”)
cur = conn.cursor()
cur.execute(“INSERT INTO mytable (column1, column2, column3) VALUES (%s, %s, %s)”, (value1, value2, value3))
conn.commit()
~~~
А вот пример использования sqlite3 для выполнения запроса SELECT в базе данных SQLite:
```py
import sqlite3
conn = sqlite3.connect(‘example.db’)
cur = conn.cursor()
cur.execute(‘SELECT * FROM mytable’)
results = cur.fetchall()
~~~
Обратите внимание, что необходимо заменить mydatabase, myuser, mytable и т.д. на соответствующие значения для вашей базы данных.
Что такое жизненный цикл потоков?
Обычно, вы создаете поток, создаётся объект типа Thread или его наследник. После создания потока, вы можете запустить его методом start(), который вызывает метод run() в новом потоке. Когда метод run() завершается, поток переходит в состояние terminated и его жизненный цикл завершается.
Жизненный цикл потоков (thread lifecycle) в Python описывает состояния, на которые может переходить поток от момента его создания до завершения работы. Основные состояния потока в Python включают:
+ Создание (creation): Поток создается, но еще не запущен.
+ Готовность (ready): Поток готов к выполнению, но еще не начал свою работу (ожидает времени для выполнения).
+ Выполнение (running): Поток начинает выполнять свою работу.
+ Ожидание (waiting): Поток ожидает какого-то условия для возобновления своей работы (например, ожидание события).
+ Блокировка (blocked): Поток блокирован и ожидает освобождения ресурсов (например, блокировка при попытке получения GIL).
+ Завершение (termination): Поток выполнил свою работу и завершил свою работу.
Методы, которые могут изменить состояние потока, включают в себя start(), sleep(), join(), wait(), и notify(). Кроме того, модуль threading позволяет использовать более продвинутые механизмы управления потоками, такие как блокировки и семафоры.
Что такое планирование?
Планирование (или планирование задач) в Python - это процесс автоматизации запуска скриптов или выполнения функций в определенное время или по расписанию. Встроенный модуль Python для этого называется sched, и он позволяет создавать простые планировщики задач, чтобы выполнять функции с указанным интервалом времени. Например:
```py
import time
import sched
создаем объект класса sched.scheduler
s = sched.scheduler(time.time, time.sleep)
определяем функцию, которую хотим выполнить
def print_msg(msg):
print(“Сообщение:”, msg)
планируем выполнение функции через 5 секунд
s.enter(5, 1, print_msg, argument=(“Привет”,))
запускаем планировщик задач
s.run()
~~~
Этот код планирует выполнение функции print_msg() через 5 секунд, и после этого функция выводит сообщение “Сообщение: Привет”. Вы можете изменить задержку и функцию, которую хотите выполнить, в зависимости от ваших потребностей. Кроме sched, есть также более продвинутые сторонние библиотеки для планирования задач, например Celery и APScheduler.
Цикл for реализован на языке python следующим образом:
```py
for element in iterable:
iter-obj=iter(iterable)
while true:
try:
element=next(iter_obj)
except(slop iteration)
break
~~~
Цикл For принимает данный объект, преобразует этот объект в форму итерируемого объекта и получает один за другим элемент из итерируемого объекта.
При получении элемента по значению из итерируемого объекта, если возникает исключение остановки итерации, тогда для цикла внутренне обрабатывается это исключение
Для чего нужен OS Module? Приведите примеры.
Модуль OS - это модуль в Python, который предоставляет множество функций для работы с операционной системой. Он позволяет выполнять такие действия, как создание, удаление и переименование файлов и папок, получение информации о файлах и папках, работа с переменными окружения и многое другое.
Вот несколько примеров использования модуля OS:
+ Получение текущей директории
```py
import os
current_directory = os.getcwd()
print(“Current directory:”, current_directory)
~~~
+ Создание новой папки
```py
import os
new_folder = os.path.join(os.getcwd(), “new_folder”)
os.mkdir(new_folder)
print(“New folder created!”)
~~~
+ Получение списка файлов в директории
```py
import os
directory = os.getcwd()
file_list = os.listdir(directory)
print(“Files in”, directory, “:”, file_list)
~~~
+ Удаление файла
```py
import os
file_path_to_delete = “path/to/file.txt”
os.remove(file_path_to_delete)
~~~
+ Переименование файла
```py
import os
old_file_name = “old_name.txt”
new_file_name = “new_name.txt”
os.rename(old_file_name, new_file_name)
~~~
+ Запуск внешней программы:
```py
import os
os.system(“notepad.exe”)
\+ Проверка существования файла или директории: ```py import os if os.path.exists('path/to/file_or_dir'): print('File or dir exists') else: print('File or dir does not exist')
+ Обход всех файлов в директории и ее поддиректориях:
```py
import os
for root, dirs, files in os.walk(‘/path/to/dir’):
for file in files:
file_path = os.path.join(root, file)
print(file_path)
~~~
Что такое приложения Python?
Python — чрезвычайно универсальный язык программирования с широким спектром практических приложений. Вот некоторые примеры:
+ Веб-разработка: Python — популярный выбор для сред веб-разработки, таких как Django и Flask.
+ Наука о данных: Python имеет множество библиотек и инструментов, которые позволяют ученым данных эффективно анализировать, визуализировать и манипулировать данными. Популярные библиотеки включают Pandas, NumPy и Matplotlib.
+ Машинное обучение и искусственный интеллект: Python стал ведущим языком разработки ИИ с такими популярными платформами, как TensorFlow, PyTorch и Keras.
+ Научные вычисления: Python имеет множество библиотек для научных вычислений, таких как SciPy, которые используются учеными для моделирования и анализа сложных систем.
+ Разработка игр: Python имеет библиотеки и фреймворки для разработки игр, такие как Pygame.
+ Настольные приложения с графическим интерфейсом: Python можно использовать для разработки кроссплатформенных настольных приложений с такими библиотеками, как PyQt и wxPython.
+ Сетевое программирование: стандартная библиотека Python включает модули для программирования сокетов и протоколов, таких как HTTP и FTP.
+ Образование: Python широко используется во многих учебных заведениях для обучения методам решения проблем и концепциям программирования.
В целом, Python используется в самых разных приложениях, и его популярность обусловлена простотой использования, гибкостью и универсальностью языка программирования.
Как интерпретируется Python?
Язык Python является интерпретируемым языком. Программа Python запускается непосредственно из исходного кода. Он преобразует исходный код, написанный программистом, в промежуточный язык, который снова переводится на машинный язык, который должен быть выполнен.
Какие инструменты помогают находить ошибки или проводить статический анализ?
Для нахождения ошибок и проведения статического анализа в Python существует ряд инструментов. Некоторые из них:
+ PyChecker — это инструмент статического анализа, который обнаруживает ошибки в исходном коде Python и предупреждает о стиле и сложности ошибки.
+ Pylint - это популярный инструмент статического анализа кода Python, который может проверять на соответствие PEP 8, выдавать предупреждения о неиспользуемом коде, проверять типы и т.д.
+ Flake8 - это инструмент, объединяющий Pylint, McCabe и PyFlakes, который может использоваться для проведения проверки стиля кода и анализа ошибок.
+ PyCharm - это интегрированная среда разработки Python, которая предоставляет инструменты для проведения статического анализа кода, включая проверку на соответствие PEP 8, поиск ошибок и оптимизации кода.
+ mypy - это инструмент статической проверки типов для Python, который позволяет обнаруживать ошибки ввода-вывода, предоставляя подробную информацию о типах данных в вашем коде.
+ Bandit - это инструмент безопасности, который может использоваться для поиска уязвимостей в коде Python.
+ Prospector - это инструмент, который проводит статический анализ Python-кода и выводит информацию о качестве кода, стиле кода, нормах отступов и т.д.
+ PyLintBear - это инструмент планирования и прогнозирования ошибок Python, разработанный на основе Pylint, который может поставляться с конфигурируемыми медведями, которые можно использовать для поиска и исправления ошибок.
Что такое pass в Python?
В Python pass - это оператор-заглушка, который ничего не делает. Его можно использовать в тех местах, где синтаксически требуется оператор, но никакого действия выполнять не нужно. pass часто используется вместо пустых блоков кода в конструкциях if/else, циклах, функциях, классах, чтобы пока сохранить структуру кода, не реализуя еще какую-то логику. Пример:
```py
if x == 1:
pass # временно заглушка
else:
print(“not 1”)
~~~
В таком примере pass не выполняет никаких действий и не вносит изменений в программу, он просто позволяет коду работать без ошибок. Однако, его можно заменить на любой другой оператор, когда потребуется реализовать какую-то логику внутри этого блока кода.
Что такое итераторы в Python?
Итератор в Python - это объект, который позволяет проходить по элементам коллекции или последовательности данных, такой как список, кортеж или словарь, и получать доступ к каждому элементу. Он работает по принципу получения следующего элемента, пока элементы не закончатся. Итераторы реализуют методы __iter__() и __next__(), который возвращает следующий элемент последовательности при каждом вызове.
Пример использования итератора в Python:
```py
my_list = [1, 2, 3]
my_iter = iter(my_list)
print(next(my_iter)) # выводит 1
print(next(my_iter)) # выводит 2
print(next(my_iter)) # выводит 3
~~~
В Python существует множество встроенных итерируемых объектов, таких как range и строки, а также можно создавать пользовательские итераторы, используя классы и реализуя методы __iter__() и __next__(). Итераторы позволяют проходить по коллекции данных без хранения всех элементов в памяти, что полезно при работе с большими объемами данных или потоками данных.
Что такое slicing в Python?
Slicing - это механизм выбора подстроки из последовательности, например, строки, списка или кортежа (list, tuple). Он основывается на использовании квадратных скобок и двоеточий [], которые могут принимать три параметра [start:stop:step], что делает возможным выбор только определенного диапазона элементов.
Основные правила slicing в Python:
start - индекс символа начала выборки (включая его). Если не указан, значит выборка начинается с самого начала.
stop - индекс символа окончания выборки (не включая его). Если не указан, выборка продолжается до конца последовательности.
step - опциональный параметр для указания шага изменения индексов.
Примеры использования:
```py
str = “Hello world”
print(str[0:5]) # выведет “Hello”
print(str[6:]) # выведет “world”
~~~
```py
list = [1, 2, 3, 4, 5]
print(list[1:3]) # выведет [2, 3]
print(list[::2]) # выведет [1, 3, 5]
~~~
Что такое генераторы в Python?
Генераторы - это функции, которые могут приостанавливать своё выполнение (с помощью ключевого слова yield) и возвращать промежуточный результат. Вместо того, чтобы возвращать результат целиком как обычная функция, генераторы возвращают итератор, который может быть использован для последовательного получения промежуточных результатов. Это делает генераторы мощными инструментами для работы с большими наборами данных, поскольку они позволяют работать с данными по мере их поступления, а не ждать завершения обработки всего набора.
Вот пример генератора, который генерирует все квадраты чисел от 1 до n включительно:
```py
def squares(n):
for i in range(1, n+1):
yield i*i
for x in squares(5):
print(x)
~~~
Этот код выведет:
```py
1
4
9
16
25
~~~
Оператор yield здесь приостанавливает выполнение функции, возвращая очередной квадрат числа, после чего функция продолжает выполнение с того же места, где остановилась на предыдущей итерации цикла. Каждый раз, когда функция доходит до ключевого слова yield, она приостанавлвает своё выполнение, возвращая промежуточный результат в основную программу. При следующем вызове функции она продолжает работу с точки, где остановилась на предыдущей итерации цикла, и так далее, пока не достигнет конца функции.
Что такое итератор?
Итератор - это объект в Python, который может быть пройден (или перебран) в цикле for. Итераторы очень похожи на коллекции: они также могут содержать набор элементов. Однако, в отличие от коллекций, итераторы не могут быть проиндексированы или скопированы напрямую. Вместо этого, они используют метод __next__() для возврата следующего элемента последовательности. Когда все элементы итератора были перебраны, вызов метода __next__() вызывает исключение StopIteration.
Например, рассмотрим следующий код, который создает итератор my_iter, проходит по его элементам и выводит их на экран:
```py
my_list = [1, 2, 3]
my_iter = iter(my_list)
while True:
try:
# Получить следующий элемент из итератора
element = next(my_iter)
print(element)
except StopIteration:
# Если все элементы были перебраны, выйти из цикла
break
~~~
Вывод:
```py
1
2
3
~~~
Здесь мы используем функцию iter() для создания итератора из списка my_list и метод next() для получения следующего элемента из итератора. Когда все элементы были перебраны, метод next() вызывает исключение StopIteration, и мы выходим из цикла while.
Объясните генераторы и итераторы в python?
Как вы можете скопировать объект в Python?
Можно скопировать объект, используя конструкторы копирования или методы копирования, такие как copy() или deepcopy() модуля copy, или используя операцию среза. Например, для создания поверхностной копии объекта можно использовать срез:
```py
original_list = [1, 2, 3]
new_list = original_list[:]
~~~
Для создания глубокой копии объекта можно использовать функцию deepcopy():
```py
import copy
original_dict = {‘a’: [1, 2, 3], ‘b’: {‘c’: 4}}
new_dict = copy.deepcopy(original_dict)
~~~
Это создаст новый словарь new_dict, который будет глубоко скопирован с original_dict.
Часто используется метод .copy() для поверхностного копирования, который создает новый объект, содержащий ссылки на те же элементы, что и исходный объект:
```py
original_dict = {‘a’: [1, 2, 3], ‘b’: {‘c’: 4}}
new_dict = original_dict.copy()
~~~
Это приведет к созданию нового словаря new_dict, который будет содержать ссылки на те же элементы, что и original_dict.
Также можно использовать конструкторы копирования для создания новых объектов с теми же значениями. Например, для создания новой копии списка можно использовать следующий код:
```py
original_list = [1, 2, 3]
new_list = list(original_list)
~~~
Как преобразовать число в строку?
Для преобразования числа в строку можно использовать функцию str(). Например:
```py
x = 10
s = str(x)
print(s) # выводит строку ‘10’
~~~
Также, при использовании строковых операций с числами, Python автоматически производит преобразование числа в строку. Например:
```py
x = 10
s = ‘Number: ‘ + str(x)
print(s) # выводит строку ‘Number: 10’
~~~
Если необходимо преобразовать строку в число, то можно использовать функцию int(). Например:
```py
s = ‘10’
x = int(s)
print(x) # выводит число 10
~~~
Но следует учитывать, что если строка не содержит числовых символов, вызов int() приведет к ошибке.
Что такое модуль и пакет в Python?
Что такое модуль и пакет в Python?
Модуль - это файл, содержащий код с определенным функционалом, который можно загрузить и использовать в других программах.
Пакет - это способ организации модулей вместе в одном месте. Пакеты могут содержать другие пакеты, а также модули.
Для создания пакета необходимо создать директорию с именем пакета, содержащую файл __init__.py. Файл __init__.py может быть пустым, либо содержать инициализирующий код для пакета. Модули внутри пакета могут быть импортированы с помощью конструкции import package.module. Это удобный способ организации больших проектов на Python и позволяет легко импортировать и использовать код из других частей программы.
Использование пакетов и модулей в Python упрощает организацию и поддержку кода, так как позволяет разбить приложение на небольшие и понятные блоки, которые можно разрабатывать отдельно, тестировать и поддерживать.
Расскажите, каковы правила для локальных и глобальных переменных в Python?
+ Локальные переменные в функции видны только внутри этой функции. Они не могут быть использованы вне функции или в другой функции.
```py
def my_function():
my_var = 42
print(my_var)
my_function() # Выведет 42
print(my_var) # Ошибка, my_var не определена.
~~~
+ Глобальные переменные определяются за пределами функции и могут быть использованы в любой части программы, включая функции.
```py
my_global_var = 42
def my_function():
print(my_global_var)
my_function() # Выведет 42
print(my_global_var) # Выведет 42
~~~
+ Объявление переменной в функции как global делает эту переменную видимой для всех функций и главной программы.
```py
def my_function():
global my_var
my_var = 42
my_function() # my_var будет доступна вне функции
print(my_var) # Выведет 42
~~~
py
+ Если переменная не была определена внутри функции, Python будет искать ее во внешней области видимости и, если найдет, будет использовать эту переменную внутри функции. Если переменная не будет найдена, это приведет к ошибке.
my_var = 42 def my_function(): print(my_var) my_function() # Выведет 42
Как вы можете использовать глобальные переменные в модулях?
В модулях Python глобальные переменные могут быть объявлены с помощью ключевого слова global. Это позволяет функциям в модуле изменять значение глобальных переменных, определенных в этом же модуле.
Например, если у вас есть модуль mod.py, содержащий глобальную переменную counter и функцию increment_counter, которая увеличивает значение счетчика на 1, то вы можете использовать global для того, чтобы эта функция могла изменить значение глобальной переменной:
```py
# mod.py
counter = 0
def increment_counter():
global counter
counter += 1
~~~
Теперь, если импортировать модуль в другой файл и вызвать функцию increment_counter, это приведет к увеличению значения счетчика на 1:
```py
# main.py
import mod
print(mod.counter) # 0
mod.increment_counter()
print(mod.counter) # 1
~~~
Также можно использовать имена модулей в качестве пространств имен для глобальных переменных, которые могут быть использованы в других файлах.
```py
# mod.py
app_count = 0
def increment_counter():
global app_count
app_count += 1
main.py
import mod
print(mod.app_count) # 0
mod.increment_counter()
print(mod.app_count) # 1
~~~
Внимание, что использование глобальных переменных может быть опасно, если они используются неправильно, поэтому лучше использовать их в ограниченном объеме и с осторожностью.
Объясните, как удалить файл в Python?
Чтобы удалить файл в Python, можно использовать метод os.remove() из модуля os.
```py
import os
os.remove(‘filename.txt’) # замените filename.txt на имя вашего файла
~~~
Однако, убедитесь, что у вас есть необходимые разрешения на удаление файла.
Если вам нужно также удалить пустую директорию, то вы можете использовать os.rmdir(). Если директория не пуста, вы должны использовать shutil.rmtree() чтобы удалить её вместе с содержимым.
```py
import os
import shutil
удаление директории если она пустая
os.rmdir(‘directory_name’) # замените directory_name на имя вашей директории
удаление директории со всем содержимым
shutil.rmtree(‘directory_name’) # замените directory_name на имя вашей директории
~~~
Использование оператора // в Python?
Оператор // в языке программирования Python используется для целочисленного деления (то есть возвращает только целую часть результата деления). Например:
```py
»> 5 // 2
2
»> 7 // 3
2
~~~
В обоих случаях результат деления округляется в меньшую сторону до ближайшего целого числа, так как до этого вычисления происходит простое целочисленное деление. Этот оператор поможет вам получить только целую часть результата деления, без остатка, что может быть полезно в некоторых случаях.
Назовите пять преимуществ использования Python?
+ Простота и читаемость кода, благодаря удобному синтаксису.
+ Кроссплатформенность, что позволяет запускать программы на различных операционных системах без изменения кода.
+ Большое количество библиотек, которые покрывают множество областей, от научных вычислений до веб-разработки.
+ Интерактивный режим, который позволяет быстро прототипировать и отлаживать код.
+ Сильная поддержка сообщества, которое разрабатывает и поддерживает множество бесплатных инструментов и библиотек.
+ Возможность использования Python во многих областях, включая научные и исследовательские проекты, веб-разработку, машинное обучение и автоматизацию задач.
+ Высокая производительность, благодаря оптимизированным интерпретаторам, промежуточным языкам и JIT-компиляторам.
+ Хорошая масштабируемость и возможность создания больших и сложных проектов.
+ Поддержка различных парадигм программирования, включая объектно-ориентированное, функциональное и процедурное программирование.
+ Большое количество обучающих ресурсов и курсов, которые помогают быстро и эффективно изучать язык.