Монтажер: Измаил Нджи

Если вы еще не видели первый день этого спринта 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!