Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.
Привет всем, яодна чаша в неделю, передняя часть, которая не хочет быть пьяной (завернутой). Если написанной статье посчастливилось получить вашу благосклонность, мне очень повезло~
Что делает функция
мастер программирования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
и т. д. относятся к встроенной области.