深入解析Java注解機制:元注解、自定義處理器及其在框架中的妙用

1.注解簡介與作用

1.1 什么是注解(Annotation)

在Java中,注解是一種應用于類、方法、變量、參數和Java包等元素的標記。這些標記可以在編譯時、加載時甚至運行時被讀取,并執行相應的處理。通過使用注解,開發人員可以在不改變原有邏輯的情況下,為代碼添加額外的信息。

// 基本的注解使用示例
public class MyClass {@Overridepublic String toString() {return "MyClass toString method";}
}

上面的代碼片段使用了@Override注解來指明toString()方法覆蓋了其父類的方法。這對于編譯器檢查是否正確執行了方法覆蓋是很有幫助的。

1.2 注解的應用場景

注解在Java編程中有許多應用場景:

  • 編譯檢查:如@Override和@Deprecated,幫助識別潛在的問題;
  • 代碼分析:可以通過注解對代碼進行靜態分析;
  • 程序運行控制:通過特定注解影響代碼的運行行為,如JUnit中的@Test;
  • 自動生成文檔:如使用@Documented生成Javadoc;
  • 配置文件替代:在框架中用注解來替代XML配置文件,如Spring和Hibernate中的注解。

1.3 注解與反射的協同作用

Java的反射機制可以在運行時加載、探知、使用編譯期間完全未知的類。注解和反射配合,能夠使得我們在運行時對這些注解信息進行訪問和處理,實現極為靈活的編程方式。

import java.lang.reflect.Method;
public class AnnotationProcessing {public static void processAnnotations(Object obj) throws Exception {Class<?> objClass = obj.getClass();for (Method method : objClass.getDeclaredMethods()) {if (method.isAnnotationPresent(MyAnnotation.class)) {MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);System.out.println("Method " + method.getName() + ": "+ myAnnotation.value());}}}public static void main(String[] args) throws Exception {processAnnotations(new MyClass());}
}

上面的代碼展示了如何結合注解和反射來處理注解值。processAnnotations方法會迭代所有方法并檢查是否有MyAnnotation注解,如果有,則打印出相應的注解值。

2.JAVA內置注解解讀

在Java語言中,除了允許程序員自定義注解外,Java也提供了一組內置注解,用于對代碼的某些行為進行說明。這些注解提供了標準化的方法來對代碼進行說明和管理。現在,我們將詳細介紹幾種常見的內置注解及其用途。

2.1 概述JAVA內置注解

Java定義了以下幾種內置注解,它們在java.lang包中定義:

  • @Override:指示編譯器一個方法聲明打算重寫父類中的另一個方法聲明。
  • @Deprecated:表示某個程序元素(類、方法、字段等)已經過時。
  • @SuppressWarnings:指示編譯器忽略特定警告。

每個注解都有其特定的適用場景,我們將在后續部分逐一深入解釋。

2.2 @Override

@Override注解可以幫助程序員驗證下面的方法是否是一個重寫方法。如果程序員誤寫了方法名或者錯誤的參數類型,編譯器會發出錯誤提示。
例如,下面的代碼將正確的使用@Override來重寫toString方法:

public class Animal {@Overridepublic String toString() {return "This is an animal";}
}

如果方法名或參數被誤寫,編譯器會提示錯誤信息,這樣@Override就起到了捕獲錯誤的功能。

2.3 @Deprecated

使用@Deprecated注解可以標記程序元素已經過時,推薦不再使用。當其他程序使用已過時的元素時,編譯器會給出警告提示。

public class MyUtils {@Deprecatedpublic void showOldMessage() {System.out.println("Old way to show message");}public void showNewMessage() {System.out.println("New way to show message");}
}

上面的例子中,showOldMessage方法使用了@Deprecated注解,表示不推薦使用這個方法,而應該使用showNewMessage方法。

2.4 @SuppressWarnings

@SuppressWarnings注解用于關閉編譯器警告。如果我們知道某一段代碼雖然會引起編譯器警告,但是實際是安全的或者是有意為之,可以使用@SuppressWarnings關閉這些警告。

@SuppressWarnings("unchecked")
public void myMethod() {List rawList = new ArrayList();List<String> list = rawList; //這里會產生未檢查的類型轉換警告
}

在該例中,我們有意使用泛型前的原始類型,因此使用了@SuppressWarnings(“unchecked”)來抑制類型轉換相關的警告。

3.自定義注解的創建與使用

Java提供了強大的注解創建能力,允許我們根據特定的需求創建自定義注解。自定義注解能夠幫助我們以聲明式的方式處理問題,使代碼更加清晰易讀。這一節我們詳細探討如何創建自定義注解,以及如何使用它們。

3.1 定義自定義注解

要定義自定義注解,我們需要使用@interface關鍵字。注解體可以為空,也可以包含元素聲明(即注解的參數)。如果注解有元素,則當應用這個注解時,需要提供元素的值。

public @interface MyCustomAnnotation {// 元素聲明,看上去像方法,但實際上是注解的一個屬性String value();// 可以提供默認值int number() default 42; 
}

上面的例子展示了一個包含兩個元素的自定義注解:value和number。number元素有一個默認值42。

3.2 注解參數與默認值

注解可以包含預定義的參數,允許你在使用注解時指定值。注解參數可以是任意類型,包括:所有基本類型、String、Class、enums、注解以及上述類型的數組。

@MyCustomAnnotation(value = "Example", number = 99)
public class MyClass {// ...
}

此代碼片段展示了如何給注解MyCustomAnnotation傳遞參數值。請注意在沒有指定number元素值的情況下,會使用默認值。

3.3 使用自定義注解

定義注解后,可以將其應用于代碼中的不同元素,包括類、方法、字段等。處理使用了注解的元素時,可以通過反射來獲取注解和它們的參數,并據此執行特定的邏輯。

public class AnnotationProcessor {public static void processAnnotations(Class<?> clazz) {if (clazz.isAnnotationPresent(MyCustomAnnotation.class)) {MyCustomAnnotation myAnnotation = clazz.getAnnotation(MyCustomAnnotation.class);System.out.println("Value: " + myAnnotation.value());System.out.println("Number: " + myAnnotation.number());}}public static void main(String[] args) {processAnnotations(MyClass.class);}
}

這段代碼將查找類MyClass上是否存在MyCustomAnnotation注解,并打印出對應的參數值。

4.JAVA四大元注解詳解

在Java中,元注解是指那些應用到其他注解上的注解,它們用來配置注解本身的行為。四大標準元注解分別是@Target、@Retention、@Documented和@Inherited,它們在定義注解時扮演著關鍵角色。

4.1 @Target的使用與限制

@Target元注解用于指定注解可以應用的Java元素類型,例如類、方法或者字段等。不同的Java元素類型通過ElementType枚舉值指定。

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.FIELD})
public @interface MyTargetAnnotation {
}

上面的代碼定義了一個名為MyTargetAnnotation的注解,它可以應用于方法和字段。

4.2 @Retention的策略選擇

@Retention元注解定義了注解保留的時間長短,也就是這個注解的生命期。@Retention包含一個RetentionPolicy類型的參數,這個參數可以是SOURCE、CLASS或者RUNTIME。

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyRetentionAnnotation {
}

如果選擇RUNTIME,則注解會在VM運行期間保留,因此可以通過反射讀取。

4.3 @Documented的文檔生成機制

@Documented元注解的存在僅僅是為了把注解包含在Javadoc中,從而在生成API文檔時能夠包含相關注解說明。

import java.lang.annotation.Documented;
@Documented
public @interface MyDocumentedAnnotation {
}

使用了@Documented的注解在用Javadoc工具生成文檔時,會被列入文檔中。

4.4 @Inherited的繼承特性

@Inherited元注解表明一個注解類型被自動繼承。如果在父類上使用了這種注解,它會被子類繼承。

import java.lang.annotation.Inherited;
@Inherited
public @interface MyInheritedAnnotation {
}

如果一個使用了@MyInheritedAnnotation的父類被繼承,那么子類也擁有這個注解,而無需顯式地重新注解子類。
了解和掌握這四大元注解是創建和使用注解時的基礎。每一個元注解在注解聲明的時候起到了關鍵的作用。

5.第5節:注解的處理過程

在Java中處理注解是一個復雜的過程,需要跨越注解的生命周期。這個過程通常涉及編譯器在編譯期間的處理,以及虛擬機在運行時的處理。讓我們詳細了解一下這一過程。

5.1 注解的生命周期

注解的生命周期有三個階段:源碼(Source)、類文件(Class)和運行時(Runtime)。不同的@Retention策略決定了注解存在的階段。例如,源碼注解只存在于源碼中,在編譯后的類文件中就不再存在;而運行時注解則可以被虛擬機讀取。

5.2 編譯時注解處理器(APT)

編譯時注解處理器是Java 6引入的一種工具,允許在編譯時讀取和處理注解信息。處理器可以生成額外的源代碼文件,從而可以用于構建過程中的代碼生成,或者為IDE等工具提供文件。例如,Lombok庫就使用編譯時注解處理器來生成getter和setter方法。

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.element.TypeElement;
import java.util.Set;
public class MyAnnotationProcessor extends AbstractProcessor {@Overridepublic boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {// 處理注解的代碼return true;}
}

上述代碼定義了一個自定義的注解處理器,繼承自AbstractProcessor類,并重載了process方法,在這個方法里可以訪問到注解的信息。

5.3 運行時注解解析

在運行時,程序可以通過反射獲取類、方法和字段上的注解信息,并據此采取相應的行動。這是動態語言特性的一種體現,可以讓程序的行為根據注解的信息來動態改變。

import java.lang.reflect.Method;
public class RuntimeAnnotationProcessor {public static void main(String[] args) throws Exception {Class<?> clazz = Class.forName("com.example.MyClass");for (Method method : clazz.getDeclaredMethods()) {if (method.isAnnotationPresent(MyRuntimeAnnotation.class)) {// 獲取注解實例MyRuntimeAnnotation myAnnotation = method.getAnnotation(MyRuntimeAnnotation.class);// 根據注解中的信息,執行某些操作// ...}}}
}

上面的例子展示了如何在運行時獲取并處理MyRuntimeAnnotation注解。

6.注解在現代框架中的應用

隨著Java企業級開發的演進,注解(Annotation)在現代框架如Spring、Hibernate等中扮演著至關重要的角色。通過使用注解,這些框架提供了一種更簡潔直觀的方式來配置和管理應用程序的各個方面。

6.1 注解在Spring框架中的角色

Spring框架極大地依賴注解來簡化配置工作。Spring提供了大量的注解來支持各種功能,下面我們將看一些常用的Spring注解及其用途。
@Controller 用于標記控制層組件(如MVC的Controller)。

@Controller
public class MyController {// Controller的處理邏輯
}

@Service 用于標記服務層組件。

@Service
public class MyService {// 服務層邏輯
}

@Repository 用于標記數據訪問組件,即DAO組件。

@Repository
public class MyRepository {// 數據訪問邏輯
}

@Autowired 自動裝配依賴的組件。

public class MyComponent {@Autowiredprivate MyService myService;
}

@Transactional 聲明事務的邊界。

@Transactional
public void updateData() {// 事務性操作
}

通過這些注解,開發者可以省去大量的XML配置,讓代碼變得更加簡潔和易于理解。

6.2 使用注解配置Hibernate實體

Hibernate是一個廣泛用于數據庫操作的ORM(Object Relational Mapping)框架,它同樣支持注解來簡化配置。通過注解,我們可以直接在Java實體類上配置和數據庫表的映射關系。
@Entity 表示一個實體類,可以與數據庫中的表相映射。

@Entity
public class User {@Idprivate Long id;private String username;//...
}

@Table 指定實體映射到數據庫中的哪個表。

@Entity
@Table(name="users")
public class User {//...
}

@Column 指定類成員屬性映射到哪個列以及如何映射。

@Entity
public class User {//...@Column(name="username", length=50, nullable=false)private String username;//...
}

注解使得配置變得非常簡潔,并且與實體類代碼放在一起,易于管理。

7.高級應用:注解處理器的編寫

自定義注解處理器(Annotation Processors)是Java注解的一種高級使用方法,這些處理器可以在編譯時檢查和處理注解。接下來,我們將詳細介紹如何編寫自己的注解處理器。

7.1 創建一個簡單的注解處理器

注解處理器是一種特殊的工具,它能夠在Java編譯器處理源代碼時處理特定的注解。要創建一個注解處理器,首先要定義一個類繼承自javax.annotation.processing.AbstractProcessor。

import javax.annotation.processing.*;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;
import java.util.Set;
@SupportedAnnotationTypes("com.example.MyAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class MyProcessor extends AbstractProcessor {@Overridepublic boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {for (TypeElement annotation : annotations) {//具體處理注解的邏輯//...}return true;}
}

在上面的例子中,process方法是注解處理的核心,注解型處理器會接收所有待處理的注解類型集合。

7.2 處理注解與生成代碼實例

在處理注解時,處理器可以生成新的Java源文件或類文件,也可以修改已有的代碼。以下是一個簡單的代碼生成例子:

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {for (TypeElement annotation : annotations) {for (Element element : roundEnv.getElementsAnnotatedWith(annotation)) {// 生成一些代碼//...}}return true;
}

以上代碼展示了如何迭代所有被某注解標記的元素,并根據這些信息生成新的代碼。

7.3 調試及優化自定義注解處理器

為確保注解處理器正確無誤,并保持最優性能,調試和優化是必不可少的步驟。推薦使用單元測試來確保您的注解處理器按照預期工作,并且性能監控要在整個開發過程中進行。
通過使用注解處理器,我們可以擴展Java編譯器的功能,這使得Java不僅僅是一門靜態的語言,而是能夠在編譯期間具有動態行為的語言。

8.思考與實踐:注解的未來與挑戰

注解在Java編程語言中廣泛應用,并且隨著新技術和模式的出現,其應用范圍持續擴大。然而,注解的增多也引入了新的挑戰。在本節中,我們將討論注解在軟件開發中的優勢、缺點以及未來的潛在發展。

8.1 注解的優缺點分析

注解作為一種元數據形式,為軟件開發帶來了以下幾個優點:
提高代碼清晰度:注解可以減少樣板代碼的書寫,使得程序的意圖更直接明了。
減少配置錯誤:通過編譯時檢查,注解減少了配置錯誤的可能性。
框架集成:現代開發框架廣泛使用注解,提高了開發效率和便捷性。
但也存在一些缺點:
濫用問題:不恰當的使用會導致代碼難以理解和維護。
隱式行為:注解可能會引入隱式的代碼行為,增加了學習曲線。
編譯時依賴:某些注解處理器可能會引入額外的編譯時依賴,增加了構建復雜性。

8.2 注解與代碼維護性

雖然注解減少了樣板代碼,但過度依賴注解可能會損害代碼的透明性和可維護性。例如,一個類可能因注解而參與了復雜的事務處理或安全驗證,但這些行為對于閱讀源代碼的人來說可能并不明顯。

8.3 注解的未來趨勢與可能性

隨著微服務、云原生應用和Serverless架構的流行,注解在服務發現、配置管理以及權限控制等方面將發揮更大作用。注解可能會與新的編程范式結合,如響應式編程或者函數式編程,提供更為靈活高效的編程方式。
我們也可以期待Java平臺將繼續發展出更多的注解處理工具和框架,以支持更為強大和復雜的注解處理機制,從而讓開發者能夠利用注解實現更多的自動化任務。
注解技術的未來還包括與人工智能相結合,比如使用AI來推薦注解的使用或自動生成注解代碼,從而進一步提升開發效率。

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

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

相關文章

C++中的List

摘要 C 標準庫中的 std::list 是一種雙向鏈表容器&#xff0c;它允許在常數時間內進行插入和刪除操作&#xff0c;每個元素包含一個指向前一個和后一個元素的指針。這給我們開發提供了高效的插入和刪除操作。 引入頭文件 要使用 std::list&#xff0c;需要包含頭文件 <li…

鈑金件設計規范

(一&#xff09; 鈑金 1、鈑金的概念 鈑金&#xff08;sheet metal&#xff09;是針對金屬薄板&#xff08;厚度通常在6mm以下&#xff09;的 一種綜合冷加工工藝&#xff0c;包括沖裁、折彎、拉深、成形、鍛壓、鉚合等&#xff0c; 其顯著的特征是同一零件厚度一致。 2、鈑…

C語言屬于什么是編程語言:探索C語言的本質與特性

C語言屬于什么是編程語言&#xff1a;探索C語言的本質與特性 在編程領域&#xff0c;C語言無疑是一種重要的、廣泛應用的編程語言。但是&#xff0c;C語言究竟屬于哪一類編程語言&#xff1f;它又有哪些獨特的特性和價值&#xff1f;本文將從四個方面、五個方面、六個方面和七…

精通推薦算法8:Embedding表征學習 -- 總體架構

1 Embedding表征學習的總體架構 目前&#xff0c;推薦算法精排模型大多基于Embedding MLP范式&#xff0c;模型底層是Embedding層&#xff0c;作用是將高維稀疏的輸入特征轉換為低維稠密的特征向量&#xff0c;并實現一定的模糊查找能力。模型上層是MLP層&#xff0c;作用是對…

在鯤鵬服務器上安裝nginx

華為鯤鵬服務器采用華為自研cpu ARMv8架構,提供 Windows 和多個Linux 系統 常使用 CentOS 7.6 64bit with ARM Nginx 和 Apache 一樣都是一種 Web 服務器。是基于 REST 架構風格&#xff0c;以統一資源描述符URI 或者統一資源定位符URL 作為溝通依據&#xff0c;通過 HTTP 協議…

【C++進階】深入STL之string:掌握高效字符串處理的關鍵

&#x1f4dd;個人主頁&#x1f339;&#xff1a;Eternity._ ?收錄專欄?&#xff1a;C “ 登神長階 ” &#x1f921;往期回顧&#x1f921;&#xff1a;C模板入門 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; ?STL之string &#x1f4d2;1. STL基本…

前端(JS)對URL的編碼和解碼方式以及重要性——IE瀏覽器必須對中文URL進行編碼

工作記錄-前端——前端&#xff08;JS&#xff09;對URL的編碼和解碼方式以及重要性——IE瀏覽器必須對中文URL進行編碼 創作場景前端JS對URL的三種編碼和解碼方式1. escape 和 unescape2. encodeURI 和 decodeURI3. encodeURIComponent 和 decodeURIComponent 本文重點 創作場…

net語言編程:深入探索其奧秘與挑戰

net語言編程&#xff1a;深入探索其奧秘與挑戰 在當今信息化社會&#xff0c;編程語言如同構建數字世界的磚瓦&#xff0c;而net語言編程便是其中的一顆璀璨明珠。它以其獨特的魅力吸引著無數開發者&#xff0c;但同時也伴隨著一系列令人困惑和充滿挑戰的問題。本文將從四個方…

大模型學習資料整理:如何從0到1學習大模型,搭建個人或企業RAG系統,如何評估與優化(更新中...)

通過本文您可以了解到&#xff1a; 學習&#xff1a;從小白如何入手&#xff0c;從0到1開始學習大模型。RAG系統&#xff1a;我想搭建屬于自己或者企業的RAG系統&#xff0c;我該怎么去做&#xff1f;評估&#xff1a;微調后的模型或者RAG系統&#xff0c;如何評估自己的模型和…

windows配置dns訪問git , 加快訪問速度保姆級教程

設置 DNS 訪問 Git 需要修改電腦的 DNS 配置。下面是具體的操作流程&#xff1a; 第一步&#xff1a;打開命令提示符或終端窗口 在 Windows 系統中&#xff0c;可以按下 Win R 組合鍵&#xff0c;然后輸入 “cmd”&#xff0c;按下 Enter 鍵打開命令提示符窗口。在 macOS 或 …

【活動】GPT-4O:AI語言生成技術的新里程碑

&#x1f308;個人主頁: 鑫寶Code &#x1f525;熱門專欄: 閑話雜談&#xff5c; 炫酷HTML | JavaScript基礎 ?&#x1f4ab;個人格言: "如無必要&#xff0c;勿增實體" 文章目錄 GPT-4O&#xff1a;AI語言生成技術的新里程碑引言GPT系列簡史回顧GPT-1: 初露鋒…

國際薦酒師(香港)協會亮相香港國際葡萄酒和烈酒展覽會

2024年5月28日至30日&#xff0c;備受矚目的香港國際葡萄酒和烈酒展覽會VINEXPO Hong Kong在香港盛大舉辦。作為亞太區最盛大的葡萄酒展會&#xff0c;本屆展會不僅吸引了全球葡萄酒和烈酒行業的目光&#xff0c;更見證了國際薦酒師&#xff08;香港&#xff09;協會&#xff0…

(2) qml誕生的原因 和Qt Creator開發環境的介紹

文章目錄 qml誕生原因Qt Quick應?程序Qt Creator環境1、MSVC2、MinGWMSVC的優缺點MinGW的優缺點 最后的選擇延伸閱讀 一些常用的快捷鍵統一格式化代碼統一qml 語言的格式Locator 定位器幫助 qml誕生原因 可以在Qt5中開發的不同類型的經典應?程序。桌?應?程 序正在發?著改…

物聯網斷點續傳

斷點續傳是一種在網絡傳輸中斷后&#xff0c;能夠從中斷的位置繼續傳輸的技術。它可以有效地避免因為網絡不穩定、服務器故障、用戶操作等原因導致的傳輸失敗&#xff0c;節省了用戶的時間和流量&#xff0c;提高了傳輸的效率和可靠性。斷點續傳在很多場景中都有廣泛的應用&…

GIS結合物聯網:塑造智慧地球的新篇章

在信息技術飛速發展的今天&#xff0c;地理信息系統&#xff08;GIS&#xff09;與物聯網&#xff08;IoT&#xff09;的深度融合&#xff0c;正以前所未有的方式重塑著我們對世界的認知。本文將深入探討GIS與物聯網結合的原理、應用實踐以及面臨的挑戰與未來展望&#xff0c;共…

鄉村振興與鄉村旅游品牌化:打造具有地方特色的鄉村旅游品牌,提升鄉村旅游吸引力,促進美麗鄉村建設

目錄 一、引言 二、鄉村旅游品牌化的重要性 &#xff08;一&#xff09;增強鄉村旅游的辨識度 &#xff08;二&#xff09;提升鄉村旅游的附加值 &#xff08;三&#xff09;促進鄉村文化的傳承與創新 三、打造具有地方特色的鄉村旅游品牌 &#xff08;一&#xff09;明…

Python知識點6---列表和元組

提前說一點&#xff1a;如果你是專注于Python開發&#xff0c;那么本系列知識點只是帶你入個門再詳細的開發點就要去看其他資料了&#xff0c;而如果你和作者一樣只是操作其他技術的Python API那就足夠了。 Python的列表和和元組定義方式如下&#xff0c;且注意列表和元組擁有…

【深度強化學習入門:結合直覺與算法的學習之旅】

文章目錄 前言深度強化學習的關鍵要素簡單的深度Q網絡&#xff08;DQN&#xff09;實現分析代碼結論 前言 深度強化學習結合了深度學習的表征學習能力和強化學習的決策制定機制&#xff0c;這使得機器能夠在復雜環境中自我學習并做出合理的行動策略。它在游戲玩耍、自動駕駛、…

Linux實驗報告(二)——Linux系統中的常用命令

目錄 一、實驗名稱&#xff1a; 二、儀器、設備&#xff1a; 三、參考資料&#xff1a; 四、實驗目的&#xff1a; 五、實驗內容&#xff08;步驟&#xff09;&#xff1a; 六、實驗數據&#xff08;程序&#xff09;記錄&#xff1a; ?編輯 ?編輯 七、實驗結果分析…

Python知識點9---推導式

提前說一點&#xff1a;如果你是專注于Python開發&#xff0c;那么本系列知識點只是帶你入個門再詳細的開發點就要去看其他資料了&#xff0c;而如果你和作者一樣只是操作其他技術的Python API那就足夠了。 Python提供的推導式&#xff0c;只對列表、字典、集合三種數據類型生…