Python належить до динамічних і строго типізованих мов програмування. Він поєднує як качину типізацію, так і поступову типізацію за допомогою підказок типів. Підтримуються всі стилі програмування: імперативний, декларативний (наприклад, функціональний) та обʼєктно-орієнтований, але всередині усе в Python - це обʼєкт.
Python надає великого значення читабельності коду й (подібно до Haskell) використовує значущі відступи для позначення визначень функцій, методів і класів.
Python створив Гвідо ван Россум; перший випуск відбувся 1991 року. Python Software Foundation керує ресурсами для розробки Python і CPython та розпоряджається ними, а також отримує пропозиції щодо змін до мови від членів спільноти через Python Enhancement Proposals, або PEP.
Повну документацію для поточної версії можна знайти на docs.python.org.
Цей перший концепт знайомить із 4 головними особливостями мови Python:
def і ключове слово return),Загалом вміст, тести й інструменти аналізатора для треку Python дотримуються стильових домовленостей, викладених у PEP 8 та PEP 257 щодо стилю коду Python, з додатковою (наполегливою) рекомендацією не використовувати односимвольні назви змінних.
Дзен Python (PEP 20) і Що таке «Pythonic»? описують додаткові принципи.
У треку Python змінні завжди записують у стилі snake_case, а константи записують у SCREAMING_SNAKE_CASE
У Python для створення змінних чи констант не використовують ключових слів.
Натомість програмісти можуть привʼязувати імена (їх ще називають змінними) до обʼєктів будь-якого типу за допомогою оператора присвоєння =: <name> = <value>.
Протягом свого життя імʼя можна повторно присвоювати (або привʼязувати) до різних значень (різних типів обʼєктів).
Наприклад, my_first_variable можна переприсвоювати багато разів за допомогою =, і щоразу вона може вказувати на обʼєкт іншого типу:
>>> 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".
>>> import collections
>>> my_first_variable = collections.Counter([1,1,2,3,3,3,4,5,6,7]) # <--Now my_first_variable has been re-bound to a Counter object.
>>> print(type(my_first_variable))
<class 'collections.Counter'>
>>> print(my_first_variable)
Counter({3: 3, 1: 2, 2: 1, 4: 1, 5: 1, 6: 1, 7: 1})
Константи - це імена, які мають бути присвоєні в програмі лише один раз.
Їх визначають на рівні модуля (файлу), і зазвичай вони видимі всім функціям і класам у програмі.
Використання SCREAMING_SNAKE_CASE сигналізує, що імʼя не слід переприсвоювати чи змінювати його значення.
# All caps signal that this is intended as a constant.
MY_FIRST_CONSTANT = 16
# Re-assignment will be allowed by the compiler & interpreter,
# but this is VERY strongly discouraged.
# Please don't do this, it could create problems in your program!
MY_FIRST_CONSTANT = "Some other value"
У Python одиниці функціональності інкапсульовані у функціях, які самі є обʼєктами (це черепахи до самого низу).
Функції можна виконувати окремо, передавати як аргументи іншим функціям, вкладати одна в одну або привʼязувати до класу. Коли функції привʼязані до імені класу, їх називають методами. Споріднені функції та класи (разом з їхніми методами) можна обʼєднати в одному файлі чи модулі й імпортувати частково або повністю для використання в інших програмах.
Ключове слово 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
# the variable 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 mis-match 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.'
# Because a string is an instance of the str class, methods can also be called on them "directly".
>>> start_text = "my silly sentence for examples."
>>> start_text.upper() # <--Calling the upper() method on start_text directly.
'MY SILLY SENTENCE FOR EXAMPLES.'
# Alternatively, we can skip the variable assignment (although this gets messy quick).
>>> "my silly sentence for examples.".upper()
'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 починаються з #, який не є частиною рядка тексту (англ. string), і закінчуються там, де закінчується рядок.
На відміну від багатьох інших мов програмування, Python не підтримує багаторядкових коментарів.
Кожен рядок блоку коментарів має починатися із символу #.
Інтерпретатор ігнорує коментарі:
# This is a single line comment.
x = "foo" # This is an in-line comment.
# This is a multi-line
# comment block over multiple lines --
# these should be used sparingly.
Першою інструкцією тіла функції може бути рядок документації, який стисло описує призначення функції чи обʼєкта. Рядки документації оголошують за допомогою потрійних подвійних лапок ("""), з відступом на тому ж рівні, що й блок коду:
# 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
Рядки документації читають автоматичні інструменти документації, і їх повертає виклик спеціального атрибута .__doc__ у функції, методі чи класі.
Їх рекомендують для програм будь-якого розміру, де потрібна документація, а їхні домовленості викладено в PEP257.
Рядки документації також можуть правити за легковагі модульні тести, які може читати й запускати PyTest, або модуль doctest, якщо його імпортувати.
Тестування та doctest ми розглянемо в наступному концепті.
# 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.
...
# Printing the __doc__ attribute of the built-in type: str.
>>> print(str.__doc__)
str(object='') -> str
str(bytes_or_buffer[, encoding[, errors]]) -> str
Create a new string object from the given object. If encoding or
errors is specified, then the object must expose a data buffer
that will be decoded using the given encoding and error handler.
Otherwise, returns the result of object.__str__() (if defined)
or repr(object).
encoding defaults to 'utf-8'.
errors defaults to 'strict'.