Заметки по Python (4): Использование функций и модулей

Python Технологии Nuggets призывают к публикации
Заметки по Python (4): Использование функций и модулей

Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.

Привет всем, яодна чаша в неделю, передняя часть, которая не хочет быть пьяной (завернутой). Если написанной статье посчастливилось получить вашу благосклонность, мне очень повезло~

Что делает функция

мастер программированияMartin FowlerГ-н однажды сказал: "В коде много неприятных запахов, и дублирование — один из худших!".

Дублированная функциональность может быть инкапсулирована в функциональный модуль, называемый «функцией», фрагмент кода, который реализует одну или связанную функцию.

определить функцию

Правила определения функций следующие:

  • Блок функционального кода начинается сdefНачинается с ключевого слова, за которым следует имя функции и круглые скобки.().
  • Правила именования имен функций соответствуют правилам именования переменных.
  • returnКлючевое слово используется для выхода из функции, при необходимости возвращая выражение вызывающей стороне.

Синтаксис следующий:

def 函数名(参数列表):
    函数体
    return语句
# 定义一个函数 往里面穿两个参数
def sum(arg1, arg2):
    # 返回2个参数的和."
    total = arg1 + arg2
    return total


# 调用sum函数
sumNum = sum(10, 20)
print(sumNum) // 30

аргументы функции

В дополнение к основным операциям, таким как определение функции и вызов функции, в функции также могут использоваться параметры. Параметры функции — это просто переменные, которые можно использовать в теле функции. В отличие от переменных, такие переменные передаются перед телом функции.

значение параметра по умолчанию

При вызове функции, если параметры не переданы, используются параметры по умолчанию.

def printInfo(name, age=12):
    "打印任何传入的字符串"
    print("名字: ", name)
    print("年龄: ", age)
    return


# 调用a函数
printInfo(age=10, name="小红")
print("------------------------")
printInfo(name="小明")

переменный параметр

Так называемые переменные параметры означают, что при вызове функции вы можете передать 0 или любое количество параметров в функцию.

# 用星号表达式来表示stamp可以接收0个或任意多个参数
def printInfo(*stamp):

    # 可变参数可以放在for循环中取出每个参数的值
    for i in stamp:
        print(i)
    return


printInfo("一碗周")
printInfo(1, 2, 3, 4, 5, 6, 7)
printInfo("hello", "hi")

Управление функциями с помощью модулей

В то же самое.pyЕсли в файле есть две функции с одинаковыми именами, поскольку в Python нет концепции перегрузки функций, более позднее определение перезапишет предыдущее, а это означает, что на самом деле существует только одна из двух функций с одинаковыми именами. В настоящее времямодульпроявляется эффект.

Каждый файл в Python представляет собой модуль, и в разных модулях могут быть функции с одинаковыми именами.При использовании функции вы можете передатьimportКлючевое слово импортируется в указанный модуль, чтобы различать каждую функцию.

пример: определить два модуля соответственноmodule1иmodule2, а затем протестируйте процесс импорта

module1

def printinfo():
    print("这是第一个模块的printinfo函数")

module2

def printinfo():
    print("这是第二个模块的printinfo函数")
  1. использоватьimportПрямое введение ключевых слов
import module1
import module2
# 通过模块名加.函数名的方式引入
module1.printinfo()
module2.printinfo()
  1. использоватьimport...asВведено переименование ключевых слов
import module1 as m1
import module2 as m2
# 可以通过重命名后的名字加.函数名的方式引入
m1.printinfo()
m2.printinfo()
  1. использоватьfrom...import...asПереименование ключевого слова вводит функцию
from module1 import printinfo as p1
from module2 import printinfo as p2
# 可以通过重命名后的名字加.函数名的方式引入
p1()
p2()

Стоит отметить, что, вот если не использоватьasпереименовать, потому что есть дваprintinfoвызовет ошибку, поэтому его нужно переименовать

__name__ == '__main__'использование

__name__это неявная переменная в Python, которая представляет имя модуля, если вы печатаете его напрямую__name__, затем появляется__main__.

образец кодаmodule.py

def printinfo():
    print("这是函数内的内容")

print(__name__)
print("这是模块函数外的内容")

выходной результат

# __main__
# 这是模块函数外的内容

еслиmodule.pyИмпортируется как модульНапечатанный результат - это имя модуля (без пути, расширения)

образец кода

import module

выходной результат

module
这是模块函数外的内容

В это время результаты вывода отличаются.Проще говоря: вmodule.pyВ моих собственных глазах имя является основным, но в глазах других файлов имя является модулем.

Пучокmodule.pyСделать макияж

def printinfo():
    print("这是函数内的内容")

printinfo()
if __name__=="__main__":
    print(__name__)
    print("这是模块函数外的内容")

выходной результат

这是函数内的内容
__main__
这是模块函数外的内容

при импорте других файлов

import module

выходной результат

这是函数内的内容

Потому что при импорте других файлов код в модуле при выполнении условия if не будет выполняться, потому что имя модуля — модуль, а не__main__

__name__ == '__main__'Это очень полезно в реальных сценариях.Как правило, тесты должны проводиться в процессе написания модулей.При импорте результаты тестов не должны распечатываться.Если они удалены, их необходимо переписать, когда вы хотите улучшить модуль. .__name__ == '__main__'пригодился

переменная область видимости

См. следующий код:

def test():
    b = "这是函数的变量"

    def test_nested():
        c = "这是嵌套的函数变量"
        print(a)
        print(b)
        print(c)
    test_nested()


if __name__ == "__main__":
    a = "这是全局作用域"
    test()

Согласно этому коду, чтобы понять область действия переменных

В это время в функцииtest_nestedЗвонок в естественных условияхa,b,cНи одна из трех функций не сообщает об ошибках,

Если вызывается вне функцииbпеременная будет сообщена

print(b)
NameError: name 'b' is not defined

ПеременнаяbНеопределенная ошибка, поскольку b является локальной переменной, принадлежит к локальной области видимости и не может быть доступна вне функции.

если вtestвызов тела функцииcсообщит

print(c)
NameError: name 'c' is not defined

Переменнаяcнеопределенная ошибка, потому что c находится вtest_nestedфункциональное тело, дляtestфункция является локальной областью действия, но дляtestвнутри функцииtest_nestedфункция, переменнаяbпринадлежит вложенной области, вtest_nestedМы можем получить к нему доступ в функции.

если прошлоglobalчтобы повысить b до глобальной переменной, вызовите вне функцииbПеременная будет напечатана нормально

nonlocalКлючевое слово может действовать только на локальные переменные и всегда находит переменную в верхней локальной области видимости, ближайшую к текущей.

def outer():
    aa = 111

    def inner():
        nonlocal aa
        aa = 222
        print(aa)
    inner()
    print(aa)


outer()

без этогоnonlocalКлючевое слово - тело функцииinnerпечать 222, тело функцииouterНапечатайте 111, а затем напечатайте два 222 сразу после добавления

Когда Python ищет переменную, он ищет в порядке «локальная область» -> «вложенная область» -> «глобальная область» -> «встроенная область». " - это те идентификаторы, встроенные в Python, которые использовались доinput,print,intи т. д. относятся к встроенной области.