網站首頁 編程語言 正文
函數參數
在python中,函數可以當作參數使用
def func01():
print("func01 is show ......")
# func01()
# 函數名存放的是函數所在空間的地址
# print(func01)
# 函數名也可以像普通變量一樣賦值
# func02 = func01
# func02()
def foo(func):
func()
foo(func01)
閉包的構成條件
1.在函數嵌套(函數里面再定義函數)的前提下
2.內部函數使用了外部函數的變量(還包括外部函數的參數)
3.外部函數返回了內部函數
# 閉包的構成條件:
# 1在函數嵌套(函數里面再定義函數)的前提下
def func_out(num1):
def func_inner(num2):
# 2內部函數使用了外部函數的變量(還包括外部函數的參數)
num = num1 + num2
print("num的值為", num2)
# 3外部函數返回了內部函數
return func_inner
# 創建閉包實例
f = func_out(10)
# 執行閉包
f(1)
f(2)
基礎的閉包的使用
# 外部函數
def config_name(name):
# 內部函數
def say_info(info):
print(name + ":" + info)
return say_info
tom = config_name("tom")
tom("你好")
tom("你在嗎")
jerry = config_name("jerry")
jerry("你好")
jerry("我在呢")
# 外部函數
def config_name(name):
# 內部函數
def say_info(info):
print(name + ":" + info)
return say_info
tom = config_name("tom")
tom("你好")
tom("你在嗎")
jerry = config_name("jerry")
jerry("你好")
jerry("我在呢")
nonloal關鍵字的使用
1.非局部聲明變量指代的已有標識符是最近外面函數的已聲明變量,但是不包括全局變量。這個是很重要的,因為綁定的默認行為是首先搜索本地命名空間。nonlocal聲明的變量只對局部起作用,離開封裝函數,那么該變量就無效。
2.非局部聲明不像全局聲明,我們必須在封裝函數前面事先聲明該變量
3.非局部聲明不能與局部范圍的聲明沖突
# 外部函數
def func_out(num1):
# 內部函數
# aaa = 10
def func_inner(num2):
nonlocal num1
num1 = num2 + 10
print(num1)
func_inner(10)
print(num1)
return func_inner
# num1 = 10
# f = func_out(10)
# 調用閉包 = 內部函數 num2 = 10
# f(10)
func_out(10)
基礎代碼實現(裝飾器)
# 1.定義一個裝飾器(裝飾器的本質是閉包)
def check(fn):
def inner():
print("登錄驗證")
fn()
return inner
# 需要被裝飾的函數
def comment():
print("發表評論")
# 2使用裝飾器裝飾函數(增加一個登錄功能)
comment = check(comment)
comment()
裝飾器的基本使用
# 1定義一個裝飾器(裝飾器的本質是閉包)
def check(fn):
def inner():
print("請先登陸")
fn()
return inner
# 2使用裝飾器裝飾函數(增加一個登陸功能)
# 解釋器遇到@check 會立即執行 comment = check(comment)
@check
def comment():
print("發表評論")
comment()
裝飾器的使用
import time
# 1 定義裝飾器
def get_time(fn):
def inner():
start = time.time()
fn()
end = time.time()
print("時間:", end - start)
return inner
# 2 裝飾函數
# 要被裝飾的函數
@get_time
def func():
for i in range(100000):
print(i)
func()
有參數的裝飾器的使用
# 定義裝飾器
def logging(fn): # fn = sum_num
def inner(a, b):
fn(a, b)
return inner # sum_num = inner
# 使用裝飾器裝飾函數
@logging
def sum_num(a, b):
result = a + b
print(result)
sum_num(1, 2)
帶有返回值的裝飾器
# 定義裝飾器
def logging(fn): # fn = sum_num
def inner(a, b):
result = fn(a, b)
return result
return inner # sum_num = inner
# 使用裝飾器裝飾函數
@logging
def sum_num(a, b):
result = a + b
return result
result = sum_num(1, 2)
print(result)
帶有不定長參數的裝飾器
# 定義裝飾器
def logging(fn): # fn = sum_num
def inner(*args, **kwargs):
fn(*args, **kwargs)
return inner # sum_num = inner
# 使用裝飾器裝飾函數
@logging
def sum_num(*args, **kwargs):
print(args, kwargs)
sum_num(1, 2, 3, age="18")
帶有參數的裝飾器的使用
# 裝飾器
def logging(flag): # flag = "+"
# 外部函數
def decorator(fn):
# 內部函數
def inner(num1, num2):
# 判斷流程
if flag == "+":
print("--正在努力加法計算--")
elif flag == "-":
print("--正在努力減法計算--")
result = fn(num1, num2)
return result
return inner
# 返回裝飾器
return decorator
# 被帶有參數的裝飾器裝飾的函數
@logging('+') # 1 logging("+") 2 @decorator起到裝飾器的功能了
def add(a, b):
result = a + b
return result
# 執行函數
result = add(1, 3)
print(result)
類裝飾器的使用
# 定義類裝飾器
class Check(object):
def __init__(self, fn):
self.__fn = fn
def __call__(self, *args, **kwargs):
print("登錄")
self.__fn()
@Check
def comment():
print("發表評論")
comment()
原文鏈接:https://blog.csdn.net/qq_45724328/article/details/127902539
相關推薦
- 2022-04-22 uniapp小程序報錯 TypeError: Cannot read property ‘call‘
- 2022-08-23 C++?primer類的基礎精講_C 語言
- 2022-10-18 AJAX跨域問題解決方案詳解_AJAX相關
- 2022-09-14 Redis?緩存淘汰策略和事務實現樂觀鎖詳情_Redis
- 2022-03-14 Go使用Gin框架開發博客系統(一)之環境搭建和項目初始化
- 2022-06-16 golang?gorm更新日志執行SQL示例詳解_Golang
- 2022-04-20 appium中常見的幾種點擊方式_python
- 2023-06-17 解讀C語言非void函數卻沒有return會怎么樣_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支