31天Python入門——第20天:魔法方法詳解

在這里插入圖片描述

你好,我是安然無虞。

文章目錄

    • 魔法方法
      • 1. `__new__和__del__`
      • 2. `__repr__和__len__`
      • 3. `__enter__和__exit__`
      • 4. 可迭代對象和迭代器
      • 5. 中括號`[]`數據操作
      • 6. `__getattr__`、`__setattr__` 和 `__delattr__`
      • 7. 可調用的
      • 8. 運算符

在這里插入圖片描述

魔法方法

魔法方法: Python中的魔法方法是一類特殊的方法, 它們以雙下劃線 __ 開頭和結尾, 用于實現類的特殊行為.這些魔法方法在Python中具有特殊的含義, 可以讓你自定義類的行為, 使其更符合你的需求, 它們一般是自動調用, 也可以通過內置函數來顯式調用.

1. __new__和__del__

__new__ 是 Python 中的一個特殊魔法方法, 用于創建對象實例.它在對象實例被創建之前被調用, 通常用于控制對象的創建過程和自定義對象的創建方式.與之相對的是 __init__ 方法, 它在對象實例創建后進行初始化操作.

__new__的注意點:

  1. 返回實例對象: __new__ 方法必須返回一個類的實例對象.通常情況下, 它會調用父類的 __new__ 方法來創建實例, 并返回實例對象.
  2. 第一個參數是類: __new__ 方法的第一個參數是類本身, 通常命名為 cls.在調用時, Python 會自動傳遞類作為第一個參數.
  3. 控制實例創建過程: __new__ 方法允許你控制實例的創建過程.你可以在這個方法中實現自定義的邏輯.
class MyClass:# 在__init__之前被調用def __new__(cls, name):print("__new__")obj = super().__new__(cls)return objdef __init__(self, name):print("__init__")self.name = namemy_class = MyClass('張三')
print(my_class.name)# __new__
# __init__
# 張三
# __new__方法可以控制實例創建過程:
# 單例模式 - 無論你實例化多少次, 始終都是同一個對象class Singleton:def __new__(cls, *args, **kwargs):obj = super().__new__(cls)return objdef __init__(self):passsingle1 = Singleton()
print(id(single1))
single2 = Singleton()
print(id(single2))# 140613070163824
# 140613070163392# 很明顯上面并沒有實現單例模式, 那怎么實現單例模式呢?
class Singleton:__instance = Nonedef __new__(cls, *args, **kwargs):# 假如已經實例化過了, 就直接返回已經存在的對象if not cls.__instance:cls.__instance = super().__new__(cls)return cls.__instancedef __init__(self):passsingle1 = Singleton()
print(id(single1))
single2 = Singleton()
print(id(single2))# 140240883584880
# 140240883584880

__del__當對象被釋放的時候, 會執行. 它通常用于執行一些資源釋放或清理操作, 如關閉文件、釋放網絡連接等. 但是, 但并不保證一定會調用, 因為垃圾回收可能由不同的策略來管理. python中對象的釋放是一個比較復雜的過程. 一個對象有可能在引用到0的時候被釋放, 且這個釋放是可能在任意一個地方發生.

注意:

__del__跟python中的關鍵字del是沒有關系的.del并不一定會觸發__del__

class TestDel:def __init__(self):print("__init__")def __del__(self):print("__del__")test_del = TestDel()
print()

Python當中的垃圾回收可以查看網上比較優秀的文章.

2. __repr__和__len__

__repr__ 用于定義對象的字符串表示形式.

__str____repr__都返回一個對象的字符串描述, 不過兩者的用途不同, str可以理解是給人閱讀的, 而repr是給程序使用的.

print(obj)str(obj)方法調用對象的str方法;交互式CLI、repr(obj)、gdb調試時查看對象值返回的是repr, 不過在多情況下程序員把str和repr設置為一樣__str__ == __repr__.

如果沒有定義 __str__ 方法, 調用 print() 時會默認使用 __repr__ 方法.

__len__: 用于定義對象的長度(大小).當你在一個對象上調用內置的 len() 函數時, Python 會查找該對象是否定義了 __len__ 方法, 如果有則調用該方法并返回長度值.

class MyList:def __init__(self, items):self.items = itemsdef __len__(self):return len(self.items)my_list = MyList('hello python')
print(len(my_list))

3. __enter__和__exit__

上下文協議是一組特殊方法(__enter__和__exit__同時存在), 允許你創建可用于 with 語句的上下文管理器.使用上下文管理器可以在進入和退出代碼塊時執行特定操作, 如資源的分配和釋放.Python 的上下文協議涉及兩個主要的特殊方法:__enter____exit__.

    __enter__(self)

__enter__ 方法:

  • 在進入with語句代碼塊前被調用, 用于執行一些準備操作.
  • 可以返回一個值, 該值將被賦給 as 關鍵字之后的變量.
    __exit__(self, exc_type, exc_value, exc_traceback)

__exit__ 方法:

  • 在退出with語句代碼塊時調用, 無論代碼塊是否發生異常.
  • 可以用于執行一些清理操作, 如資源的釋放.
  • 如果代碼塊內沒有異常發生, 參數為 None, None, None.如果有異常, 參數包含異常類型、異常實例和跟蹤信息.
  • 如果 __exit__ 方法返回 True, 異常不會向上繼續傳播.返回 False 則異常會繼續向上拋.

上下文協議的使用案例:可以使用 with 語句來管理文件的打開和關閉, 確保文件資源在退出代碼塊時被正確釋放.

class FileHandler:# 一個實現了上下文協議的類def __init__(self):passdef __enter__(self):passdef __exit__(self, exc_type, exc_val, exc_tb):passfile_handler = FileHandler()
with file_handler:print(11111111111)
logger = logging.getLogger(__name__)class FileHandler:# 一個實現了上下文協議的類def __init__(self, file_name, mode, encoding='utf-8'):self.file_name = file_nameself.mode = modeself.encoding = encodingself.file = Nonedef __enter__(self):self.file = open(self.file_name, self.mode, encoding=self.encoding)return self.filedef __exit__(self, exc_type, exc_val, exc_tb):if exc_type:logger.error(f"出錯: {exc_val}")if self.file:print("文件正在關閉")self.file.close()return Truefile_handler = FileHandler("test.py", "r")
with file_handler as f:content = f.read()print(content)# 上下文協議的實現簡化了異常捕獲的代碼, 讓異常捕獲的封裝性更好
try:file = open()
except Exception:# 處理這個異常pass
finally:file.close()

4. 可迭代對象和迭代器

可迭代對象和迭代器是 Python 中用于遍歷數據集合的概念.它們在很多情況下都用于實現數據的迭代操作, 如循環.

可迭代對象(Iterable)

可迭代對象是一種數據類型, 可以通過迭代獲取其中的元素.

在 Python 中, 任何實現了 __iter__() 方法的對象都被視為可迭代對象.常見的可迭代對象包括列表、元組、字典、集合、字符串等.

可迭代對象的特點:

  • 可以使用 for 循環遍歷元素.
  • 可以通過 iter() 函數將其轉換為迭代器.
class MyNumber:def __init__(self, numbers):self.numbers = numbersdef __iter__(self):# __iter__()必須返回迭代器return iter(self.numbers)a_list = [1,2,3,4,5,6,7]
my_numbers = MyNumber(a_list)print(isinstance(my_numbers, Iterable)) # Truefor num in my_numbers:print(num)# 如果沒有實現__iter__()就會報錯:
class MyNumber:def __init__(self, numbers):self.numbers = numbersa_list = [1,2,3,4,5,6,7]
my_numbers = MyNumber(a_list)print(isinstance(my_numbers, Iterable)) Falsefor num in my_numbers:print(num)

迭代器Iterator

迭代器是一個實現了 __iter__()__next__() 方法的對象.__iter__() 方法返回迭代器對象自身, 而 __next__() 方法返回迭代器的下一個元素, 如果沒有元素了, 拋出 StopIteration 異常.

迭代器的特點:

  • 可以使用 for 循環遍歷元素, 也可以使用 next() 函數逐個獲取元素.
  • 只能遍歷一次, 遍歷完成后就不能再次使用.

總結:

  1. 可迭代對象是具有迭代性質的對象, 而迭代器是一個實現了迭代協議的對象.
  2. 可迭代對象可以通過 iter() 函數轉換為迭代器.
  3. 迭代器是一種一次性的數據獲取方式, 每次調用 next() 都會獲取下一個元素.
class MyNumbersIterator:def __init__(self):passdef __iter__(self):passdef __next__(self):passmy_numbers_iterator = MyNumbersIterator()
print(isinstance(my_numbers_iterator, Iterable)) # True
print(isinstance(my_numbers_iterator, Iterator)) # True# ----------------------------------------------------------------class MyNumbersIterator:def __init__(self, numbers):self.numbers = numbersself.index = 0def __iter__(self):# __iter__()必須返回迭代器return selfdef __next__(self):try:num = self.numbers[self.index]self.index += 1except IndexError:raise StopIterationreturn numa_list = [1,2,3,4,5,6,7]
my_numbers_iterator = MyNumbersIterator(a_list)
print(isinstance(my_numbers_iterator, Iterable))
print(isinstance(my_numbers_iterator, Iterator))

5. 中括號[]數據操作

__getitem____setitem____delitem__ 用于自定義對象的索引訪問和操作.它們在創建自定義的容器類時非常有用, 允許你實現類似字典或列表的行為.

  1. __getitem__(self, key)

    這個方法定義了使用索引訪問對象時的行為.當你像 obj[key] 這樣使用索引操作時, Python 會調用對象的 __getitem__ 方法, 并將索引 key 作為參數傳遞給這個方法.你可以在這個方法中實現對應的行為, 比如從內部數據結構中獲取相應的值.

  2. __setitem__(self, key, value)

    這個方法定義了使用索引賦值操作時的行為.當你像 obj[key] = value 這樣進行索引賦值操作時, Python 會調用對象的 __setitem__ 方法, 并將索引 key 和值 value 作為參數傳遞給這個方法.你可以在這個方法中實現對應的賦值行為.

  3. __delitem__(self, key)

    這個方法定義了使用 del obj[key] 進行索引刪除操作時的行為.當你使用 del 刪除索引時, Python 會調用對象的 __delitem__ 方法, 并將索引 key 作為參數傳遞給這個方法.你可以在這個方法中實現刪除操作的邏輯.

這些方法的使用可以使你的自定義類更具像內置容器類型(如字典和列表)的行為, 從而實現更靈活和符合預期的數據操作.

# 補充知識:
# 列表切片 返回的是  列表.
# 元組切片 返回是是  元組.
# print(my_numbers[1:3]) # 切片my_numbers[1:3]相當于slice(1,3,None)
# s = slice(1, 3, None)from collections.abc import Iterableclass MyNumbers:# 全部都是數字def __init__(self, numbers):self.numbers = numbersdef __getitem__(self, item):if isinstance(item, slice):# 如果進了判斷, 就代表是在做切片, 則需要返回與原本數據類型一致的數據類型.temp = self.numbers[item]cls = type(self)obj = cls(temp)return objelse:num = self.numbers[item]return numdef __setitem__(self, key, value):if isinstance(value, (int, float)):self.numbers[key] = valueelse:raise ValueError(f'{value}的值設置必須是數字類型.')def __str__(self):return f"{self.numbers}"def __len__(self):return len(self.numbers)def __contains__(self, item):return item in self.numbersdef __delitem__(self, key):# 不允許為空, 起碼要有一個元素.if len(self.numbers) > 1:self.numbers.pop(key)else:raise ValueError('序列起碼要有一個元素')a_list = [1, 2, 3, 4, 5, 6]
# a_dict = {'a': 1, 'b': 2, 'c': 3}
my_numbers = MyNumbers(a_list)
# my_numbers[0] = 8
del my_numbers[0]
del my_numbers[1]
del my_numbers[2]
del my_numbers[0]
del my_numbers[0]
del my_numbers[0]
print(my_numbers)
# print(2 in my_numbers)
# print(type(my_numbers))
# s = slice(1, 3, None)
# print(type(a_list[s]))
# 列表切片 返回的是  列表.
# 元組切片 返回是是  元組.
# print(my_numbers[1:3])
# print(isinstance(my_numbers, Iterable))
#
# for num in my_numbers:
#     print(num)

6. __getattr____setattr____delattr__

__getattr____setattr____delattr__ 是 Python 中的魔法方法, 用于自定義對象的屬性訪問和操作.它們允許你控制屬性的獲取、設置和刪除行為, 從而實現自定義的屬性操作邏輯.

  1. __getattr__(self, name)

    當你訪問一個不存在的屬性時, Python 會調用對象的 __getattr__ 方法, 并將屬性名 name 作為參數傳遞給這個方法.你可以在這個方法中實現對應的行為, 比如返回一個默認值或者拋出異常.

  2. __setattr__(self, name, value)

    當你設置屬性的值時, Python 會調用對象的 __setattr__ 方法, 并將屬性名 name 和值 value 作為參數傳遞給這個方法.你可以在這個方法中實現對應的賦值行為, 比如進行值的驗證或修改.

  3. __delattr__(self, name)

    當你刪除屬性時, Python 會調用對象的 __delattr__ 方法, 并將屬性名 name 作為參數傳遞給這個方法.你可以在這個方法中實現刪除屬性的邏輯.

這些方法的使用可以使你的自定義類的屬性操作更具控制性和靈活性.

class Person:def __init__(self, name, age, info):self.name = nameself.age = ageself.info = infodef __getattr__(self, item):if item in self.info:return self.info[item]else:raise AttributeError(f'{self.__class__}沒有{item}屬性')def __setattr__(self, key, value):# print(f'__setattr__接收到的參數key的值是{key}, value的值是{value}')if key == 'age':if 0 < value < 150:super().__setattr__(key, value)else:raise AttributeError(f"{key}的值{value}設置不合法")super().__setattr__(key, value)def __delattr__(self, item):if item in ['name', 'age']:raise AttributeError(f"{item!r}是基礎屬性, 不允許刪除")super(Person, self).__delattr__(item)information = {'gender': "男",'height': 180,'hobby': "打籃球",
}
person = Person('張三', 20, information)
person.age = 25
del person.age
print(person.name)
print(person.age)
print(person.gender)
# print(person.height)
# print(person.hobby)
# print(person.aaa)

7. 可調用的

不僅 Python 函數是真正的可調用的, 任何 Python 對象都可以表現得像函數.為此, 只需實現魔法方法 __call__.

__call__ 是 Python 中的一個特殊魔法方法, 用于使對象可以像函數一樣被調用.當一個對象被調用時, Python 會檢查對象是否定義了 __call__ 方法, 如果定義了, 就會調用該方法, 從而實現對象的可調用行為.

這使得你可以將一個類的實例像函數一樣使用, 提供更多的靈活性和自定義操作.

from collections.abc import Callableclass Add:def __call__(self, a, b):return a + b# def func():
#     print(111)# add = Add()
# res = add(1, 2)
# print(res)
# print(isinstance(func, Callable))
# print(isinstance(test_call, Callable))# 類裝飾器.# 創建一個裝飾器函數,使被裝飾的函數只能在特定的時間段內執行。
# 在早上9點 -> 晚上6點之間, 可以調用, 其余時間不允許調用.
import datetimedef time_limited(start, end):def outer(func):def inner(*args, **kwargs):now = datetime.datetime.now().time()if start < now < end:result = func(*args, **kwargs)return resultelse:print(f"對不起, 該時間段無法調用此接口.")return innerreturn outerclass TimeLimit:def __init__(self, start, end):self.start = startself.end = enddef __call__(self, f):def inner(*args, **kwargs):now = datetime.datetime.now().time()if self.start < now < self.end:result = f(*args, **kwargs)return resultelse:print(f"對不起, 該時間段無法調用此接口.")return inner# @time_limited(start=datetime.time(9, 0), end=datetime.time(18, 0))
@TimeLimit(start=datetime.time(9, 0), end=datetime.time(18, 0))
def ceshi():print('我只能在特定的時間段內執行.')if __name__ == '__main__':ceshi()

8. 運算符

運算符魔法方法是用于實現對象之間的比較和關系運算的.它們允許你定義自定義的比較操作, 使你的對象可以像內置類型一樣進行大小比較、相等性檢查等操作.

下面是一些常用的運算符類型的魔法方法及其解釋:

  • __lt__(self, other): 小于運算符 < 的魔法方法.定義對象小于另一個對象時的行為.
  • __le__(self, other): 小于等于運算符 <= 的魔法方法.定義對象小于等于另一個對象時的行為.
  • __eq__(self, other): 等于運算符 == 的魔法方法.定義對象相等時的行為.
  • __ne__(self, other): 不等于運算符 != 的魔法方法.定義對象不等于另一個對象時的行為.
  • __gt__(self, other): 大于運算符 > 的魔法方法.定義對象大于另一個對象時的行為.
  • __ge__(self, other): 大于等于運算符 >= 的魔法方法.定義對象大于等于另一個對象時的行為.
import randomclass IntNumber:def __init__(self):self.value = random.randint(1, 10000)def __str__(self):return f"{self.value}"def __gt__(self, other):return self.value > other.valuedef __eq__(self, other):return self.value == other.valuedef __add__(self, other):return self.value + other.valueclass FloatNumber:def __init__(self):self.value = random.uniform(1, 10000)def __str__(self):return f"{self.value}"def __lt__(self, other):return self.value < other.valueint_number = IntNumber()
int_number2 = IntNumber()
print(int_number + int_number2)
# float_number = FloatNumber()
# print(int_number)
# print(int_number2)
# print(float_number)
# print(int_number2 != int_number)
# print(int_number is float_number)class Date:def __init__(self, year, month, day):self.year = yearself.month = monthself.day = daydef __gt__(self, other):if self.year > other.year:return Trueif self.year == other.year:if self.month > other.month:return Trueelif self.month == other.month:return self.day > other.dayelse:return Falseif self.year < other.year:return Falsedef __eq__(self, other):return self.year == other.year and self.month == other.month and self.day == other.day# date1 = Date(2022, 7, 15)
# date2 = Date(2022, 7, 15)
#
# print(date1 == date2)
遇見安然遇見你,不負代碼不負卿。
謝謝老鐵的時間,咱們下篇再見~

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

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

相關文章

棧 —— 數據結構基礎刷題路程

一、P1739 表達式括號匹配 - 洛谷 算法代碼&#xff1a; #include<bits/stdc.h> using namespace std; const int N300008; struct mystack {int a[N];int t-1;//壓棧void push(int data){a[t]data; } //取棧頂元素int top(){return a[t]; } //彈出棧頂元素void pop(){i…

瑞昱RTD2556QR顯示器驅動芯片

一、概述 RTD2556QR芯片是由Realtek公司精心研發的一款高性能顯示驅動芯片&#xff0c;專為滿足現代顯示設備對高分辨率、多功能接口及穩定性能的需求而設計。該芯片憑借其卓越的技術特性和廣泛的應用領域&#xff0c;在顯示驅動市場中占據重要地位。它集成了多種先進的功能模…

PyQt5和OpenCV車牌識別系統

有需要請加文章底部Q哦 可遠程調試 PyQt5和OpenCV車牌識別系統 一 介紹 此車牌識別系統基于PyQt5和OpenCV開發&#xff0c;藍牌&#xff0c;新能源(綠牌)&#xff0c;黃牌&#xff0c;白牌均可以準確識別&#xff0c;支持中文識別&#xff0c;可以導出識別結果(Excel格式)。此…

學有所記- 探索FastAPI在docker上的部署

目標&#xff1a; 學習怎樣在docker中安裝部署FastAPI&#xff0c;完成項目結構的搭建以及hello world的運行 背景&#xff1a; 公司內服務器資源有限&#xff0c;為了共享算力資源&#xff0c;同時又能隔離運行環境&#xff0c;因此采用了docker部署的方式&#xff0c;進行各…

HTTP keepalive 詳解

一、簡介 HTTP協議早期版本&#xff0c;比如1.0&#xff0c;默認是不使用持久連接的&#xff0c;也就是每個請求/響應之后都會關閉TCP連接。這樣的話&#xff0c;每次請求都需要重新建立連接&#xff0c;增加了延遲和資源消耗。Keep-Alive的作用是保持連接&#xff0c;讓多個請…

長短期記憶神經網絡(LSTM)基礎學習與實例:預測序列的未來

目錄 1. 前言 2. LSTM的基本原理 2.1 LSTM基本結構 2.2 LSTM的計算過程 3. LSTM實例&#xff1a;預測序列的未來 3.1 數據準備 3.2 模型構建 3.3 模型訓練 3.4 模型預測 3.5 完整程序預測序列的未來 4. 總結 1. 前言 在深度學習領域&#xff0c;循環神經網絡&…

基于機器學習的三國時期諸葛亮北伐失敗因素量化分析

一、研究背景與方法論 1.1 歷史問題的數據化挑戰 三國時期&#xff08;220-280年&#xff09;的戰爭史存在史料分散、數據缺失的特點。本研究通過構建包含軍事、經濟、地理、政治四大維度的結構化數據庫&#xff0c;收錄建安十二年&#xff08;207年&#xff09;至建興十二年…

藍橋杯省模擬賽 數位和

問題描述 只能被 1 和本身整除的數稱為質數。 請問在 1 &#xff08;含&#xff09;到 1000000 &#xff08;含&#xff09;中&#xff0c;有多少個質數的各個數位上的數字之和為 23 。 提示&#xff1a;599 就是這樣一個質數&#xff0c;各個數位上的數字之和為 59923 。 #…

Timer的底層實現原理?

Timer 是 Java 中用于定時任務調度的基礎工具類,其底層實現基于 單線程+任務隊列 的模型。以下是 Timer 的底層實現原理的詳細分析: 一、核心組件 TimerThread 繼承自 Thread,是 Timer 的工作線程,負責從隊列中提取任務并執行。通過 while (true) 循環持續檢查任務隊列。Ta…

Java 枚舉類 Key-Value 映射的幾種實現方式及最佳實踐

Java 枚舉類 Key-Value 映射的幾種實現方式及最佳實踐 前言 在 Java 開發中&#xff0c;枚舉(Enum)是一種特殊的類&#xff0c;它能夠定義一組固定的常量。在實際應用中&#xff0c;我們經常需要為枚舉常量添加額外的屬性&#xff0c;并實現 key-value 的映射關系。本文將詳細…

青少年編程與數學 02-015 大學數學知識點 01課題、概要

青少年編程與數學 02-015 大學數學知識點 01課題、概要 一、線性代數二、概率論與數理統計三、微積分四、優化理論五、離散數學六、數值分析七、信息論 《青少年編程與數學》課程要求&#xff0c;在高中畢業前&#xff0c;盡量完成大部分大學數學知識的學習。一般可以通過線上課…

智能打印預約系統:微信小程序+SSM框架實戰項目

微信小程序打印室預約系統&#xff0c;采用SSM&#xff08;SpringSpringMVCMyBatis&#xff09;經典框架組合。 一、系統核心功能詳解 1. 智能化管理后臺 ?用戶數據看板?打印店資源管理?預約動態監控?服務評價系統 2. 微信小程序端 ?智能定位服務?預約時段選擇?文件…

DataX 3.0 實戰案例

第五章 實戰案例 5.1. 案例一 5.1.1. 案例介紹 MySQL數據庫中有兩張表&#xff1a;用戶表(users)&#xff0c;訂單表(orders)。其中用戶表中存儲的是所有的用戶的信息&#xff0c;訂單表中存儲的是所有的訂單的信息。表結構如下&#xff1a; 用戶表 users: id&#xff1a;用…

設計模式學習(1)

面向對象設計原則 單一職責 每個類只有一個職責&#xff0c;并被完整的封裝在類中&#xff0c;該原則用來控制類的粒度。 例如Mapper&#xff0c;controller都只負責一個業務。 開閉原則 應該對擴展開放&#xff0c;而對修改封閉&#xff0c;例如定義接口或是抽象類作為抽…

在 Rocky Linux 9.2 上編譯安裝 Redis 6.2.6

文章目錄 在 Rocky Linux 9.2 上編譯安裝 Redis 6.2.6Redis 介紹官網Redis 的核心特性高性能支持多種數據結構多種持久化機制復制與高可用2.5 事務與 Lua 腳本消息隊列功能 Redis 適用場景Redis 與其他數據庫對比Redis 的優勢與劣勢Redis 優勢Redis 劣勢 部署過程系統環境信息環…

量子計算與經典計算的融合與未來

最近研學過程中發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊下方超鏈接跳轉到網站人工智能及編程語言學習教程。讀者們可以通過里面的文章詳細了解一下人工智能及其編程等教程和學習方法。下面進入文章正…

數據結構(4)——帶哨兵位循環雙向鏈表

目錄 前言 一、帶哨兵的循環雙向鏈表是什么 二、鏈表的實現 2.1規定結構體 2.2創建節點 2.3初始化 2.4打印 2.5檢驗是否為空 2.6銷毀鏈表 2.7尾插 2.8尾刪 2.9頭插 2.10頭刪 2.11尋找特定節點 2.12任意位置插入&#xff08;pos前&#xff09; 2.13刪除任意節點 …

Github 2025-03-30 php開源項目日報 Top10

根據Github Trendings的統計,今日(2025-03-30統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量PHP項目10TypeScript項目1Coolify: 開源自助云平臺 創建周期:1112 天開發語言:PHP, Blade協議類型:Apache License 2.0Star數量:10527 個Fo…

3. 線程間共享數據

1. 線程共享數據會造成什么問題&#xff1f; 1.1 讀寫不一致 多線程讀不會造成數據變動&#xff0c;所以沒有問題。只要有一個線程設計修改數據&#xff0c;就會導致數據共享出現問題&#xff0c;簡單的是數據不一致&#xff0c;嚴重的是程序訪問已經釋放的內存&#xff0c;造…

JAVA垃圾回收算法和判斷垃圾的算法

一、判斷垃圾的算法 判斷對象是否為垃圾的核心是確定對象是否不再被使用。Java主要采用以下兩種算法&#xff1a; 1. 引用計數法&#xff08;Reference Counting&#xff09; 原理&#xff1a;每個對象維護一個引用計數器&#xff0c;記錄被引用的次數。當引用被添加時計數器…