Основы программирования на Python Каширский / методички / Лабораторная работа № 4 2025
.pdfДополнительный материал
1 Работа с различными коллекциями в цикле for
1.1 Итерация по строкам
Строки являются последовательностями поэтому реализуют интерфейс итерируемого объекта, что позволяет пройтись по каждому символу строки в цикле for
text = "Hello" for char in text: print(char)
#H
#e
#l
#l
#o
1.2 Итерация по спискам
fruits = ['apple', 'banana', 'cherry'] for fruit in fruits: print(fruit) # apple # banana # cherry
1.3 Итерация по кортежам coordinates = (10, 20, 30)
for coord in coordinates: print(coord)
# Часто используется для распаковки points = [(1, 2), (3, 4), (5, 6)] for x, y in points: print(f"X: {x}, Y: {y}")
1.4 Итерация по множествам
colors = {'red', 'green', 'blue'}
for color in colors: print(color)
#blue, green, red (порядок может быть другим)
#Проверка принадлежности
for color in colors: |
|
if 'e' in color: |
|
print(f"Цвет с буквой 'e': |
{color}") |
1.5 Итерация по словарям
По умолчанию итерация ведется по ключам
colors = {'red', 'green', 'blue'}
person = {'name': 'Alice', 'age': 30, 'city': 'London'}
for key in person: print(key)
#name
#age
#city
Можно явно указать, что нужна итерация по ключам, воспользовавшись методом keys()
person = {'name': 'Alice', 'age': |
30, 'city': 'London'} |
for key in person.keys(): |
|
print(key) |
|
# name |
|
# age |
|
# city |
|
Метод values() дает возможность итерации по значениям
person = {'name': 'Alice', 'age': 30, 'city': 'London'}
for value in person.values(): print(value)
#Alice
#30
#London
#Поиск определенного значения for value in person.values():
if isinstance(value, int): print(f"Найдено число: {value}")
Если требуется итерация одновременно по ключу и значению, то можно воспользоваться методом items()
person = {'name': 'Alice', 'age': |
30, 'city': 'London'} |
for key, value in person.items(): |
|
print(f"{key}: {value}") |
|
# name: Alice |
|
# age: 30 |
|
# city: London |
|
1.6Одновременная итерация по нескольким последовательностям
Спомощью zip() можно реализовать параллельную итерацию. Функция принимает в качестве аргументов итерируемые объекты и возвращает кортежи, состоящие из элементов этих объектов с одинаковыми индексами.
names = ['Alice', 'Bob', 'Charlie'] scores = [85, 92, 78] ages = [25, 30, 35] cities = ['London', 'New York', 'Tokyo']
for name, score in zip(names, scores): print(f"{name}: {score} баллов")
#Alice: 85 баллов
#Bob: 92 баллов
#Charlie: 78 баллов
for name, age, city |
in zip(names, |
ages, cities): |
print(f"{name}, |
{age} лет, из |
{city}") |
1.7 Получение индекса в цикле for
Возникают ситуации, когда нужно знать индекс текущего элемента, но цикл for его не предоставляет. В этом случае можно завести целочисленную переменную и на каждой итерации цикла увеличивать ее значение на единицу. Но есть более элегантный способ – использовать enumerate(). Данная функция принимает два аргумента: итерируемый объект и начальное значение индекса (по умолчанию равно нулю), а возвращает кортежи вида (индекс, элемент итерируемого объекта).
fruits = ['apple', 'banana', 'cherry']
# Без enumerate (неудобно) i = 0 for fruit in fruits: print(f"{i}: {fruit}") i += 1
# С enumerate (удобно) for index, fruit in enumerate(fruits): print(f"{index}: {fruit}")
# С изменением начального индекса for index, fruit in enumerate(fruits, start=1): print(f"{index}: {fruit}")
# Поиск элемента по условию с сохранением индекса numbers = [10, 20, 30, 40, 50] for idx, num in enumerate(numbers): if num > 25: print(f"Первое число > 25: {num} на позиции {idx}") break
2 Создание коллекций с помощью включений
Концепция включений состоит в создании новых коллекций на основе существующих в одну строку.
Преимущества:
• Более читаемый и компактный код
• Часто работают быстрее обычных циклов
• Идиоматичный стиль Python
Включения бывают списковыми, словарными, множественными.
2.1 Списковые включения (List Comprehensions)
Синтаксис спискового включения:
[expression for item in iterable], где
expression – выражение, задающее значение элемента создаваемого списка, item – текущий элемент исходного итерируемого объекта,
iterable – итерируемый объект.
Пример генерации списка, состоящего из квадратов целых чисел
#Обычный способ squares = []
for x in range(5): squares.append(x ** 2)
#Списковое включение
squares = [x ** |
2 |
for |
x in range(5)] |
print(squares) |
# |
[0, |
1, 4, 9, 16] |
Списковые включения могут содержать условие. В этом случае синтаксис спискового включения принимает следующий вид:
[expression for item in iterable if condition]
Примеры генерации списка, состоящего из четных чисел, и списка, состоящего из чисел больше 5
# Только четные числа |
|
|
||
evens = [x for x in range(10) if x |
% 2 == |
0] |
||
print(evens) |
# [0, 2, 4, 6, 8] |
|
|
|
# Числа больше 5 |
|
|
|
|
big_nums = [x |
for x in range(10) if x > 5] |
|
||
print(big_nums) |
# [6, 7, 8, 9] |
|
|
|
В списковых включениях можно использовать условия и в виде тернарного оператора. Синтаксис:
[expression_true if condition else expression_false for item in iterable]
Примеры
# Замена отрицательных чисел на 0 |
|||
numbers = [1, |
-2, 3, |
-4, 5] |
|
non_negative |
= [x if |
x >= |
0 else 0 for x in numbers] |
print(non_negative) |
# [1, 0, 3, 0, 5] |
||
# Четные/нечетные метки |
|
||
labels = ["even" if x |
% 2 |
== 0 else "odd" for x in range(5)] |
|
print(labels) |
# ['even', |
'odd', 'even', 'odd', 'even'] |
|
Списковые включения аналогично циклам могут быть вложенными. Синтаксис:
[expression for outer_item in outer_iterable for inner_item in inner_iterable]
Примеры
# Создание таблицы умножения |
|
|
|
table = [[i * |
j for j in range(1, |
4)] for i in range(1, |
4)] |
print(table) |
# [[1, 2, 3], [2, 4, 6], [3, 6, 9]] |
|
|
# "Раскрытие" |
вложенного списка |
|
|
matrix = [[1, |
2], [3, 4], [5, 6]] |
|
|
flat = [num for row in matrix for |
num in row] |
|
|
print(flat) |
# [1, 2, 3, 4, 5, 6] |
|
|
2.2 Множественные включения (Set Comprehensions)
Множественные включения имеют синтаксис аналогичный синтаксису списковых включений, отличаясь только фигурными скобками:
{expression for item in iterable}
Примеры
# Создание множества квадратов |
||||
squares_set = |
{x ** |
2 |
for x in range(5)} |
|
print(squares_set) |
# |
{0, 1, 4, 9, 16} |
||
# Удаление дубликатов |
из списка |
|||
numbers = [1, |
2, 2, |
3, 3, |
3, 4] |
|
unique_nums = |
{x for |
|
x in |
numbers} |
print(unique_nums) |
# |
{1, |
2, 3, 4} |
|
2.3 Словарные включения (Dict Comprehensions)
Словарные включения имеют синтаксис похожий на синтаксисис множественных включений, только вместо expression указывается через двоеточие пара значений – key и value:
{key: value for item in iterable}
Примеры
# Создание словаря |
квадратов |
squares_dict = {x: |
x ** 2 for x in range(5)} |
print(squares_dict) |
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} |
# Инвертирование словаря |
|
original = {'a': 1, 'b': 2, 'c': 3} |
|
inverted = {value: key for key, value in original.items()} print(inverted) # {1: 'a', 2: 'b', 3: 'c'}
Задание 1
Данное задание предполагает применение только конструкций if, if – else, if – elif – else.
1. Расчет делителя напряжения.
Пользователь вводит значения двух резисторов R1, R2 и входное напряжение Uin. Программа рассчитывает выходное напряжение по формуле Uout = Uin * (R2 / (R1 + R2)). Если R1 + R2 равна нулю, вывести сообщение об ошибке (короткое замыкание).
2. Расчет сопротивления параллельно соединенных резисторов.
Пользователь вводит значения сопротивления двух резисторов в Омах. Вычисляет общее сопротивление по формуле для параллельного соединения: Rобщ = 1/(1/R1 + 1/R2). Если R1 или R2 меньше или равно нуля, то вывести ошибку.
3. Расчет мощности резистора.
Пользователь вводит ток через резистор и его сопротивление. Программа вычисляет рассеиваемую мощность P = I² * R. Если рассчитанная мощность превышает типовые значения (0.125 Вт, 0.25 Вт, 0.5 Вт, 1 Вт), вывести предупреждение о возможном перегреве.
4. Определение цвета полос резистора (3 полосы).
Пользователь вводит сопротивление (от 1 Ом до 990 кОм). Программа определяет первые две значащие цифры и множитель, а затем выводит соответствующие цвета для 3-полосной маркировки. Если число выходит за диапазон, сообщить об ошибке.
5. Расчет коэффициента пульсаций.
Пользователь вводит амплитудное Umax и минимальное Umin напряжение на выходе выпрямителя. Программа вычисляет коэффициент пульсаций Kp = (Umax - Umin) / Umax * 100%. Вывести оценку: "Низкие пульсации" (<5%), "Высокие пульсации" (>20%) или "Средние пульсации".
6. Расчет емкости последовательного соединения конденсаторов.
Пользователь вводит емкости двух конденсаторов. Программа вычисляет общую емкость при последовательном соединении Ctotal = (C1 * C2) / (C1 + C2). Если C1 + C2 равен нулю, вывести ошибку.
7. Расчет индуктивности параллельного соединения катушек.
Пользователь вводит индуктивности двух катушек. Программа вычисляет общую индуктивность при параллельном соединении Ltotal = (L1 * L2) / (L1 + L2). Если L1 + L2 равен нулю, вывести ошибку.
8. Определение времени заряда RC-цепи.
Пользователь вводит сопротивление R, емкость C и единицу измерения времени (секунды, миллисекунды, микросекунды). Программа проверяет корректность
введенных данных. Программа вычисляет постоянную времени τ = R * C. Вывести, за какое время (1τ, 3τ, 5τ) конденсатор зарядится примерно до 63%, 95% и 99% от напряжения питания.
9. Определение состояния светодиода.
Пользователь вводит ток, протекающий через светодиод (Iled) и его номинальный ток (Inom). Программа определяет и выводит: "Нормальный режим", "Недостаточный ток" (если Iled < 0.7 * Inom), "Перегрузка" (если Iled > 1.3 * Inom).
10. Расчет коэффициента усиления операционного усилителя.
Пользователь вводит номиналы резисторов в цепи обратной связи (R1, R2) для неинвертирующего усилителя. Программа вычисляет коэффициент усиления (K = 1 + R2/R1). Если R1 равен нулю, вывести сообщение об ошибке (деление на ноль).
11. Проверка возможности стабилизации стабилитроном.
Пользователь вводит напряжение питания, минимальное и максимальное сопротивление нагрузки, напряжение стабилизации стабилитрона. Программа должна определить, будет ли стабилитрон работать в режиме стабилизации (проверить, превышает ли входное напряжение напряжение стабилитрона и находится ли ток, протекающий через стабилитрон, в допустимых пределах). Вывести "Стабилизация возможна" или "Стабилизация невозможна".
12. Определение типа конденсатора по емкости.
Пользователь вводит значение емкости в Фарадах. Программа определяет тип: электролитический (> 1 мкФ), керамический (1 нФ - 1 мкФ), пленочный (100 пФ - 100 нФ), и выводит соответствующее сообщение.
13. Расчет мощности трансформатора.
Пользователь вводит напряжение и ток вторичной обмотки. Программа вычисляет полную мощность (S = U * I). Вывести, подходит ли данный трансформатор для питания условного устройства с мощностью потребления 50 Вт.
14. Определение падения напряжения на диоде.
Пользователь вводит материал диода ("кремний" или "германий") и величину тока, протекающего через него. Программа выводит типичное падение напряжения (0.6-0.7 В для Si, 0.2-0.3 В для Ge). Для других материалов вывести "Неизвестный материал".
15. Проверка логического уровня.
Пользователь вводит напряжение на входе КМОП-микросхемы (логический "0" < 1.5 В, логическая "1" > 3.5 В). Программа определяет и выводит: "Логический 0", "Логическая 1" или "Неопределенный уровень".
16. Расчет резонансной частоты LC-контура.
Пользователь вводит индуктивность L и емкость C. Программа вычисляет резонансную частоту f = 1 / (2 * π * √(L * C)). Если L или C меньше или равно нулю, вывести ошибку.
17. Определение ширины запрещенной зоны.
Пользователь вводит название полупроводника ("кремний", "германий", "арсенид галлия"). Программа выводит ширину запрещенной зоны (Si: ~1.12 эВ, Ge: ~0.67 эВ, GaAs: ~1.43 эВ). Если материал неизвестен, сообщить об ошибке.
18. Расчет скважности импульсов.
Пользователь вводит длительность импульса timp и период следования импульсов T. Программа вычисляет скважность S = T / timp. Если timp > T, вывести "Ошибка: длительность импульса больше периода".
19. Проверка допустимого тока для медного проводника.
Пользователь вводит сечение медного провода (в мм²) и ток (в А). Программа сравнивает ток с условным допустимым (например, 10 А на 1 мм²) и выводит "Провод подходит" или "Слишком большой ток!".
20. Определение цвета свечения светодиода.
Пользователь вводит длину волны (в нм). Программа определяет цвет: ультрафиолет
(<380 нм), фиолетовый (380-450 нм), синий (450-495 нм), зеленый (495-570 нм), желтый (570-590 нм), оранжевый (590-620 нм), красный (620-750 нм), инфракрасный (>750 нм).
21. Проверка закона Ома.
Пользователь вводит любые два параметра из трех (напряжение U, ток I, сопротивление R). Программа запрашивает, какой параметр нужно вычислить, и вычисляет его по закону Ома. Если введены все три, проверить их соответствие закону Ома.
22. Определение типа транзистора по напряжению база-эмиттер.
Пользователь вводит напряжение База-Эмиттер UBE в режиме усиления. Программа определяет: "Кремниевый транзистор" (UBE ~ 0.6 В), "Германиевый транзистор" (UBE ~ 0.2 В) или "Неверное напряжение".
23. Расчет КПД усилителя.
Пользователь вводит выходную мощность Pout и потребляемую мощность Pin от источника питания. Программа вычисляет КПД (η = (Pout / Pin) * 100%). Вывести оценку: "Высокий КПД" (>70%), "Низкий КПД" (<30%) или "Средний КПД".
24. Проверка соответствия напряжения стандартам.
Пользователь вводит переменное напряжение. Программа определяет, к какому стандарту оно ближе: 220 В / 50 Гц (Россия/ЕС) или 110 В / 60 Гц (США/Япония), и
выводит соответствующую страну. Если напряжение сильно отличается от обоих, вывести "Нестандартное напряжение".
25. Определение необходимого теплоотвода.
Пользователь вводит рассеиваемую мощность на компоненте P и максимальную рабочую температуру без радиатора Tmax. Программа, используя условное пороговое значение (например, 1 Вт), рекомендует: "Теплоотвод не требуется" или "Необходим теплоотвод!".
26. Расчет выходного напряжения ЦАП.
Для простого ЦАП пользователь вводит опорное напряжение Uref) и 3-битный цифровой код. Программа вычисляет аналоговое напряжение по формуле Uout = Uref * (D0/2 + D1/4 + D2/8), где D0 - младший бит.
27. Определение сопротивления для ограничения тока светодиода.
Пользователь вводит напряжение питания Ups, прямое падение напряжения на светодиоде Uled и требуемый ток Iled. Программа вычисляет необходимое сопротивление резистора: R = (Ups - Uled) / Iled. Если Ups <= Uled, вывести ошибку.
28. Проверка условия насыщения транзистора.
Пользователь вводит ток коллектора Ic и ток базы Ib. Программа проверяет условие насыщения Ic < β * Ib, где β – условный коэффициент, например, 10. Вывести "Транзистор в насыщении" или "Транзистор в активном режиме".
29. Расчет частоты среза ФНЧ.
Пользователь вводит сопротивление R и емкость C для фильтра низких частот. Программа проверяет корректность введенных данных. Программа вычисляет частоту среза fс = 1 / (2 * π * R * C).
30. Определение полосы пропускания по добротности.
Пользователь вводит резонансную частоту контура fres и добротность Q. Программа вычисляет полосу пропускания Δf = fres / Q. Если Q <= 0, вывести ошибку.
