Все функции питона для егэ

Доброго времени суток каждому жителю Хабрвилля! Давненько я не писал статей! Пора это исправить!

В сегодняшней статье поговорим о насущной для многих выпускников школ теме — ЕГЭ. Да-да-да! Я знаю, что Хабр — это сообщество разработчиков, а не начинающих айтишников, но сейчас ребятам как никогда нужна поддержка именно сообщества. Ребят опять посадили на дистант. Пока не ясно на какой период, но уже сейчас можно сказать, что ЕГЭ по информатике будет на компьютерах и его можно зарешать при помощи языка Python.

Вот я и подумал, чтобы не получилось как в песне, стоит этим заняться. Я расскажу про все задачи первой части и их решения на примере демо варианта ЕГЭ за октябрь.

Всех желающих — приглашаю ниже!

Быстрый перевод из системы в систему

В Python есть интересные функции bin(), oct() и hex(). Работают данные функции очень просто:

bin(156) #Выводит '0b10011100'
oct(156) #Выводит '0o234'
hex(156) #Выводит '0x9c'

Вывод в интерпретационном режиме

Вывод в интерпретационном режиме

Как вы видите, выводится строка, где 0b — означает, что число далее в двоичной системе счисления, 0o — в восьмеричной, а 0x — в шестнадцатеричной. Но это стандартные системы, а есть и необычные…

Давайте посмотрим и на них:

n = int(input()) #Вводим целое число
 
b = '' #Формируем пустую строку
 
while n > 0: #Пока число не ноль
    b = str(n % 2) + b #Остатот от деления нужной системы (в нашем сл записываем слева
    n = n // 2 #Целочисленное деление
 
print(b) #Вывод

Данная программа будет работать при переводе из десятичной системы счисления в любую до 9, так как у нас нет букв. Давайте добавим буквы:

n = int(input()) #Вводим целое число

b = '' #Формируем пустую строку

while n > 0: #Пока число не ноль
	if (n % 21) > 9: #Если остаток от деления больше 9...
		if n % 21 == 10: #... и равен 10...
			b = 'A' + b #... запишем слева A
		elif n % 21 == 11:#... и равен 11...
			b = 'B' + b#... запишем слева B

'''

И так далее, пока не дойдём до системы счисления -1 (я переводил в 21-ную систему и шёл до 20)

'''

		elif n % 21 == 11:
			b = 'B' + b
		elif n % 21 == 12:
			b = 'C' + b
		elif n % 21 == 13:
			b = 'D' + b
		elif n % 21 == 14:
			b = 'E' + b
		elif n % 21 == 15:
			b = 'F' + b
		elif n % 21 == 16:
			b = 'G' + b
		elif n % 21 == 17:
			b = 'H' + b
		elif n % 21 == 18:
			b = 'I' + b
		elif n % 21 == 19:
			b = 'J' + b
		elif n % 21 == 20:
			b = 'K' + b
	else: #Иначе (остаток меньше 10)
		b = str(n % 21) + b #Остатот от деления записываем слева
	n = n // 21 #Целочисленное деление

print(b) #Вывод

Способ объёмен, но понятен. Теперь давайте используем тот же функцию перевода из любой системы счисления в любую:

def convert_base(num, to_base=10, from_base=10):
    # Перевод в десятичную систему
    if isinstance(num, str): # Если число - строка, то ...
        n = int(num, from_base) # ... переводим его в нужную систему счисления
    else: # Если же ввели число, то ...
        n = int(num) # ... просто воспринять его как число
    # Перевод десятичной в 'to_base' систему
    alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" # Берём алфавит
    if n < to_base: # Если число меньше системы счисления в которую переводить...
        return alphabet[n] # ... вернуть значения номера в алфавите (остаток от деления)
    else: # Иначе...
        return convert_base(n // to_base, to_base) + alphabet[n % to_base] # ... рекурсивно обратиться к функии нахождения остатка

Вызвав функцию вывода print(convert_base(156, 16, 10)) мы переведём 156 из 10 в 16 систему счисления, а введя print(convert_base('23', 21, 4)) переведёт 23 из 4-ичной в 21-ичную систему (ответ: B).

Задача 2

Все задания беру из первого октябрьского варианта (он же вариант № 9325894) с сайта Решу.ЕГЭ.

Решение данной задачи совсем простое: банальный перебор.

print('y', 'x', 'z', 'F') #Напечатаем заголовки таблицы
for y in range(2): #Берём все переменные и меняем их в циклах '0' и '1'
	for x in range(2):
		for z in range(2):
			for w in range(2):
				F = ((not x or y) == (not z or w)) or (x and w) #Записываем функцию
				print(x, y, z, F) #Выводим результат

Результат:

Нам вывелась вся таблица истинности (1 = True, 0 = False). Но это не очень удобно. Обратите внимание, что в задании, функция равно 0, так и давайте подправим код:

print('y', 'x', 'z', 'F') #Напечатаем заголовки таблицы
for y in range(2): #Берём все переменные и меняем их в циклах '0' и '1'
	for x in range(2):
		for z in range(2):
			for w in range(2):
				F = ((not x or y) == (not z or w)) or (x and w) #Записываем функцию
				if not F:
					print(x, y, z, F) #Выводим результат

Результат:

Далее — простой анализ.

Задача 5

Данная задача легко решается простой последовательностью действий в интерпретационном режиме:

Задача 6

Перепечатали и получили ответ:

s = 0
k = 1
while s < 66:
    k += 3
    s += k
print(k)

Задача 12

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

a = '9' * 1000

while '999' in a or '888' in a:
	if '888' in a:
		a = a.replace('888', '9', 1)
	else:
		a = a.replace('999', '8', 1)
print(a)

Задача 14

Компьютер железный, он всё посчитает:

a = 4 ** 2020 + 2 ** 2017 - 15
k = 0

while a > 0:
    if a % 2 == 1:
    	k += 1
    a = a // 2

print(k)

Задача 16

Опять же, просто дублируем программу в python:

def F(n):
    if n > 0:
        F(n // 4)
        print(n)
        F (n - 1)
print(F(5))

Результат:

Задача 17

Задача с файлом. Самое сложное — достать данные из файла. Но где наша не пропадала?!

with open("17.txt", "r") as f: #Открыли файл 17.txt для чтения
    text = f.read() #В переменную text запихнули строку целиком
a = text.split("n") #Разбили строку энтерами (n - знак перехода на новую строку)

k = 0 #Стандартно обнуляем количество
m = -20001 #Так как у нас сумма 2-ух чисел и минимальное равно -10000, то минимум по условию равен -20000, поэтому...

for i in range(len(a)): #Обходим все элементы массива
	if (int(a[i - 1]) % 3 == 0) or (int(a[i]) % 3 == 0): #Условное условие
		k += 1 #Счётчик
		if int(a[i - 1]) + int(a[i]) > m: #Нахождение минимума
			m = int(a[i - 1]) + int(a[i])

print(k, m) #Вывод

Немного пояснений. Функция with() открывает файл считывает данные при помощи функции read() и закрывает файл. В остальном — задача стандартна.

Задача 19, 20 и 21

Все три задачи — задачи на рекурсию. Задачи идентичны, а вопросы разные. Итак, первая задача:

Пишем рекурсивную функцию и цикл перебора S:

def f(x, y, p): #Рекурсивная функция
	if x + y >= 69 or p > 3: #Условия завершения игры
		return p == 3
	return f(x + 1, y, p + 1) or f(x, y + 1, p + 1) or
		   f(x * 2, y, p + 1) or f(x, y * 3, p + 1) #Варианты действий

for s in range (1, 58 + 1): #Перебор S
	if f(10, s, 1): #Начали с 10 камней
		print(s)
		break

Немного пояснений. В рекурсивной функции существует 3 переменные x — число камней в первой куче, y — число камней во второй куче, p — позиция. Позиция рассчитывается по таблице:

Игра

Петя

Ваня

Петя

Ваня

Петя

p

1

2

3

4

5

6

Далее — всё по условию задачи.

Вторая задача на теорию игр:

Все отличия в рамке. Ну и код, соответственно, не сильно отличается:

def f(x, y, p): #Рекурсивная функция
	if x + y >= 69 or p > 4: #Условия завершения игры
		return p == 4
	if p % 2 != 0:
		return f(x + 1, y, p + 1) or f(x, y + 1, p + 1) or
			   f(x * 2, y, p + 1) or f(x, y * 3, p + 1) #Варианты действий
	else:
		return f(x + 1, y, p + 1) and f(x, y + 1, p + 1) and
			   f(x * 2, y, p + 1) and f(x, y * 3, p + 1) #Варианты действий


for s in range (1, 58 + 1): #Перебор S
	if f(10, s, 1): #Начали с 10 камней
		print(s)

Отличия:

  1. Выиграл Петя, соответственно, позиция 4

  2. Так как Петя не может выиграть за один ход — он выигрывает за 2 хода (and, а не or на нечётных позициях (играх Пети))

  3. Убрали break, так как нам нужны все S, а не единственный

Последняя вариация задачи:

Сразу код:

def f(x, y, p): #Рекурсивная функция
	if x + y >= 69 or p > 5: #Условия завершения игры
		return p == 3 or p == 5
	if p % 2 == 0:
		return f(x + 1, y, p + 1) or f(x, y + 1, p + 1) or
			   f(x * 2, y, p + 1) or f(x, y * 3, p + 1) #Варианты действий
	else:
		return f(x + 1, y, p + 1) and f(x, y + 1, p + 1) and
			   f(x * 2, y, p + 1) and f(x, y * 3, p + 1) #Варианты действий


for s in range (1, 58 + 1): #Перебор S
	if f(10, s, 1): #Начали с 10 камней
		print(s)

Ну и всего лишь 2 отличия:

  1. Позиции 3 или 5, а не 4, так как выиграл Ваня

  2. На второй ход выигрывает Ваня и нам нужно or и and поменять. Я заменил только кратность 2.

Задача 22

Ctrl+C, Ctrl+V — наше всё! :)

for i in range(1, 100000):
	x = i
	L = 0
	M = 0
	while x > 0 :
		L = L+1
		if (x % 2) != 0:
			M = M + x % 8
		x = x // 8
	if L == 3 and M == 6:
		print(i)

Задача 23

Итак, код:

def f(x, y):
	if x > y: #Перегнали цель
		return 0
	if x == y:  #Догнали цель
		return 1
	if x < y: #Догоняем цель тремя методами
		return f(x + 1, y) + f(x + 2, y) + f(x * 2, y)

print(f(3, 10) * f(10, 12)) #Прошло через 10, значит догнали 10 и от де догоняем 12

Так как в условии задачи мы увеличиваем число, но будем числа «догонять». Три метода описаны, ну а пройти через 10 — значит дойти до него и идти от него.

Собственно, это и есть вся первая часть ЕГЭ по информатике решённая на Python.

Ссылка на репозиторий со всеми программами:

Надеюсь, что смог помочь в своей статье выпускникам и готовящимся ;)

Остался один вопрос — нужен ли разбор второй части ЕГЭ по информатике на Python? Оставлю этот вопрос на ваше голосование.

Всем удачи!

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Делаю разбор второй части?

Проголосовали 105 пользователей.

Воздержались 15 пользователей.

Название операции Операция в формуле Операция в Python с числовыми переменными Операция в Python со множествами
инверсия, отрицание
¬

not()

not()
импликация, следование


<=

конъюнкция, поразрядная конъюнкция
/      &

&

intersection()
дизъюнкция, поразрядная дизъюнкция
/      +

|

union()
тождество


==

==

  • Порядок выполнения логических операций:
    1. действия в скобках
    2. отрицание (НЕ)
    3. логическое умножение (И)
    4. логическое сложение (ИЛИ) и оперция «исключающее ИЛИ»
    5. импликация (следование)
    6. эквивалентность
  • Главное меню

    • Главная
    • Обучение
      • Дистанционное обучение
      • Доп. образование (ОДО)
      • Внеурочная деятельность
      • Использование ПО
      • Оснащенность обучения
      • ВПР
      • Учебные предметы
      • Домашнее задание
      • Воспитательная работа
      • Программирование
        • Блок-схемы
        • C / C++
        • Pascal
        • Lazarus
        • Python
        • Java
        • html/css (web)
      • Информация по ГИА
    • О школе
    • Документы
    • Новости
    • Библиотека
    • Мероприятия
    • Обратная связь

    Ссылки

    • http://uom.mv.ru:3000/
    • ГосВэб
    • ГосВэб
    • Группа Школы 61 ВКонтакте
    • Школьный клуб «Гелиос»
    • Программирование

    Рейтинг

    Продолжаем наш видеокурс по подготовке к ЕГЭ по информатике 2022. Сегодня разоблачим второе задание!

    Кто незнаком с основными логическими операциями, можете посмотреть прошлогоднюю статью по заданию 2 из ЕГЭ по информатике.

    В этой статье будут раскрыты методики решения 2 задания через язык программирования Питон.

    Будем перебирать для каждой логической переменной все возможные варианты в программе. А логическая переменная всего два значения может принимать: 1 или 0 (истину или ложь). Таким образом, если к примеру у нас 4 переменные, мы получим 24=16 различных комбинаций.

    Кто знаком с мощнейшим методом для 2 задания из ЕГЭ по информатике, о котором я рассказывал в прошлогодней статье, тот поймёт, что мы будем применять тот же самый мощнейший метод, но автоматизированный с помощью питона.

    Нам нужно будет запрограммировать логическую функцию на языке Питон. Вот таблица, которая поможет это сделать.

    Логическая операция Представление в Питоне
    Отрицание ¬ not()
    Логическое умножение ∧ and
    Логическое сложение ∨ or
    Следование A ⟶ B not(A) or B
    Равносильность ≡ ==

    Перейдём к практике решения задач задания 2 с помощью языка программирования Python.

    Задача (Классическая)

    Миша заполнял таблицу истинности логической функции F

    (w → z) ∧ ((y → x) ≡ (z → y)),

    но успел заполнить лишь фрагмент из трёх различных её строк, даже
    не указав, какому столбцу таблицы соответствует каждая из переменных
    w, x, y, z.

    ЕГЭ по информатике 2022 - задание 2 (классическая задача)

    Определите, какому столбцу таблицы соответствует каждая из переменных
    w, x, y, z.

    В ответе напишите буквы w, x, y, z в том порядке, в котором идут
    соответствующие им столбцы (сначала буква, соответствующая первому
    столбцу; затем буква, соответствующая второму столбцу, и т.д.). Буквы
    в ответе пишите подряд, никаких разделителей между буквами ставить
    не нужно.

    Пример. Функция F задана выражением ¬x / y, зависящим от двух
    переменных, а фрагмент таблицы имеет следующий вид.

    ЕГЭ по информатике 2022 - задание 2 (пример)

    В этом случае первому столбцу соответствует переменная y, а второму
    столбцу – переменная x. В ответе следует написать: yx.

    Решение:

    Решать задачу будем с помощью шаблона на языке Python (Питон).

    print('x y z w')
    for x in range(0, 2):
        for y in range(0, 2):
            for w in range(0, 2):
                for z in range(0, 2):
                    if (not(w) or z) and ((not(y) or x) == (not(z) or y)):
                        print(x, y, z, w)
    

    В задаче у нас 4 переменные, значит, формируем 4 вложенных цикла. В каждом цикле перебираем все возможные значения для конкретной переменной. Мы перебираем значения 0 и 1.

    Функция должна выдавать всегда 1 (единицу, истину). Внутри всех циклов прописываем условие, которое срабатывает как раз на истину. В этом условии прописываем нашу функцию. Если наша функция будет выдавать истину, то мы распечатаем значения переменных, при которых это произошло. Если функция будет выдавать ложь, значит, ничего распечатано не будет.

    Четыре вложенных цикла проверяют все возможные варианты (24 = 16 вариантов), и мы получим таблицу истинности, почти такую же, как нам и дали в условии задачи.

    Так же вверху печатаем названия переменных, чтобы знать, какие значения каким переменным принадлежат.

    Запустим программу, и на экране распечатается табличка:

    ЕГЭ по информатике 2022 - задание 2 (таблица истинности)

    В получившийся табличке может быть больше строчек, чем в условии. Так же при поиске переменных нельзя опираться на порядок, в котором идут нули и единицы в нашей табличке. А можно опираться лишь на количество нулей и единиц в строчках или столбцах.

    Можно вычеркнуть первую строчку и последнюю, потому что в таблице, которую дали в условии, в каждой строчке есть хотя бы один ноль и хотя бы одна единица.

    ЕГЭ по информатике 2022 - задание 2 (классическая задача решение)

    Сразу видно, что первый столбец принадлежит переменной x, только там могут быть все единицы.

    Второй столбец принадлежит переменной w, только там могут быть все нули.

    У нас остались две пустые клеточки в самой таблице. Нам нужно где-то поставить единицу, а где-то ноль, потому что у нас остались столбцы с двумя единицами и одним нулём, а так же с двумя нулями и одной единицей. Если мы в третий столбец поставим единицу, а в четвёртый ноль, то первая строчка и вторая будут совпадать.

    А в условии сказано, что строки не должны повторяться. Поэтому нужно ноль и единицу расставить наоборот.

    Получается, что в третий столбец идёт z, а в четвёртый y

    Ответ: xwzy

    Посмотрим, как решать задачи второго задания из ЕГЭ по информатике, когда функция выдаёт нули в таблице истинности.

    Задача (Классическая, закрепление)

    Миша заполнял таблицу истинности функции (x ≡ ¬y) → ((x ∧ w) ≡ z), но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.

    ЕГЭ по информатике 2022 - задание 2 (классическая задача 2)

    Определите, какому столбцу таблицы соответствует каждая из переменных
    w, x, y, z.

    В ответе напишите буквы w, x, y, z в том порядке, в котором идут
    соответствующие им столбцы (сначала буква, соответствующая первому
    столбцу; затем буква, соответствующая второму столбцу, и т.д.). Буквы
    в ответе пишите подряд, никаких разделителей между буквами ставить
    не нужно.

    Пример. Функция F задана выражением ¬x / y, зависящим от двух
    переменных, а фрагмент таблицы имеет следующий вид.

    ЕГЭ по информатике 2022 - задание 2 (пример)

    В этом случае первому столбцу соответствует переменная y, а второму
    столбцу – переменная x. В ответе следует написать: yx.

    Решение:

    Воспользуемся программой на языке Python.

    print('x y z w')
    for x in range(0, 2):
        for y in range(0, 2):
            for w in range(0, 2):
                for z in range(0, 2):
                    if not( not(( x == (not(y)) )) or ((x and w) == z) ):
                        print(x, y, z, w)
    

    От прошлой программы эта программа отличается только функцией!

    В таблице видим, что функция должна выдавать ноль. Поэтому в условии мы функцию «оборачиваем» в not().

    После == операцию not() мы заключили в скобки, чтобы не было синтаксической ошибки.

    Получаем следующую таблицу истинности:

    ЕГЭ по информатике 2022 - задание 2 (таблица истинности 2)

    Разгадаем, где какая переменная находится.

    ЕГЭ по информатике 2022 - задание 2 (классическая задача решение)

    Последнюю строку из нашей таблицы можно вычеркнуть, потому что, если мы вычеркнем другую строку, то не получится столбца, где все три единицы, а он должен быть.

    Получается, что второй столбец достаётся переменной z.

    В первом столбце должно быть две единицы. На эту роль подходит переменная y.

    В нашей таблице нет строчки, где все единицы, значит, во второй строчке в пустом окошке выставляем ноль. И в этой строчке нулём обладает переменная x. Следовательно, в третьем столбце будет находится x.

    А в последний столбец идёт переменная w по остаточному принципу.

    Ответ: yzxw

    А как Питон справится с более сложной функцией из примерного варианта ЕГЭ по информатике?

    Задача (Сложная функция)
    Логическая функция F задаётся выражением ((x → y ) ∧ (y → w)) ∨ (z ≡ ( x ∨ y)).
    Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F.
    Определите, какому столбцу таблицы истинности соответствует каждая из переменных x, y, z, w.

    ЕГЭ по информатике - задание 2 мощнейший метод

    В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы (сначала — буква, соответствующая первому столбцу; затем — буква, соответствующая второму столбцу, и т. д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.

    Пример. Пусть задано выражение x → y, зависящее от двух переменных x и y, и фрагмент таблицы истинности:

    ЕГЭ по информатике - задание 2 (лёгкая задача) пример

    Тогда первому столбцу соответствует переменная y, а второму столбцу соответствует переменная x. В ответе нужно написать: yx.

    Источник задачи сайт решу ЕГЭ: https://inf-ege.sdamgia.ru/

    Решение:

    Запрограммируем функцию на языке Python.

    print('x y z w')
    for x in range(0, 2):
        for y in range(0, 2):
            for w in range(0, 2):
                for z in range(0, 2):
                    if not( ((not(x) or y) and (not(y) or w)) or (z == (x or y)) ):
                        print(x, y, z, w)
    

    Запустим программу и расставим переменные по своим местам.

    ЕГЭ по информатике 2022 - задание 2 (сложная функция, решение)

    Переменная z может быть только в третьем столбце.

    Во второй столбец идёт переменная w, только этот столбец может иметь одну единицу.

    Посмотрим на строчку, где у w стоит единица. В этой же строчке и у x единица. Значит, x идёт в последний столбец, а y в первый столбец.

    Ответ: ywzx

    Тот же шаблон работает, когда у нас во втором задании три переменные.

    Задача (Три переменные)

    (№ 1608) Логическая функция F задаётся выражением (¬x ∧ z) ∨ (¬x ∧ ¬y ∧ ¬z)

    ЕГЭ по информатике 2022 - задание 2 (три переменных)

    На рисунке приведён фрагмент таблицы истинности функции F, содержащий все наборы аргументов, при которых функция F истинна. Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z.

    Источник задачи сайт К. Ю. Полякова: https://kpolyakov.spb.ru/

    Решение:

    Для трёх переменных шаблон на Питоне отлично работает.

    print('x y z')
    for x in range(0, 2):
        for y in range(0, 2):
            for z in range(0, 2):
                   if (not(x) and z) or (not(x) and not(y) and not(z)):
                        print(x, y, z)
    

    Здесь и так понятно, куда какая переменная идёт.

    ЕГЭ по информатике 2022 - задание 2 (с тремя переменными, решение)

    Ответ: yxz

    Посмотрим, как решать задачи из второго задания ЕГЭ по информатике, когда в таблице истинности разные значения у функции F.

    Задача (Разные значения функции)

    Логическая функция F задаётся выражением (¬a ∨ b ∨ ¬c) ∧ (b ∨ ¬c). Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных a, b, c.

    ЕГЭ по информатике 2022 - задание 2 (разные значения функции)

    В ответе напишите буквы a, b, c в том порядке, в котором идут соответствующие им столбцы (без разделителей).

    Источник задачи сайт К. Ю. Полякова: https://kpolyakov.spb.ru/

    Решение:

    Когда такая ситуация, что функция имеет различные значения в таблице, мы можем проверить, какие значения переменных дают единицу у всей функции. А потом проверить, какие значения выдают ноль у всей функции, если это потребуется.

    print('a b c')
    for a in range(0, 2):
        for b in range(0, 2):
            for c in range(0, 2):
                   if (not(a) or b or not(c)) and (b or not(c)):
                        print(a, b, c)
    

    ЕГЭ по информатике 2022 - задание 2 (разные значения функции, решение)

    В таблице 6 строчек, в которых главная функция превращается в единицу. Далее эти строчки и будем рассматривать. У нас тоже получилось 6 строчек.

    Переменная a имеет три единицы. Это второй столбец, потому что там три единицы.

    Переменная b имеет четыре единицы, значит, она расположена в первом столбце.

    Переменной c достаётся последний столбец.

    Ответ: bac

    Ещё одна интересная задача для подготовки к ЕГЭ по информатике 2022.

    Задача(С подвохом)

    Логическая функция F задаётся выражением a ≡ b ∨ b → c.

    ЕГЭ по информатике 2022 - задание 2 (задача с подвохом)

    На рисунке приведён частично заполненный фрагмент таблицы истинности функции F, содержащий неповторяющиеся строки. Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных a, b, c.

    Источник задачи группа Евгения Джобса: https://vk.com/inform_web

    Решение:

    Подвох заключается в том, что если мы переведём бездумно функцию на язык Питон, то получится a==b or not(b) or c. Но у нас существуют приоритеты для логических операций, которые описаны в прошлогодней статье по подготовке к ЕГЭ по информатике.

    В начале должно обрабатываться или, которое было изначально. Затем должно обработаться следование, а потом равносильность. А если мы переведём формулу бездумно, порядок будет не правильный.

    Операцию b ∨ b можно представить, как просто b. Ведь, если b принимает значение 0, тогда будет 0 ∨ 0 = 0. Если значение будет 1, то 1 ∨ 1 = 1. Поэтому формулу можно переписать следующим образом:

    a ≡ b → c

    a == (not(b) or c)

    В предыдущих задачах нам не приходилось думать над приоритетами, потому что везде были расставлены скобки. И в основном они уже расставлены в задачах второго задания из ЕГЭ по информатике.

    Дальше решаем как обычно.

    print('a b c')
    for a in range(0, 2):
        for b in range(0, 2):
            for c in range(0, 2):
                   if a == (not(b) or c):
                        print(a, b, c)
    

    Последнюю строчку можно вычеркнуть из нашей таблицы, т.к. у нас в каждой строчке есть хотя бы один ноль.

    ЕГЭ по информатике 2022 - задание 2 (задача с подвохом, решение)

    Последний столбец занимает переменная a, т.к. только в последний столбец может влезть две единицы.

    В строчке, где у a ноль, так же ноль и у переменной c. Значит, во второй столбец идёт переменная c. Если мы ноль поставим в первой строчке в первом столбце, то получится первый столбец из всех нулей. А такого у нас в таблице истинности нет.

    Тогда переменная b в первом столбце.

    Ответ: bca

    слишком много лишних скобок ни к чему. Код очень грязный

    А есть какой-нибудь простой код, который смог бы помочь с таким заданием: «Сколькими способами можно поставить в соответствие переменные w, x, y, z столбцам таблицы истинности функции F, опираясь на информацию из данного фрагмента?», или же в данном случае нужно самому подбирать комбинации?

    Доброго времени суток, есть вопрос про операции в последней задаче. Вот там написано что b ∨ b можно представить как b. А если будет b ∧ b, то это можно будет представить как b? И можете объяснить почему?

    Как в циклах идут переменные, это не важно. Это просто перебор всех возможных вариантов.

    Володя, b ∧ b = b, эти формулы приведены в материале, на который я даю ссылку в начале статьи.

    28 декабря 2021

    В закладки

    Обсудить

    Жалоба

    100 страниц с последовательным изложением базовых конструкций языка программирования Python с объяснением, как они работают.

    Материал не про ЕГЭ, материал именно про язык программирования. И будет полезен тем, кто хочет разобраться, а не «заучить шаблоны для ЕГЭ».

    py.pdf

    Источник: vk.com/inform_web

    Программирование на Phyton. ЕГЭ 2022

    Урок 1 из 5. Основы

    Языки программирования бывают разные, например, для веба хорошо подходит PHP, а если хочешь написать ОС, то лучше всего Си. В принципе, большинство современных языков –  полные, то есть на любом из них можно написать что угодно: хоть сайт, хоть игру.

    Но не рекомендую вам писать видеоигры на Паскале:)

    Какой язык лучше всего учить сейчас? Он должен отвечать двум критериям:

    • Не очень сложный синтаксис: его нужно успеть освоить в совершенстве за  учебный год. Поэтому если вы не знаете Java, например, то лучше оставить его на потом;
    • На нем должно быть удобно решать задачи из ЕГЭ (спасибо, кэп). 

    Ну, что, вы уже догадались, к чему я веду?:)

    Конечно, нам подходит Python. У него простой синтаксис, и, главное, – очень много встроенных функций, которые существенно облегчают жизнь.

    Например, сравните код на Паскале и на Питоне для вот этой задачи: 

    Дана строка, у которой могут быть пробелы в начале, в конце и между словами может оказаться более одного пробела. Уберите все лишние пробелы, т.е. удалите все пробелы в начале и конце, а между словами оставьте только один пробел.

    Паскаль:

    var s: string;

    begin

        readln(s);

        p := 0;

        while s[p] = ‘ ‘ do

            delete(s, p, 1);    {удаляем все пробелы в начале}

        p := length(s);

        while s[p] = ‘ ‘ do begin

            delete(s, p, 1);    {удаляем все пробелы в конце}

            p := p – 1;

        end;

        p := pos(s, ‘  ‘);

        while pos(s, ‘  ‘) <> 0 do

        begin

            delete(s, p, 1);   {удаляем один пробел каждый раз, когда встретили два пробела подряд}

            p := pos(s, ‘  ‘);

        end;

        writeln(s)

    end.

    Питон:

    s = input().strip()  # считываем и сразу удаляем лишние пробелы вначале и в конце

    while s.find(‘  ‘) >= 0:

        s = s.replace(‘  ‘, ‘ ‘)  # заменяем два пробела на один

    print(s)

    Если вы думаете, что будет что-то ещё, вы ошибаетесь: это и есть вся программа 🙂 Некоторые программы на питоне вообще можно написать в одну строку!

    В общем, думаю, я вас заинтересовал. А если вы хотите научиться так же влёгкую решать задачки из ЕГЭ (а потом и более сложные, то есть становиться программистом), вам самое время смотреть первый вебинар марафона “Программирование на Phyton!”

    Каждое значение в Python имеет тип. Поскольку всё в Python — объекты, типы являются классами, а значения — экземплярами (объектами) этих классов.

    Прим. перев. В Python 2 типы и классы — разные понятия, в то время как в Python 3 это одно и то же.

    В Python есть разные типы, давайте рассмотрим самые основные.

    Числа

    Целые числа, числа с плавающей запятой и комплексные числа относятся к группе чисел. В Python они представлены классами int, float и complex.

    Мы можем использовать функцию type(), чтобы узнать класс переменной или значения, и функцию isinstance() для проверки принадлежности объекта определённому классу:

    >>> a = 5
    >>> print(a, "is of type", type(a))
    5 is of type <class 'int'>
    >>> a = 2.0
    >>> print(a, "is of type", type(a))
    2.0 is of type <class 'float'>
    >>> a = 1+2j
    >>> print(a, "is complex number?", isinstance(1+2j, complex))
    (1+2j) is complex number? True
    

    Целые числа могут быть любой длины, они ограничиваются лишь доступной памятью.

    Числа с плавающей запятой имеют ограниченную точность. Визуально разницу между целым числом и числом с плавающей запятой можно заметить в консоли по наличию точки: 1 — целое число, 1.0 — с плавающей запятой.

    Комплексные числа записываются в форме x+yj, где x — действительная часть числа, а y — мнимая. Вот несколько примеров:

    >>> a = 1234567890123456789
    >>> a
    1234567890123456789
    >>> b = 0.1234567890123456789
    >>> b
    0.12345678901234568
    >>> c = 1+2j
    >>> c
    (1+2j)

    Обратите внимание, что значение переменной b было усечено.

    Списки

    Список представляет собой упорядоченную последовательность элементов. Он очень гибкий и является одним из самых используемых типов в Python. Элементы списка не обязательно должны быть одного типа.

    Объявить список довольно просто. Внутрь квадратных скобок помещаются элементы списка, разделённые запятой:

    >>> a = [1, 2.2, 'python']

    Мы можем использовать оператор [] для извлечения элемента (такая операция называется «доступ по индексу») или диапазона элементов (такая операция назвается «извлечение среза») из списка. В Python индексация начинается с нуля:

    >>> a = [5,10,15,20,25,30,35,40]
    >>> print("a[2] =", a[2])
    a[2] = 15
    >>> print("a[0:3] =", a[0:3])
    a[0:3] = [5, 10, 15]
    >>> print("a[5:] =", a[5:])
    a[5:] = [30, 35, 40]
    

    Списки являются изменяемым типом, т.е. значения его элементов можно изменить:

    >>> a = [1,2,3]
    >>> a[2] = 4
    >>> a
    [1, 2, 4]

    Кортежи

    Так же как и список, кортеж (tuple) является упорядоченной последовательностью элементов. Вся разница заключается в том, что кортежи неизменяемы.

    Кортежи используются для защиты данных от перезаписи и обычно работают быстрее, чем списки, т.к. их нельзя изменять.

    Для создания кортежа нужно поместить внутрь круглых скобок элементы, разделённые запятой:

    >>> t = (5,'program', 1+3j)

    Мы можем использовать оператор извлечения среза [] для извлечения элементов, но мы не можем менять их значения:

    >>> t = (5,'program', 1+3j)
    >>> print("t[1] =", t[1])
    t[1] = program
    >>> print("t[0:3] =", t[0:3])
    t[0:3] = (5, 'program', (1+3j))
    # Приводит к ошибке, т.к.
    # кортежи неизменяемы
    >>> t[0] = 10

    Строки

    Строка представляет собой последовательность символов. Мы можем использовать одинарные или двойные кавычки для создания строки.  Многострочные строки можно обозначить тройными кавычками, ''' или """:

    >>> s = "Простая строка"
    >>> s = '''многострочная
    строка'''

    Как и в случае со списками и кортежами, мы можем использовать оператор [] и со строками. Стоит отметить, что строки в Python относятся к категории неизменяемых последовательностей, то есть все функции и методы могут лишь создавать новую строку.

    Множества

    Множество является неупорядоченной уникализированной последовательностью. Объявляется множество с помощью элементов, разделённых запятой, внутри фигурных скобок:

    >>> a = {5,2,3,1,4}
    # вывод переменной множества
    >>> print("a =", a)
    a = {1, 2, 3, 4, 5}
    # тип данных переменной а
    >>> print(type(a))
    <class 'set'>
    

    Над множествами можно выполнять такие операции, как объединение и пересечение. Т.к. элементы в множестве должны быть уникальны, они автоматически удаляют дубликаты:

    >>> a = {1,2,2,3,3,3}
    >>> a
    {1, 2, 3}

    Поскольку множество является неупорядоченной последовательностью, оператор извлечения среза здесь не работает:

    >>> a = {1,2,3}
    >>> a[1]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module> 
    TypeError: 'set' object does not support indexing

    Словари

    Словари — неупорядоченные наборы пар ключ-значение.

    Они используются, когда нужно сопоставить каждому из ключей значение и иметь возможность быстро получать доступ к значению, зная ключ. В других языках словари обычно называются map, hash или object. Словари оптимизированы для извлечения данных. Чтобы извлечь значение, нужно знать ключ.

    Словарь объявляется парами элементов в форме ключ:значение, заключенными в фигурные скобки:

    >>> d = {1:'value', 'key':2}
    >>> type(d)
    <class 'dict'>

    Значение может быть любого типа, а вот ключ — только неизменяемого.

    Мы используем ключ, чтобы получить соответствующее ему значение. Но не наоборот:

    >>> d = {1:'value', 'key':2}
    >>> print("d[1] =", d[1]);
    d[1] = value
    >>> print("d['key'] =", d['key']);
    d['key'] = 2
    # Приводит к ошибке
    >>> print("d[2] =", d[2]);

    Преобразование типов данных

    Мы можем преобразовывать значения из одного типа в другой с помощью таких функций, как int(), float(), str() и т.д.

    >>> float(5)
    5.0

    При преобразовании числа с плавающей запятой в целое будет утеряна часть после запятой:

    >>> int(10.6)
    10
    >>> int(-10.6)
    -10

    Для преобразования из/в строку должны использоваться совместимые значения:

    >>> float('2.5')
    2.5
    >>> str(25)
    '25'
    >>> int('1p')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: '1p'

    Можно даже преобразовывать одну последовательность в другую:

    >>> set([1,2,3])
    {1, 2, 3}
    >>> tuple({5,6,7})
    (5, 6, 7)
    >>> list('hello')
    ['h', 'e', 'l', 'l', 'o']

    Прим. перев. Для преобразования списка из символов обратно в строку нельзя вызвать str(список), так как в результате мы получим строковое представление списка (наподобие того, что мы видим, когда выводим список на экран). Вместо этого нужно сделать следующее:

    ''.join(['h', 'e', 'l', 'l', 'o'])

    Для преобразования в словарь каждый элемент последовательности должен быть парой:

    >>> dict([[1,2],[3,4]])
    {1: 2, 3: 4}
    >>> dict([(3,26),(4,44)])
    {3: 26, 4: 44}

    Интересуетесь Python? Тогда взгляните на нашу подборку книг для программистов любого уровня.

    Перевод статьи «Python Data Types»

    Начав писать главу про ООП, понял что совсем забыл освятить такой большой и нужный раздел Пайтона как функции. Тема это большая и обширная, потому, чтобы не сильно растягивать паузу между уроками, решил разделить ее на 2 части. Сначала расскажу основы, потом уже углубленные особенности Пайтоновского функциестроения.

    Функции в Пайтоне объявляются не просто, а очень просто. Вот пример самой простой:

    Def empty_func():
    pass

    Начинается объявление с ключевого слова def, что как не сложно догадаться является сокращением от define. После него идет имя функции. После имени в круглых скобках задается список параметров, в данном случае отсутствующих.
    Тело функции пишется с отступом со следующей строки. учтите, что в Пайтоне функции с пустым телом запрещены, потому в качестве тела приведенной выше функции используется «пустой оператор» pass.
    Теперь рассмотрим пример посерьезнее.

    Def safe_div(x, y):
    «»»Do a safe division:-)
    for fun and profit»»»
    if y != 0:
    z = x / y
    print z
    return z
    else:
    print «Yippie-kay-yay, motherf___er!»

    В этом примере есть несколько нововведений. первое, что бросается в глаза — это строка документации (docstring), идущая сразу после тела функции.
    Обычно эта строка занимает не одну строку исходного текста (простите за каламбур) и потому задается в тройных кавычках. Она предназначена для описания функции, ее предназначения, параметров и т.п. Все хорошие ИДЕ умеют с этой строкой работать. Получить к ней доступ можно и из самой программы, используя свойство __doc__:

    Print safe_div.__doc__

    Этим свойством (да, да, именно свойством, в Пайтоне даже функции на самом деле — классы) удобно пользоваться во время сеансов работы интерактивной консоли.
    >>> from ftplib import FTP
    >>> print FTP.__doc__
    An FTP client class.
    To create a connection, call the class using these argument:
    host, user, passwd, acct
    These are all strings, and have default value «».
    Then use self.connect() with optional host and port argument.
    # дальнейшее почикано мною:-)

    Вернемся к нашей исходной функции. Суть ее очень проста, она принимает 2 параметра: х и у. Если у не равен 0, она делит х на у, выводит результат на экран и возвращает свое частное в виде результата. Результат функции возвращают с помощью команды return. Благодаря механизму кортежей, описанному в прошлом уроке, функции в Пайтоне могут возвращать одновременно множество объектов.
    Если же делитель все-таки равен нулю, функция выводит сообщение об ошибке. Неверно было бы предположить что в этом случае функция ничего не вернет. Правильнее будет сказать что функция вернет «ничего»:) Иначе говоря, если в функции отсутствует оператор return, или же он вызван без параметров, то функция возвращает специальное значение None. В этом легко убедиться вызвав что-то типа print safe_div(10, 0).

    Вот пример слегка посложнее, он взят из доклада-презентации Гвидо ван Россума.

    Def gcd(a, b):
    «Нахождение НОД»
    while a != 0:
    a,b = b%a,a # параллельное определение
    return b

    Данная функция находит наибольший общий делитель двух чисел.

    В общем, следует учитывать, что параметры в функции Пайтоном передаются по ссылке. Еще одним, возможно нетривиальным фактом к которому придется привыкать — является тот факт что сами функции являются значением, которое можно присваивать. Если воспользоваться нашей функцией safe_div для дальнейших экспериментов, то можно написать следующий код.

    Mystic_function = safe_div
    print mystic_function(10, 4)

    Вот на этот раз и все, «за бортом» осталось еще много аспектов определения функций в Пайтоне, которые будут освещены в следующий раз.

    Упражнения для проверки.
    1. На основе существующей функции нахождения НОД, напишите функцию поиска НОК двух чисел.
    2. Напишите подпрограмму табулирования функции, переданной в качестве аргумента. Так же аргументами задается начальное, конечное значение и шаг табуляции.

    PS кстати, каков оптимальный объем «урока»? Что лучше — реже выходящие большие главы, или «лучше меньше да чаще».

    Быстрая навигация:
    1.31 Списки — массивы. Первое знакомство. 1.30 Функции которые возвращают результат — return 1.29 Подпрограммы: функции и процедуры в Питоне 1.28 Преобразование типов данных — int() 1.27 Ввод данных с клавиатуры — input() 1.26 Типы и размеры данных 1.25 Цикл с предусловием — while. Числа Фибоначчи 1.24 Измерение длины строки, списки 1.23 Срезы строк — вывод определенного количества символов из имеющегося текста 1.22 Строки и управляющие символы 1.21 Системные ошибки в процессе отладки программы 1.20 Оператор ветвления — if, комментарии 1.19 Вывод на печать — print(), быстрый ввод данных, округление, комментарии 1.18 Типы программирования. Часть 2. Объектно-ориентированное программирование 1.17 Типы программирования. Часть 1. Структурное программирование. Циклы 1.16 Представление символьной информации — ASCII 1.15 Деление двоичных чисел 1.14 Математические операции с двоичными числами 1.13 Как хранится и записывается информация. Биты и байты 1.12 Перевод целых чисел десятичной системы счисления в другую систему 1.11 Перевод целых чисел из шестнадцатеричной системы счисления в десятичную 1.10 Перевод целого двоичного числа в шестнадцатеричное 1.9 Перевод целого двоичного числа в другую систему счисления 1.8 Системы счисления 1.7 Булевая алгебра. Логические выражения 1.6 Базовые понятия. Часть 3 — Числа, выражения, операнды, знаки операций 1.5 Базовые понятия. Часть 2 — Программа, данные 1.4 Базовые понятия. Часть 1 — Задача и алгоритм 1.3 Среда разработки СИ 1.2 История языков программирования 1.1 Введение

    При написании программ в любом языке программирования необходимо стремиться к написанию компактных кодов, чтобы можно было легко ориентироваться в самом коде.
    Бывает что реализовать таким образом свой код не представляется возможным и, зачастую, программный код выглядит как нескончаемой длинны свиток древнего документа, который занимает 10 — 15 экранов монитора по вертикали…
    Конечно же разобраться в такой программе бывает крайне сложно самому автору такого творения.

    В этом случае на помощь программисту приходит возможность разбиения кода программы на подпрограммы
    .

    Подпрограмма
    — это некая законченная программа, но не самостоятельная.
    Она вызывается из какой то программы более высокого уровня только для выполнения того или иного действия.

    Как это выглядит на практике?

    К примеру в какой то очень большой программе вам необходимо произвести (мы с вами уже рассматривали алгоритм его работы).
    И вместо того, чтобы в этом большом программном коде каждый раз писать еще и код для расчета чисел Фибоначчи, мы просто выносим его в отдельный файл. Это и будет подпрограмма.
    Тогда в том месте где должен производиться необходимый расчет этих чисел мы вставляем лишь некое указание на то, чтобы в этом месте была вызвана наша подпрограмма.

    В этом случае программный код значительно уменьшается в объеме и разобраться в работе программы будет намного легче.

    В разных языках программирования такие подпрограммы называются:

    Процедурами или
    — функциями

    В языке СИ такие подпрограммы называются функциями.

    Кстати мы с вами уже применяли функции на практике!
    Например мы с вами использовали ВСТРОЕННЫЕ в интерпретатор функции:

    Print() — для вывода данных на печать неких параметров, которые были заключены в круглые скобки
    — str() — для преобразования данных к строковому типу. Именно ее предварительно запускает функция print()
    — int() — для преобразования данных к целому числу
    — float() — для преобразования целых чисел в дробный тип
    — round() — для округления некоего значения
    и т.п.

    Итак.
    Для вызова функции достаточно набрать ее имя и в скобках перечислить требуемые параметры (аргументы) которые мы хотим передать в данную функцию.

    Но было бы совсем неинтересно, если бы у нас не было возможности создавать свои собственные функции для выполнения тех или иных задач.
    Что касается Питона, то в нем существует специальный оператор определения функции, имеющий следующий синтаксис:

    def ИМЯ_ФУНКЦИИ(СПИСОК_ПАРАМЕТРОВ):
    ПОСЛЕДОВАТЕЛЬНОСТЬ_ВЫРАЖЕНИЙ

    Имена функций следует подбирать также, как и имена переменных — по тем же правилам: имя должно начинаться с латинской буквы.
    — В списке параметров находятся некие значения, которые передаются в функцию. Эти параметры перечисляются через запятую.

    В Питоне для определения функции первым параметром пишется служебное слово def
    (заголовок функции) (от define
    — определить) — этим мы указываем, что будем вызывать функцию.
    Заголовок функции после закрывающей круглой скобки заканчивается двоеточием (в Питоне) и далее следуют необходимые выражения начинающиеся со смещения относительно начала строки (используется как правило клавиша TAB).

    Возвращаясь к расчету чисел Фибоначчи рассмотрим на его примере работу вызова функции.
    Мы возьмем еще один вариант расчета чисел Фибоначчи, который не рассматривали ранее.

    Он основан на параллельном присваивании значений переменным.

    Def fib(n):
    a, b = 0, 1
    while a

    Если вкратце, то строка:
    a, b = 0, 1

    означает запись (но не полностью эквивалентна ей):
    a = 0
    b = 1

    А строка
    a, b = b, a + b

    означает запись:
    a = b
    b = a + b

    Рассмотрим код по строкам:

    1

    def fib(n):

    — определить (def
    ) функцию по имени fib
    с параметрами (аргументами) указанными в круглых скобках которые мы хотим передать в эту самую функцию по имени fib
    .
    Т.е. в качестве параметра n
    мы будем передавать значение для которого будет производиться расчет. Это число будет передаваться в нашу функцию в качестве аргумента.

    После двоеточия вводимые данные в интерпретаторе Python печатаются с отступом. Это говорит о том, что эти данные имеют непосредственное отношение к данной функции.

    2

    a, b = 0, 1

    Инициализируем переменные соответствующими значениями:
    a = 0
    b = 1

    3

    while a Оператор цикла while
    — будет выполняться до тех пор, пока будет выполнено условие цикла a
    Здесь также после двоеточия открывается новый блок имеющий НЕПОСРЕДСТВЕННОЕ отношение только к циклу.
    Этот блок будет печататься после перевода строки с дополнительным отступом.

    4

    print(a, end = » «)

    Выводим на печать данные переменной а и пробел после каждого витка цикла

    5

    a, b = b, a + b

    Присваиваем переменным соответствующие значения:
    a = b
    b = a + b

    Для изменения исходных данных и продолжения работы расчета чисел Фибоначчи

    6

    print()

    Обратите внимание на то, что данный print()
    нужно печатать ПОД while
    … т.е. он уже относится не к телу цикла while
    , а к телу функции fib

    Однако для чего нам нужен второй print()
    да еще и с пустыми скобками?

    В данном случае это вывод пустой строки — сделать «отбивку» — перенос строки. А еще вернее, данная функция выводит на печать символ перевода строки.
    В нашем случае можно и не использовать.

    Итак мы определили функцию fib
    для расчета чисел Фибоначчи и она, как вы заметили — не работает.

    Для того, чтобы она заработала необходимо ее ВЫЗВАТЬ и передать ей некий параметр для расчетов.
    Вызываем нашу функцию и передаем в качестве аргумента значение 40
    .
    В результате мы должны получить расчет чисел Фибоначчи для всех чисел до 40
    :

    Печатаем в интерпретаторе Python:
    fib(40)

    Получаем:

    0 1 1 2 3 5 8 13 21 34

    Вы можете еще раз вызвать функцию fib()
    с другим параметром и точно также получите вывод необходимых данных.
    Например введем
    fib(400)

    И получим:

    0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

    Таким образом нашу функцию можно запускать необходимое количество раз.

    Во многих языках программирования процедура и функция не синонимы и имеют отличия друг от друга.
    Чем же они отличаются друг от друга в таких языках программирования?

    Функция — возвращает значение
    — Процедура — не возвращает значение

    Поясним на примере:

    Если мы можем использовать такую запись (только в качестве примера):
    x = fib(n)
    — то это функция, она присваивает полученное значение переменной x
    (в данном случае переменной x ничего записано не будет)

    Если же возможна только запись fib(n)
    — то это процедура.

    Таким образом мы можем сказать, что наш пример является ПРОЦЕДУРОЙ.

    Как в Питоне использовать наш код для расчета чисел Фибоначчи в качестве функции мы рассмотрим несколько позже…

    Последнее обновление: 11.04.2018

    Функции представляют блок кода, который выполняет определенную задачу и который можно повторно использовать в других частях программы. Формальное определение функции:

    Def имя_функции ([параметры]):
    инструкции

    Определение функции начинается с выражения def
    , которое состоит из имени функции, набора скобок с параметрами и двоеточия.
    Параметры в скобках необязательны. А со следующей строки идет блок инструкций, которые выполняет функция. Все инструкции функции имеют отступы от начала строки.

    Например, определение простейшей функции:

    Def say_hello():
    print(«Hello»)

    Функция называется say_hello . Она не имеет параметров и содержит одну единственную инструкцию,
    которая выводит на консоль строку «Hello».

    Для вызова функции указывается имя функции, после которого в скобках идет передача значений для всех ее параметров. Например:

    Def say_hello():
    print(«Hello»)
    say_hello()
    say_hello()
    say_hello()

    Здесь три раза подряд вызывается функция say_hello. В итоге мы получим следующий консольный вывод:

    Hello
    Hello
    Hello

    Теперь определим и используем функцию с параметрами:

    Def say_hello(name):
    print(«Hello,»,name)
    say_hello(«Tom»)
    say_hello(«Bob»)
    say_hello(«Alice»)

    Функция принимает параметр name, и при вызове функции мы можем передать вместо параметра какой-либо значение:

    Hello, Tom
    Hello, Bob
    Hello, Alice

    Значения по умолчанию

    Некоторые параметры функции мы можем сделать необязательными, указав для них значения по умолчанию при определении функции. Например:

    Def say_hello(name=»Tom»):
    print(«Hello,», name)
    say_hello()
    say_hello(«Bob»)

    Здесь параметр name является необязательным. И если мы не передаем при вызове функции для него значение, то применяется значение по умолчанию, то есть
    строка «Tom».

    Именованные параметры

    При передаче значений функция сопоставляет их с параметрами в том порядке, в котором они передаются. Например, пусть есть следующая функция:

    Def display_info(name, age):
    print(«Name:», name, «t», «Age:», age)
    display_info(«Tom», 22)

    При вызове функции первое значение «Tom» передается первому параметру — параметру name, второе значение — число 22 передается второму параметру — age. И так далее по порядку.
    Использование именованных параметров позволяет переопределить порядок передачи:

    Def display_info(name, age):
    print(«Name:», name, «t», «Age:», age)
    display_info(age=22, name=»Tom»)

    Именованные параметры предполагают указание имени параметра с присвоением ему значения при вызове функции.

    Неопределенное количество параметров

    С помощью символа звездочки можно определить неопределенное количество параметров:

    Def sum(*params):
    result = 0
    for n in params:
    result += n
    return result
    sumOfNumbers1 = sum(1, 2, 3, 4, 5) # 15
    sumOfNumbers2 = sum(3, 4, 5, 6) # 18
    print(sumOfNumbers1)
    print(sumOfNumbers2)

    В данном случае функция sum принимает один параметр — *params , но звездочка перед названием параметра указывает, что фактически на место этого
    параметра мы можем передать неопределенное количество значений или набор значений. В самой функции с помощью цикла for можно пройтись по этому набору и произвести с переданными
    значениями различные действия. Например, в данном случае возвращается сумма чисел.

    Возвращение результата

    Функция может возвращать результат. Для этого в функции используется оператор return
    , после которого указывается возвращаемое значение:

    Def exchange(usd_rate, money):
    result = round(money/usd_rate, 2)
    return result
    result1 = exchange(60, 30000)
    print(result1)
    result2 = exchange(56, 30000)
    print(result2)
    result3 = exchange(65, 30000)
    print(result3)

    Поскольку функция возвращает значение, то мы можем присвоить это значение какой-либо переменной и затем использовать ее: result2 = exchange(56, 30000) .

    В Python функция может возвращать сразу несколько значений:

    Def create_default_user():
    name = «Tom»
    age = 33
    return name, age
    user_name, user_age = create_default_user()
    print(«Name:», user_name, «t Age:», user_age)

    Здесь функция create_default_user возвращает два значения: name и age. При вызове функции эти значения по порядку присваиваются переменным
    user_name и user_age, и мы их можем использовать.

    Функция main

    В программе может быть определено множество функций. И чтобы всех их упорядочить, хорошей практикой считается добавление специальной функции
    main , в которой потом уже вызываются другие функции:

    Def main():
    say_hello(«Tom»)
    usd_rate = 56
    money = 30000
    result = exchange(usd_rate, money)
    print(«К выдаче», result, «долларов»)
    def say_hello(name):
    print(«Hello,», name)
    def exchange(usd_rate, money):
    result = round(money/usd_rate, 2)
    return result
    # Вызов функции main
    main()

    В языках программирования функции являются именованной частью кода. Это отдельные блоки в тексте программы. Определяются с помощью зарезервированного слова def. В Python к функциям можно обращаться неограниченное количество раз из любой части сценария.

    Зачем нужны функции

    Функции — это незаменимый инструмент программиста. С их помощью разработчик структурирует программу, делая ее понятней и компактнее. С помощью функций можно добиться многократного использования отдельной части кода без его повторного написания.

    Это простейший способ упаковать логику выполнения отдельных частей программы. При этом сокращается объем и время, которое специалист тратит на создание сценария.

    Как написать первую функцию

    В Python 3 для начинающих свое знакомство с программированием есть самая простая функция print(). Чтобы увидеть ее в действии вам понадобится среда разработки. Для этого скачайте дистрибутив языка с официального сайта и установите Python на компьютер.

    Откройте меню «Пуск» и в списке программ найдите Python 3. Разверните его щелчком левой клавиши. В открывшемся списке найдите среду IDLE и запустите ее. Наберите print(«Hello, World!») и нажмите «Ввод». Интерпретатор вернет результат вашей первой функции.

    Некоторые программисты предпочитают работать в консоли. Если вы относитесь к их числу, нажмите win+R и введите команду python.exe. Откроется обычный интерпретатор, только с интерфейсом cmd. Наберите программу описанным выше образом и нажмите Enter в конце, чтобы увидеть результат.

    Как использовать def

    Новые функции создаются с помощью инструкции def. Они так же эффективны, как и встроенные print() или open(), но отличаются от функций в компилирующих языках. Python def относится к исполняемым инструкциям. Это означает, что функции не существует, пока интерпретатор ее не увидит, и не перейдет к ее исполнению.

    Инструкция def создает новый объект и дает ему название. То есть когда интерпретатор приступает к реализации, он создает новый объект и связывает его с именем, указанным после def. Чтобы хранить данные к функциям можно прикреплять различные атрибуты.

    Теперь давайте напишем функцию, возвращающую фразу «Hello, World!», только с использованием def:

    • >>> def здравствуй_мир():
    • print(«Hello, World!»)
    • >>> здравствуй_мир() #вызов функции
    • Hello, World!

    Синтаксис функций и return

    Инструкция def в Python состоит из заголовка и пишется по следующим правилам:

    • >>>def

    После заголовка следует блок инструкций, который начинается с обязательного отступа. В IDLE интерпретатор сделает его автоматически. Но в блокноте или другом текстовом редакторе вы можете забыть нажать Tab. Тогда функция не запустится. Программный код в блоке инструкции называется телом функции и выполняется каждый раз при ее вызове.

    Также в теле иногда находится return:

    • def (аргумент 1, аргумент 2, аргумент N):
    • return

    Return завершает работу функции и передает вызывающей программе объект-результат. Инструкция не является обязательной. Функция будет работать без return, и завершится, когда поток управления достигнет конца ее тела.

    Параметры и аргументы

    Каждой функции можно передавать параметры, которые указываются в скобках после def. В Python они записываются как переменные, разделенные запятыми. Значения или ссылки на объекты этим именам присваиваются в блоке за двоеточием. После операции присвоения их принято называть аргументами, а не параметрами.

    Аргументы внутри функции никак не связаны с объектами вне ее, поэтому в программировании их относят к локальным переменным. Область видимости ограничена блоком функции, который начинается с def и заканчивается return. Чтобы было понятнее, приведем пример:

    • x = 12 #присваиваем переменным ссылки на целочисленные объекты
    • y = 34
    • >>>def example(x,y): #создаем функцию с именем example
    • x = «Hello» #присваиваем значения аргументам x, y
    • y = «Python»
    • print(x, y, sep= «, »)
    • return None
    • >>>example(x, y) #вызываем функцию, не забыв указать параметры
    • Hello, Python
    • >>>print(x, y)
    • 12 34

    Обратите внимание на предпоследнюю строчку кода. В интерпретаторе Python команда print() вернула переменные x и y из глобальной области видимости.

    Значения аргументов не обязательно указывать внутри функции, можно их вписать вручную при ее вызове:

    • >>>def E_2(x, y):
    • return x + y
    • >>>E_2(«Hello, » «Python!») #чтобы слова были разделены, поставьте пробел перед закрывающей кавычкой
    • Hello, Python!
    • E_2(5, 4)

    Как видно из примера с простой функцией E_2, результат полностью зависит от типа объектов x и y. В первом случае E_2 выполнила конкатенацию, а во втором — арифметическую операцию сложения. В этом заключается принцип полиморфизма и То, что объекты определяют синтаксический смысл, обуславливает гибкость и простоту языка. Не нужно тратить время на то, чтобы отдельно указать тип данных, с которым работает функция.

    Правило LEGB

    Это правило касается работы с переменными в разных областях видимости. По умолчанию все имена, которые вы создаете в теле функции, считаются локальными. А имена в модуле являются глобальными. При желании именам можно присвоить значение переменных верхнего уровня с помощью инструкции notlocal и global.

    Правило LEGB объясняет схему разрешения имен:

    1. Как только интерпретатор находит переменную внутри инструкции def, он сначала выполняет поиск значений в локальной области видимости.
    2. Если поиск не дает результата, он переходит к области видимости любой всеобъемлющей инструкции def.
    3. Дальше интерпретатор двигается к глобальным именам в верхнем уровне модуля и тем, что обозначены как global.
    4. Если поиск не дает результатов, интерпретатор ищет имена во встроенной области видимости языка Python.

    Рассмотрим наглядный пример:

    • >>>L = 85
    • >>>R = 23
    • >>>def пример_2(K):
    • R = 10
    • C = L + K+R
    • return C
    • >>>пример_2(5)

    Переменные L и R находятся на верхнем уровне и являются глобальными именами. R, C и K — это локальные переменные, так как присваивание значения происходит внутри инструкции def.

    Интерпретатор сначала выполняет операцию сложения для локальных R, C и K, игнорируя переменную R вне инструкции def. Потом ищет L, и не найдя ее среди имен local, переходит на верхний уровень.

    Что такое lambda

    Помимо def, в Python функции можно создавать с помощью специальных выражений, одно из которых — lambda. Свое оригинальное название получила в честь лямбда-исчислений языка LISP.

    Как и def, lambda создает функцию, которую можно будет в дальнейшем вызвать, но не связывает ее с каким-нибудь именем. На практике lambda используют, когда нужно отложить выполнение фрагмента кода.

    Основы лямбда-выражений

    По внешнему виду lambda-выражения напоминают инструкции def. Вначале пишется ключевое слово lambda, потом аргументы, двоеточие и само выражение:

    • >>>f = lambda x, y, z: x + y + z
    • >>>f(2, 3, 4)

    Тело лямбда представляет собой одно единственное выражение, а не блок инструкций. За счет этого lambda ограничена в возможностях и не настолько универсальна как def. В ней может быть реализована только логика, без циклов while или for.

    Для лямбда действуют аналогичные с def правила поиска переменных. Имена, указанные вне выражения, являются глобальными, внутри — локальными, и они никак не влияют друг на друга.

    Lambda-выражения очень удобно встраивать в программу. За счет небольшого размера они минимизируют и упрощают код. Но использование лямбда не является принципиальным. В Python 3 начинающим для работы будет достаточно инструкции def.

    В этой статье я планирую рассказать о функциях, именных и анонимных, инструкциях def, return и lambda, обязательных и необязательных аргументах функции, функциях с произвольным числом аргументов.

    Именные функции, инструкция def

    Функция в python — объект, принимающий аргументы и возвращающий значение. Обычно функция определяется с помощью инструкции def
    .

    Определим простейшую функцию:

    def
    add
    (x
    ,
    y
    ):

    return
    x
    +
    y

    Инструкция return
    говорит, что нужно вернуть значение. В нашем случае функция возвращает сумму x и y.

    Теперь мы ее можем вызвать:

    >>>
    add
    (1
    ,
    10
    )

    11
    >>>
    add
    («abc»
    ,
    «def»
    )

    «abcdef»

    Функция может быть любой сложности и возвращать любые объекты (списки, кортежи, и даже функции!):

    >>>
    def
    newfunc
    (n
    ):


    def
    myfunc
    (x
    ):


    return
    x
    +
    n


    return
    myfunc

    >>>
    new
    =
    newfunc
    (100
    )
    # new — это функция

    >>>
    new
    (200
    )

    300

    Функция может и не заканчиваться инструкцией return, при этом функция вернет значение :

    >>>
    def
    func
    ():


    pass

    >>>
    print
    (func
    ())

    None

    Аргументы функции

    Функция может принимать произвольное количество аргументов или не принимать их вовсе. Также распространены функции с произвольным числом аргументов, функции с позиционными и именованными аргументами, обязательными и необязательными.

    >>>
    def
    func
    (a
    ,
    b
    ,
    c
    =
    2
    ):
    # c — необязательный аргумент


    return
    a
    +
    b
    +
    c

    >>>
    func
    (1
    ,
    2
    )
    # a = 1, b = 2, c = 2 (по умолчанию)

    5
    >>>
    func
    (1
    ,
    2
    ,
    3
    )
    # a = 1, b = 2, c = 3

    6
    >>>
    func
    (a
    =
    1
    ,
    b
    =
    3
    )
    # a = 1, b = 3, c = 2

    6
    >>>
    func
    (a
    =
    3
    ,
    c
    =
    6
    )
    # a = 3, c = 6, b не определен

    Traceback (most recent call last):
    File «», line 1, in
    func(a=3, c=6)
    TypeError
    : func() takes at least 2 arguments (2 given)

    Функция также может принимать переменное количество позиционных аргументов, тогда перед именем ставится *:

    >>>
    def
    func
    (*
    args
    ):


    return
    args

    >>>
    func
    (1
    ,
    2
    ,
    3
    ,
    «abc»
    )

    (1, 2, 3, «abc»)
    >>>
    func
    ()

    ()
    >>>
    func
    (1
    )

    (1,)

    Как видно из примера, args — это из всех переданных аргументов функции, и с переменной можно работать также, как и с кортежем.

    Функция может принимать и произвольное число именованных аргументов, тогда перед именем ставится **:

    >>>
    def
    func
    (**
    kwargs
    ):


    return
    kwargs

    >>>
    func
    (a
    =
    1
    ,
    b
    =
    2
    ,
    c
    =
    3
    )

    {«a»: 1, «c»: 3, «b»: 2}
    >>>
    func
    ()

    {}
    >>>
    func
    (a
    =
    «python»
    )

    {«a»: «python»}

    В переменной kwargs у нас хранится , с которым мы, опять-таки, можем делать все, что нам заблагорассудится.

    Анонимные функции, инструкция lambda

    Анонимные функции могут содержать лишь одно выражение, но и выполняются они быстрее. Анонимные функции создаются с помощью инструкции lambda
    . Кроме этого, их не обязательно присваивать переменной, как делали мы инструкцией def func():

    >>>
    func
    =
    lambda
    x
    ,
    y
    :
    x
    +
    y

    >>>
    func
    (1
    ,
    2
    )

    3
    >>>
    func
    («a»
    ,
    «b»
    )

    «ab»
    >>>
    (lambda
    x
    ,
    y
    :
    x
    +
    y
    )(1
    ,
    2
    )

    3
    >>>
    (lambda
    x
    ,
    y
    :
    x
    +
    y
    )(«a»
    ,
    «b»
    )

    «ab»

    lambda функции, в отличие от обычной, не требуется инструкция return, а в остальном, ведет себя точно так же:

    >>>
    func
    =
    lambda
    *
    args
    :
    args

    >>>
    func
    (1
    ,
    2
    ,
    3
    ,
    4
    )

    (1, 2, 3, 4)

    Для решения задачи (25) полезно уметь пользоваться (f)-строками — форматированными выражениями, содержащими поля замены. Форматированные (f)-строки имеют вид f'<текст >{объект}< текст>’. Поля замены ограничиваются фигурными скобками, и значения в них подставляются во время выполнения программы.

    Например, фрагменты программ:

    print(‘Решать задания ЕГЭ мне помогают материалы ЯКласс!’)

    print(f’Решать задания ЕГЭ мне помогают материалы ЯКласс!’)

    будут выполняться одинаково, хотя в верхней строке обычное форматирование, а во второй — (f)-строка. Обратим на это внимание в следующем примере.

    0-1.png

    Рис. (1). Пример вывода

    0-2.png

    Рис. (2). Результат работы программы (1)

    Для аккуратного форматирования придётся воспользоваться разделителем sep(=»)  и вставкой дополнительных пробелов в текст для того, чтобы избавиться от автоматически расставляемых пробелов на месте запятых в функции print.

    Сравни результат работы с результатом работы (f)-строки:

    0-3.png

    Рис. (3). Пример вывода (f)-строки

    0-4.png

    Рис. (4). Результат работы программы (2)

    Конечно, этим не исчерпываются возможности (f)-строк.

    Рассмотрим задачу на поиск делителей числа. 

    Пример (1)

    Для некоторого случайного числа в интервале ([4,12300]) подсчитай количество нетривиальных делителей и выведи их.

    Решение

    1-1.png

    Рис. (5). Программа (1)

    1-2.png

    Рис. (6). Результат работы программы (3)

    Обрати внимание на оформление вывода. Результаты работы программы форматированы как (f)-строки. В качестве объекта в фигурных скобках записана стандартная функция len от другой функции mult. Одна из этих функций составлена пользователем и описана здесь же в программе. Кроме использования вычислений в (f)-строке мы также можем форматировать нужные нам строки.

    Пример (2)

    Даны символы «e», «c», «t», «f», «j», «k», «y». Сколько различных имён файлов, соответствующих маске (1?23.?x?), можно составить из предложенных символов? Сколько из них будут иметь расширение «txt» или «exe»?

    2-1.png

    Рис. (7). Программа (2)

    Обрати внимание: для контроля за работой программы мы вывели на печать имена файлов с заданными расширениями.

    2-2.png

    Рис. (8). Результат работы программы (4)

    Разбор досрочного варианта (2022)

    Назовём маской числа последовательность цифр в которой также могут встречаться следующие символы:

    • символ «?» означает ровно одну произвольную цифру;

    • символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

    Среди натуральных чисел, не превышающих (10**9), найди все числа, соответствующие маске (12345?6?8) и делящиеся на (17) без остатка.

    В ответе запиши в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им частные от деления на (17).

    Здесь полем замены будут цифры, занимающие места «?».

    d1.png

    Рис. (9). Программа (3)

    d2.png

    Рис. (10). Результат работы программы (5)

    Для решения задач с применением масок числа полезно знать работу функции product модуля itertools.

    В условии задачи досрочного варианта упоминается, что в маске может находиться «*», а это набор символов любой длины, в том числе и нулевой.

    Функция product модуля itertools сформирует нам необходимую комбинацию символов для замены «*».

    Рассмотрим пример её работы.

    Пример (3)

    Составь все возможные пары из элементов строк (‘0123’) и (‘abcd’) — такие, чтобы первый элемент был из числовой строки, а следующий — из текстовой. (Множество таких пар элементов называется декартовым произведением первой и второй из заданных строк.)

    3-1.png

    Рис. (11). Программа (4)

    Мы получили список, состоящий из кортежей, первый элемент которых — из числовой строки, а второй — из текстовой.

    3-2.png

    Рис. (12). Результат работы программы (6)

    Но для вставки вместо «*» нам нужно преобразовать кортежи, из которых состоит список, в строки.

    Пример (3A)

    3-3.png

    Метод  join преобразовал кортежи в строки.

    3-4.png

    Рис. (13). Результат работы программы (7)

    Если необходимо составить комбинации пар, или троек, или иного количества символов одного множества, то необходимо задать параметр repeat для функции product.

    Пример (3B)

    Составь таблицу истинности логической функции

    ((x→y)≡(z→w))∨(x∧w).

    3-5.png

    Рис. (14). Программа (5)

    3-6.png

    Рис. (15). Результат работы программы (8)

    Пример (3C)

    3-7.png

    Рис. (16). Программа (6)

    3-8.png

    Рис. (17). Результат работы программы (9)

    Вот эти строки уже можно вставлять на место «*».

    Рассмотрим ещё одно задание из ЕГЭ прошлых лет.

    Пример (4)

    Определи, какое из указанных имён файлов удовлетворяет маске (‘?vi*r.?xt’).

    1) vir.txt 

    2) ovir.txt

    3) ovir.xt

    4) virr.txt

    Задание решалось вручную, и мы можем составить программу и сопоставить ответ, полученный программой, с ручными расчётами.

    4-1.png

    Рис. (18). Программа (7)

    Понравилась статья? Поделить с друзьями:

    Новое и интересное на сайте:

  • Все фразовые глаголы для егэ по английскому скачать
  • Все фразовые глаголы для егэ по английскому 2023
  • Все фразовые глаголы для егэ по английскому 2022
  • Все фразовые глаголы английского языка для егэ
  • Все фразеологизмы для егэ по русскому языку 2022

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии