当前位置: 首页 > news >正文

Python精进系列:从 __name__ 开始了解 python 常见内置变量



引言

在Python编程的世界里,__name__是一个既特殊又常用的内置变量。无论是初涉Python的新手,还是经验丰富的开发者,理解__name__变量的工作机制都至关重要。它不仅关乎代码的结构组织,还对模块的正确使用和调试有着深远影响。本文将深入探讨__name__变量的各个方面,通过丰富的代码案例,帮助大家全面掌握这一重要概念。

一、__name__是什么?

__name__是Python为每个模块自动创建的内置变量。其值取决于模块的运行方式。当模块作为主程序直接运行时,__name__被赋值为'__main__';而当模块被其他模块导入时,__name__的值为模块的名称(不包含.py扩展名)。

案例1:直接运行模块

# 文件名:main_demo.py
print(f"The value of __name__ is: {__name__}")

当直接运行main_demo.py时,输出结果为:

The value of __name__ is: __main__

这表明,在作为主程序运行的模块中,__name__被设置为'__main__'

案例2:模块被导入

创建另一个文件import_demo.py,内容如下:

# 文件名:import_demo.py
import main_demo

当运行import_demo.py时,main_demo.py中的输出结果为:

The value of __name__ is: main_demo

此时,main_demo模块作为被导入模块,其__name__变量的值为模块名main_demo

二、__name__的主要用途

(一)区分主程序和导入模块

这是__name__最常见的用途之一。通过检查__name__的值,我们可以让模块在作为主程序运行时有不同的行为,而在被导入时避免执行某些代码。

案例3:测试代码隔离

假设我们有一个用于数学计算的模块math_operations.py

# 文件名:math_operations.py
def add(a, b):return a + bdef subtract(a, b):return a - bif __name__ == '__main__':result1 = add(3, 5)result2 = subtract(10, 4)print(f"3 + 5 = {result1}")print(f"10 - 4 = {result2}")

在这个模块中,if __name__ == '__main__':块内的代码用于测试addsubtract函数。当直接运行math_operations.py时,测试代码会执行,输出结果为:

3 + 5 = 8
10 - 4 = 6

但当math_operations.py被其他模块导入时,测试代码不会执行,从而避免了不必要的输出和干扰。

(二)动态导入模块

在一些高级编程场景中,我们可能需要根据不同的条件动态导入模块。__name__变量可以帮助我们实现这一功能。

案例4:根据环境动态导入模块

# 文件名:dynamic_import.py
env = "production"
if env == "development":import development_module as target_module
else:import production_module as target_moduletarget_module.do_something()

在这个例子中,根据env变量的值,我们动态地导入不同的模块。这里,__name__变量在模块导入过程中发挥着关键作用,确保每个模块在被导入时,其__name__被正确设置,以便在后续代码中进行识别和使用。

三、__name__在包结构中的应用

在Python的包结构中,__name__同样扮演着重要角色。包是一种组织模块的方式,通过将相关模块放在同一个目录下,并包含一个__init__.py文件(在Python 3.3及以上版本中,该文件可以为空)来标识这是一个包。

案例5:包内模块访问

假设我们有一个包结构如下:

my_package/__init__.pymodule1.pymodule2.py

module1.py中,我们可以通过__name__来判断当前模块是否在包内,以及获取包的相关信息。

# 文件名:module1.py
if __name__.startswith('my_package'):print("This module is inside the my_package.")
else:print("This module is not inside the expected package.")

在这个例子中,通过检查__name__是否以包名my_package开头,我们可以确定模块是否在指定的包内,从而进行相应的处理。

四、注意事项与常见错误

(一)在交互式环境中使用__name__

在Python的交互式环境(如Python shell或Jupyter Notebook)中,__name__的值始终为'__main__'。这与在脚本文件中运行的情况不同,需要特别注意。例如,在Jupyter Notebook中执行以下代码:

print(__name__)

输出结果将始终是:

__main__

因此,在交互式环境中进行测试或开发时,不能依赖__name__来区分主程序和导入模块的情况。

(二)避免在导入时执行不必要的代码

由于__name__的特性,在模块被导入时,模块级别的代码(不在函数或类内部的代码)会被执行。如果这些代码包含一些副作用(如文件写入、网络请求等),可能会导致意外行为。为了避免这种情况,应将不需要在导入时执行的代码放在if __name__ == '__main__':块内。

案例6:错误示例

# 文件名:bad_example.py
print("This code will be executed every time the module is imported.")def useful_function():pass

每次导入bad_example.py时,模块级别的print语句都会执行,这可能不是我们期望的。正确的做法是:

# 文件名:good_example.py
def useful_function():passif __name__ == '__main__':print("This code will only be executed when the module is run directly.")

这样,在导入good_example.py时,不会执行print语句,只有在直接运行该模块时才会执行。

五、Python中的其他内置变量

在Python中,除了__name__这个常用的内置变量外,还有许多其他十分有用的内置变量,它们在不同的编程场景中发挥着关键作用。

(一)__doc__

__doc__用于获取模块、类、函数或方法的文档字符串(docstring)。文档字符串是一段位于模块、类、函数或方法开头的字符串,用于详细描述其功能、参数以及使用方法等信息,这对于代码的理解、维护以及自动生成文档都非常有帮助。

案例7:获取函数的文档字符串

def calculate_average(numbers):"""该函数用于计算给定数字列表的平均值。:param numbers: 一个包含数字的列表:return: 列表中数字的平均值"""if not numbers:return Nonetotal = sum(numbers)return total / len(numbers)print(calculate_average.__doc__)

上述代码中,calculate_average函数定义了详细的文档字符串,通过__doc__可以轻松获取并打印出该函数的功能说明和参数信息。

(二)__file__

在模块中,__file__变量会返回该模块的文件路径。利用这个变量,我们可以方便地获取模块所在的位置,进而进行一些与文件相关的操作,例如读取同目录下的配置文件等。需要注意的是,在交互式解释器中或者通过exec等特殊方式执行代码时,__file__可能未被定义。

案例8:获取模块文件路径

import osprint(os.__file__)

运行上述代码,会输出os模块的文件路径,这样我们就能知道该模块在系统中的具体存储位置。

(三)__class__

在类的实例方法中,self.__class__用于返回实例所属的类。这在需要动态创建类的实例、进行类型检查或者实现一些基于类的动态行为时非常有用。

案例9:使用__class__动态创建实例

class Animal:def speak(self):print("I am an animal.")class Dog(Animal):def speak(self):print("Woof!")class Cat(Animal):def speak(self):print("Meow!")def create_animal(animal_type):if animal_type == "dog":return Dog()elif animal_type == "cat":return Cat()else:return Animal()def make_animal_speak(animal):animal.__class__().speak()my_dog = create_animal("dog")
make_animal_speak(my_dog)

make_animal_speak函数中,通过animal.__class__()动态创建了与animal实例所属类相同的新实例,并调用其speak方法,展示了__class__在动态编程中的应用。

(四)__dict__

无论是类还是实例,都具有__dict__属性。对于类而言,__dict__是一个字典,其中包含了类的所有属性(包括类属性和方法);对于实例来说,__dict__包含了实例的所有实例属性。我们可以通过__dict__来查看、修改对象的属性,这在一些需要动态操作对象属性的场景中十分便捷。

案例10:查看和修改实例属性

class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person("Alice", 30)
print(person.__dict__)
person.__dict__["age"] = 31
print(person.age)

上述代码中,首先通过__dict__打印出person实例的属性字典,然后直接通过修改该字典来改变person实例的age属性值,展示了__dict__在操作实例属性方面的便利性。

这些内置变量丰富了Python的编程生态,合理运用它们能够显著提升代码的灵活性和功能性,帮助开发者更加高效地完成各种编程任务。

六、总结

__name__变量是Python编程中的一个核心概念,它为模块的管理和使用提供了强大的支持。通过理解__name__的工作原理,我们能够更好地组织代码,实现代码的模块化和可复用性。在实际编程中,合理运用__name__变量可以避免许多潜在的问题,提高代码的质量和可维护性。

相关文章:

Python精进系列:从 __name__ 开始了解 python 常见内置变量

目录 引言一、__name__是什么?案例1:直接运行模块案例2:模块被导入 二、__name__的主要用途(一)区分主程序和导入模块案例3:测试代码隔离(二)动态导入模块案例4:根据环境…...

Nacos 服务发现的核心模型有哪些?Service, Instance, Cluster 之间的关系是什么?

Nacos 服务发现的核心模型 Nacos 服务发现的核心数据模型主要围绕以下几个关键概念构建,它们共同构成了服务注册与发现的基础: Namespace (命名空间): 用途: 用于进行环境隔离。比如,你可以为开发环境 (dev)、测试环境 (test) 和生产环境 (p…...

Java程序设计第1章:概述

一、Hello World 1.代码: public class HelloWorld {public static void main(String[] args){System.out.println("Hello World!");} } 2.运行结果: Hello World! 二、输出姓名、学号、班级 1.题目: 编写一个Application&a…...

C++开发工具全景指南

专业编译与调试工具深度解析 2025年4月 编译器套件 GNU Compiler Collection (GCC) GNU编译器套件是自由软件基金会开发的跨平台编译器系统,支持C、C、Objective-C、Fortran、Ada等多种编程语言。作为Linux系统的标准编译器,GCC以其强大的优化能力和…...

Java的Selenium的特殊元素操作与定位之iframe切换

iframe切换 四种切换方式: driver.switchTo().frame(index);driver.switchTo().frame(id);driver.switchTo().frame(name);driver.switchTo().frame(WebElement); 切换之后,回到默认内容页面(否则会找不到元素 driver.switchTo().defaultContent(); //iframe处…...

AI比人脑更强,因为被植入思维模型【42】思维投影思维模型

giszz的理解:本质和外在。我们的行为举止,都是我们的内心的表现。从外边可以看内心,从内心可以判断外在。曾国藩有7个识人的方法,大部分的人在他的面前如同没穿衣服一样。对于我们自身的启迪,我认为有四点&…...

7-12 最长对称子串(PTA)

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。 输入格式: 输入在一行中给出长度不超过1000的非空字符串。 输出格式&…...

嵌入式AI的本地化部署的好处

嵌入式AI本地化处理(即边缘计算)的核心优势在于将AI算力下沉至设备端,直接处理数据而非依赖云端,这种模式在多个维度上展现出显著价值: 一、数据隐私与安全性提升 1. 敏感数据本地存储 金融、医疗等涉及隐私的行业…...

0基础 | 硬件 | 电源系统 一

降压电路LDO 几乎所有LDO都是基于此拓扑结构 图 拓扑结构 LDO属于线性电源,通过控制开关管的导通程度实现稳压,输出纹波小,无开关噪声 线性电源,IoutIin,发热功率P电压差△U*电流I,转换效率Vo/Vi LDO不适…...

LeetCode详解之如何一步步优化到最佳解法:20. 有效的括号

LeetCode详解系列的总目录(持续更新中): LeetCode详解之如何一步步优化到最佳解法:前100题目录(更新中...)-CSDN博客 LeetCode详解系列的上一题链接: LeetCode详解之如何一步步优化到最佳解法…...

LeetCode18四数之和

代码来源:代码随想录 /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/ int com…...

《K230 从熟悉到...》无线网络

《K230 从熟悉到...》无线网络 STA模式 《庐山派 K230 从熟悉到...》无线网络 无线网络中通常是STA(Station,站点)和AP(Access Point,无线接入点)。 STA(站点) 定义:STA…...

去中心化指数(链上ETF)

去中心化指数(链上ETF) 核心概念 去中心化指数: 类似传统金融的ETF(交易所交易基金),通过一篮子代币分散投资风险,无需主动管理。 核心价值:降低研究成本、分散风险、自动化资产…...

LeeCode题库第1695题

项目场景: 给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。 返回 只删除一个 子数组可获得的 最大得分 。 如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],…...

【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)

🚀 LeetCode 热题 23:合并 K 个升序链表(详细解析) 📌 题目描述 LeetCode 23. Merge k Sorted Lists 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合…...

LeetCode hot 100—删除链表的倒数第N个节点

题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3&…...

超级科学软件实验室(中国) : Super Scientific Software Laboratory (SSSLab)

Super Scientific Software Laboratory (SSSLab) gitee 官网...

2025大唐杯仿真1——车联网

车联网 V2N是指车辆与网络 Uu接口是用户设备(UE)与基站之间的通信接口,用于终端和基站之间的通信 Uu接口可用的是N41频段,归属中国移动 车辆间交互是V2V,频段是PCS PC5接口是一种用于设备间直接通信(D2D…...

云资源合规基线:确保云环境安全与合规的完整指南

1. 引言 随着越来越多的企业将其IT基础设施迁移到云端,确保云资源的安全性和合规性变得至关重要。云资源合规基线是一套最佳实践和标准,旨在帮助组织维护安全、高效且符合法规要求的云环境。本文将深入探讨云资源合规基线的各个方面,为IT管理者和安全专业人士提供全面的指导。…...

1.0 软件测试全流程解析:从计划到总结的完整指南

软件测试全流程解析:从计划到总结的完整指南 摘要 本文档详细介绍了软件测试的完整流程,包括测试计划、测试设计、测试执行、测试报告和测试总结等主要阶段。每个阶段都从目标、主要工作、输出物和注意事项等方面进行了详细说明。通过本文档&#xff0…...

@reduxjs/toolkit 报错,解决

项目场景: 使用redux存储状态,写一个reducer 问题描述 报错:Uncaught Error: A case reducer on a non-draftable value must not return undefined import { createSlice } from "reduxjs/toolkit"; //错误写法 const counterS…...

C++蓝桥杯实训篇(二)

片头 嗨咯~小伙伴们!今天我们来一起学习算法和贪心思维,准备好了吗?咱们开始咯! 第1题 数位排序 对于这道题,我们需要自己写一个排序算法,也就是自定义排序,按照数位从小到大进行排序。 举一…...

YY forget password

YY forget password 老早以前的语音工具,游戏团队协作工具...

Kafka 如何解决消息堆积问题?

Kafka 的消息堆积问题是实际生产中经常遇到的情况,尤其在高并发、大流量、消费者故障或处理速度慢的情况下,非常容易出现。 下面我从诊断 解决方案 实战技巧三步帮你梳理清楚: 🔍 一、先判断:是否真的“堆积”&…...

如何通过优化HMI设计大幅提升产品竞争力?

一、HMI设计的重要性与竞争力提升 HMI(人机交互界面)设计在现代产品开发中扮演着至关重要的角色。良好的HMI设计不仅能够提升用户体验,还能显著增强产品的竞争力。在功能趋同的市场环境中,用户体验成为产品竞争的关键。HMI设计通…...

2025大唐杯仿真4——信令流程

Preamble请求...

MyBatis Plus 在 ZKmall开源商城持久层的优化实践

ZKmall开源商城作为基于 Spring Cloud 的高性能电商平台,其持久层通过 MyBatis Plus 实现了多项深度优化,涵盖分库分表、缓存策略、分页性能、多租户隔离等核心场景。以下是具体实践总结: 一、分库分表与插件集成优化 1. 分库分表策略 ​Sh…...

Qt多线程从基础到性能优化

一、为什么需要多线程开发 现代应用程序的性能需求 CPU多核架构的有效利用 复杂任务的解耦与响应式界面保持 二、Qt线程创建四大方式 1. 继承QThread重写run() class WorkerThread : public QThread {void run() override {// 耗时操作qDebug() << "Thread ID…...

Spring常见问题复习

############Spring############# Bean的生命周期是什么&#xff1f; BeanFactory和FactoryBean的区别&#xff1f; ApplicationContext和BeanFactory的区别&#xff1f; BeanFactoryAware注解&#xff0c;还有什么其它的Aware注解 BeanFactoryAware方法和Bean注解的方法执行顺…...

股票日数据使用_未复权日数据生成前复权日周月季年数据

目录 前置&#xff1a; 准备 代码&#xff1a;数据库交互部分 代码&#xff1a;生成前复权 日、周、月、季、年数据 前置&#xff1a; 1 未复权日数据获取&#xff0c;请查看 https://blog.csdn.net/m0_37967652/article/details/146435589 数据库使用PostgreSQL。更新日…...

【C++】从零实现Json-Rpc框架(2)

目录 JsonCpp库 1.1- Json数据格式 1.2 - JsonCpp介绍 • 序列化接口 • 反序列化接口 1.3 - Json序列化实践 JsonCpp使用 Muduo库 2.1 - Muduo库是什么 2.2 - Muduo库常见接口介绍 TcpServer类基础介绍 EventLoop类基础介绍 TcpConnection类基础介绍 TcpClient…...

JVM虚拟机篇(二):深入剖析Java与元空间(MetaSpace)

这里写目录标题 JVM虚拟机篇&#xff08;二&#xff09;&#xff1a;深入剖析Java与元空间&#xff08;MetaSpace&#xff09;一、引言二、全面认识Java2.1 Java的起源与发展历程2.2 Java的特性2.2.1 简单性2.2.2 面向对象2.2.3 平台无关性2.2.4 健壮性2.2.5 安全性2.2.6 多线程…...

NDK开发:音视频处理基础

音视频处理基础 一、音视频基础 1.1 音视频基本概念 视频编码格式 H.264/AVCH.265/HEVCVP8/VP9AV1音频编码格式 AACMP3PCMOPUS封装格式 MP4FLVMKVTS1.2 音视频处理流程 视频处理流程 采集(Camera/Screen)预处理(美颜/滤镜)编码(H.264/H.265)封装传输/存储音频处理流程 …...

【数字电路】第一章 数制和码制

一、数码的基本概念 1.数制 2.码制 二、几种常用的数制 三、不同数制间的转换 八进制和十六进制间通常不直接进行转换&#xff0c;而是先转换成二进制或十进制然后再进行转换。 1.任意进制→十进制&#xff08;N—十转换&#xff09; 2.十进制→任意进制&#xff08;十—N转换…...

软件工程面试题(二十九)

1、Internet的最顶级的商业域名叫什么? 答: .com 2、GC是什么,为什么要使用它? 垃圾回收 (garbage collection, GC) 一个跟踪过程,它传递性地跟踪指向当前使用的对象的所有指针,以便找到可以引用的所有对象,然后重新使用在此跟踪过程中未找到的任何堆内存。公共语言运行…...

6.第二阶段x64游戏实战-分析人物状态

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;5.第二阶段x64游戏实战-动态模块地址 人物状态是与角色相关的&#xff0c;如果…...

Synopsys:设计对象

相关阅读 Synopsyshttps://blog.csdn.net/weixin_45791458/category_12812219.html?spm1001.2014.3001.5482 对于Synopsys的EDA工具&#xff08;如Design Compiler、PrimeTime、IC Compiler&#xff09;等&#xff0c;设计对象(Design Objects)是组成整个设计的抽象表示&…...

Redis数据结构之Hash

目录 1.概述2.常见操作2.1 H(M)SET/H(M)GET2.2 HGETALL2.3 HDEL2.4 HLEN2.5 HEXISTS2.6 HKEYS/HVALS2.7 HINCRBY2.8 HSETNX 3.总结 1.概述 Hash是一个String类型的field(字段)和value(值)的映射表&#xff0c;而且value是一个键值对集合&#xff0c;类似Map<String, Map<…...

【VUE】RuoYi-Vue3项目结构的分析

【VUE】RuoYi-Vue3项目结构的分析 1. 项目地址2. RuoYi-Vue3项目结构2.1 整体结构2.2 package.json2.2.1 &#x1f9fe; 基本信息2.2.2 &#x1f527; 脚本命令&#xff08;scripts&#xff09;2.2.3 &#x1f30d; 仓库信息2.2.4 &#x1f4e6; 项目依赖&#xff08;dependenc…...

libreoffice-help-common` 的版本(`24.8.5`)与官方源要求的版本(`24.2.7`)不一致

出现此错误的原因主要是软件包依赖冲突&#xff0c;具体分析如下&#xff1a; ### 主要原因 1. **软件源版本不匹配&#xff08;国内和官方服务器版本有差距&#xff09; 系统中可能启用了第三方软件源&#xff08;如 PPA 或 backports 源&#xff09;&#xff0c;导致 lib…...

5.数据手册解读——共模电感

目录 1 共模电感的工作原理 2 核心参数解读 2.1 电气参数 2.2 阻抗特性 共模电感(Common mode Choke)&#xff0c;也叫共模扼流圈&#xff0c;是在一个闭合磁环上对称绕制方向相反、匝数相同的线圈。理想的共模扼流圈对L&#xff08;或N&#xff09;与E之间的共模干扰具有抑…...

easy-poi 一对多导出

1. 需求&#xff1a; 某一列上下两行单元格A,B值一样且这两个单元格&#xff0c; 前面所有列对应单元格值一样的话&#xff0c; 就对A,B 两个单元格进行纵向合并单元格 1. 核心思路&#xff1a; 先对数据集的国家&#xff0c;省份&#xff0c;城市...... id 身份证进行排序…...

用C语言控制键盘上的方向键

各位同学&#xff0c;大家好&#xff01;相信大家在学习C语言的过程中&#xff0c;都和我一样&#xff0c;经常使用scanf函数来接受字符&#xff0c;数字&#xff0c;这些标准输入信息&#xff0c;来实现自己设计的程序效果。 而我突然有一天&#xff08;对就是今天&#xff09…...

第3课:状态管理与事件处理

第3课&#xff1a;状态管理与事件处理 学习目标 掌握useState Hook的使用理解组件事件处理机制实现表单输入与状态绑定完成任务添加功能原型 一、useState基础 1. 创建第一个状态 新建src/Counter.js&#xff1a; import { useState } from react;function Counter() {co…...

硬件工程师面试问题(五):蓝牙面试问题与详解

蓝牙技术作为物联网与智能设备的核心无线协议&#xff0c;其硬件设计能力直接影响产品连接稳定性、功耗及兼容性。面试是评估候选人射频电路设计、天线优化、协议栈调试等综合技能的关键环节&#xff0c;尤其在BLE低功耗设计、共存抗干扰等场景中&#xff0c;硬件工程师的实践经…...

leetcode4.寻找两个正序数组中的中位数

思路源于 LeetCode004-两个有序数组的中位数-最优算法代码讲解 基本思路是将两个数组看成一个数组&#xff0c;然后划分为两个部分&#xff0c;若为奇数左边部分个数多1&#xff0c;若为偶数左边部分等于右边部分个数。i表示数组1划分位置&#xff08;i为4是索引4也表示i的左半…...

20250405在荣品的PRO-RK3566开发板使用Rockchip原厂的buildroot系统来适配gmac1

【暂时还没有解决让PRO-RK3566的eth0/gmac1开机就启动】 PRO-RK3566作为iperf服务器&#xff1a; rootrk3566-buildroot:/# ifconfig rootrk3566-buildroot:/# ifconfig -a rootrk3566-buildroot:/# ifconfig eth0 up rootrk3566-buildroot:/# ifconfig rootrk3566-buildroot:/…...

7. 记忆(Memory)机制:让AI拥有“短期记忆”与“长期记忆”

引言&#xff1a;当AI学会"记住你" 2025年某银行智能客服因无法记住用户身份&#xff0c;每次对话都要求重复验证&#xff0c;引发大量投诉。引入LangChain 记忆系统后&#xff0c;客户满意度提升62%。本文将基于MemorySaver与FAISS本地存储&#xff0c;教你构建符合…...

Chapter07_图像压缩编码

文章目录 图像压缩编码图像压缩编码基础图像压缩的基本概念信息相关信息冗余信源编码及其分类 图像编码模型信源编码器模型信源解码器模型 数字图像的信息熵信源符号码字平均长度信息熵信息量 变长编码费诺码霍夫曼编码 位平面编码格雷码 图像压缩编码 数字图像的压缩是指在满…...

网络安全之前端学习(css终章)

如大家所见&#xff0c;今天的文章就是css的最后一篇文章。那么话不多说&#xff0c;我们开始吧。本章内容比较杂&#xff0c;就是补充之前几章没讲到的。 关系选择器 之前我们讲到了很多选择器&#xff0c;这里补充一个关系选择器。 1.1后代选择器 后代选择器&#xff0c;…...