Сокрытые драгоценности Python
В последнее время у меня появилось новое хобби – чтение документации Python просто для удовольствия! Когда вы читаете на досуге, то, как правило, замечаете интересные «лакомые кусочки», которые в противном случае пропустили бы. Итак, вот перечень «кусочков», которые заставили меня сказать:
О! Вы можете сделать это на Python?
1. Атрибуты функций
Подобно тому, как вы можете устанавливать атрибуты классов и объектов, вы также можете устанавливать атрибуты функций.
def func(x): intermediate_var = x**2 + x + 1 if intermediate_var % 2: y = intermediate_var ** 3 else: y = intermediate_var **3 + 1 # setting attributes here func.optional_return = intermediate_var func.is_awesome = 'Yes, my function is awesome.' return y y = func(3) print('Final answer is', y) # Accessing function attributes print('Show calculations -->', func.optional_return) print('Is my function awesome? -->', func.is_awesome)
Мы установили атрибуты «optional_return» в строке 10 и «is_awesome» в строке 11. Мы получили доступ к этим атрибутам вне функции позднее в строках 19 и 20. Результат кода:
Final answer is 2197
Show calculations —> 13
Is my function awesome? —> Yes, my function is awesome.
Это удобно, когда вы хотите, чтобы функция извлекала некую промежуточную переменную, но не возвращала её явно с оператором return каждый раз при вызове функции. Также обратите внимание, что атрибуты могут быть установлены как внутри определения функции, так и вне определения функции.
2. Цикл for-else
В Python вы можете добавить условие else в цикл for. Условие else будет срабатывать только в том случае, если во время выполнения в теле цикла не встретится оператор break.
my_list = ['some', 'list', 'containing', 'five', 'elements'] min_len = 3 for element in my_list: if len(element) < min_len: print(f'Caught an element shorter than letters') break else: print(f'All elements at least letters long')
All elements at least 3 letters long
Обратите внимание, что else имеет отступ на уровне for, а не на уровне if. Здесь ни один элемент не имеет длины короче трёх. Таким образом, никогда не будет встречен оператор break. Следовательно, условие else будет запущено (после выполнения цикла for) и выведется результат, указанный выше.
Можно утверждать, что этого можно достичь с помощью отдельной переменной, которая отслеживает встретился ли оператор break. И, возможно, для другого человека, читающего код, это будет также менее запутанно. Далее приведен эквивалентный путь достижения того же результата:
my_list = ['some', 'list', 'containing', 'five', 'elements'] min_len = 3 no_break = True for element in my_list: if len(element) < min_len: print(f'Caught an element shorter than letters') no_break = False break if no_break: print(f'All elements at least letters long')
Думаю, это полезно знать.
3. Разделители для int
Трудно визуально различить целые числа подобные 10000000 и 100000000 (они даже разные числа?). Мы не можем использовать запятые здесь, в Python, подобному тому, как мы используем их в английском языке, потому что Python интерпретирует это как кортеж из нескольких целых чисел.
У Python есть очень удобный способ справиться с этим: мы можем использовать подчеркивание как разделитель для улучшения читабельности. Таким образом, 1_000_000 будет интерпретироваться как целое число.
a = 3250 b = 67_543_423_778 print(type(a)) print(type(b)) print(type(a)==type(b))
4. eval () и exec ()
В Python есть возможность динамически считывать строку и обрабатывать её как часть Python кода. Это достигается использованием функций eval() и exec() (‘eval’ для вычисления выражений; и ‘exec’ для выполнения операторов).
a = 3 b = eval('a + 2') print('b =', b) exec('c = a ** 2') print('c is', c)
В третьей строке функция eval() считывает входную строку как выражение Python, оценивает её и присваивает результат переменной b. В строке 6 функция exec() считывает входную строку как оператор Python и исполняет её.
Вы даже можете динамически передать созданные строки этим функциям. Например, вы можете создать 1000 переменных с именами х_0, х_1, . х_999 без записи каждого объявления этих переменных вручную в коде. Может показаться, что это совершенно бессмысленно, но это не так.
В целом, в более широком контексте программирования (не только в отношении Python) использование eval/exec невероятно сильно, поскольку позволяет вам писать динамический код, который использует информацию, доступную во время выполнения, для решения проблем, которые не могут быть даже выражены во время компиляции. […] exec – это буквально интерпретатор Python, встроенный в Python, поэтому, если у вас есть особенно сложная проблема для разрешения, один из способов её решить – написать программу для *написания программы для её решения*, затем использовать exec для запуска этой второй программы.
Вы можете прочитать об этом в замечательном объяснении Стивена Д’Апрано.
5. Многоточие (Ellipsis)
Многоточие (или «…») - это встроенная константа Python, аналогичная таким встроенным константам как None, True, False и т.д. Её можно использовать по-разному, например, следующими способами (но, разумеется, не ограничиваясь ими):
5.1. Замена для ненаписанного кода
Подобно pass, константы можно использовать в качестве замены, когда код не полностью написан, но требует некоторого заполнения для синтаксической правильности.
def some_function(): . def another_function(): pass
5.2. Альтернатива NONE
None выбирают, когда хотят обозначить пустой ввод или возврат. Но иногда None может быть одним из ожидаемых входных или возвращаемых параметров функций. В этом случае Многоточие может служить заменой.
# calculate nth odd number def nth_odd(n): if isinstance(n, int): return 2 * n - 1 else: return None # calculate the original n of nth odd number def original_num(m=. ): if m is . print('This function needs some input') elif m is None: print('Non integer input provided to nth_odd() function') elif isinstance(m, int): if m % 2: print(f' is th odd number') else: print(f' is not an odd number') original_num() a = nth_odd(n='some string') original_num(a) b = nth_odd(5) original_num(b) original_num(16)
Функция nth_odd() вычисляет n-ое нечетное число, c учетом n. Функция original_num() вычисляет исходное число n, учитывая n-ое нечетное число. Здесь None – один из ожидаемых входных параметров функции original_num(), так что мы не можем использовать его как замену по умолчанию для аргумента m. Результат кода:
This function needs some input
Non integer input provided to nth_odd() function
9 is 5th odd number
16 is not an odd number
5.3. Нарезка массива в NumPy
NumPy использует многоточие для нарезки массива. Следующий код показывают два эквивалентных способа нарезки:
import numpy as np a = np.arange(16).reshape(2,2,2,2) print(a[. 0].flatten()) print(a[:, :, :, 0].flatten())
[ 0 2 4 6 8 10 12 14]
[ 0 2 4 6 8 10 12 14]
Таким образом, ‘…’ показывает, что существует столько ‘:’, сколько необходимо.
Логическое значение Многоточия
В отличие от None (Логическое значение которого False), логическое значение Многоточия - True.
TL; DR
Итак, я обнаружил следующие интересные особенности.
Атрибуты Функций: присвоение атрибутов функциям, как и объектам.
Цикл for-else: отслеживание, был ли цикл выполнен без оператора break.
Разделители для int: 32_534_478 – это int.
eval() и exec(): читайте строки как код Python и запустите его.
Многоточие: универсальная встроенная константа.
Напутствие
Python – это не только полезный язык, но и действительно интересный. Все мы заняты своей жизнью, но это не мешает узнавать язык ради него самого. Я бы хотел узнать больше о Пасхальных Яйцах, которые вы, возможно, найдёте.
- python
- программирование python
- python class
- python for web
- python tutor
«Одномерные Массивы»
Внимание! Все тесты в этом разделе разработаны пользователями сайта для собственного использования. Администрация сайта не проверяет возможные ошибки, которые могут встретиться в тестах.
«Одномерные Массивы»
Список вопросов теста
Вопрос 1
Дан одномерный массив.
| -125 | 200 | 10 | 0 | 43 | 11 |
Чему равно значение элемента массива с индексом 4.
Варианты ответов
Вопрос 2
Выберите правильный вариант вывода элементов массива на печать в столбик.
Варианты ответов
- for i:=1 to n do writeln (a[i])
- for i:=1 to n do writeln (`a[`, i, `]=`)
- for i:=1 to n do write (a[i], ` ` )
Вопрос 3
Дан фрагмент программы, определяющий количество неотрицательных элементов массива A[1..10]. Восстановите пропущенное условие.
k:=10;
i:=1;
while i begin
if ________ then k:=k – 1;
i:=i+1
end;
write (k)
Варианты ответов
Вопрос 4
Задан одномерный массив А, содержащий N элементов. Значения всех элементов массива различны. Укажите, что будет определено в результате работы следующего фрагмента программы:
m:=A[1];
for i:=1 to N do
if A[i]
Варианты ответов
- Значение минимального элемента массива
- Индекс минимального элемента массива
Вопрос 5
var a: array [1..100] of integer;
При выполнении этого оператора в памяти компьютера будет выделено … ячеек целого типа.
Варианты ответов
Вопрос 6
Выберите правильное описание массива А, состоящего из нескольких переменных целого типа .
Варианты ответов
- A: array [1..25] of integer
- A: array [1..25] of real
- A: array [1..25] of byte
Вопрос 7
Что такое массив?
Варианты ответов
- Структурированный тип данных, состоящий из элементов разных типов
- Структурированный тип данных, состоящий из элементов одного типа, упорядоченных по номеру и объединенных под одним именем
- Совокупность данных, объединенных под одним именем
Вопрос 8
Каким способом ввода элементов массива А лучше воспользоваться, если значения элементов массива равны своим удвоенным индексам?
Варианты ответов
- С помощью оператора присваивания по формуле A[i]:=2* A[i]
- С помощью оператора присваивания случайными числами
- С помощью оператора присваивания по формуле A[i]:=2*i
Вопрос 9
Какой оператор необходимо вставить вместо многоточия в следующий фрагмент программы на языке Паскаль, чтобы верно решалась задача нахождения суммы элементов массива А, содержащего N элементов?
…
for i:=1 to N do S:=S+A[i]
Варианты ответов
Вопрос 10
Задан одномерный массив А, содержащий N элементов. Укажите, что будет определено в результате работы следующего фрагмента программы:
k:=0;
for i:=1 to N do
if A[i]>=0 then k:=k+1
Варианты ответов
- Количество положительных элементов массива
- Количество неотрицательных элементов массива
- Количество отрицательных элементов массива
Какой оператор необходимо вставить вместо многоточия в следующий
До сих пор здесь обсуждался язык регулярных выражений вне всякой связи с каким-либо языком программирования. Пришло время обсудить, как пользоваться возможностями регулярных выражений в программах на Perl.
Следующий фрагмент кода проверяет, содержит ли переменная $_ десятичную запись целого числа (как минимум одна десятичная цифра, которой, возможно, предшествует знак минуса):
Perlif(m/^\-?\d+$/) < print "число\n"; > else < print "не число\n"; >
Perlprint(m/^\-?\d+$/? '': 'не ', "число\n");
Мы видим, что знаки косой (слэши) черты служат ограничителями, внутри которых заключён шаблон. Это, конечно, означает, что просто так эти знаки не получится использовать в шаблоне. Не нужно быть очень умным, чтобы сообразить, как обойти эту трудность. Разумеется, следует ставить бэкслэши перед слэшами. К примеру, если в переменной $_ находится полное имя файла, проверка того, лежит ли файл в директории /usr/bin , будет выглядеть так:
Perlif(m/^\/usr\/bin\//) < print "лежит"; > else < print "не лежит"; >
Если часто приходится обрабатывать имена файлов и директорий с помощью регулярных выражений, удобно использовать альтернативные формы оператора поиска с другими ограничителями: m#⋯# , m!⋯! , m+⋯+ , m(⋯) , m[⋯] . Сравните: m/^\/usr\/bin\// и m#^/usr/bin/# . Тогда, помещая в шаблон выбранный символ ограничителя (кроме скобок), нужно позаботиться о его защите и вставить перед ним бэкслэш. Со скобками в качестве ограничителей такой проблемы нет (почему?). Программисты на Perl имеют свои нежные привязанности к тому или иному виду ограничителей.
Оператор замены
- Требуется заменить в переменной $_ несколько идущих подряд пробелов на один. Эта задача решается при помощи оператора s/\ +/ / .
- В переменной $_ содержатся фамилия, имя и отчество человека, разделённые пробелами, например, Чайковский Пётр Ильич . Нужно заменить имя и отчество инициалами: Чайковский П. И. . Решение: s/^(\S+) (\S)\S* (\S)\S*$/$1 $2. $3./ (здесь предполагается, что фамилия, имя и отчество не содержат пробелов, что, как правило, верно, но не всегда). Этот пример показывает, что переменные захвата вполне можно использовать во второй части оператора замены. Если подобным образом нужно обработать все элементы массива, применим цикл:
Perls/^(\S+) (\S)\S* (\S)\S*$/$1 $2. $3./ for @persons;
Оператор связывания
Может сложиться впечатление, что с помощью регулярных выражений в Perl можно осуществлять поиск лишь в переменной $_ . На самом деле поиск возможен в любой скалярной переменной, в ячейке массива (обычного и ассоциативного), и вообще в произвольном скалярном значении. Нужно лишь связать переменную или значение с оператором поиска. Для этого имеется специальный оператор =~ — оператор связывания. В отсутствие оператора связывания поиск считается связанным с переменной по умолчанию.
То же самое относится и к оператору замены с тем лишь исключением, что он может быть связан только с переменной, поскольку оператор замены меняет связанную с ним величину. Будет ошибкой связать замену с константой:
Perl'константа'=~s/к/К/;
Оператор связывания возвращает истинное или ложное значение в зависимости от успешности поиска. У него в компании имеется дополнительный оператор !~ , который, наоборот, возвращает ложное значение в случае успешного поиска, и истинное в случае неуспешного. Таким образом, выражение $a !~ m/⋯/ равносильно выражению !( $a =~ m/⋯/ ) .
Встроенная процедура split
Встроенная процедура split использует шаблоны поиска. Она получает в качестве аргументов регулярное выражение и строку, а возвращает массив. В исходной строке отыскиваются все подстроки, соответствующие шаблону. Фрагменты строки, заключённые между найденными подстроками, как раз и возвращаются в массиве в порядке их появления. Если строка отсутствует в списке параметров split , используется, как обычно в таких случаях, переменная по умолчанию $_ .
Например, строку, содержащую слово во всевозможных падежах, записанных через пробел, можно превратить в массив слов следующим образом:
Perlmy @cases=split /\ /, 'луна луну луне луну луной луне';
Если в качестве разделителей могут появиться другие пробельные символы, да ещё по нескольку подряд, шаблон следует заменить на \s+ :
Perlmy @cases=split /\s+/, "луна луну луне луну луной луне";
Особый случай использования процедуры split возникает для пустого шаблона: в этом случае срока разбивается между символами, то есть split возвращает массив символов, составляющих строку. Следующий пример выводит все символы строки по одному в строке:
Perlprint "$_\n" for split //, 'Привет!';
П р и в е т !
Мы не упоминаем здесь многие другие возможности, предоставляемые процедурой split , отсылая читателя к документации на man- странице .
| Шаблоны поиска | Глава 31. Римская числовая нотация |
Тест "Программирование на языке С++".
Внимание! Все тесты в этом разделе разработаны пользователями сайта для собственного использования. Администрация сайта не проверяет возможные ошибки, которые могут встретиться в тестах.
Будьте внимательны! У Вас есть 45 минут на прохождение теста. Система оценивания - 5* балльная. Порядок заданий и вариантов ответов в тесте случайный.
Система оценки: 5* балльная
Список вопросов теста
Вопрос 1
Что будет выведено на экран в результате выполнения фрагмента программы
a=5; b=3; cout
Здесь a и b — целые переменные.
Варианты ответов
- 5=Z(3)
- 5"=Z("3)
- 5=Z(3")"
- a=Z(b)
- a"=Z("b")"
Вопрос 2
Чему будет равна переменная «c» после выполнения этой программы:
a = 26; b = 6; c = a % b + b;
Вопрос 3
Чему будет равна переменная «c» после выполнения этой программы:
a = 24; b = 5; b = a / b; c = a % (b + 1);
Вопрос 4
Определите значение переменной «a» после выполнения фрагмента программы:
a = 10; if ( a < 5 ) a = a + 12; else a = a - 7;
Вопрос 5
Определите значение переменной «a» после выполнения фрагмента программы:
a = 10; if ( a > 5 ) a = a + 12; else a = a - 7; if ( a > 5 ) a = a + 12; else a = a - 7;
Вопрос 6
Определите значение переменной «a» после выполнения фрагмента программы: a = 10; b = 7; if ( a > 5 && a < b ) a = a - 5;
Варианты ответов
Вопрос 7
Какую логическую операцию нужно добавить в программу вместо многоточия, чтобы значение переменной «a» после выполнения фрагмента программы стало равно 15?
a = 10; b = 5; if ( a < 1 . a >b ) a = a - 5; else a = a + 5;
Вопрос 8
Какое число будет выведено на экран в результате выполнения фрагмета программы?
i = 6; cout
Вопрос 9
Какое число нужно написать вместо многоточия, чтобы цикл выполнился ровно 2 раза?
i = 4; while ( i >= . )
Вопрос 10
Чему будет равно значение целой переменной «a» после выполнения этого фрагмента программы?
a = 2; for ( i=0; i
Вопрос 11
Какое число будет выведено на экран после выполнения этого фрагмента программы?
for ( i=2; i>=1; i-- ) cout
Вопрос 12
Отметьте все правильные утверждения о массивах в языке C++
Варианты ответов
- элементы массива могут быть разных типов
- все элементы массива должны быть одного типа
- элементы в памяти расположены рядом
- элементы могут быть расположены в памяти по одному
- элементы всегда нумеруются с нуля
Вопрос 13
Какой индекс имеет последний элемент массива A?
int A[6];
Вопрос 14
Требуется заполнить массив именно так:
X = [1 3 5 7 9 11]
Какой оператор надо поместить в тело цикла вместо многоточия?
for ( k=0; k
Варианты ответов
- X[k] = k
- X[k] = 2*k
- X[k] = 2*k - 1
- X[k] = 2*k + 1
- X[k] = 2*(k + 1)
Вопрос 15
Задан массив A[N]. Какой оператор надо поставить вместо многоточия, чтобы найти сумму всех элементов массива в переменной S? Вводите ответ без пробелов.
S = 0; for ( k=0 k
Вопрос 16
В какой из следующих строк выполняется обращение к восьмому элементу массива, размер массива равен 10
Варианты ответов
- mas[7];
- mas[8];
- mas(7);
- mas;
- mas(8);