今日メインコンテンツ
- モジュールの知人
- インポートモジュール
- モジュールパス
- カスタムモジュール
- 内蔵モジュール(標準ライブラリ)
- 時間
- 日付時刻
- ランダム
- SYS
- インクルード
- funtools
まず、モジュールの知人
(A)モジュールとは何ですか
- 実際には、我々が作成したすべてのPYファイルがモジュールで、モジュールは、異なる機能の機能がある分類、分割、パッケージコレクションです
- モジュールカテゴリ:
- 内蔵モジュール(標準ライブラリ)
- サードパーティ製のモジュール(サードパーティのライブラリ)
- カスタムモジュール
- 機能モジュール:イズム
- 高効率の開発は、その原則を知る必要はありません
- コードの重複を減らします
- サブファイル管理、変更し、維持するのに役立ち
(B)モジュールを導入
インポートモジュールキーワード:インポート
初回のみのインポートモジュール内のオブジェクトをメモリにロードされ、メモリにロードモジュールの名前でインポート最初後輸入の複製、パイソンを防止再度だけモジュールをインポートするために、行うことが参照される時間が増加する、省略する実行モジュール内の文
# text.py文件 print("这是text.py文件中的语句") def func(): print("这是text.py文件中的函数") # target.py文件 import text import text import text 运行结果: 这是text.py文件中的语句 # 只运行一次
3つのことをインポートするときに最初に発生しました:
- ソースファイル(インポートモジュール)インポートされたモジュールで定義された新しい名前空間、関数またはメソッドを作成するには、グローバルネームスペースにアクセスするために使用されています
- モジュールに含まれるコードは、新しく作成されたスペースの名前でで実行します
- 同じ名前空間の名前を参照するためにモジュール名を作成します。
注文インポートモジュールを探します
- メモリ>内蔵>のsys.path
- 説明:インタプリタを実行している場合は、共通モジュールの一部になりますが、我々は、このモジュールがメモリにロードされている場合を見つけるために行かない場合は、調べるために、モジュールのインタプリタをインポートする場合があり、メモリにロードされていない、このようなビルトインライブラリモジュール何の最終的な外観場合
sys.path
モジュールのパスが含まれていない、インポートは、いない場合は、通訳が与えられます - パス・モジュールを手動に添加することによって添加することができる
sys.path
、sys.path
リストを返し、使用することができるappend()
添加法、検索のためのインタプリタを
from sys import path path.append(r"C:\Users\11582\Desktop") from text import ceshi ceshi()
導入のモジュールの方法:
import XXX
:すべてのインポートされたモジュールfrom XXX import XXX
:インポート機能モジュールを指定します。- 後の使用では
as
、両方とも、モジュールまたは機能リネームに導入されます
import time as a from time import sleep as s
説明:
- 使用
import
インポート行は、複数のモジュールに導入されたが、お勧めできません、お勧めのすべてを使用することができimport
、インポートモジュールを1つだけ
import time import random import sys
- 使用が
from
使用時ラインに複数の機能を導入することができる、同じ名前を持つ変数の定義の前に導入された機能が上書きされます
def time(): print("123") from time import time time() 运行结果: 123
from XXX import *
:で、モジュール内のすべての機能を紹介__all__
インポート機能を制限
# 被导入文件:zxd.py def name(): print("zxd") def age(): print("age") __all__ = ["name"] # 运行文件:target.py from zxd import * age() 运行结果: NameError: name 'age' is not defined
- 使用
二つは、モジュールを使用しています
- 一般的なモジュールの実行など
- スクリプトの実行など
機能モジュールを使用する方法
- 全能
.
- 使用している場合は、
import
を活用するために使用された場合、モジュール全体をインポートします模块名.功能
import time t = time.time()
- あなたが使用している場合
from
、あなたは直接この機能を使用するので、事前に定義された関数のオーバーライドに注意を払うことができます
def time(): print("123") from time import time time() 运行结果: 123
- 全能
円形インポートモジュールを避けます
- 三つのモジュール、インポートモジュール2、モジュール3インポートモジュール2、モジュール3インポートモジュール1(回避)
(III)カスタムモジュール
注:同じビルトインモジュールモジュール名のカスタムモジュールを定義しないでください
あなたが作成したPYファイルカスタムモジュールであります
# zxd.py # 自定义模块 def name(): print("zxd") def age(): print("age") # target.py import zxd zxd.name() zxd.age() 运行结果: zxd 23
プライベートの部分定義モジュール(未使用の導入による)
if __name__ == "__main__": """私有部分"""
- 仕組み:あなたがいる場合
__name__
、この文書が返される実行__main__
リターンがインポートファイル名をインポートされている場合。
# zxd.py文件 print(__name__) if __name__ == "__main__": """私有部分""" 运行结果: __main__
# zxd.py文件 print(__name__) if __name__ == "__main__": """私有部分""" # target.py文件 import zxd print(__name__) 运行结果: zxd __main__
- 仕組み:あなたがいる場合
第二に、ビルトインモジュール(標準ライブラリ)
(A)時間モジュール
時間モジュールは、Pythonの時間依存モジュールであり、Pythonの時間は三つの形式に分けられます。
タイムスタンプ:1970-01-01午後12時00分00秒今からは、フロートに代表される、合計秒数を経験しました
構造化された時間:タプルの形式で出力時の固定構造に
- 固定構造:それは時間(夏時間が1である、夏であるかどうかを年、月、日、時、分、秒、年の最初の数週間、今年の日、0は非夏時間で、-1確かにするかどうか夏時間)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=-1)
フォーマット時間:任意の時間をフォーマットするために私たちの必要に応じて
- フォーマット規格:
%と 2桁の年表現(00-99) %Y(共通) 4桁の年表示(000から9999) %M(共通) 月(01-12) %のD(共通) その日の月以内(0-31) %H(共通) 24時間番号(0-23)時間 %私 12時間数(01-12)H %M(共通) 分の数(= 59 00) %S(共通) 秒(00〜59) %A ローカルの簡素化、週名 %A ローカル完全な曜日名 %bの ローカル簡素化された月の名前 %のB ローカル完全な月名 %のC ローカルな表現適切な日付と時刻の表現 %jを 年度中の日(001〜366) %P ローカルAMまたはPMと同等の文字 %U 日曜日から始まる週の年(00から53)の週 %のワット 週(0-6)、日曜日が週の始まりです %W 月曜日から始まる週の年(00から53)の週 %バツ 対応する日付のローカルな表現 %バツ 対応するローカル時間を表します %から 現在のタイムゾーンの名前 %% %番号そのもの
パートタイムモジュール記載の方法:
time.time() 現在のタイムスタンプを取得します。 time.sleep() スリープ(遅延) time.localtime() 構造化へのタイムスタンプの変換 time.mktime() 変換構造のタイムスタンプ time.strftime() 構造の期間の形式を変換します time.strptime() フォーマットされた時刻を変換することは構造化された時間であり、 time.time()
- 関数定義:
time()
- 関数の説明:今の時間を渡すために1970-01-01 0時00分00秒から現在のタイムスタンプを取得し、秒単位で、結果は浮動小数点型であります
import time print(time.time()) 运行结果: 1569505356.1715019
- 関数定義:
time.sleep()
- 関数定義:
sleep(seconds)
- 機能の説明:第二パラメータは、数秒の遅延のために実行されるサブセカンドレベルフロートであってもよいです
import time print(1) time.sleep(10) print(2) 运行结果: 1 2 # 相隔10S
- 関数定義:
time.localtime()
- 関数定義:
localtime([seconds])
- 関数が返されます。
(tm_year,tm_mon,tm_mday,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)
- 関数の説明:タイムスタンプパラメータは、時間を示すタイムスタンプがローカル時間をタプルに、時に変換され、
seconds
着信がない、現在のタイムスタンプに変換します
import time print(time.localtime()) 运行结果: time.struct_time(tm_year=2019, tm_mon=9, tm_mday=26, tm_hour=22, tm_min=2, tm_sec=38, tm_wday=3, tm_yday=269, tm_isdst=0)
戻り値値:
- 戻り値は値でインデックス化することができます
import time print(time.localtime()[0]) 运行结果: 2019
- キーワードの値によって戻り値
import time print(time.localtime().tm_year) 运行结果: 2019
- 関数定義:
time.mktime()
- 関数定義:
mktime(p_tuple)
- 機能:構造化された時間パラメータタプル、タイムスタンプのタプル構造はに変換され、
import time t = time.localtime() print(time.mktime(t)) 运行结果: 1569506956.0
- 関数定義:
time.strftime()
- 関数定義:
strftime(format, p_tuple=None)
- 機能の説明:最初の引数はフォーマット仕様であり、第二のパラメータの構造は時間タプルであるタプルが存在しない時には、場合、タプルは、時間の文字列に構成
localtime()
現在時刻が文字列を返すように
import time t = time.localtime() print(time.strftime("%Y-%m-%d %H:%M:%S", t)) 运行结果: 2019-09-26 22:19:30
- 関数定義:
time.strptime()
- 関数定義:
strptime(string, format)
- 機能の説明:最初のパラメータは、時間列では、第2のパラメータは時間タプルに解析フォーマット指定文字列によれば、標準化されたフォーマットであります
import time print(time.strptime("2019-09-26 22:19:30", "%Y-%m-%d %H:%M:%S")) 运行结果: time.struct_time(tm_year=2019, tm_mon=9, tm_mday=26, tm_hour=22, tm_min=19, tm_sec=30, tm_wday=3, tm_yday=269, tm_isdst=-1)
- 関数定義:
時間差を計算し
import time time_msg = input("请输入时间:") def time_difference(args): tid = time.time() - time.mktime(time.strptime(args, "%Y-%m-%d %H:%M:%S")) return time.localtime(tid) t = time_difference(time_msg) print(f"过去了{t.tm_year-1970}年{t.tm_mon-1}月{t.tm_mday-1}天{t.tm_hour}小时{t.tm_min}分{t.tm_sec}秒") 运行结果: 请输入时间:2019-01-01 00:00:00 过去了0年8月26天6小时39分17秒
(II)datetimeモジュール
- datetimeモジュールは、時間よりも強い時間モジュール、機能モジュールであります
datatimeクラスセクションdatatimeモジュールのメソッドの説明:
日付時刻() 指定された時刻を取得します。 datetime.now() 現在の時刻を取得します。 datetime.timestamp() 変換時間のタイムスタンプオブジェクト datetime.fromtimestamp() タイムスタンプ時間目標の変換 datetime.strftime() 文字列への変換時オブジェクト datetime.strptime() 対象時間に文字列を変換 日付時刻()
- 関数定義:
datetime(year: int, month: int, day: int, hour: int = ..., minute: int = ..., second: int = ..., microsecond: int = ..., tzinfo: Optional[_tzinfo] = ..., *, fold: int = ...)
- 関数の説明:着信年、月、日、時、分、秒、マイクロ秒、タイムゾーン、倍(未知パラメータを、3.6の追加)は、時間のターゲットを返します。
from datetime import datetime print(datetime(2019,9,27)) print(type(datetime(2019,9,27))) 运行结果: 2019-09-27 00:00:00 <class 'datetime.datetime'> # 对象类型
- 関数定義:
datetime.now()
- 関数定義:
now(tz=None)
- 関数の説明:パラメータの時間帯、日時オブジェクトを介して時刻オブジェクトを作成し、あなたはタイムゾーン情報を選択することができます
from datetime import datetime print(datetime.now()) print(type(datetime.now())) 运行结果: 2019-09-27 14:06:10.948891 <class 'datetime.datetime'>
- 関数定義:
datetime.timestamp()
- 関数定義:
timestamp(obj)
- 説明機能:Dateオブジェクトのパラメータ、オブジェクトの変換タイムスタンプ
from datetime import datetime print(datetime.timestamp(datetime.now())) print(type(datetime.timestamp(datetime.now()))) 运行结果: 1569565460.237563 <class 'float'>
- 関数定義:
datetime.fromtimestamp()
- 関数定義:
fromtimestamp(t, tz=None)
- 機能の説明:最初のパラメータは、タイムスタンプ、第2のパラメータの時間帯では、入来タイムスタンプがオブジェクトに変換されます。
from datetime import datetime print(datetime.fromtimestamp(0)) print(type(datetime.fromtimestamp(0))) 运行结果: 1970-01-01 08:00:00 <class 'datetime.datetime'>
- 関数定義:
datetime.strftime()
- 関数定義:
strftime(obj, format)
- 機能の説明:最初のパラメータは、目標時間であり、第2のパラメータは、フォーマット指定文字列オブジェクトの変換時間に応じて、標準化されたフォーマットであります
from datetime import datetime print(datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S")) print(type(datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S"))) 运行结果: 2019-09-27 14:35:37 <class 'str'>
- 関数定義:
datetime.strptime()
- 関数定義:
strptime(date_string, format)
- 機能の説明:最初のパラメータは、時間列では、第2のパラメータは、フォーマット指定、日時指定に係る物体フォーマット解析時間文字列であります
from datetime import datetime print(datetime.strptime("2019-09-27 14:35:37", "%Y-%m-%d %H:%M:%S")) print(type(datetime.strptime("2019-09-27 14:35:37", "%Y-%m-%d %H:%M:%S"))) 运行结果: 2019-09-27 14:35:37 <class 'datetime.datetime'>
- 関数定義:
timedeltaクラスセクションdatatimeモジュールのメソッドの説明:
デルタH()
- 関数定義:
timedelta(days: float = ..., seconds: float = ..., microseconds: float = ..., milliseconds: float = ..., minutes: float = ..., hours: float = ..., weeks: float = ..., *, fold: int = ...)
- 機能:オブジェクトをスケーリングするための時間の関数、対応するキーワードのパラメーター時の値を記入
from datetime import datetime, timedelta print(datetime(2019, 1, 2)) print(datetime(2019, 1, 2) - timedelta(days=1)) 运行结果: 2019-01-02 00:00:00 2019-01-01 00:00:00
- 関数定義:
(C)ランダムモジュール
- ランダムはランダムなモジュールである、任意のランダムな状況は、完全なランダムモジュールの助けを必要と
ランダムモジュール部は、方法について説明します。
random.Random() 0と1の間のランダム小数を生成します random.randint() ランダムに生成された数字 random.randrange() 乱数生成(ステップサイズを設定することができます) random.choice() 一回の反復オブジェクトからランダムな要素を取得します random.choices() 複数のオブジェクトからランダム要素を取得することは、反復することができ、そこに繰り返されます random.sample() 複数のオブジェクトからランダム要素を取得することは、反復してもよい、と繰り返しません rendom.shuffle() ランダムスクランブル random.Random()
- 関数定義:
random()
- 関数の説明:0と1の間のランダム小数を生成します
import random print(random.random()) 运行结果: 0.8988729646775544
- 関数定義:
random.randint()
- 関数定義:
randint(a, b)
- 関数の説明:Bへの間の乱数を生成します
import random print(random.randint(1, 10)) 运行结果: 9
- 関数定義:
random.randrange()
- 関数定義:
randrange(start, stop=None, step=1, _int=int)
- 機能の説明:デフォルトでゼロから充填終了位置は、充填工程場合、デフォルトは1である場合に乱数の開始から終了までの範囲内で発生は、ステップサイズは、設定されてもよいです
import random print(random.randrange(5)) # 从0到5随机生成 print(random.randrange(1, 10)) # 从1到10随机生成 print(random.randrange(1, 10, 2)) # 从1到10 运行结果: 4 3 9
- 関数定義:
random.choice()
- 関数定義:
choice(seq)
- 機能:ランダムな非空のシーケンスから要素を選択します
import random print(random.choice(["a", "b", "c"]) 运行结果: b
- 関数定義:
random.choices()
- 関数定義:
choices(population, weights=None, *, cum_weights=None, k=1)
- 函数说明:从非空序列中随机选择k个元素,会有重复选择的情况,以列表的形式返回
import random print(random.choices(["a", "b", "c"], k=3)) 运行结果: ['b', 'b', 'a']
- 関数定義:
random.sample()
- 函数定义:
sample(population, k)
- 函数说明:随机从非空序列中选择k个元素,不会重复选择,以列表的形式返回
import random print(random.sample(["a", "b", "c"], k=3)) 运行结果: ['c', 'b', 'a']
- 函数定义:
rendom.shuffle()
- 函数定义:
shuffle(x, random=None)
- 函数说明:将参数重新洗牌,结果返回None
import random lst = [1, 2, 3, 4, 5] random.shuffle(lst) print(lst) 运行结果: [2, 3, 5, 4, 1]
- 函数定义:
(四)os模块
- os模块中的内容全部与操作系统有关
os模块部分方法介绍:
os.makedirs('dirname1/dirname2') 递归创建目录** os.removedirs('dirname1') 递归删除目录 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir(path) 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.system("bash command") 运行shell命令,直接显示 os.popen("bash command").read() 运行shell命令,获取执行结果 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路径,返回True os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小 重点介绍常用15个方法
os.makedirs('dirname1/dirname2')
- 函数定义:
makedirs(dirname)
- 函数说明:递归创建文件夹
import os os.makedirs("dir1/dir2/dir3") # 在当前目录递归创建文件夹 运行结果: # 创建三层文件夹 ◥dir1 ◥dir2 ◥dir3
- 函数定义:
os.removedirs('dirname1')
- 函数定义:
removedirs(dirname)
- 函数说明:若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
import os os.removedirs("dir1/dir2/dir3") 运行结果: # 先判断dir3目录是否为空,若为空则删除,再一次向上判断,递归删除文件夹
- 函数定义:
os.mkdir('dirname')
- 函数定义:
mkdir(dirname)
- 函数说明:创建单级目录
import os os.mkdir("dir1") 运行结果: # 创建dir1文件夹
- 函数定义:
os.rmdir('dirname')
- 函数定义:
rmdir(dirname)
- 函数说明:删除单级目录,若目录不存在或不为空报错
import os os.rmdir("dir1") 运行结果: # 若dir1为空,删除dir1文件夹
- 函数定义:
os.listdir(path)
- 函数定义:
listdir(path)
- 函数说明:返回该路径下的所有文件夹和文件,以列表的形式
import os print(os.listdir("D:\dir")) 运行结果: ['dir1', 'dir2', 'dir3']
- 函数定义:
os.remove()
- 函数定义:
remove(filename)
- 函数说明:删除文件
import os os.remove("text.py") 运行结果: # 直接删除"text.py"文件
- 函数定义:
os.rename("oldname","newname")
- 函数定义:
rename(oldname, newname)
- 函数说明:重命名,第一个参数为旧文件名,第二个参数为新文件名
import os os.rename("text1.py", "text2.py") 运行结果: # 将文件名"text1.py"改为"text2.py"
- 函数定义:
os.getcwd()
- 函数定义:
getcwd(*args, **kwargs)
- 函数说明:返回当前文件的工作路径,以Unicode字符串的形式(若被当作模块导入,则返回的是导入文件的工作路径)
import os print(os.getcwd("text.py")) 运行结果: D:\text.py
- 函数定义:
os.path.abspath(path)
- 函数定义:
abspath(path)
- 函数说明:返回当文件的绝对路径
import os print(os.path.abspath("text.py")) 运行结果: D:\text.py
- 函数定义:
os.path.dirname(path)
- 函数定义:
dirname(path)
- 函数说明:返回文件的目录
import os path = r"D:\dir\dir1\name.py" print(os.path.dirname(path)) 运行结果: D:\dir\dir1
- 函数定义:
os.path.basename(path)
- 函数定义:
basename(path)
- 函数说明:返回文件名
import os path = r"D:\dir\dir1\name.py" print(os.path.basename(path)) 运行结果: name.py
- 函数定义:
os.path.isfile(path)
- 函数定义:
isfile(path)
- 函数说明:判断路径是否是一个文件
import os path = r"D:\dir\dir1\name.py" print(os.path.isfile(path)) 运行结果: True
- 函数定义:
os.path.isdir(path)
- 函数定义:
isdir(path)
- 函数说明:判断路径是否是一个文件夹
import os path = r"D:\dir\dir1" print(os.path.isdir(path)) 运行结果: True
- 函数定义:
os.path.join(path1[, path2[, ...]])
- 函数定义:
join(path, *paths)
- 函数说明:将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
import os path = r"D:\dir" print(os.path.join(path, "dir1", "text.py")) print(os.path.join("text.py", path, "dir1", "text.py")) 运行结果: D:\dir\dir1\text.py D:\dir\dir1\text.py
- 函数定义:
os.path.getsize(path)
- 函数定义:
getsize(filename)
- 函数说明:返回文件的大小
import os path = r"D:\dir\dir1\name.py" print(os.path.getsize(path)) 运行结果: 7971
- 函数定义:
(五)sys模块
- sys模块是与python解释器交互的一个接口
sys模块部分方法介绍:
sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称 sys.modules 获取所有的模块 sys.path
- 方法说明:返回模块的搜索路径,以列表的形式,需要导入自定义模块时,向
sys.path
中添加路径
import sys print(sys.path) 运行结果: ['D:\\python_S26\\day15', 'D:\\python_S26', 'D:\\Software\\Pycharm\\pycharm\\PyCharm 2019.2.1\\helpers\\pycharm_display', 'C:\\Python3.6.8\\python36.zip', 'C:\\Python3.6.8\\DLLs', 'C:\\Python3.6.8\\lib', 'C:\\Python3.6.8', 'C:\\Python3.6.8\\lib\\site-packages', 'D:\\Software\\Pycharm\\pycharm\\PyCharm 2019.2.1\\helpers\\pycharm_matplotlib_backend']
- 方法说明:返回模块的搜索路径,以列表的形式,需要导入自定义模块时,向
(六)functools模块
- funtools模块针对于一些函数的操作
之前介绍过的
reduce()
函数,用于累计算from functools import reduce print(reduce(lambda x, y: x * y, [1, 2, 3, 4, 5])) print(reduce(lambda x, y: x * y, [1, 2, 3, 4, 5], 5)) print(reduce(lambda x, y: x * y, [], 5)) 运行结果: 120 600 5
wraps
用于修改装饰器内层函数的函数名
我们在执行被装饰器装饰过的函数时,其实真正执行的是装饰器内部的inner函数,我们通过
__name__
方法可查看函数调用真正调用的函数名def wrapper(fn): def inner(*args, **kwargs): print("扩展内容") ret = fn(*args, **kwargs) print("扩展内容") return ret return inner @wrapper def target_func(): print("目标函数") print(target_func.__name__) 运行结果: inner
但对于调用方而言,会对函数产生疑问,所以使用warps可以修改内层inner函数的函数名
from functools import wraps def wrapper(fn): @wraps(fn) # 装饰内层函数 def inner(*args, **kwargs): print("扩展内容") ret = fn(*args, **kwargs) print("扩展内容") return ret return inner @wrapper def target_func(): print("目标函数") print(target_func.__name__) 运行结果: target_func