python 高級技巧 0708

python 33個高級用法技巧

  1. 使用裝飾器計時函數
    裝飾器是一種允許在一個函數或方法調用前后運行額外代碼的結構。
import timedef timer(func):"""裝飾器函數,用于計算函數執行時間并打印。參數:func (function): 被裝飾的函數返回:function: 包裝后的函數"""def wrapper(*args, **kwargs):"""包裝函數,計算并打印函數執行時間。參數:*args: 原函數的非關鍵字參數**kwargs: 原函數的關鍵字參數返回:原函數的返回值"""start_time = time.time()  # 記錄開始時間result = func(*args, **kwargs)  # 執行原函數end_time = time.time()  # 記錄結束時間print(f"Function {func.__name__} took {end_time - start_time} seconds")return result  # 返回原函數的結果return wrapper@timer
def example_function(x):"""示例函數,等待 x 秒后返回 x。參數:x (int/float): 等待的秒數返回:int/float: 輸入的 x 值"""time.sleep(x)  # 模擬耗時操作return x# 調用被裝飾的函數
result = example_function(2)
print(result)
Function example_function took 2.0022225379943848 seconds
2
  • 裝飾器功能:

    • 裝飾器 timer 計算并打印被裝飾函數的執行時間。
    • 通過 wrapper 函數實現這一功能,使得可以在不修改原函數代碼的情況下,添加額外的行為。
  • 裝飾器語法糖:

    • @timer 是裝飾器的簡潔語法,用于將裝飾器應用于函數。
    • 相當于手動將函數傳遞給裝飾器并將返回值賦給原函數名。
  • 包裝函數:

    • wrapper 函數接受任意數量的參數和關鍵字參數,確保可以包裝任何函數。
    • wrapper 中,可以在調用原函數之前或之后添加任何額外的代碼,這里是計算并打印執行時間。
  1. 使用生成器
    生成器是一種特殊的迭代器,通過 yield關鍵字逐個生成值。

通過使用裝飾器,可以在不修改原函數代碼的情況下,添加額外的行為。裝飾器函數接受一個函數作為參數,返回一個新的包裝函數,在調用原函數之前或之后執行額外的代碼。裝飾器提供了一種簡潔而強大的方式來擴展函數的功能,使代碼更加模塊化和可重用。

def countdown(n):"""生成從 n 到 1 的倒計時序列。參數:n (int): 倒計時的起始值生成:int: 當前倒計時的值"""while n > 0:yield nn -= 1# 使用生成器函數 countdown 進行倒計時
for i in countdown(5):print(i)
5
4
3
2
1
  • 生成器函數:

    • 生成器函數使用 yield 關鍵字逐個生成值,與常規的返回值函數不同,它在每次生成值后暫停執行,并保留其狀態以便繼續生成下一個值。
    • 在生成器函數 countdown 中,while 循環每次生成當前的 n 值,然后將 n 減少 1。
  • 迭代生成器:

    • 使用 for 循環迭代生成器時,循環會自動處理生成器的狀態,并在每次迭代時調用生成器函數的 __next__() 方法,獲取下一個值。
    • 當生成器函數不再生成新值時,迭代結束。

通過使用生成器函數,可以逐個生成序列中的值,而不需要一次性創建整個序列。這種方法在處理大數據集或需要逐步生成數據時非常有用,能夠節省內存并提高效率。生成器函數使用 yield 關鍵字生成值,并在每次生成后暫停執行,保留其狀態以便后續繼續生成。

  1. 使用命名元組
    命名元組是一種特殊的元組,允許通過名稱訪問元素。
from collections import namedtuplePoint = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)
10 20
  1. 使用全局變量
    全局變量可以在多個函數之間共享數據。
global_var = 0def increment():global global_varglobal_var += 1increment()
print(global_var)
1
  1. 使用局部變量
    局部變量在函數內部定義,只在函數內部有效。
def example():local_var = 'Hello'print(local_var)example()
# print(local_var)  # 這行會報錯,因為local_var是局部變量
Hello
  1. 使用類方法
    類方法是一種綁定到類而不是實例的方法。
class MyClass:class_var = 0@classmethoddef increment_class_var(cls):cls.class_var += 1MyClass.increment_class_var()
print(MyClass.class_var)
1
  1. 使用靜態方法
    靜態方法是一種不依賴于類或實例的獨立方法。
class MyClass:@staticmethoddef static_method():print('This is a static method.')MyClass.static_method()
This is a static method.
  1. 使用實例方法
    實例方法是綁定到實例的方法,可以訪問實例的屬性和方法。
class MyClass:def __init__(self, value):self.value = valuedef display_value(self):print(self.value)obj = MyClass(10)
obj.display_value()
10
  1. 使用裝飾器添加功能
    裝飾器可以在不修改原函數代碼的情況下添加功能。
def decorator(func):"""裝飾器函數,用于在調用被裝飾函數之前打印一條消息。參數:func (function): 被裝飾的函數返回:function: 包裝后的函數"""def wrapper(*args, **kwargs):"""包裝函數,打印一條消息然后調用原函數。參數:*args: 原函數的非關鍵字參數**kwargs: 原函數的關鍵字參數返回:原函數的返回值"""print('Function is called')return func(*args, **kwargs)return wrapper@decorator
def say_hello():"""打印 'Hello' 的函數"""print('Hello')# 調用被裝飾的函數
say_hello()
Function is called
Hello
  1. 使用鏈式函數調用
    鏈式函數調用允許連續調用多個方法。
class MyClass:def __init__(self, value):self.value = valuedef increment(self):self.value += 1return selfdef display_value(self):print(self.value)obj = MyClass(10)
obj.increment().increment().display_value()
12
  1. 使用自定義迭代器
    自定義迭代器可以實現自己的迭代邏輯。
class MyIterator:def __init__(self, data):"""初始化 MyIterator 對象,并設置初始數據和索引。參數:data (list): 要迭代的數據列表"""self.data = dataself.index = 0def __iter__(self):"""返回迭代器對象本身。返回:MyIterator: 迭代器對象"""return selfdef __next__(self):"""返回下一個數據元素。返回:int/float: 當前索引的數據元素拋出:StopIteration: 當沒有更多元素時停止迭代"""if self.index < len(self.data):result = self.data[self.index]self.index += 1return resultelse:raise StopIteration# 創建 MyIterator 對象并迭代打印每個元素
my_iter = MyIterator([1, 2, 3])
for value in my_iter:print(value)
1
2
3
  • __iter__ 方法返回迭代器對象本身。
  • __next__ 方法在每次迭代中被調用,返回當前索引位置的元素,并將索引加1。
    當索引超出數據列表的長度時,拋出 StopIteration 異常,迭代結束。
  1. 使用類方法
    類方法可以在不實例化類的情況下調用。
class MyClass:class_var = 0@classmethoddef increment_class_var(cls):cls.class_var += 1MyClass.increment_class_var()
print(MyClass.class_var)
1
  1. 使用屬性裝飾器
    屬性裝飾器用于控制屬性的訪問和修改。
class MyClass:def __init__(self, value):"""初始化 MyClass 對象并設置初始值。參數:value (int/float): 初始值"""self._value = value@property  # 屬性方法def value(self):"""獲取 _value 的值。返回:int/float: 當前 _value 的值"""return self._value@value.setter  # 屬性的設置方法def value(self, new_value):"""設置 _value 的新值。參數:new_value (int/float): 新值"""self._value = new_value# 創建一個 MyClass 對象,初始值為 10
obj = MyClass(10)# 獲取并打印 _value 的值
print(obj.value)  # 輸出: 10# 設置 _value 的新值為 20
obj.value = 20# 獲取并打印新的 _value 的值
print(obj.value)  # 輸出: 20
10
20
  • @property 裝飾器:

    • 將方法轉換為屬性,使得可以通過 obj.value 訪問,而不需要調用方法。
    • 這種方法使得屬性訪問看起來更自然,與直接訪問實例變量類似。
  • @value.setter 裝飾器:

    • 將方法轉換為屬性的設置方法,使得可以通過 obj.value = new_value 來設置屬性的值。
    • 這種方法提供了一種控制屬性值設置的機制,可以在設置值之前進行驗證或其他處理。
  1. 使用字典合并
    合并兩個字典。
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}# 使用字典的update方法合并
dict1.update(dict2)
print(dict1)
print({**dict1, **dict2})
{'a': 1, 'b': 3, 'c': 4}
{'a': 1, 'b': 3, 'c': 4}
  1. 使用 Counter計數
    Counter類用于計數可哈希對象。
from collections import Counterdata = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
counter = Counter(data)
print(counter)
Counter({'apple': 3, 'banana': 2, 'orange': 1})
  1. 使用 deque進行雙端隊列操作
    deque是一種雙端隊列,可以在兩端高效地添加和刪除元素。
from collections import dequed = deque([1, 2, 3])
d.appendleft(0)
d.append(4)
print(d)
deque([0, 1, 2, 3, 4])
  1. 使用 defaultdict
    defaultdict是一個帶有默認值的字典。
from collections import defaultdictdd = defaultdict(int)
dd['a'] += 1
print(dd)
defaultdict(<class 'int'>, {'a': 1})
  1. 使用堆排序
    使用 heapq模塊進行堆排序。
import heapq# 初始化一個無序列表
data = [3, 1, 4, 1, 5, 9, 2, 6, 5]# 使用 heapq.heapify 將列表轉換為堆
heapq.heapify(data)# 使用 heapq.heappop 逐個彈出最小元素,實現排序
sorted_data = [heapq.heappop(data) for _ in range(len(data))]# 打印排序后的列表
print(sorted_data)
[1, 1, 2, 3, 4, 5, 5, 6, 9]
  • 堆排序過程:

    • heapq.heapify(data) 將列表 data 轉換為最小堆,最小元素在堆的根節點。
    • heapq.heappop(data)逐個彈出最小元素,重新調整堆結構,使得次小元素成為新的根節點。
    • 通過列表推導式,所有元素依次彈出并存入新的列表 sorted_data,實現排序。
  • 堆的性質:

    • 最小堆是一種完全二叉樹結構,滿足父節點小于或等于子節點的性質。
    • 這種結構使得獲取最小元素的時間復雜度為 O(1),插入和刪除元素的時間復雜度為 O(log n)
import heapq# 初始化一個無序列表
data = [3, 1, 4, 1, 5, 9, 2, 6, 5]# 將所有元素取反,構建最大堆
max_heap = [-x for x in data]# 使用 heapq.heapify 將列表轉換為堆
heapq.heapify(max_heap)# 使用 heapq.heappop 逐個彈出最大元素(原值)
sorted_data = [-heapq.heappop(max_heap) for _ in range(len(max_heap))]# 打印排序后的列表
print(sorted_data)
[9, 6, 5, 5, 4, 3, 2, 1, 1]

通過使用 heapq 模塊,可以間接實現大頂堆和堆排序。雖然 heapq 主要支持最小堆,但通過取反數的方法,可以高效地實現最大堆排序。

  1. 使用 bisect進行二分查找
    使用 bisect模塊進行二分查找。
import bisect# 初始化一個有序列表
data = [1, 2, 4, 4, 5]# 使用 bisect.insort 在合適的位置插入元素 3
bisect.insort(data, 3)# 打印插入后的列表
print(data)
[1, 2, 3, 4, 4, 5]
  • 二分查找:

    • bisect 模塊使用二分查找算法在有序列表中找到元素應該插入的位置。
    • 二分查找的時間復雜度為 O(log n),比線性查找 O(n) 更高效。
  • 插入元素:

    • insort 函數不僅找到插入位置,還會將元素插入到該位置。
  1. 使用 itertools生成排列組合
import itertools# 生成 'ABC' 字符串的長度為2的排列
permutations = list(itertools.permutations('ABC', 2))
# 生成 'ABC' 字符串的長度為2的組合
combinations = list(itertools.combinations('ABC', 2))print('Permutations:', permutations)
print('Combinations:', combinations)
Permutations: [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
Combinations: [('A', 'B'), ('A', 'C'), ('B', 'C')]
  1. 使用 itertools生成無限序列
import itertoolscounter = itertools.count(start=1, step=2)
print(next(counter))
print(next(counter))
print(next(counter))
1
3
5
  1. 使用 functools.partial
    使用 partial函數創建部分參數的函數。
from functools import partialdef power(base, exponent):"""計算 base 的 exponent 次方。參數:base (int/float): 底數exponent (int/float): 指數返回:int/float: base 的 exponent 次方"""return base ** exponent# 使用 partial 函數創建一個新的函數 square,固定 exponent 參數為 2
square = partial(power, exponent=2)# 計算 3 的平方
print(square(3))  # 輸出: 9
9
  • partial 函數:

partial 函數用于固定一個函數的部分參數,從而創建一個新的函數。
在這個例子中,partial 被用來固定 power 函數的 exponent 參數為 2,從而創建一個新的函數 square

  1. 使用 functools.lru_cache
    使用 lru_cache緩存函數結果,提高性能。
from functools import lru_cache@lru_cache(maxsize=None)
def fibonacci(n):"""計算第n個斐波那契數,使用lru_cache進行緩存以提高性能。參數:n (int): 需要計算的斐波那契數的索引返回:int: 第n個斐波那契數"""if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)# 打印第10個斐波那契數
print(fibonacci(10))
55
  • 緩存的優勢:

    • 在沒有緩存的情況下,遞歸計算斐波那契數會有大量的重復計算。例如,計算 F(10) 會多次計算 F(9)、F(8) 等。
    • 使用 lru_cache 后,每個值只計算一次,然后存儲在緩存中,以后再需要相同值時直接從緩存中讀取,避免重復計算,提高了性能。
  • 遞歸過程:

    • 當計算 fibonacci(10) 時,函數會遞歸調用 fibonacci(9)fibonacci(8),依次類推,直到調用 fibonacci(0)fibonacci(1)
    • 由于 lru_cache 的存在,計算 fibonacci(10) 的整個過程中,每個值只會計算一次,并存儲在緩存中。
  1. 使用 subprocess運行外部命令
import subprocessresult = subprocess.run(['echo', 'Hello, World!'], capture_output=True, text=True)
print(result.stdout)
Hello, World!
  1. 使用 shutil進行文件操作
import shutil
# 創建一個文件 example.txt 并寫入內容
with open('example.txt', 'w') as file:file.write('Hello, world!')
shutil.copy('example.txt', 'example_copy.txt')
print('File copied.')
File copied.
  1. 使用 pathlib處理文件路徑
from pathlib import Path# 創建一個文件 example.txt 并寫入內容
with open('example.txt', 'w') as file:file.write('Hello, world!')# 使用 pathlib 創建一個 Path 對象
p = Path('example.txt')# 打印文件名
print(p.name)    # 輸出:example.txt# 打印文件名(不包括后綴)
print(p.stem)    # 輸出:example# 打印文件后綴
print(p.suffix)  # 輸出:.txt# 打印文件的父目錄
print(p.parent)  # 輸出:.
example.txt
example
.txt
.
  1. 使用正則表達式匹配字符串
    使用 re模塊進行正則表達式匹配。
import repattern = re.compile(r'\d+')
match = pattern.search('The answer is 42')
print(match.group())
42
  1. 使用內存映射文件
    使用 mmap模塊進行內存映射文件操作。
import mmap
# 創建一個文件 example.txt 并寫入內容
with open('example.txt', 'w') as file:file.write('Hello, world!')
# 打開文件 example.txt 進行讀寫操作 ('r+b' 表示讀寫二進制模式)
with open('example.txt', 'r+b') as f:# 使用 mmap 模塊創建內存映射對象with mmap.mmap(f.fileno(), 0) as mm:# 從內存映射對象中讀取一行,并將其解碼為 UTF-8 字符串print(mm.readline().decode('utf-8'))
Hello, world!

with mmap.mmap(f.fileno(), 0) as mm:

使用 mmap 模塊創建一個內存映射對象。f.fileno() 返回文件的文件描述符,0 表示將整個文件映射到內存中。with 語句確保內存映射對象在塊結束時會自動關閉。

  1. 使用logging記錄日志
import logginglogging.basicConfig(level=logging.INFO)
logging.info('This is an info message')
INFO:root:This is an info message
  1. 使用 argparse解析命令行參數
import argparsedef main(name="Default Name"):print(f"Hello, {name}!")if __name__ == "__main__":parser = argparse.ArgumentParser(description='Example script')parser.add_argument('name', type=str, nargs='?', default="Default Name", help='Your name')args = parser.parse_args()main(args.name)
Hello, Alice!
  1. 使用 unittest進行單元測試
import unittestdef add(x, y):return x + yclass TestAdd(unittest.TestCase):def test_add(self):self.assertEqual(add(2, 3), 5)if __name__ == '__main__':unittest.main(argv=[''], verbosity=2, exit=False)
test_add (__main__.TestAdd) ... ok----------------------------------------------------------------------
Ran 1 test in 0.002sOK
  1. 使用 tqdm顯示進度條
from tqdm import tqdm
import timefor i in tqdm(range(100)):time.sleep(0.01)
100%|██████████| 100/100 [00:01<00:00, 97.88it/s]
  1. 使用 pandas進行數據分析
import pandas as pddata = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]}
df = pd.DataFrame(data)
print(df)
Name  Age
0    Alice   25
1      Bob   30
2  Charlie   35

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42965.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42965.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42965.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件架構之開發方法

軟件架構之開發方法 第6章&#xff1a;開發方法6.1 軟件生命周期6.2 軟件開發模型6.2.1 瀑布模型6.2.2 演化模型6.2.3 螺旋模型6.2.4 增量模型6.2.5 構件組裝模型 6.3 統一過程6.4 敏捷方法6.4.1 極限編程6.4.2 特征驅動開發6.4.3 Scrum6.4.4 水晶方法6.4.5 其他敏捷方法 6.5 軟…

vmware lun回收引起的IO問題

起初并沒人關注的小問題,正常不過的虛機存儲遷移操作,引起的延遲卻引發一連串的變化。 環境 vsphere 6.7 + 華為集中式存儲 開始 下午5:17 業務反饋,存在數據超時,頻繁在1秒鐘以內,正常在200ms。需運維排查虛機的狀態與IO情況等硬件使用情況。下午5:30 隨手翻開zabbix 打開…

vue在線預覽excel、pdf、word文件

安裝 //docx文檔預覽組件 npm install vue-office/docx vue-demi//excel文檔預覽組件 npm install vue-office/excel vue-demi//pdf文檔預覽組件 npm install vue-office/pdf vue-demi使用示例 docx文檔的預覽 <template><vue-office-docx :src"src" ren…

【嵌入式Linux】<知識點> 虛擬地址空間

前言 在Linux中&#xff0c;新創建的進程都擁有獨立的虛擬地址空間。為深入多進程多線程的理解&#xff0c;了解虛擬地址空間分區十分有必要。 一、概念 虛擬地址空間分為4G空間&#xff0c;其中1G為內核區&#xff0c;3G為用戶區。虛擬地址空間的地址從0開始&#xff0c;且該…

20240708 視覺大模型

參考網站&#xff1a; 萬字長文帶你全面解讀視覺大模型 - 知乎 一.DINO 1."YOLO"&#xff08;You Only Look Once&#xff09;和"DINO"&#xff08;DIstillation of knowledge&#xff09;是兩種不同的模型&#xff0c;針對不同的任務和學習目標。以下是…

oracle數據庫表統計信息

oracle數據庫表統計信息未及時更新會導致oracle基于成本的執行計劃可能不是最優&#xff0c;查看執行計劃是沒問題的&#xff0c;但sql實際執行起來確很慢。 查詢oracle數據庫表統計信息最后更新時間&#xff1a; SELECT TABLE_NAME, LAST_ANALYZED,a.* FROM ALL_TAB_STATISTI…

66.Python-web框架-Django-免費模板django-datta-able的分頁的一種方式

目錄 1.方案介紹 1.1實現效果 1.2django.core.paginator Paginator 類: Page 類: EmptyPage 和 PageNotAnInteger 異常: 1.3 templatetags 2.方案步驟 2.1創建一個common app 2.2創建plugins/_pagination.html 2.3 其他app的views.py查詢方法 2.4在AIRecords.html里…

入門 Vue Router

Vue Router Vue Router插件做了什么&#xff1f; 全局注冊 RouterView 和 RouterLink 組件。添加全局 $router 和 $route 屬性。啟用 useRouter() 和 useRoute() 組合式函數。觸發路由器解析初始路由。 標簽介紹 RouterView 加載指定頁面 <RouterLink to"/home"…

必剪APP視頻剪輯的字幕制作方法教程!

你是否還在用pr聽一句打一句的制作字幕&#xff1f;你是否還在用ps做字幕然后拉到pr里一句一句的對時間軸&#xff1f;快別用那些老方法啦&#xff0c;繁瑣又浪費時間&#xff01;今天給大家推薦一個方便速度的制作字幕的方法&#xff0c;趕快來看看吧&#xff01; 第一步&…

【Altium】AD-網絡版一個用戶非人為異常占用多個License的解決方法

【更多軟件使用問題請點擊億道電子官方網站】 1、 文檔目標 當出現一個用戶同時占用多個授權&#xff0c;又無法單獨釋放一個授權的情況下&#xff0c;該如何解決。 2、 問題場景 一個用戶獲取網絡版授權后&#xff0c;AD會自動重復獲取授權&#xff0c;直到該license下所有授…

電視盒子變身NAS之安裝termux

此方法適合安卓4.4到安卓9.0都可以用&#xff0c;我目前測試的設備是安卓9.0的電視盒子 第一步&#xff1a;下載安裝termux https://termux.dev/en/ 或者 https://github.com/termux/termux-app/releases 第二步&#xff1a;把apk安裝到你的機頂盒&#xff0c;使用優盤&…

讀書記錄《SQL從小白到大牛》01

讀書記錄《SQL從小白到大牛》01 接地氣的書名&#xff0c;內容應當值得一讀。 第一篇 SQL基礎 01 一些基礎概念 SQL是結構化查詢語言&#xff08;Structured Query Language&#xff09;&#xff0c;是一套用來輸入、更改和查看關系數據庫內容的命令。數據庫發展經歷三個階…

Python自動化與系統安全

信息安全是運維的根本&#xff0c;直接關系到企業的安危&#xff0c;稍有不慎會造成災難性的后果。比如經年發生的多個知名網站會員數據庫外泄事件&#xff0c;信息安全體系建設已經被提到了前所未有的高度。如何提升企業的安全防范水準是目前普遍面臨的問題&#xff0c;主要有…

Swagger的原理及應用詳解(四)

本系列文章簡介: 在當今快速發展的軟件開發領域,特別是隨著微服務架構和前后端分離開發模式的普及,API(Application Programming Interface,應用程序編程接口)的設計與管理變得愈發重要。一個清晰、準確且易于理解的API文檔不僅能夠提升開發效率,還能促進前后端開發者之…

Greenplum(一)【MPP 架構 數據類型】

1、Greenplum 入門 Greenplum 是基于 MPP 架構的一款分布式分析型數據庫&#xff0c;具備關系型數據庫的特點&#xff0c;因為它處理的是結構化的數據&#xff0c;同時具備大數據分布式的特點。 1.1、MPP 架構 MPP&#xff08;Massively Parallel Processing&#xff09;架構是…

從Java開發者到.NET Core初級工程師學習路線:目錄

C#語言基礎 1.1 C#語法概覽 1.2 變量和數據類型 1.3 運算符和表達式 1.4 控制流語句 1.5 方法和參數 1.6 類和對象 1.7 繼承和多態 1.8 接口和抽象類 1.9 委托和事件 1.10 泛型 1.11 LINQ (Language Integrated Query) 1.12 異步編程 (async/await) 1.13 異常處理 1.14 文件I/O…

IOC、DI<3> IServiceConllection 自定義IOC含屬性注入、多實現注入,方法注入

using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks;namespace IOC.Common {public class ZenServiceCollection : IZenServiceCollection{// 記錄IOC注冊的抽象、實現private Di…

SpringSecurity初始化過程

SpringSecurity初始化過程 SpringSecurity一定是被Spring加載的&#xff1a; web.xml中通過ContextLoaderListener監聽器實現初始化 <!-- 初始化web容器--><!--設置配置文件的路徑--><context-param><param-name>contextConfigLocation</param-…

sql注入問題批量處理

問題&#xff1a;SQL注入修改&#xff0c;歷史代碼全是${};無法修改的比如表名&#xff0c;列名&#xff0c;動態排序之類的不改&#xff0c;其他的都要修改完成 背景&#xff1a;新公司第一個任務就是SQL注入的修改&#xff0c;歷史sql全部都是${},一個個調整不太合適只能批量…

機場的出租車問題折線圖

分析并可視化機場離場車輛數數據 本文將詳細介紹如何使用Python的正則表達式庫re和繪圖庫matplotlib對機場離場車輛數數據進行分析和可視化。以下是具體步驟和代碼實現。 數據資源&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1rU-PRhrVSXq-8YdR6obc6Q?pwd1234 提…