Ос

Основи у Python

113 вправ

Про концепцію Основи

Python належить до динамічних і строго типізованих мов програмування. Він поєднує як качину типізацію, так і поступову типізацію за допомогою підказок типів. Підтримуються всі стилі програмування: імперативний, декларативний (наприклад, функціональний) та обʼєктно-орієнтований, але всередині усе в Python - це обʼєкт.

Python надає великого значення читабельності коду й (подібно до Haskell) використовує значущі відступи для позначення визначень функцій, методів і класів.

Python створив Гвідо ван Россум; перший випуск відбувся 1991 року. Python Software Foundation керує ресурсами для розробки Python і CPython та розпоряджається ними, а також отримує пропозиції щодо змін до мови від членів спільноти через Python Enhancement Proposals, або PEP.

Повну документацію для поточної версії можна знайти на docs.python.org.


Цей перший концепт знайомить із 4 головними особливостями мови Python:

  1. Присвоєння імен (змінні та константи),
  2. Функції (ключове слово def і ключове слово return),
  3. Коментарі, та
  4. Рядки документації.
Note

Загалом вміст, тести й інструменти аналізатора для треку 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'.
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Основи