Можно использовать мокирование (mocking) зависимостей или стабирование (stubbing), чтобы заменить долгие операции на быстрые фиктивные реализации, которые будут возвращать заранее заданные значения. Также можно рассмотреть параллельное выполнение или кеширование результатов для ускорения тестов.
Если функция выполняет одинаковые операции с одинаковыми входными данными, можно кэшировать результаты этих операций, чтобы не выполнять их повторно.
Используйте mock-объекты для замены дорогих операций фиктивными, которые возвращают заранее определенные результаты.
Фикстуры позволяют подготовить данные или состояния один раз перед выполнением тестов и повторно использовать их в разных тестах.
Параллельное выполнение тестов может значительно сократить общее время тестирования. Допустим, у нас есть функция, которая выполняет дорогую операцию:
import time
def expensive_operation(data):
time.sleep(5) # Имитация долгой операции
return sum(data)
def process_data(data):
result = []
for item in data:
result.append(expensive_operation(item))
return result
Мы можем замокировать
expensive_operation, чтобы она возвращала заранее определенные результаты без выполнения долгих операций.from unittest.mock import patch
def test_process_data():
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
with patch('__main__.expensive_operation') as mock_expensive:
mock_expensive.side_effect = [6, 15, 24] # Заранее определенные результаты
result = process_data(data)
assert result == [6, 15, 24]
assert mock_expensive.call_count == 3 # Проверка, что функция вызвана 3 раза
Используем кэширование для хранения результатов дорогостоящих операций.
from functools import lru_cache
@lru_cache(maxsize=None)
def expensive_operation(data):
time.sleep(5) # Имитация долгой операции
return sum(data)
def process_data(data):
result = []
for item in data:
result.append(expensive_operation(tuple(item))) # Преобразуем список в кортеж для кэширования
return result
Фикстуры для подготовки данных
Создаем фикстуры для подготовки данных, которые используются в тестах.
import pytest
@pytest.fixture
def sample_data():
return [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
def test_process_data(sample_data):
with patch('__main__.expensive_operation') as mock_expensive:
mock_expensive.side_effect = [6, 15, 24] # Заранее определенные результаты
result = process_data(sample_data)
assert result == [6, 15, 24]
Запуск тестов параллельно
Используйте возможности параллельного выполнения тестов, например, с помощью
pytest-xdist.pytest -n 4 # Запуск тестов в 4 параллельных потоках
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍8
Проверка взаимодействия между различными модулями или компонентами системы.
Проверяет, как отдельные части системы работают вместе.
Выявляет проблемы, которые могут возникнуть при передаче данных или управлении между модулями.
Проводится после юнит-тестов и перед системными тестами.
Включает взаимодействие с внешними сервисами, базами данных, файлами и другими модулями.
Часто используются mock-объекты для замены реальных зависимостей.
def fetch_data_from_db():
# Имитация запроса к базе данных
return {"user": "John", "email": "john@example.com"}
def send_email(data):
# Имитация отправки электронной почты
print(f"Sending email to {data['email']}")
def process_user_data():
data = fetch_data_from_db()
send_email(data)
Интеграционный тест может выглядеть так
def test_process_user_data():
data = fetch_data_from_db()
assert data["email"] == "john@example.com"
send_email(data)
Проверка функциональности системы на соответствие требованиям.
Проверяет, выполняет ли система свои функции в соответствии с заданными требованиями.
Тестирует систему с точки зрения конечного пользователя.
Может включать юнит-тесты, интеграционные тесты, системные и приемочные тесты.
Не требует знания внутренней структуры или кода системы.
Могут использоваться автоматизированные тестовые фреймворки, такие как Selenium для веб-приложений.
def register_user(username, password):
# Имитация регистрации пользователя
if username and password:
return "Registration successful"
else:
return "Registration failed"
Функциональный тест может выглядеть так:
def test_register_user():
assert register_user("testuser", "securepassword") == "Registration successful"
assert register_user("", "securepassword") == "Registration failed"
Интеграционное тестирование: Проверка взаимодействия между модулями.
Функциональное тестирование: Проверка функциональности системы на соответствие требованиям.
Интеграционное тестирование: Взаимодействие и интерфейсы между модулями.
Функциональное тестирование: Поведение системы с точки зрения пользователя.
Интеграционное тестирование: Промежуточный уровень между юнит-тестами и системными тестами.
Функциональное тестирование: Может охватывать все уровни, включая юнит-тесты, интеграционные, системные и приемочные тесты.
Интеграционное тестирование: Тестирование "серого ящика" (частичное знание внутренней структуры).
Функциональное тестирование: Тестирование "черного ящика" (без знания внутренней структуры).
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7💊4👍3🔥3
Вьюха обрабатывает запрос (например, получение данных из базы данных, выполнение бизнес-логики). На основе обработки данных вьюха формирует объект ответа. В Django это может быть
HttpResponse, JsonResponse и т.д. В Flask это может быть объект Response или просто строка, которая будет конвертирована в ответ. from django.http import HttpResponse
def my_view(request):
data = "Hello, World!"
return HttpResponse(data)
Пример в Flask
from flask import Flask, Response
app = Flask(__name__)
@app.route('/')
def my_view():
return Response("Hello, World!")
После того как вьюха сформировала ответ, он проходит через цепочку промежуточных слоев (middleware). Middleware могут модифицировать объект ответа, добавлять заголовки, обрабатывать ошибки и т.д. Примеры обработки включают логирование, сжатие контента, обработку сессий и т.д.
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
response['X-Custom-Header'] = 'My Custom Header'
return response
После прохождения всех промежуточных слоев ответ передается веб-серверу. Веб-сервер, такой как Nginx или Apache, отправляет сформированный ответ обратно клиенту (например, браузеру). Сервер обрабатывает низкоуровневые детали HTTP-протокола, такие как установка соединения, обработка заголовков и передача данных.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Это процесс проверки корректности и полноты данных, поступающих в систему, прежде чем они будут использованы или сохранены. Этот процесс может происходить на разных уровнях веб-приложения: клиентская сторона, серверная сторона, и на уровне базы данных.
До отправки данных на сервер. Используются HTML5 атрибуты и JavaScript. Снижение нагрузки на сервер, мгновенная обратная связь для пользователя. Не является надежной, так как пользователь может обойти ее.
<form>
<input type="text" name="username" required minlength="3">
<input type="email" name="email" required>
<input type="submit">
</form>
Пример JavaScript валидации
document.querySelector('form').addEventListener('submit', function(event) {
const username = document.querySelector('input[name="username"]').value;
if (username.length < 3) {
alert('Username must be at least 3 characters long.');
event.preventDefault();
}
});После получения данных от клиента. Используются встроенные или сторонние библиотеки и фреймворки. Надежная защита, обязательна даже при наличии клиентской валидации. Добавляет нагрузку на сервер, может увеличить время отклика.
from django import forms
class UserForm(forms.Form):
username = forms.CharField(min_length=3, max_length=100)
email = forms.EmailField()
def my_view(request):
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid():
# Обработка данных
pass
else:
# Обработка ошибок
pass
else:
form = UserForm()
return render(request, 'my_template.html', {'form': form})
Пример в Flask
from flask import Flask, request, render_template_string
from wtforms import Form, StringField, validators
app = Flask(__name__)
class UserForm(Form):
username = StringField('Username', [validators.Length(min=3, max=100)])
email = StringField('Email', [validators.Email()])
@app.route('/', methods=['GET', 'POST'])
def my_view():
form = UserForm(request.form)
if request.method == 'POST' and form.validate():
# Обработка данных
pass
return render_template_string('<form method="POST">{{ form.csrf_token }}{{ form.username }}{{ form.email }}<input type="submit"></form>', form=form)
При сохранении данных в базу данных. Используются ограничения базы данных (constraints) и триггеры. Гарантия целостности данных на уровне хранения. Может вызвать ошибки, если данные уже были приняты сервером, но не прошли валидацию на уровне БД.
Пример ограничения в SQL
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(100) NOT NULL CHECK (LENGTH(username) >= 3),
email VARCHAR(100) NOT NULL UNIQUE
);
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍2💊2😁1
Это стандартный интерфейс между веб-серверами и веб-приложениями или фреймворками, написанными на языке Python. Он определяет, как веб-сервер должен взаимодействовать с веб-приложением, и позволяет различным веб-серверам работать с любыми Python-приложениями, поддерживающими WSGI.
Позволяет любому WSGI-совместимому веб-серверу запускать любое WSGI-совместимое приложение.
Обеспечивает возможность объединения нескольких промежуточных компонентов (middleware), которые могут выполнять задачи до или после обработки запросов основным приложением.
Упрощает разработку и развертывание веб-приложений, делая их независимыми от конкретных веб-серверов.
Программное обеспечение, которое принимает HTTP-запросы от клиента (например, браузера), преобразует их в формат, понятный приложению, и затем отправляет HTTP-ответы обратно клиенту. Примеры WSGI-серверов: Gunicorn, uWSGI.
Любое Python-приложение или фреймворк, которое реализует WSGI-интерфейс. Примеры фреймворков: Django, Flask.
WSGI определяет простой интерфейс, который веб-сервер использует для передачи запросов в приложение и получения ответов от него. Этот интерфейс основан на вызове функции или вызываемого объекта (callable), который принимает два аргумента:
environ и start_response.Словарь, содержащий все данные о запросе, такие как заголовки, параметры и другие метаданные.
Функция, которую приложение вызывает для начала формирования ответа. Она принимает статус ответа и заголовки.
def application(environ, start_response):
status = '200 OK'
headers = [('Content-Type', 'text/plain')]
start_response(status, headers)
return [b"Hello, World!"]
# Запуск приложения с использованием встроенного WSGI-сервера wsgiref
if __name__ == "__main__":
from wsgiref.simple_server import make_server
server = make_server('localhost', 8051, application)
print("Serving on http://localhost:8051...")
server.serve_forever()
Современные Python веб-фреймворки, такие как Django и Flask, автоматически поддерживают WSGI. Это позволяет легко развертывать приложения, используя WSGI-серверы.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, World!"
if __name__ == "__main__":
app.run()
Для развертывания этого приложения с использованием WSGI-сервера, например, Gunicorn, можно выполнить команду. Где
myapp — это имя файла без расширения .py, а app — это объект приложения Flask.gunicorn myapp:app
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Django и микрофреймворки, такие как FastAPI, предназначены для разработки веб-приложений на Python, но они имеют различия в подходе, функциональности и областях применения.
Django предоставляет полный набор инструментов для разработки веб-приложений, включая ORM (Object-Relational Mapping), систему шаблонов, формы, аутентификацию, админ-панель и другие компоненты. Подходит для разработки сложных и крупных приложений, требующих множества встроенных функциональностей.
Django следует принципу "The web framework for perfectionists with deadlines", предлагая стандартные способы решения большинства задач. Многое делается "из коробки", что снижает необходимость принимать решения по настройке и интеграции.
Django создавался с идеей "все включено", что означает, что все основные компоненты встроены и работают вместе. Это упрощает создание приложений, но может быть избыточным для небольших или простых проектов.
Django ORM позволяет удобно работать с различными базами данных, абстрагируясь от специфики SQL. Включает мощные средства для миграций баз данных.
from django.shortcuts import render
from django.http import HttpResponse
def hello_world(request):
return HttpResponse("Hello, World!")
FastAPI является легковесным фреймворком, предназначенным для создания высокопроизводительных веб-API. Включает минимальное количество компонентов, предоставляя только то, что необходимо для обработки запросов и ответов.
FastAPI изначально поддерживает асинхронное программирование с помощью
async и await, что позволяет создавать высокопроизводительные приложения. Построен на базе Starlette и Pydantic, что обеспечивает скорость работы и удобную валидацию данных.FastAPI следует принципу "минимальных зависимостей", позволяя разработчику добавлять только необходимые компоненты и библиотеки. Легко интегрируется с различными базами данных и другими инструментами по мере необходимости.
FastAPI использует аннотации типов Python для автоматической генерации документации OpenAPI и валидации данных. Это упрощает разработку и тестирование API, делая код более читаемым и поддерживаемым.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def hello_world():
return {"message": "Hello, World!"}
Django: Предоставляет все необходимые инструменты для разработки полного веб-приложения, включая работу с базами данных, формами, аутентификацией и админ-панелью.
FastAPI: Фокусируется на создании быстрых и производительных веб-API, оставляя выбор других инструментов за разработчиком.
Django: Поддержка асинхронного программирования была добавлена в более поздних версиях, но изначально он был ориентирован на синхронное программирование.
FastAPI: Изначально построен с поддержкой асинхронного программирования, что позволяет создавать высокопроизводительные приложения.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥3
Это метод определения типов переменных в программе, при котором типы данных проверяются на этапе компиляции, а не во время выполнения программы. Это означает, что все типы переменных, параметров функций и возвращаемых значений должны быть известны и определены до запуска программы.
Типы переменных и выражений проверяются компилятором или статическим анализатором до запуска программы. Ошибки, связанные с типами, выявляются еще до выполнения программы.
В языках со статической типизацией программист обычно явно указывает типы переменных. Это позволяет компилятору точно знать, какого типа значения будут использоваться в каждой переменной.
Статическая типизация помогает предотвратить многие типы ошибок, такие как использование переменных с неправильным типом, вызов функций с неверными аргументами и т.д. Улучшает надежность и предсказуемость кода.
Компилятор может выполнять оптимизации, зная типы данных заранее. Это может привести к более эффективному машинному коду и улучшению производительности программы.
Java
public class Example {
public static void main(String[] args) {
int number = 10;
String text = "Hello, World!";
System.out.println(text + " " + number);
}
}C++
#include <iostream>
using namespace std;
int main() {
int number = 10;
string text = "Hello, World!";
cout << text << " " << number << endl;
return 0;
}
Go
package main
import "fmt"
func main() {
var number int = 10
var text string = "Hello, World!"
fmt.Println(text, number)
}
Ошибки, связанные с типами, обнаруживаются на этапе компиляции, что снижает количество ошибок, проявляющихся во время выполнения программы.
Современные IDE могут использовать информацию о типах для улучшения автодополнения кода, навигации по коду и рефакторинга.
Явное указание типов служит дополнительной документацией для разработчиков, облегчая понимание и сопровождение кода.
Компилятор может выполнять более эффективные оптимизации, зная точные типы данных, что улучшает производительность программы.
Необходимость явно указывать типы данных может увеличить объем кода и время разработки.
В некоторых случаях статическая типизация может ограничить гибкость кода, требуя дополнительных усилий для работы с динамическими структурами данных.
Python является динамически типизированным языком, но с версией 3.5 и выше появились возможности для аннотации типов (type hints) с использованием модуля
typing. Это добавляет элементы статической типизации, помогая улучшить читаемость кода и использовать статические анализаторы для проверки типов.def greet(name: str) -> str:
return f"Hello, {name}!"
def add(x: int, y: int) -> int:
return x + y
name: str = "Alice"
print(greet(name))
result: int = add(3, 5)
print(result)
Использование статического анализатора mypy
mypy example.py
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥3
Это два различных подхода к определению и проверке типов данных в программировании.
Типы данных проверяются компилятором или статическим анализатором до запуска программы.
Программист явно указывает типы переменных, параметров функций и возвращаемых значений.
Ошибки, связанные с типами, выявляются на этапе компиляции, что предотвращает множество ошибок во время выполнения программы.
Java, C, C++, Go, Rust.
Пример на Java
public class Example {
public static void main(String[] args) {
int number = 10;
String text = "Hello, World!";
System.out.println(text + " " + number);
}
}Типы данных проверяются интерпретатором или средой выполнения во время исполнения программы.
Типы переменных определяются автоматически на основе присваиваемых значений.
Переменные могут менять свой тип в течение выполнения программы, что позволяет писать более гибкий код.
Python, JavaScript, Ruby, PHP.
def greet(name):
return f"Hello, {name}!"
number = 10
text = "Hello, World!"
print(greet(text))
print(number)
Ошибки, связанные с типами, выявляются на этапе компиляции, что снижает вероятность ошибок во время выполнения программы.
Компилятор может выполнять более эффективные оптимизации, зная точные типы данных.
Современные IDE могут использовать информацию о типах для улучшения автодополнения, навигации по коду и рефакторинга.
Явное указание типов служит дополнительной документацией для разработчиков, облегчая понимание и сопровождение кода.
Необходимость явно указывать типы данных может увеличить объем кода и время разработки.
В некоторых случаях статическая типизация может ограничить гибкость кода, требуя дополнительных усилий для работы с динамическими структурами данных.
Отсутствие необходимости явно указывать типы данных позволяет писать код быстрее и проще, особенно для прототипирования и небольших проектов.
Нет необходимости явно указывать типы, что уменьшает объем кода.
Переменные могут менять тип в течение выполнения программы, что упрощает некоторые задачи.
Ошибки, связанные с типами, выявляются только во время выполнения программы, что может усложнить отладку и тестирование.
Отсутствие информации о типах на этапе компиляции может ограничить возможности оптимизации.
В больших проектах отсутствие явных типов может усложнить понимание и сопровождение кода.
Является надстройкой над JavaScript, добавляющей статическую типизацию. Позволяет разработчикам использовать статические типы и получать раннюю проверку типов, сохраняя при этом гибкость JavaScript.
С версии 3.5 введены аннотации типов (type hints) с использованием модуля
typing. Это позволяет использовать статический анализ типов с помощью инструментов, таких как mypy.def greet(name: str) -> str:
return f"Hello, {name}!"
def add(x: int, y: int) -> int:
return x + y
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍4
Это два популярных языка программирования, каждый из которых имеет свои уникальные особенности, области применения, преимущества и недостатки.
Более сложный и строгий синтаксис, требующий явного объявления типов переменных, использования указателей, управления памятью и других низкоуровневых конструкций. Более крутая кривая обучения из-за необходимости понимать концепции, такие как управление памятью, указатели и более сложные конструкции языка.
#include <iostream>
int main() {
int number = 10;
std::cout << "Hello, World! Number: " << number << std::endl;
return 0;
}
Простой и лаконичный синтаксис, который делает код более читаемым и легким для написания. Нет необходимости в явном объявлении типов благодаря динамической типизации. Пологая кривая обучения, подходящая для новичков и быстрых прототипов.
number = 10
print("Hello, World! Number:", number)
Типы данных проверяются на этапе компиляции, что позволяет обнаруживать ошибки раньше и оптимизировать код. Типы переменных и функций должны быть явно указаны.
Типы данных проверяются на этапе выполнения, что обеспечивает большую гибкость, но может приводить к ошибкам времени выполнения. Типы переменных определяются автоматически на основе присваиваемых значений.
Благодаря компиляции в машинный код и возможностям низкоуровневой оптимизации C++ обеспечивает высокую производительность. Ручное управление памятью с помощью
new, delete, указателей и других механизмов, что позволяет тонко настраивать использование ресурсов.Интерпретируемый язык с динамической типизацией, что может замедлить выполнение кода по сравнению с C++. Сборщик мусора автоматически управляет памятью, что упрощает разработку, но может снижать производительность.
Используется для разработки операционных систем, драйверов и другого системного ПО. Широко применяется для разработки игр благодаря высокой производительности и возможностям низкоуровневого управления. Используется в задачах, требующих максимальной производительности.
Популярен в веб-разработке благодаря фреймворкам, таким как Django и Flask. Широко используется в области данных и ИИ благодаря библиотекам, таким как Pandas, NumPy, TensorFlow и PyTorch. Отлично подходит для написания скриптов и автоматизации задач благодаря простоте синтаксиса и большим возможностям стандартной библиотеки.
Поддерживает процедурное, объектно-ориентированное и обобщённое программирование (templates). Мощный инструмент для обобщённого программирования и метапрограммирования.
Поддерживает процедурное, объектно-ориентированное и функциональное программирование. Инструменты, облегчающие функциональное и асинхронное программирование.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13💊1
Это концепция в программировании, означающая, что язык строго контролирует использование типов данных, не позволяя неявных преобразований и смешивания несовместимых типов. В языке со строгой типизацией тип переменной определяет, какие операции могут быть выполнены с этой переменной, и любые операции, не поддерживаемые типом, вызывают ошибку компиляции или выполнения.
Преобразование типов должно быть явным. Если вы хотите преобразовать один тип данных в другой, вы должны явно указать это в коде. Например, в языках со строгой типизацией нельзя автоматически сложить строку и число без явного преобразования.
Компилятор или интерпретатор проверяет совместимость типов во время компиляции или выполнения. Ошибки типов выявляются и сообщаются разработчику, что помогает предотвратить многие классы ошибок.
Строго типизированные языки обеспечивают высокий уровень безопасности типов, предотвращая операции между несовместимыми типами данных. Это способствует большей надежности и предсказуемости кода.
В Java преобразования типов должны быть явными. Например, при попытке сложить строку и число необходимо явно преобразовать число в строку.
public class Example {
public static void main(String[] args) {
int number = 10;
String text = "Number: ";
String result = text + Integer.toString(number); // Явное преобразование числа в строку
System.out.println(result);
}
}Также требуется явное преобразование типов при необходимости.
#include <iostream>
#include <string>
int main() {
int number = 10;
std::string text = "Number: ";
std::string result = text + std::to_string(number); // Явное преобразование числа в строку
std::cout << result << std::endl;
return 0;
}
Несмотря на динамическую типизацию, Python также поддерживает строгую типизацию в том смысле, что неявные преобразования типов не выполняются.
number = 10
text = "Number: "
result = text + str(number) # Явное преобразование числа в строку
print(result)
Язык со слабой типизацией позволяет неявные преобразования типов. Примером является JavaScript, где строка и число могут быть сложены без явного преобразования.
let number = 10;
let text = "Number: ";
let result = text + number; // Неявное преобразование числа в строку
console.log(result); // "Number: 10"
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Типы: GET (получение данных), POST (отправка данных), PUT (обновление ресурса), DELETE (удаление ресурса), PATCH (частичное обновление). GET передаёт параметры в URL, а POST отправляет данные в теле запроса. PUT и DELETE изменяют состояние сервера, а PATCH обновляет только указанные части ресурса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥4
Это языки, которые предоставляют минимальную абстракцию от аппаратного обеспечения компьютера. Они ближе к машинному коду и позволяют программистам контролировать все аспекты работы с аппаратными ресурсами, такими как память, процессор и другие компоненты.
Представляет собой низкоуровневый язык программирования, который напрямую соответствует машинным инструкциям конкретного процессора.
Каждая команда ассемблера соответствует одной или нескольким машинным инструкциям. Программы на ассемблере зависят от архитектуры процессора (например, x86, ARM). Высокий уровень контроля над аппаратным обеспечением.
section .data
hello db 'Hello, world!', 0
section .text
global _start
_start:
; write(1, hello, 13)
mov eax, 4
mov ebx, 1
mov ecx, hello
mov edx, 13
int 0x80
; exit(0)
mov eax, 1
xor ebx, ebx
int 0x80
Машинный код состоит из инструкций, выполняемых непосредственно центральным процессором компьютера (CPU). Эти инструкции записываются в виде бинарных чисел (0 и 1). Наиболее низкий уровень абстракции. Трудночитаем для человека. Высокая производительность и контроль над аппаратными ресурсами.
10111000 00000001 10110000 01100001 00000000 11000000
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9