Python - це мова програмування з динамічною та строгою типізацією. У ній поєднано як качину типізацію, так і поступову типізацію завдяки підказкам типів.
Хоча Python підтримує багато різних стилів програмування, всередині усе в Python є обʼєктом. Це стосується чисел, рядків тексту (англ. string), масивів і навіть функцій.
Ми докладніше розберемо, що все це означає, у міру просування треком.
У цій першій вправі ми познайомимося з чотирма основними можливостями мови Python:
def і ключове слово return),Загалом матеріали, тести й інструментарій аналізатора для треку Python дотримуються стильових конвенцій, викладених у PEP 8 і PEP 257 щодо стилю коду Python, з додатковою (наполегливою) рекомендацією не використовувати однолітерні назви змінних і змінні з назвою "_".
У треку Python змінні завжди записуються в snake_case, а константи - у SCREAMING_SNAKE_CASE.
Програмісти можуть привʼязувати імена (їх ще називають змінними) до обʼєктів будь-якого типу за допомогою оператора присвоєння =: <name> = <value>.
Протягом свого життя імʼя можна повторно присвоїти (або повторно привʼязати) до інших значень (інших типів обʼєктів).
>>> my_first_variable = 1 #<-- my_first_variable bound to an integer object of value one.
>>> my_first_variable = 2 #<-- my_first_variable re-assigned to integer value 2.
>>> print(type(my_first_variable))
<class 'int'>
>>> print(my_first_variable)
2
>>> my_first_variable = "Now, I'm a string." #<-- You may re-bind a name to a different object type and value.
>>> print(type(my_first_variable))
<class 'str'>
>>> my_first_variable = 'You can call me "str".' #<-- Strings can be declared using single or double quote marks.
>>> print(my_first_variable)
You can call me "str".
Константами називають імена, які мають бути присвоєні в програмі лише один раз.
Їх слід визначати на рівні модуля (файлу), і зазвичай вони видимі для всіх функцій і класів у програмі.
Використання SCREAMING_SNAKE_CASE сигналізує, що імʼя не слід повторно присвоювати і що його значення не слід змінювати.
Ключове слово def починає визначення функції.
Кожна функція може мати нуль або більше формальних параметрів у дужках (), після яких іде двокрапка :.
Інструкції для тіла функції починаються з рядка після def і мають бути відступлені блоком.
# The body of a function is indented by 2 spaces, & prints the sum of the numbers.
def add_two_numbers(number_one, number_two):
total = number_one + number_two
print(total)
>>> add_two_numbers(3, 4)
7
# Inconsistent indentation in your code blocks will raise an error.
>>> def add_three_numbers_misformatted(number_one, number_two, number_three):
... result = number_one + number_two + number_three # This was indented by 4 spaces.
... print(result) #this was only indented by 3 spaces
...
...
File "<stdin>", line 3
print(result)
^
IndentationError: unindent does not match any outer indentation level
Функції явно повертають значення або обʼєкт за допомогою ключового слова return:
# Function definition on first line, explicit return used on final line.
>>> def add_two_numbers(number_one, number_two):
return number_one + number_two
# Calling the function in the Python shell returns the sum of the numbers.
>>> add_two_numbers(3, 4)
7
# Assigning the function call to a variable and printing it
# will also return the value.
>>> sum_with_return = add_two_numbers(5, 6)
>>> print(sum_with_return)
11
Функції, у яких після return немає явного виразу, неявно повертають обʼєкт None.
Детально None ми розглянемо в одній із наступних вправ.
Для цілей цієї вправи та пояснення вважатимемо None заповнювачем, який означає «нічого» або null:
# This function will return `None`
def square_a_number(number):
square = number * number
return # <-- note that this return is not followed by an expression
# Calling the function in the Python shell appears
# to not return anything at all.
>>> square_a_number(2)
>>>
# Using print() with the function call shows that
# the function is actually returning the **None** object.
>>> print(square_a_number(2))
None
Функції, які пропускають return, також неявно повертають обʼєкт None.
Це означає, що якщо ми не використовуємо return у функції, Python поверне обʼєкт None за нас.
# This function omits a return keyword altogether.
def add_two_numbers(number_one, number_two):
result = number_one + number_two
>>> add_two_numbers(5, 7)
>>> print(add_two_numbers(5, 7))
None
# Assigning the function call to a variable and printing
# the variable will also show None.
>>> sum_without_return = add_two_numbers(5, 6)
>>> print(sum_without_return)
None
Функції викликають, вказуючи їхню назву, а потім ().
Точкова нотація (.) використовується для виклику функцій, визначених усередині класу або модуля.
>>> def raise_to_power(number, power):
... return number ** power
...
>>> raise_to_power(3,3) # <--Invoking the function with the arguments 3 and 3.
27
# A mismatch between the number of parameters and the number of arguments will raise an error.
>>> raise_to_power(4,)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: raise_to_power() missing 1 required positional argument: 'power'
# Calling methods or functions in classes and modules.
>>> start_text = "my silly sentence for examples."
>>> str.upper(start_text) # <--Calling the upper() method from the built-in str class on start_text.
'MY SILLY SENTENCE FOR EXAMPLES.'
# Importing the math module
>>> import math
>>> math.pow(2,4) # <--Calling the pow() function from the math module.
16.0
Коментарі у Python починаються із символу #, який не є частиною рядка тексту, і закінчуються в кінці рядка.
На відміну від багатьох інших мов програмування, Python не підтримує позначки для багаторядкових коментарів.
Кожен рядок блоку коментарів має починатися із символу #.
Першою інструкцією тіла функції може бути рядок документації, який стисло описує призначення функції чи обʼєкта. Рядки документації оголошуються за допомогою потрійних подвійних лапок (""") з відступом на тому самому рівні, що й блок коду:
# An example from PEP257 of a multi-line docstring
# reformatted to use Google style non-type hinted docstrings.
# Some additional details can be found in the Sphinx documentation:
# https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html#getting-started
def complex(real=0.0, imag=0.0):
"""Form a complex number.
Keyword Arguments:
real (float): The real part of the number (default 0.0)
imag (float): The imaginary part of the number (default 0.0)
"""
if imag == 0.0 and real == 0.0:
return complex_zero
Рядки документації читають автоматичні інструменти документації, як-от Sphinx, і їх повертає виклик спеціального атрибута .__doc__ у функції, методі чи класі.
Загальні конвенції щодо рядків документації викладено в PEP257, але точні формати різняться залежно від проєкту та команди.
Концептуальні вправи Exercism намагаються дотримуватися стилю Google для коду без підказок типів.
Рядки документації також можуть правити за легковагові модульні тести, які ми розглянемо в одній із наступних вправ.
# An example on a user-defined function using a Google style docstring.
>>> def raise_to_power(number, power):
"""Raise a number to an arbitrary power.
Parameters:
number (int): The base number.
power (int): The power to raise the base number to.
Returns:
int: The number raised to the specified power.
Takes a number and raises it to the specified power, returning the result.
"""
return number ** power
...
# Calling the .__doc__ attribute of the function and printing the result.
>>> print(raise_to_power.__doc__)
Raise a number to an arbitrary power.
Parameters:
number (int): The base number.
power (int): The power to raise the base number to.
Returns:
int: The number raised to the specified power.
Takes a number and raises it to the specified power, returning the result.
Ми напишемо трохи коду, щоб допомогти приготувати розкішну лазанью з нашої улюбленої кулінарної книги.
На нас чекає пʼять завдань, усі повʼязані з приготуванням нашої страви.
У файлі-заготовці ми вже почали перше визначення функції, але решту визначень функцій доведеться написати самостійно. Також самостійно доведеться визначити потрібні константи. Уважно прочитайте рядки коментарів #TODO у файлі-заготовці. Коли завершите завдання, видаліть коментар TODO.
Визначте константу EXPECTED_BAKE_TIME, яка задає, скільки хвилин лазанья має пектися в духовці.
Згідно з нашою кулінарною книгою, лазанью слід тримати в духовці 40 хвилин:
>>> print(EXPECTED_BAKE_TIME)
40
Доповніть функцію bake_time_remaining(), яка приймає як аргумент фактичну кількість хвилин, які лазанья вже провела в духовці, і повертає, скільки хвилин їй ще залишилося пектися, виходячи з константи EXPECTED_BAKE_TIME.
>>> bake_time_remaining(30)
10
Визначте функцію preparation_time_in_minutes(), яка приймає як аргумент number_of_layers — кількість шарів, які потрібно додати до лазаньї, — і повертає, скільки хвилин піде на їх приготування.
Вважайте, що на приготування кожного шару потрібно 2 хвилини.
>>> def preparation_time_in_minutes(number_of_layers):
...
...
>>> preparation_time_in_minutes(2)
4
Визначте функцію elapsed_time_in_minutes(), яка приймає як аргументи два параметри:
number_of_layers (кількість шарів, доданих до лазаньї)elapsed_bake_time (кількість хвилин, які лазанья вже провела в духовці).Ця функція має повернути загальну кількість хвилин, які ми провели на кухні за приготуванням: час на викладання шарів плюс час, який лазанья провела в духовці.
>>> def elapsed_time_in_minutes(number_of_layers, elapsed_bake_time):
...
...
>>> elapsed_time_in_minutes(3, 20)
26
Поверніться до рецепта й додайте «примітки» у вигляді рядків документації функцій.
def elapsed_time_in_minutes(number_of_layers, elapsed_bake_time):
"""Calculate the elapsed cooking time.
Parameters:
number_of_layers (int): The number of layers in the lasagna.
elapsed_bake_time (int): Time the lasagna has been baking in the oven.
Returns:
int: The total time elapsed (in minutes) preparing and baking.
This function takes two integers representing the number of lasagna
layers and the time already spent baking the lasagna. It calculates
the total elapsed minutes spent cooking (preparing + baking).
"""
Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.