Монтажер: Измаил Нджи
Если вы еще не видели первый день этого спринта Python:
- Вот мой рассказ об этом! — Там вы можете найти ссылки на мое ядро упражнений Kaggle, а также вводную записную книжку Колина Морриса.
Теперь на День 2!
День 2 был посвящен функциям и получению помощи. Он состоял из функций на Python, пользовательских функций, использования функции справки и небольших советов по отладке. Вводный блокнот очень важен для предстоящих упражнений, поэтому я предлагаю вам сначала прочитать этот блокнот!
В этом посте я расскажу об упражнениях второго дня:
- Упражнение 1:
Это первое упражнение необходимо было выполнить, чтобы соответствовать строке документации. Строка документации — это строка, которая обычно идет после заголовка определяемой пользователем функции, поэтому при вызове функции help() для нашей функции она будет отображать строку документации. Он предназначен для того, чтобы дать представление о том, что функция должна выводить.
Следующая функция предназначена для получения округленного числа до 2 знаков после запятой.
def round_to_two_places(num): """Return the given number rounded to two decimal places. >>> round_to_two_places(3.14159) 3.14 """ return round(num,2) <- CODED THIS
Как видите, строка документации предоставляет информацию о функции и пример ее правильного вывода. Загляните в мою записную книжку, чтобы узнать, как использовать функцию справки для этой конкретной проблемы.
- Упражнение 2:
Это упражнение было направлено на демонстрацию использования функции round() с отрицательным числом в качестве второго аргумента.
round(122.54,-2)
Отрицательное число в качестве второго аргумента этой функции округления будет округлено до ближайших степеней 10.
-1 будет округляться до ближайших 10, -2 будет округляться до ближайших 100 и т. д. Таким образом, ожидаемый результат ячейки выше будет 100,0
- Упражнение 3:
В Наборе упражнений 1-го дня упражнение 4 заключалось в том, чтобы разделить конфеты между Алисой, Бобом и Кэрол.
В упражнении нужно было получить количество конфет, которые нужно разбить, учитывая, что они поделили остальные конфеты поровну между тремя из них; используя оператор модуля.
В сегодняшнем упражнении цель состояла в том, чтобы создать функцию, которая возвращает конфеты, которые нужно разбить. Однако фишка заключалась в том, что функция должна учитывать сценарии, в которых друзей не только 3, а, скажем, n друзей.
def to_smash(total_candies, friends = 3): <- CODED 'friends = 3' """Return the number of leftover candies that must be smashed after distributing the given number of candies evenly between n friends, where 3 friends is the default. >>> to_smash(91,3) 1 >>> to_smash(91,4) 3 """ return total_candies % friends
В функции «friends = 3» является настройкой функции по умолчанию, что означает, что если второй аргумент не определен, т.е. если количество друзей явно не определено, то функция предполагает наличие 3 друзей.
- Упражнение 4:
Часть 1:
В этом упражнении основное внимание уделялось ошибкам чтения и, в конечном итоге, их исправлению.
Учитывая ячейку ниже:
ruound_to_two_places(9.9999)
Мы можем сказать, что с этой строкой кода что-то не так. Если мы обратимся к упражнению 2, мы определили функцию round_to_two_places для округления числа до 2 знаков после запятой. Однако, поскольку приведенная выше функция написана неправильно, Python не может распознать вызываемую функцию, поэтому возникает исключение:
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-13-9547bd109d11> in <module>() ----> 1 ruound_to_two_places(9.9999) NameError: name 'ruound_to_two_places' is not defined
Чтобы обработать ошибку, просто правильно напишите имя функции!
Часть 2:
x = -10 y = 5 # Which of the two variables above has the smallest absolute value? smallest_abs = min(abs(x, y))
Ошибка здесь не так очевидна, если вы не знаете, какие аргументы должна принимать каждая функция.
Сообщение об ошибке:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-15-65ed4db8c6e3> in <module>() 2 y = 5 3 # Which of the two variables above has the smallest absolute value? ----> 4 smallest_abs = min(abs(x, y)) TypeError: abs() takes exactly one argument (2 given)
Сообщение об ошибке здесь говорит нам, что функция abs() может принимать только один аргумент, однако в приведенном выше коде она принимает 2 аргумента, x и y.
Чтобы обработать эту ошибку, нам нужно взять абсолютное значение каждого значения отдельно, а затем применить функцию min к двум сохраненным переменным:
def smallest_abs(a,b): i1 = abs(a) i2 = abs(b) return min(i1,i2)
Часть 3:
def f(x): y = abs(x) return y print(f(-5))
Ошибка здесь довольно очевидна, если вы понимаете пользовательские функции в Python. Ключевое слово return должно иметь отступ в функции.
def f(x): y = abs(x) return y # Correct indentation of 'return' print(f(-5))
- Упражнение 5:
В этом упражнении будет использоваться модуль «время». Функция времени выводит количество секунд, прошедших с начала Эпохи.
Функция сна приостанавливает среду на несколько секунд.
Для следующей функции нам пришлось закодировать основное тело функции в соответствии со строкой документации.
def time_call(fn, arg): """Return the amount of time the given function takes (in seconds) when called with the given argument. """ t1 = time() # Time before fn(arg) t2 = time() #Time after Time_Taken = t2-t1 #Difference in time return Time_Taken pass
Для заданной функции (сна) «time_call» выводит время, необходимое для запуска функции с учетом аргумента, относящегося к этой конкретной функции.
Например, если мы вызываем функцию time_call для функции сна и аргумента 5 секунд, мы предполагаем, что time_call выведет число, близкое к числу 5.
- Упражнение 6:
В этом упражнении используется функция «time_call» из упражнения 5. Мы должны создать функцию, которая возвращает количество времени, затраченное на самый медленный из трех вызовов функции.
def slowest_call(fn, arg1, arg2, arg3): """Return the amount of time taken by the slowest of the following function calls: fn(arg1), fn(arg2), fn(arg3) """ # Function taken from cells in question 5 t1 = time_call(fn,arg1) t2 = time_call(fn,arg2) t3 = time_call(fn,arg3) return max(t1,t2,t3) #Max time taken = slowest time pass
Здесь я создал переменные для времени, затрачиваемого на каждый вызов функции с заданным аргументом, а затем вернул максимальное из 3-х раз, которые выводят время самого медленного вызова функции.
slowest_call(sleep, 2, 4, 6)
Учитывая приведенную выше функцию, можно предположить, что функция вернет число, близкое к 6, поскольку 6 секунд будут самым медленным временем для функции sleep() с 3 аргументами.
- Упражнение 7:
Это была демонстрация вложенного кода Python.
print(print("Spam"))
Вывод для этой строки кода будет:
Spam None
Это связано с тем, что Python оценивает вызовы вложенных функций изнутри. Итак, сначала он оценивает внутреннюю функцию печати; который напечатает строку «Спам». Затем функция внешней печати становится print(None), которая будет печатать None.
- Упражнение 8:
Последним упражнением было тестирование функции на пределе ее возможностей. Основываясь на строке документации, функция должна возвращать, какой из строковых аргументов является наименьшим числом.
def smallest_stringy_number(s1, s2, s3): """Return whichever of the three string arguments represents the smallest number. >>> smallest_stringy_number('1', '2', '3') '1' """ return min(s1, s2, s3)
Если мы протестируем функцию:
smallest_stringy_number('1', '2', '3')
Это выведет «1», что правильно. Однако, если в качестве аргумента вместо «1» используется строка «10», мы сталкиваемся с проблемой.
smallest_stringy_number('10', '2', '3')
Это выводит «10». Мы ожидали, что на выходе будет «2». Проблема в том, что функция min в Python возвращает аргумент, который идет первым в лексикографическом порядке; логика, используемая для упорядочивания словарей. Он просмотрел первый символ в строке «10» и распознал, что это «1»; затем он упорядочил эту строку как первое число, что указывает на то, что она является наименьшей.
Чтобы изменить это, мы передадим функцию, используя аргумент «ключ».
def smallest_stringy_number(s1, s2, s3): return min(s1, s2, s3,key=int)
Мы передаем функцию «int», используя аргумент «ключ». Теперь функция вернет строковое значение с наименьшим значением, заданным функцией «int».
Еще одно напоминание о просмотре ядра Kaggle для этой истории и следите за днем 3!