09 фСвраля 2021

🐍 Как Π² Python ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ΠŸΠΈΡˆΡƒ, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠΆΡƒ ΠΈ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽ IT-ΡΡ‚Π°Ρ‚ΡŒΠΈ. На proglib написал 140 ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ². УвлСкаюсь Python, Π²Π΅Π±ΠΎΠΌ ΠΈ Data Science. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΊ Π΄ΠΈΠ°Π»ΠΎΠ³Ρƒ – ссылки Π½Π° соцсСти ΠΈ мСссСндТСры: https://matyushkin.github.io/links/ Если понравился ΡΡ‚ΠΈΠ»ΡŒ излоТСния, упорядочСнный список ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ β€” https://github.com/matyushkin/lessons
Рассмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, Π² Ρ‡Π΅ΠΌ польза Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Python ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для инкапсуляции ΠΊΠΎΠ΄Π°, Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ ΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ².
🐍 Как Π² Python ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡ прСдставляСт собой Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сокращСнный ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ ЛСоданиса Посо Рамоса Python Inner Functions: What Are They Good For? ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Ρ‚Π°ΠΊΠΆΠ΅ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π² Π²ΠΈΠ΄Π΅ Jupyter-Π±Π»ΠΎΠΊΠ½ΠΎΡ‚Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π² Colab.

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ (ΠΈΠ»ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅, Π°Π½Π³Π». inner, nested) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ опрСдСляСм Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ Python такая функция ΠΈΠΌΠ΅Π΅Ρ‚ прямой доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ Π΅Ρ‘ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ мноТСство ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ для создания Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ ΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

Π’ этом руководствС ΠΌΡ‹...

  • ... ΡƒΠ·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ ΠΈ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ внСшнСго доступа
  • ... напишСм Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для облСгчСния ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΊΠΎΠ΄Π°
  • ... Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ замыкания для сохранСния состояний ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ
  • ... создадим Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ для добавлСния повСдСния ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ функциям

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Python

НачнСм с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΊΠΎΠ΄Π°, содСрТащСго Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

        def outer_func():
    def inner_func():
        print("Hello, World!")
    inner_func()




    
        >>> outer_func()
Hello, World!
    

Π’ этом ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ опрСдСляСм inner_func() Π²Π½ΡƒΡ‚Ρ€ΠΈ outer_func() для Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° экран строки Hello, World!. Для этого ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ inner_func() Π² послСднСй строкС outer_func().

Основная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ β€” ΠΈΡ… ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΈΠ· Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ («внСшнСй») Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π°Ρ функция прСдоставляСт пространство ΠΈΠΌΠ΅Π½, доступноС Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Π² Π½Π΅Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

        def outer_func(who):
    def inner_func():
        print(f"Hello, {who}")
    inner_func()
    
        >>> outer_func("World!")
Hello, World!
    

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ строку Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ outer_func(), ΠΈ inner_func() Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ этому Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ Ρ‡Π΅Ρ€Π΅Π· имя who. Π­Ρ‚ΠΎ имя опрСдСляСтся Π² локальной области видимости outer_func(). ИмСна, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ опрСдСляСм Π² локальной области внСшнСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ nonlocal. Они Π½Π΅Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния inner_func().

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ слоТной Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

        def factorial(number):
    # Валидация Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ значСния
    if not isinstance(number, int):
        raise TypeError("Число Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΌ.")
    if number < 0:
        raise ValueError("Число Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.")
    # РасчСт Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π°
    def inner_factorial(number):
        if number <= 1:
            return 1
        return number * inner_factorial(number - 1)
    return inner_factorial(number)
    
        >>> factorial(4)
24
    

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ factorial() ΠΌΡ‹ сначала провСряСм Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ прСдоставляСт Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ опрСдСляСм Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΈΠΌΠ΅Π½Π΅ΠΌ inner_factorial(), Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΡƒΡŽ вычислСниС Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π°. На послСднСм шагС вызываСтся inner_factorial() ΠΈ выполняСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ расчСт.

ОсновноС прСимущСство использования Ρ‚Π°ΠΊΠΎΠ³ΠΎ шаблона Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² всС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²ΠΎ внСшнСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ бСзопасно ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ошибок Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΈ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… вычислСниях.

🐍 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»
πŸπŸŽ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ Python
ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ PythonΒ»
🐍🧩 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Python
Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ Python для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ PythonΒ»

ΠžΡΠ½ΠΎΠ²Ρ‹ примСнСния Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Python

Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ

РаспространСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ – ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΡ‚ всСго, Ρ‡Ρ‚ΠΎ происходит Π·Π° Π΅Π΅ ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· глобальной области видимости. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ инкапсуляциСй.

НачнСм с ΠΏΠΎΡΡΠ½ΡΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

        def increment(number):
    def inner_increment():
        return number + 1
    return inner_increment()





    
        >>> print(increment(10))
11
# Π’Ρ‹Π·ΠΎΠ²Π΅ΠΌ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ inner_increment()
>>> print(inner_increment())
NameError: name 'inner_increment' is not defined
    

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρƒ нас Π½Π΅Ρ‚ прямого доступа ΠΊ inner_increment(). ΠŸΠΎΠΏΡ‹Ρ‚Π°Π²ΡˆΠΈΡΡŒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ NameError. Ѐункция increment() ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ скрываСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ inner_increment(), прСдотвращая доступ ΠΈΠ· глобальной области.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Иногда Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° функция, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… мСстах своСго Ρ‚Π΅Π»Π°. НапримСр, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„Π°ΠΉΠ»Π° CSV, содСрТащСго ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… доступа Wi-Fi Π² Нью-Π™ΠΎΡ€ΠΊΠ΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ количСство Ρ‚ΠΎΡ‡Π΅ΠΊ доступа, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, которая ΠΈΡ… прСдоставляСт, ΠΌΡ‹ создали ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ скрипт:

hotspots.py
        import csv
from collections import Counter

def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)

            for row in content:
                hotspots.append(row["Provider"])

        counter = Counter(hotspots)
        print(
            f"Π’ Нью-Π™ΠΎΡ€ΠΊΠ΅ {len(hotspots)} Ρ‚ΠΎΡ‡Π΅ΠΊ Wi-Fi.\n"
            f"{counter.most_common(1)[0][1]} ΠΈΠ· Π½ΠΈΡ… прСдоставляСт"
            f"{counter.most_common(1)[0][0]}."
        )

    if isinstance(file, str):
        # ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ
        file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # Π—Π°Π±ΠΈΡ€Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„Π°ΠΉΠ»Π°
        most_common_provider(file)
    

Π—Π΄Π΅ΡΡŒ process_hotspots() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ file ΠΈ провСряСт, являСтся Π»ΠΈ Ρ„Π°ΠΉΠ» строковым ΠΏΡƒΡ‚Π΅ΠΌ ΠΊ физичСскому Ρ„Π°ΠΉΠ»Ρƒ ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. Π—Π°Ρ‚Π΅ΠΌ функция Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ most_common_provider(), которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

  1. Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ содСрТимоС Ρ„Π°ΠΉΠ»Π° Π² Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт словари с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ csv.DictReader.
  2. БоставляСт список ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² Wi-Fi.
  3. ΠŸΠΎΠ΄ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ количСство Ρ‚ΠΎΡ‡Π΅ΠΊ доступа Wi-Fi для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ поставщика с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° collections.Counter.
  4. ΠŸΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ сообщСниС с ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ.

Запустив Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

        
>>> from hotspots import process_hotspots

>>> file_obj = open("./NYC_Wi-Fi_Hotspot_Locations.csv", "r")
>>> process_hotspots(file_obj)
Π’ Нью-Π™ΠΎΡ€ΠΊΠ΅ 3319 Ρ‚ΠΎΡ‡Π΅ΠΊ Wi-Fi.
1868 ΠΈΠ· Π½ΠΈΡ… прСдоставляСт LinkNYC - Citybridge.

>>> process_hotspots("./NYC_Wi-Fi_Hotspot_Locations.csv")
Π’ Нью-Π™ΠΎΡ€ΠΊΠ΅ 3319 Ρ‚ΠΎΡ‡Π΅ΠΊ Wi-Fi.
1868 ΠΈΠ· Π½ΠΈΡ… прСдоставляСт LinkNYC - Citybridge.
    

НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π»ΠΈ ΠΌΡ‹ process_hotspots() со строковым ΠΏΡƒΡ‚Π΅ΠΌ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΈΠ»ΠΈ с Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

ИспользованиС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ создаСм Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ most_common_provider(), ΠΊΠΎΠ³Π΄Π° Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ Π»ΠΈΠ±ΠΎ Ссли Π½Π΅ собираСмся Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… Π³Π΄Π΅-Π»ΠΈΠ±ΠΎ Π΅Ρ‰Π΅, ΠΊΡ€ΠΎΠΌΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π₯отя написаниС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΄Π°Π΅Ρ‚ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ вынСсти ΠΈΡ…, ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня. Π’ этом случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прСфикс ΠΈΠ· Π·Π½Π°ΠΊΠ° подчСркивания (_) Π² ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° являСтся ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠΉ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ модуля ΠΈΠ»ΠΈ класса. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ функциям ΠΈΠ· любого мСста Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ ΠΈΠ»ΠΈ классС ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости.

Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ‡ΠΈΡ‰Π΅ ΠΈ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠ΅Π΅. Вакая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° соотвСтствуСт ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ СдинствСнной отвСтствСнности.

Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ состояния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: замыкания Π² Python

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python Π² своих ΠΏΡ€Π°Π²Π°Ρ… Ρ€Π°Π²Π½Ρ‹ Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ числа, строки, списки, ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ Ρ‚. Π΄. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ динамичСски ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Ρ‚ΡŒ, ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π² структурах Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΈΠΌ функциям, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния.

Π’ Python Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π΄ΠΎ сих ΠΏΠΎΡ€, Π±Ρ‹Π»ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ функциями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ»Π΅ΠΉ случая оказались Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Если Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ внСшнСго ΠΌΠΈΡ€Π°, Ρ‚ΠΎ ΠΈ Π½Π΅Ρ‚ особых ΠΏΡ€ΠΈΡ‡ΠΈΠ½ для влоТСния.

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ€ΠΎΠ΄Π΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ – замыканиях. Π­Ρ‚ΠΎ динамичСски создаваСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ функциями. Главная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ замыкания ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π² локальном пространствС ΠΈΠΌΠ΅Π½, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±Ρ‹Π»ΠΎ создано Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, Π΄Π°ΠΆΠ΅ Ссли Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π°Ρ функция Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π° своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΈ шага:

  1. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.
  2. Π‘ΠΎΡΠ»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
  3. Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

БСйчас разбСрСмся Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ….

Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ состояния Π² Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΈ

Π˜Ρ‚Π°ΠΊ, Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ заставляСт Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ состояниС своСго окруТСния. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ – это Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сама внутрСнняя функция, Π½ΠΎ ΠΈ ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π°Ρ срСда.

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

powers.py
        def generate_power(exponent):
    def power(base):
        return base ** exponent
    return power
    

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ опрСдСляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ generate_power(), которая прСдставляСт собой Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ для создания Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ. Π’ΠΎ Π΅ΡΡ‚ΡŒ эта функция ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ создаСт ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС опрСдСляСтся функция power(), которая являСтся Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ СдинствСнный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ base ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выраТСния base ** exponent. ПослСдняя строка Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ power ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π΅ вызывая Π΅Π³ΠΎ.

ΠžΡ‚ΠΊΡƒΠ΄Π° power() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ показатСля стСпСни exponent? Π’ΠΎΡ‚ Π³Π΄Π΅ Π² ΠΈΠ³Ρ€Ρƒ вступаСт Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ power() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ экспонСнты ΠΈΠ· внСшнСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ generate_power(). Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Python, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ generate_power():

  1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр power(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ base.
  2. Π”Π΅Π»Π°Π΅Ρ‚ «снимок» окруТСния power(). Он Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ exponent с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.
  3. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ power() вмСстС с состояниСм.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ экзСмпляр power(), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ generate_power(), ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ функция Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ стСпСни exponent:

        >>> raise_two = generate_power(2)
>>> raise_three = generate_power(3)
>>> raise_two(4)
16
>>> raise_two(5)
25
>>> raise_three(4)
64
>>> raise_three(5)
125

    

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° замыкания Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСпСни ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ. Π’ этих ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… raise_two() Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ exponent = 2, Π° raise_three() Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ exponent = 3.

Рассмотрим Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

        def has_permission(page):
    def permission(username):
        if username.lower() == "admin":
            return f"'{username}' ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ {page}."
        else:
            return f"'{username}' Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ доступа ΠΊ {page}."
    return permission

check_admin_page_permision = has_permission("Admin Page")
    
        >>> print(check_admin_page_permision("admin"))
'admin' ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ Admin Page.
>>> print(check_admin_page_permision("john"))
'john' Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ доступа ΠΊ Admin Page.
    

ВлоТСнная функция провСряСт, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΏΡ€Π°Π²Π° доступа ΠΊ страницС. ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Ρ€Π°Π²Π΅Π½ Π»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ 'admin', ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ запрос ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ замыкания Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ состояниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Β«ΠΏΡ€ΠΈ Ρ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈΒ», ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…. Но ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ динамичСскиС замыкания, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ измСняСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ – словари, мноТСства ΠΈΠ»ΠΈ списки.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ…. Π”Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΈ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция сохраняла ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ измСрСния. Π’ этом случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ΄ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ для создания Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

        def mean():
    sample = []
    def inner_mean(number):
        sample.append(number)
        return sum(sample) / len(sample)
    return inner_mean

sample_mean = mean()
    
        >>> sample_mean(100)
100.0
>>> sample_mean(105)
102.5
>>> sample_mean(101)
102.0
>>> sample_mean(98)
101.0

    

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, присвоСнноС sample_mean, сохраняСт состояниС Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ. Π₯отя ΠΌΡ‹ опрСдСляСм список sample Π²Π½ΡƒΡ‚Ρ€ΠΈ mean(), ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ доступСн ΠΈ Π² Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΈ.

ИзмСнСниС состояния замыкания

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ замыкания ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ скрыты ΠΎΡ‚ внСшнСго ΠΌΠΈΡ€Π°. Однако ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π΄Π°Ρ‚ΡŒ для Π½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Π° ΠΈ сСттСра:

        def make_point(x, y):
    def point():
        print(f"Point({x}, {y})")
    def get_x():
        return x
    def get_y():
        return y
    def set_x(value):
        nonlocal x
        x = value
    def set_y(value):
        nonlocal y
        y = value
    # ДобавляСм Π³Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹ ΠΈ сСттСры
    point.get_x = get_x
    point.set_x = set_x
    point.get_y = get_y
    point.set_y = set_y
    return point

point = make_point(1, 2)
    
        >>> point.get_x()
1
>>> point.get_y()
2
>>> point()
Point(1, 2)
>>> point.set_x(42)
>>> point.set_y(7)
>>> point()
Point(42, 7)
    

Π—Π΄Π΅ΡΡŒ make_point() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ point. К этому ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для получСния доступа ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ ΠΈ записи ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… x ΠΈ y.

Вакая Ρ„Π°Π±Ρ€ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ быстрСС, Ρ‡Π΅ΠΌ эквивалСнтный класс, Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ прСдоставляСт наслСдованиС, дСскрипторы ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ возмоТности классов Python.

ИзмСнСниС повСдСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ Python – Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ популярный ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ использования Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, особСнно для Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ. Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ – это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΌΠ΅Ρ‚ΠΎΠ΄, класс) ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
Если концСпция Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρƒ вас трудности, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½Π°ΡˆΡƒ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ Всё, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°Ρ… Python.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для динамичСского добавлСния свойств ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΈ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π΅Π³ΠΎ повСдСния, Π½Π΅ затрагивая ΠΈ Π½Π΅ измСняя Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ. Для этого Π² ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΡΡŽΡ‰Π΅ΠΉ Π΅Π³ΠΎ строкС ставится символ @ ΠΈ имя Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°:

        @decorator
def decorated_func():
    # Function body...
    pass
    

Π­Ρ‚ΠΎΡ‚ синтаксис заставляСт decorator() автоматичСски ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ decorator_func() Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² своСм Ρ‚Π΅Π»Π΅. Π­Ρ‚Π° опСрация являСтся сокращСниСм для инструкции ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π°:

        decorated_func = decorator(decorated_func)
    

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ для измСнСния повСдСния ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

        def add_messages(func):
    def _add_messages():
        print("Π­Ρ‚ΠΎ ΠΌΠΎΠΉ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€.")
        func()
        print("Пока!")
    return _add_messages

@add_messages
def greet():
    print("ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!")
    
greet()
    
        Π­Ρ‚ΠΎ ΠΌΠΎΠΉ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€.
ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!
Пока!
    

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ @add_messages для дСкорирования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ greet(). Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ функция ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ greet(), вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ просто Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!, ΠΎΠ½Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΄Π²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… сообщСния.

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΊΠΎΠ΄Π° Π½Π° Python являСтся вставка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² print() для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Однако, добавляя ΠΈ удаляя Π²Ρ‹Π·ΠΎΠ²Ρ‹ print(), ΠΌΡ‹ рискуСм Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· Π½ΠΈΡ…. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€:

        def debug(func):
    def _debug(*args, **kwargs):
        result = func(*args, **kwargs)
        print(
            f"{func.__name__}(args: {args}, kwargs: {kwargs}) -> {result}"
        )
        return result
    return _debug


@debug
def add(a, b):
    return a + b
    
        >>> add(5, 6)
add(args: (5, 6), kwargs: {}) -> 11
11
    

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ функция-Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ debug () ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ имя Π΄Π΅ΠΊΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ значСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π’Π°ΠΊΠΎΠΉ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, достаточно ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° @debug, ΠΈ отлаТСнная функция Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ послСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ generate_power() Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°:

        def generate_power(exponent):
    def power(func):
        def inner_power(*args):
            base = func(*args)
            return base ** exponent
        return inner_power
    return power


@generate_power(2)
def raise_two(n):
    return n


@generate_power(3)
def raise_three(n):
    return n

    
        >>> raise_two(7)
49
>>> raise_three(5)
125
    

Π­Ρ‚Π° вСрсия generate_power() Π΄Π°Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Ρ‡Ρ‚ΠΎ ΠΈ Π² исходной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’ этом случаС ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для запоминания показатСля стСпСни ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ func().

Π—Π΄Π΅ΡΡŒ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ (ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСпСни), поэтому Π½Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π΄Π²Π° уровня Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ прСдставлСн Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ power(), которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π΄Π΅ΠΊΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ прСдставлСн Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ inner_power(), которая ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСпСни Π² args, выполняСт ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ расчСт ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π˜Ρ‚Π°ΠΊ, Π² Python Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ прямой доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ опрСдСляСтС Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ прСдоставляСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для инкапсуляции Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, создания Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ ΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

ΠœΠ•Π ΠžΠŸΠ Π˜Π―Π’Π˜Π―

Если Ρƒ вас ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ вопросы, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ ΠΈΠΌΠΈ Π² коммСнтариях.

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию
Senior Java Developer
Москва, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования
Java Team Lead
Москва, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•