Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.
Привет всем, яодна чаша в неделю, передняя часть, которая не хочет быть пьяной (завернутой). Если написанной статье посчастливилось получить вашу благосклонность, мне очень повезло~
Что делает функция
мастер программирования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函数")
- использовать
importПрямое введение ключевых слов
import module1
import module2
# 通过模块名加.函数名的方式引入
module1.printinfo()
module2.printinfo()
- использовать
import...asВведено переименование ключевых слов
import module1 as m1
import module2 as m2
# 可以通过重命名后的名字加.函数名的方式引入
m1.printinfo()
m2.printinfo()
- использовать
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и т. д. относятся к встроенной области.