101 игра на python. Шпаргалки. Списковые включения (list comprehensions)
Что такое списковое включение?
В самом простом виде, списковое включение – это компактный способ создания нового списка на основе уже существующего (или любого итерируемого объекта). Вместо того, чтобы использовать традиционный цикл for и добавлять элементы в список по одному, ты можешь сделать это в одну строку кода.
Краткость: Они позволяют писать меньше кода.
Читаемость: Когда ты привыкнешь к их синтаксису, ты будешь находить их более легкими для понимания, чем эквивалентные циклы for.
Производительность: В некоторых случаях списковые включения могут быть быстрее, чем циклы for.
Вот базовый синтаксис спискового включения:
expression: Выражение, которое определяет, как будет вычисляться каждый элемент нового списка. Это может быть что угодно: простое значение, математическая операция, вызов функции.
item: Переменная, которая принимает значение каждого элемента из iterable по очереди.
iterable: Итерируемый объект, например, список, кортеж, строка или результат работы range().
Пример:
Предположим, у тебя есть список чисел, и ты хочешь создать новый список, содержащий квадраты этих чисел.
Без спискового включения:
Со списковым включением:
Списковое включение делает код короче и понятнее!
Добавление условия
Списковые включения также позволяют тебе добавлять условия для выбора элементов, которые будут включены в новый список.
condition: условие, которое должно выполняться для включения элемента в новый список.
Пример:
Создадим список квадратов только четных чисел из нашего исходного списка numbers.
Без спискового включения:
Со списковым включением:
Я добавил if number % 2 == 0 в списковое включение, чтобы отфильтровать только четные числа.
Многострочные списковые включения
Когда списковые включения становятся сложнее, их можно разбивать на несколько строк для лучшей читаемости.
Пример:
Это делает код более понятным, особенно когда у тебя есть длинные условия или сложные выражения.
Упражнения
Упражнение 1: Преобразование температур
У тебя есть список температур в градусах Цельсия, и тебе нужно преобразовать их в градусы Фаренгейта. Формула для преобразования: F = (C * 9/5) + 32.
Вот твой список температур в Цельсиях:
Задача:
Используя списковое включение, создай новый список fahrenheit_temperatures, содержащий температуры из celsius_temperatures, преобразованные в градусы Фаренгейта.
Выведи полученный список fahrenheit_temperatures на экран.
Подсказка:
Используй формулу (celsius * 9/5) + 32 в качестве выражения в списковом включении.
Подумай, что является iterable, а что item в данном случае.
Мое решение:
Разбор кода:
celsius_temperatures = [0, 10, 20, 30, 40]: Это исходный список с температурами в градусах Цельсия.
fahrenheit_temperatures = [...]: Здесь мы создаем новый список с помощью спискового включения.
(celsius * 9/5) + 32: Это выражение, которое выполняется для каждого элемента. Оно преобразует температуру из Цельсия в Фаренгейт.
for celsius in celsius_temperatures: Это часть спискового включения, которая перебирает каждый элемент в списке celsius_temperatures, присваивая его значение переменной celsius на каждой итерации.
print(fahrenheit_temperatures): Выводит полученный список температур в Фаренгейтах.
Важно отметить:
В данном случае, celsius_temperatures является iterable, а celsius — item.
Я использую многострочное форматирование спискового включения для повышения читаемости кода.
Внутри выражения я напрямую применяю формулу преобразования, используя текущее значение celsius.
Упражнение 2: Фильтрация и преобразование строк
У тебя есть список слов, и тебе нужно сделать следующее:
Отфильтровать слова, которые начинаются с буквы "a" (регистр не важен).
Преобразовать все оставшиеся слова в верхний регистр.
Вот твой список слов:
Задача:
Используя списковое включение, создай новый список transformed_words, содержащий только те слова из списка words, которые не начинаются с буквы "a" (или "A"), и при этом преобразованные в верхний регистр.
Выведи полученный список transformed_words на экран.
Подсказки:
Используй метод строки startswith() для проверки, начинается ли слово с определенной буквы. Не забудь про регистр! Приведи все к нижнему регистру.
Используй метод строки upper() для преобразования строки в верхний регистр.
Подумай о порядке операций. Сначала фильтруем, потом преобразуем.
Мое решение:
Упражнение 3: Создание словаря из списка кортежей
У тебя есть список кортежей, где каждый кортеж содержит два элемента: имя и возраст человека.
Задача:
Используя списковое включение, создай словарь people_dict, где ключами будут имена людей, а значениями — их возраст.
Выведи словарь people_dict на экран.
Подсказки:
Списковые включения создают списки, но их можно использовать для создания списков кортежей, которые затем можно передать в конструктор dict().
Подумай, как извлечь имя и возраст из каждого кортежа.
Помни, что словарь — это структура данных, которая хранит пары ключ-значение.
Немного объяснения:
В Python можно создать словарь из списка кортежей, где каждый кортеж состоит из двух элементов (ключ, значение). Для этого я использую конструктор dict(). Например:
Твоя задача состоит в том, чтобы с помощью спискового включения создать этот список кортежей, который потом будет использован для создания словаря.
Мое решение:
Разбор кода:
people_data = [...]: Это исходный список кортежей, где каждый кортеж содержит имя и возраст человека.
people_dict = dict(...): Мы используем конструктор dict(), чтобы создать словарь из списка кортежей.
[ (name, age) for name, age in people_data ]: Это списковое включение, которое создает список кортежей.
(name, age): Это выражение создает кортеж из двух элементов: name и age.
for name, age in people_data: Это часть перебирает все кортежи из списка people_data. На каждой итерации кортеж распаковывается на две переменные: name и age.
print(people_dict): Выводит созданный словарь.
Ключевые моменты:
Списковое включение создает список кортежей.
Конструктор dict() преобразует список кортежей в словарь, используя первый элемент кортежа в качестве ключа, а второй - в качестве значения.
Распаковка кортежей в цикле for name, age in people_data делает код более читабельным.
Списковое включение в этом примере используется для подготовки данных для словаря.
Другие шпаргалки:
101 игра на python. Шпаргалки. Когда использовать dict и list
Примеры использования списков и словарей для представления данных о товарах. Я разложу абстрактный товар по характеристикам и покажу, как использовать список для представления товаров в категории.
Словарь (dict) – это идеальный способ представления характеристик одного товара, где есть пары "ключ-значение".
Список (list) – это отличный способ представления набора однотипных товаров, где каждый товар может быть представлен словарем.
1. Словарь (dict) для представления характеристик товара
Словарь для представления характеристик одного товара. В этом случае, ключами словаря будут названия характеристик, а значениями – их соответствующие значения.
Разъяснение кода:
словарь product, где ключами являются названия характеристик товара (id, name, brand, price и т.д.), а значениями — их соответствующие значения.
product.items() для итерации по всем парам "ключ-значение" и вывел их на экран.
2. Список (list) для представления товаров в категории
Список для представления списка товаров в определенной категории. В этом случае, каждый элемент списка будет представлять отдельный товар, который, в свою очередь, может быть представлен словарем.
Разъяснение кода:
Список products, где каждый элемент - это словарь, представляющий отдельный товар.
Я проитерировал список и вывел на экран информацию о каждом товаре, используя ключи словаря для доступа к характеристикам товара.
Я показал, как получить доступ к первому товару в списке, используя индекс 0.
Я проитерировал список еще раз, и показал как можно выводить только названия товаров.
Оригинала статьи в GIT
Другие шпаргалки:
Структуры данных в python
Переменные в python: что, как и зачем нужны
Строки в python
Функции в python
Синглтон (Singleton) в Python
dict vs SimpleNamespace в Python
Серия 101 игра на python с разбором кода. Портирую классические игры на язык python с добавлением искусственного интеллекта.
UPD:
КОД ПЕРЕЕХАЛ ПО ЭТОМУ АДРЕСУ
Шпаргалки. dict vs SimpleNamespace в Python. Особенности, преимущества, когда какой из них лучше использовать
Оба они позволяют хранить именованные данные, но делают это по-разному, и каждый из них имеет свои особенности.
1. Словари (dict)
Словарь в Python – это структура данных, которая хранит пары "ключ-значение". Ключи должны быть неизменяемыми типами данных (например, строки, числа, кортежи), а значения могут быть любыми.
Создание: Словари создаются с помощью фигурных скобок {} или функции dict().
Доступ к значениям: Значения доступны по ключу с помощью квадратных скобок [].
Изменение: Значения можно изменять, добавлять новые пары "ключ-значение" и удалять существующие.
2. SimpleNamespace
SimpleNamespace – это простой класс из модуля types, который позволяет обращаться к значениям как к атрибутам объекта. Он хорош для хранения и передачи набора данных.
Создание: SimpleNamespace создается с помощью функции SimpleNamespace() и передачей именованных аргументов.
Доступ к значениям: Значения доступны как атрибуты объекта с помощью точечной нотации `.`
Изменение: Значения можно изменять, добавлять новые атрибуты и удалять существующие.
Преимущества dict
Гибкость ключей: Ключи словаря могут быть любыми неизменяемыми типами данных (строки, числа, кортежи). Это позволяет создавать словари со сложной структурой, где ключами могут быть, например, координаты точек или другие сложные объекты.
Множество методов: Словари предоставляют богатый набор встроенных методов для работы с данными:
keys(): Возвращает все ключи словаря.
values(): Возвращает все значения словаря.
items(): Возвращает все пары "ключ-значение" в виде кортежей.
get(): Возвращает значение по ключу или значение по умолчанию, если ключа нет.
pop(): Удаляет элемент по ключу и возвращает его значение.
и многие другие.
Динамическое создание: Словари можно легко расширять, добавляя новые пары "ключ-значение" во время выполнения программы.
Итерация: Словари можно удобно итерировать: по ключам, по значениям или по парам ключ-значение.
Удобно для JSON: Словари имеют удобное представление для работы с JSON данными
Преимущества SimpleNamespace
Доступ к атрибутам через точку: Доступ к значениям с помощью точечной нотации (my_namespace.attribute) более читаем и удобен, чем использование квадратных скобок и ключей (my_dict["key"]). Это делает код более похожим на работу с обычными объектами.
Удобство при передаче данных: SimpleNamespace удобно использовать для передачи данных в функции или модули, когда нужно передать набор связанных именованных значений. Вы можете передать один объект, вместо нескольких переменных.
Простота создания: SimpleNamespace легко создать, передав именованные аргументы: SimpleNamespace(name="Alice", age=30).
Меньше кода: Для простого доступа к значениям как к атрибутам объекта, использование SimpleNamespace может потребовать меньше кода, чем работа со словарями.
Предсказуемая структура: В отличии от словаря, SimpleNamespace создает объект с конкретными атрибутами.
Когда что использовать:
Используй dict когда:
У тебя есть динамический набор ключей, которые могут меняться во время выполнения программы.
Тебе нужно использовать методы словаря для обработки итерирования данных.
Ты работаешь с данными в формате "ключ-значение".
Тебе нужны гибкость и динамичность.
Тебе нужны ключи, которые не являются строками.
Используй SimpleNamespace когда:
У тебя есть предопределенный набор именованных значений (атрибутов).
Тебе нужно передавать набор данных в виде объекта.
Тебе нужна более читаемая точечная нотация для доступа к значениям.
Тебе нужна простота и удобство при создании объектов для хранения данных.
Когда структура данных не должна меняться динамически.
Пример:
У тебя есть функция, которая принимает данные о пользователе.
В этом примере, для dict я использую метод get, чтобы получить значения, с предустановленным значением, если ключа нет. Для SimpleNamespace я обращаюсь к атрибутам напрямую, что более читаемо.
Оригинала статьи в GIT
Другие шпаргалки:
Структуры данных в python
Переменные в python: что, как и зачем нужны
Строки в python
Функции в python
Синглтон (Singleton) в Python
Серия 101 игра на python с разбором кода. Портирую классические игры на язык python с добавлением искусственного интеллекта.
UPD:
КОД ПЕРЕЕХАЛ ПО ЭТОМУ АДРЕСУ
101 игра на python. Шпаргалки. Синглтон (Singleton) в Python
В Python, синглтон – это шаблон проектирования, который гарантирует, что у класса будет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру. Это значит, что при попытке создать новый объект этого класса, ты всегда будешь получать один и тот же объект.
Синглтоны полезны, когда нужно ограничить количество экземпляров класса, например:
Для управления подключением к базе данных (чтобы не открывать много подключений).
Для хранения глобальной конфигурации приложения (чтобы все части приложения использовали одну и ту же конфигурацию).
Для логгирования (чтобы все сообщения шли в один файл).
Преимущества синглтона:
Гарантия единственного экземпляра: Синглтон гарантирует, что класс будет иметь только один экземпляр. Это полезно для управления ресурсами, которые должны быть уникальными.
Глобальный доступ: Синглтон предоставляет глобальную точку доступа к экземпляру класса, что упрощает использование этого экземпляра в любой части программы.
Недостатки синглтона:
Глобальное состояние: Синглтон может привести к использованию глобального состояния, что может вызывать неожиданные побочные эффекты и усложнять тестирование.
Нарушение принципов ООП: Синглтон может нарушать принцип единственной ответственности и инкапсуляции.
Несколько способов реализации синглтона в Python.
1. Реализация Через переопределение метода __new__
Mетод __new__ отвечает за создание экземпляра класса. Переопределив его, я смогу контролировать этот процесс.
В этом примере я буду хранить единственный экземпляр класса в переменной _instance.
Если экземпляра еще нет, я его создам, иначе верну уже существующий экземпляр.
2. Реализация Через декоратор
Декоратор – это функция, которая модифицирует класс.
В этом примере я создаю функцию-декоратор singleton, которая принимает класс и возвращает его обернутую версию.
Внутри декоратора я храню экземпляры классов в словаре instances.
Если экземпляр класса еще не создан, я его создам и сохраню в словаре, иначе верну существующий экземпляр.
3. Реализация Через метакласс
Mетакласс позволяет контролировать создание классов.
В этом примере я создам метакласс SingletonMeta, который будет следить за созданием экземпляров.
Метакласс хранит экземпляры классов в словаре _instances.
При создании нового экземпляра, я проверяю, есть ли он уже в словаре, если нет – создаю, иначе возвращаю существующий экземпляр.
4. Реализация Через модуль
В Python модуль сам по себе является синглтоном.
Я могу создать объект в модуле, и он будет единственным экземпляром.
Когда использовать синглтон?
Когда тебе нужно, чтобы объект существовал в единственном экземпляре (например, конфигурация, логгер, подключение к базе данных).
Когда тебе требуется глобальный доступ к этому объекту.
Оригинала статьи в GIT
Другие шпаргалки:
Серия 101 игра на python с разбором кода. Портирую классические игры на язык python с добавлением искусственного интеллекта.
Серия информатика, с изложением терминов
UPD:
КОД ПЕРЕЕХАЛ ПО ЭТОМУ АДРЕСУ
101 игра на python. Шпаргалки. Структуры данныx python
1. Списки (Lists)
Определение: Списки в Python – это упорядоченные, изменяемые коллекции элементов. Это значит, что ты можешь добавлять, удалять и изменять элементы в списке, и порядок элементов имеет значение.
Представление: Списки создаются с помощью квадратных скобок [], а элементы разделяются запятыми.
Особенности:
Могут содержать элементы разных типов данных (числа, строки, булевы значения, другие списки и т.д.).
Поддерживают индексацию (доступ к элементу по его позиции, начиная с 0).
Изменяемые (mutable).
Примеры:
2. Словари (Dictionaries)
Определение: Словари в Python – это неупорядоченные коллекции элементов, где каждый элемент состоит из пары "ключ-значение".
Представление: Словари создаются с помощью фигурных скобок {}, а пары "ключ-значение" разделяются двоеточием :.
my_dict = {"name": "John", "age": 30, "city": "New York"}
Особенности:
Ключи должны быть уникальными и неизменяемыми (обычно строки или числа), а значения могут быть любого типа.
Доступ к значениям осуществляется по ключу.
Изменяемые (mutable).
Неупорядоченные (порядок может не сохранятся)
Примеры:
3. Кортежи (Tuples)
Определение: Кортежи в Python – это упорядоченные, неизменяемые коллекции элементов.
Представление: Кортежи создаются с помощью круглых скобок (), а элементы разделяются запятыми.
my_tuple = (1, 2, 3, "apple", "banana", True)
Особенности:
Аналогичны спискам, но являются неизменяемыми (immutable), то есть нельзя изменить элементы после создания кортежа.
Могут содержать элементы разных типов данных.
Поддерживают индексацию.
Используются для представления неизменяемых последовательностей.
Примеры:
# Создание кортежа my_tuple = (1, 2, 3, "apple", "banana") print(f"Создание кортежа: {my_tuple}") # Доступ по индексу print(f"Элемент по индексу 2: {my_tuple[2]}") # Нельзя изменить элемент # my_tuple[0] = 0 # Это вызовет ошибку: TypeError: 'tuple' object does not support item assignment # Нельзя добавить элемент # my_tuple.append(4) # Это вызовет ошибку: AttributeError: 'tuple' object has no attribute 'append' # Нельзя удалить элемент # del my_tuple[0] # Это вызовет ошибку: TypeError: 'tuple' object doesn't support item deletion
4. SimpleNamespace
Определение: SimpleNamespace из модуля types - это простой класс, позволяющий создавать объекты, у которых атрибуты (свойства) можно задавать как при создании, так и потом.
Представление: Для создания объекта SimpleNamespace нужно импортировать его из types и передать в него именованные аргументы (или не передать их):
from types import SimpleNamespace my_namespace = SimpleNamespace(name="John", age=30, city="New York")
Особенности:
Позволяет создавать объекты с динамическими атрибутами (похоже на словарь).
Удобен для создания простых объектов для хранения данных.
Атрибуты доступны через точку, как у обычных объектов: my_namespace.name
В отличие от словарей, порядок атрибутов сохраняется.
Поля можно менять, но нельзя добавлять новые поля
Примеры:
from types import SimpleNamespace # Создание SimpleNamespace my_namespace = SimpleNamespace(name="John", age=30, city="New York") print(f"Создание SimpleNamespace: {my_namespace}") # Доступ к атрибуту print(f"Атрибут 'name': {my_namespace.name}") # Изменение атрибута my_namespace.age = 31 print(f"Изменение атрибута: {my_namespace}") # Нельзя добавить новый атрибут # my_namespace.occupation = "engineer" # Это вызовет ошибку: AttributeError: 'SimpleNamespace' object has no attribute 'occupation' # Нельзя удалить атрибут # del my_namespace.age # Это вызовет ошибку: AttributeError: age # Добавление через setattr setattr(my_namespace, "occupation", "engineer") print(f"Добавление атрибута: {my_namespace}") # Удаление через delattr delattr(my_namespace, "city") print(f"Удаление атрибута: {my_namespace}")
5. Другие структуры данных в Python:
Множества (Sets):
Неупорядоченные коллекции уникальных элементов.
Представление: {1, 2, 3, "apple"}
Изменяемые.
Строки (Strings):
Последовательность символов.
Представление: "hello", 'world'
Неизменяемые (immutable).
Поддерживают индексацию и многие другие операции.
Байтовые массивы (Bytearrays):
Изменяемая последовательность байтов.
Представление: bytearray(b"hello")
Используются для работы с двоичными данными.
Диапазоны (Ranges):
Последовательность целых чисел.
Представление: range(10), range(1, 10, 2)
Неизменяемые.
Используются для генерации последовательностей.
Frozen sets (неизменяемые множества)
Неизменяемая версия множеств (sets).
Представление frozenset([1, 2, 3])
UPD:
КОД ПЕРЕЕХАЛ ПО ЭТОМУ АДРЕСУ
101 игра нa python. Шпаргалка. Переменные в Python: что, как и зачем нужны
Статья из серии 101 игра на python. В серии я публикую разбор кода учебного репозитория для делающих первые шаги в разработке на python и просто любителей хорошего кода. В репозитории находится сборник программ игр, написанных лёгким языком, по которым ты можешь изучать код.
Переменные — это именованные контейнеры для хранения данных в памяти компьютера. Они позволяют обращаться к данным по имени, вместо того чтобы использовать их непосредственно.
Здесь `x` и `y` — переменные. `x` хранит число 10, а `y` — строку 'Привет, мир!'.
Как работают переменные в Python?
1. Динамическая типизация
В Python не нужно указывать тип переменной при её создании — это делается автоматически.
2. Ссылочная модель хранения данных
Переменные в Python — это ссылки на объекты в памяти. Например:
Правила именования переменных
1.Обязательные правила
- Имя переменной может состоять из букв, цифр и символа `_`, но не может начинаться с цифры.
✅ Примеры: `my_var`, `_data`, `var123`
❌ Неправильно: `123var`, `my-var`
- Имя переменной чувствительно к регистру.
Пример: `age` и `Age` — это разные переменные.
2. Рекомендации для имён переменных:
- Используй имена, которые отражают суть данных.
❌ Плохо: `a = 100`, `b = 'Имя'`
✅ Хорошо: `salary = 100`, `username = 'Имя'`
- Для многословных имён используй стиль snake_case:
Пример: `user_age`, `total_cost`.
3. Зарезервированные слова
Нельзя использовать ключевые слова Python (например, `if`, `for`, `while`) в качестве имён переменных. Чтобы увидеть список ключевых слов, выполни:
Особенности хранения типов данных
1. Типы данных Python
2. Изменяемые и неизменяемые типы
- Изменяемые: `list`, `dict`, `set`.
- Неизменяемые `int`, `float`, `str`, `tuple`.
3. Функция `type` для проверки типа
1. Используй осмысленные имена переменных, чтобы твой код был понятным.
2. Помни, что Python не требует объявления типа переменной, но будь внимателен, чтобы не путаться с типами данных.
3. Изучи встроенные функции работы с переменными, такие как `type()`, `id()` и модули, такие как `sys`, чтобы лучше понимать, как Python управляет памятью.
UPD:
КОД ПЕРЕЕХАЛ ПО ЭТОМУ АДРЕСУ
Шапргалка. Функции в python
Это дополнительный материал для изучающих python по репозиторию 101 игра на python, в котором находятся код игр для быстрого освоения программирования. Серия постов о проекте здесь
Содержание
1.Объявление функции
2. Параметры функции
- Виды параметров
3.Возврат значения
4. Локальные и глобальные переменные
5. Вложенные функции
6. Рекурсия
7. Обработка исключений
8. Пример использования
1.Объявление функции
Функция объявляется с помощью ключевого слова `def`, за которым следует имя функции, список параметров в круглых скобках и двоеточие. Тело функции пишется с отступом.
`a: int` и `b: int` — параметры функции с аннотациями типов.
-> int — аннотация типа возвращаемого значения.
2. Параметры функции
Функции могут принимать параметры, которые представляют собой входные данные. Они указываются в скобках после имени функции.
Пример с одним параметром:
Виды параметров:
1. Обязательные параметры — должны быть переданы при вызове функции.
2. Необязательные параметры — могут иметь значения по умолчанию.
3. Возврат значения
Функция может возвращать значение с помощью ключевого слова `return`. Если `return` не используется, функция по умолчанию возвращает `None`.
Пример:
4. Локальные и глобальные переменные
- Локальная переменная — это переменная, которая существует только внутри функции. Она создается и уничтожается при каждом вызове функции.
- Глобальная переменная— это переменная, которая доступна во всем коде, включая функции.
Пример использования глобальной переменной:
Если внутри функции нужно изменить глобальную переменную, необходимо использовать ключевое слово `global`:
5. Вложенные функции
В Python функции могут быть вложенными, то есть одна функция может быть определена внутри другой. Вложенная функция может обращаться к переменным внешней функции.
Пример:
6. Рекурсия
Рекурсия — это когда функция вызывает саму себя. Это полезно для задач, которые можно разбить на более мелкие аналогичные задачи (например, факториал).
Пример рекурсии:
7. Обработка исключений с `try` и `except`
Python предоставляет механизм обработки ошибок с помощью блоков `try` и `except`. Код, который может вызвать ошибку, помещается в блок `try`, а ошибки обрабатываются в блоке `except`.
Пример обработки ошибок:
Здесь:
- Блок `try` пытается выполнить операцию деления.
- Блок `except ZeroDivisionError` перехватывает ошибку деления на ноль.
- Блок `except Exception as e` ловит другие исключения и выводит сообщение об ошибке.
8. Пример использования функций:
9. Метод и функция — в чем разница?
Разница между методом и функцией заключается в контексте, в котором они используются:
Метод:
Это функция, которая принадлежит определенному объекту или классу.
Метод вызывается через экземпляр класса или сам класс, что позволяет ему работать с данными этого объекта.
Методы используют self (в случае классов Python) для доступа к данным объекта.
Пример:
Функция:
Это независимый блок кода, который не связан с объектами или классами.
Функция вызывается напрямую, и она может работать с любыми переданными ей параметрами.
Пример:
Основное различие:
Метод привязан к классу или объекту, а функция — это независимая единица кода, которая выполняет задачу и не зависит от объектов.
UPD:
КОД ПЕРЕЕХАЛ ПО ЭТОМУ АДРЕСУ