Python:import语句的使用(详细解析)(一)

news2024/12/25 15:04:47

相关阅读

Pythonicon-default.png?t=O83Ahttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm=1001.2014.3001.5482


        import语句是Python中一个很重要的机制,允许在一个文件中访问另一个文件的函数、类、变量等,本文就将进行详细介绍。

        在具体谈论import语句前,首先介绍相关的前置知识——导入的搜索目录。

导入的搜索目录

        既然要求在一个文件访问其他文件,那么如何找到其他文件就是一个问题,这由sys包中的path列表决定,它在Python解释器在启动时会自动初始化,并属于整个Python解释器而不是某个文件。

        初始化后的sys.path列表由多个元素组成,每个元素都是一个字符串,表示在导入时会依次搜索的路径(除内建模块外,比如math)。

        sys.path列表第一个元素会根据Python解释器的启动方式而定:

        1、如果是以交互式启动,则会被设置为空字符串,以表示当前工作目录,如例1所示(空字符串永远代表当前工作目录,即使在交互式Python中使用os.chdir函数改变了当前工作目录)。

# 例1
# 命令行
(test) C:\Users\12078\Desktop>python
Python 3.10.14 | packaged by Anaconda, Inc. | (main, May  6 2024, 19:44:50) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', 'D:\\Anaconda\\envs\\test\\python310.zip', 'D:\\Anaconda\\envs\\test\\DLLs', 'D:\\Anaconda\\envs\\test\\lib', 'D:\\Anaconda\\envs\\test', 'D:\\Anaconda\\envs\\test\\lib\\site-packages']

        2、如果以python  -m命令启动,则会被设置当前工作目录,如例2所示(注意其与例1的区别)。

# 例2
# 文件test1.py
import sys
print(sys.path)

# 命令行
(test) C:\Users\12078\Desktop>python -m example.test1
['C:\\Users\\12078\\Desktop', 'D:\\Anaconda\\envs\\test\\python310.zip', 'D:\\Anaconda\\envs\\test\\DLLs', 'D:\\Anaconda\\envs\\test\\lib', 'D:\\Anaconda\\envs\\test', 'D:\\Anaconda\\envs\\test\\lib\\site-packages']

        3、如果是以普通的python命令启动(最常见),则会被设置为命令行中脚本文件所在的目录,如例3所示(本文将这种情况为例)。

# 例3
# 文件test1.py
import sys
print(sys.path)

# 命令行
(test) C:\Users\12078\Desktop>python .\example\test1.py
['C:\\Users\\12078\\Desktop\\example', 'D:\\Anaconda\\envs\\test\\python310.zip', 'D:\\Anaconda\\envs\\test\\DLLs', 'D:\\Anaconda\\envs\\test\\lib', 'D:\\Anaconda\\envs\\test', 'D:\\Anaconda\\envs\\test\\lib\\site-packages']

        sys.path列表中的其他元素还包括环境变量PYTHONPATH中指定的目录、标准库路径、site-packages目录等。该列表可以在程序执行时被添加、删除元素,就像一个普通的列表那样,但是这是需要谨慎,因为可能出现导入相关的问题。

import语句的语法

        下面是Python官方文档中,对于import语句的描述,由于imort语句分为基本import语句和from import语句,下面将分别讨论。

import_stmt     ::=  "import" module ["as" identifier] ("," module ["as" identifier])*
                     | "from" relative_module "import" identifier ["as" identifier]
                     ("," identifier ["as" identifier])*
                     | "from" relative_module "import" "(" identifier ["as" identifier]
                     ("," identifier ["as" identifier])* [","] ")"
                     | "from" relative_module "import" "*"
module          ::=  (identifier ".")* identifier
relative_module ::=  "."* module | "."+

基本import语句

        基本import语句的执行分两步进行,首先会在导入的搜索目录中,根据模块的import路径查找并导入(如果已导入,则不会重复导入),随后在import语句执行位置所在的命名空间定义若干标识符。

import路径

        一个以.py后缀的文件或包(即目录)可以代表一个模块,对于import路径,路径分隔符不再是斜杠(对于Linux系统)或反斜杠(对于Windows系统)而是点,且对于.py后缀的文件不添加.py后缀。

        图1展示了例3的文件结构,例4给出了几个import路径的示例,假设执行的是test1.py文件(因此'C:\\Users\\12078\\Desktop\\example'是sys.path列表的第一个元素)。

图1 文件结构 

# 例4
Package                        # 这是一个包的import路径
Package.__init__               # 这是一个包的import路径, 与上等价
Package.test2                  # 这是一个.py文件的import路径
example.Package                # 这是不合法的, 要相对sys.path中的路径
example.Package.test2          # 这是不合法的, 要相对sys.path中的路径
Package.test2.func1            # 这是不合法的, 一个函数不是模块
模块导入

        导入一个模块,会执行模块内的所有代码(包也是模块,对于它是指执行了包中的__init__.py文件),并在sys.modules字典(它和sys.path一样属于整个Python解释器)中记录模块的import路径和模块的绝对路径(Python解释器根据import路径防止重复导入),如例5所示,假设执行的是test1.py文件。

# 例5
# 文件test1.py
import sys
print(sys.modules)
import Package.test2
print(sys.modules)
import Package

# 文件__init__.py
def fun():
    print("func in __init__.py")
print("This is a package's __init__.py")

# 文件test2.py
def fun1c():
    print("func1 in test2.py")
def fun2c():
    print("func2 in test2.py")

print("This is test2.py")

# 命令行
(test) C:\Users\12078\Desktop>python .\example\test1.py
{'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_thread': <module '_thread' (built-in)>, '_warnings': <module '_warnings' (built-in)>, '_weakref': <module '_weakref' (built-in)>, '_io': <module '_io' (built-in)>, 'marshal': <module 'marshal' (built-in)>, 'nt': <module 'nt' (built-in)>, 'winreg': <module 'winreg' (built-in)>, '_frozen_importlib_external': <module '_frozen_importlib_external' (frozen)>, 'time': <module 'time' (built-in)>, 'zipimport': <module 'zipimport' (frozen)>, '_codecs': <module '_codecs' (built-in)>, 'codecs': <module 'codecs' from 'D:\\Anaconda\\envs\\test\\lib\\codecs.py'>, 'encodings.aliases': <module 'encodings.aliases' from 'D:\\Anaconda\\envs\\test\\lib\\encodings\\aliases.py'>, 'encodings': <module 'encodings' from 'D:\\Anaconda\\envs\\test\\lib\\encodings\\__init__.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from 'D:\\Anaconda\\envs\\test\\lib\\encodings\\utf_8.py'>, '_codecs_cn': <module '_codecs_cn' (built-in)>, '_multibytecodec': <module '_multibytecodec' (built-in)>, 'encodings.gbk': <module 'encodings.gbk' from 'D:\\Anaconda\\envs\\test\\lib\\encodings\\gbk.py'>, '_signal': <module '_signal' (built-in)>, '_abc': <module '_abc' (built-in)>, 'abc': <module 'abc' from 'D:\\Anaconda\\envs\\test\\lib\\abc.py'>, 'io': <module 'io' from 'D:\\Anaconda\\envs\\test\\lib\\io.py'>, '__main__': <module '__main__' from 'C:\\Users\\12078\\Desktop\\example\\test1.py'>, '_stat': <module '_stat' (built-in)>, 'stat': <module 'stat' from 'D:\\Anaconda\\envs\\test\\lib\\stat.py'>, '_collections_abc': <module '_collections_abc' from 'D:\\Anaconda\\envs\\test\\lib\\_collections_abc.py'>, 'genericpath': <module 'genericpath' from 'D:\\Anaconda\\envs\\test\\lib\\genericpath.py'>, '_winapi': <module '_winapi' (built-in)>, 'ntpath': <module 'ntpath' from 'D:\\Anaconda\\envs\\test\\lib\\ntpath.py'>, 'os.path': <module 'ntpath' from 'D:\\Anaconda\\envs\\test\\lib\\ntpath.py'>, 'os': <module 'os' from 'D:\\Anaconda\\envs\\test\\lib\\os.py'>, '_sitebuiltins': <module '_sitebuiltins' from 'D:\\Anaconda\\envs\\test\\lib\\_sitebuiltins.py'>, '_distutils_hack': <module '_distutils_hack' from 'D:\\Anaconda\\envs\\test\\lib\\site-packages\\_distutils_hack\\__init__.py'>, 'site': <module 'site' from 'D:\\Anaconda\\envs\\test\\lib\\site.py'>}
This is a package's __init__.py
This is test2.py
{'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_thread': <module '_thread' (built-in)>, '_warnings': <module '_warnings' (built-in)>, '_weakref': <module '_weakref' (built-in)>, '_io': <module '_io' (built-in)>, 'marshal': <module 'marshal' (built-in)>, 'nt': <module 'nt' (built-in)>, 'winreg': <module 'winreg' (built-in)>, '_frozen_importlib_external': <module '_frozen_importlib_external' (frozen)>, 'time': <module 'time' (built-in)>, 'zipimport': <module 'zipimport' (frozen)>, '_codecs': <module '_codecs' (built-in)>, 'codecs': <module 'codecs' from 'D:\\Anaconda\\envs\\test\\lib\\codecs.py'>, 'encodings.aliases': <module 'encodings.aliases' from 'D:\\Anaconda\\envs\\test\\lib\\encodings\\aliases.py'>, 'encodings': <module 'encodings' from 'D:\\Anaconda\\envs\\test\\lib\\encodings\\__init__.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from 'D:\\Anaconda\\envs\\test\\lib\\encodings\\utf_8.py'>, '_codecs_cn': <module '_codecs_cn' (built-in)>, '_multibytecodec': <module '_multibytecodec' (built-in)>, 'encodings.gbk': <module 'encodings.gbk' from 'D:\\Anaconda\\envs\\test\\lib\\encodings\\gbk.py'>, '_signal': <module '_signal' (built-in)>, '_abc': <module '_abc' (built-in)>, 'abc': <module 'abc' from 'D:\\Anaconda\\envs\\test\\lib\\abc.py'>, 'io': <module 'io' from 'D:\\Anaconda\\envs\\test\\lib\\io.py'>, '__main__': <module '__main__' from 'C:\\Users\\12078\\Desktop\\example\\test1.py'>, '_stat': <module '_stat' (built-in)>, 'stat': <module 'stat' from 'D:\\Anaconda\\envs\\test\\lib\\stat.py'>, '_collections_abc': <module '_collections_abc' from 'D:\\Anaconda\\envs\\test\\lib\\_collections_abc.py'>, 'genericpath': <module 'genericpath' from 'D:\\Anaconda\\envs\\test\\lib\\genericpath.py'>, '_winapi': <module '_winapi' (built-in)>, 'ntpath': <module 'ntpath' from 'D:\\Anaconda\\envs\\test\\lib\\ntpath.py'>, 'os.path': <module 'ntpath' from 'D:\\Anaconda\\envs\\test\\lib\\ntpath.py'>, 'os': <module 'os' from 'D:\\Anaconda\\envs\\test\\lib\\os.py'>, '_sitebuiltins': <module '_sitebuiltins' from 'D:\\Anaconda\\envs\\test\\lib\\_sitebuiltins.py'>, '_distutils_hack': <module '_distutils_hack' from 'D:\\Anaconda\\envs\\test\\lib\\site-packages\\_distutils_hack\\__init__.py'>, 'site': <module 'site' from 'D:\\Anaconda\\envs\\test\\lib\\site.py'>, 'Package': <module 'Package' from 'C:\\Users\\12078\\Desktop\\example\\Package\\__init__.py'>, 'Package.test2': <module 'Package.test2' from 'C:\\Users\\12078\\Desktop\\example\\Package\\test2.py'>}

        可以看出,在test2.py文件(导入)执行前,Package包中的__init__.py文件先(导入)执行了,因为所有import路径上的目录(包)会从浅到深依次导入,最后导入目标模块,从导入后的sys.modules字典中也可以看到Package包比Package.test2模块添加得更早。如果在此之后,再次导入Package,__init__.py文件不会再(导入)执行了,因为Python解释器会避免重复导入。

定义标识符

        在import语句执行后,会在当前命名空间定义标识符,用于访问导入的模块中全局命名空间下的函数、类、变量等,需要注意的是导入是针对整个Python解释器而言的,而定义标识符是针对在当前命名空间而言的,两个步骤并不一定会全部完成(如例8所示)。

        例6中展示了在当前命名空间定义标识符的过程。

# 例6
# 文件test1.py

import Package.test2 # 首先导入(执行)Package包,随后导入(执行)Package.test2模块, 最后在全局命名空间定义标识符Package和Package.test2
Package.func()         # 可以调用__init__.py中的函数了
Package.test2.func1()  # 可以调用test2.py中的函数了

def ttt():
   Package.func() # 局部命名空间可以访问全局命名空间的标识符

ttt() # 调用ttt函数

# 文件__init__.py
def func():
    print("func in __init__.py")
print("This is a package's __init__.py")

# 文件test2.py
def func1():
    print("func1 in test2.py")
def func2():
    print("func2 in test2.py")

print("This is test2.py")

# 命令行
(test) C:\Users\12078\Desktop>python .\example\test1.py
This is a package's __init__.py
This is test2.py
func in __init__.py
fun1c in test2.py
func in __init__.py

控制导入模块的执行

        如果希望某些代码在模块导入时不执行,则可以如例7所示,这利用了只有直接执行而非导入执行时,__name__变量才为"__main__"的性质。

# 例7
# 文件test1.py

import Package.test2 # 首先导入(执行)Package包,随后导入(执行)Package.test2模块, 最后在全局命名空间定义标识符Package和Package.test2
Package.func()         # 可以调用__init__.py中的函数了
Package.test2.func1()  # 可以调用test2.py中的函数了

def ttt():
   Package.func() # 局部命名空间可以访问全局命名空间的标识符

ttt() # 调用ttt函数

# 文件__init__.py
def func():
    print("func in __init__.py")

if __name__ == "__main__":
    print("This is a package's __init__.py")

# 文件test2.py
def func1():
    print("func1 in test2.py")
def func2():
    print("func2 in test2.py")

if __name__ == "__main__":
    print("This is test2.py")

# 命令行
(test) C:\Users\12078\Desktop>python .\example\test1.py
func in __init__.py
fun1c in test2.py
func in __init__.py

as子句

        如果模块的路径很长,则定义的标识符也会很长,此时使用as子句就可以用指定的标识符代表该模块,如例8所示,需要小心这可能会导致标识符的覆盖问题。

# 例8
# 文件test1.py
import Package.test2 as t2 # 首先导入(执行)Package包,随后导入(执行)Package.test2模块, 最后在全局命名空间定义标识符t2
# Package.func()   不可以调用__init__.py中的函数,因为虽然Package包被导入,但此时没有定义任何标识符
# Package.test2.func1() 不可以调用test2.py中的函数,因为虽然Package.test2模块被导入,但此时没有定义该标识符
t2.func1()  # 需要用新的标识符调用test2.py中的函数

import Package.test2 # 由于Package包和Package.test2模块已被导入,直接在全局命名空间定义标识符Package和Package.test2
Package.func()
Package.test2.func1()

# 文件__init__.py
def func():
    print("func in __init__.py")

if __name__ == "__main__":
    print("This is a package's __init__.py")

# 文件test2.py
def func1():
    print("func1 in test2.py")
def func2():
    print("func2 in test2.py")

if __name__ == "__main__":
    print("This is test2.py")

# 命令行
(test) C:\Users\12078\Desktop>python .\example\test1.py
func in __init__.py
fun1c in test2.py
func in __init__.py
多重import语句 

        多个import语句可以合并为同一个语句,当语句包含多个子句(由逗号分隔)时这两个步骤将对每个子句分别执行,如同这些子句被分成独立的import语句一样,例9重写了例8。

# 例9
# 文件test1.py
import Package.test2 as t2, Package.test2 # 首先导入(执行)Package包, 随后导入(执行)Package.test2模块, 接着在全局命名空间定义标识符t2, 最后在全局命名空间定义标识符Package和Package.test2
t2.func1()  # 用新的标识符调用test2.py中的函数
Package.func()
Package.test2.func1()


# 文件__init__.py
def func():
    print("func in __init__.py")

if __name__ == "__main__":
    print("This is a package's __init__.py")

# 文件test2.py
def func1():
    print("func1 in test2.py")
def func2():
    print("func2 in test2.py")

if __name__ == "__main__":
    print("This is test2.py")

# 命令行
(test) C:\Users\12078\Desktop>python .\example\test1.py
fun1c in test2.py
func in __init__.py
fun1c in test2.py

        至此,所有关于基本import语句的内容就结束了,由于篇幅问题,from import语句将在下一篇文章中讨论。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux驱动编程——等待队列

一、等待队列 可实现调用read函数时阻塞等。 1、流程 &#xff08;1&#xff09;初始化等待队列头&#xff08;带参宏&#xff09; init_waitqueue_head(q) 等待队列头wq数据类型&#xff1a; wait_queue_head_t&#xff0c;等待条件condition&#xff1a;int型变量。 &…

Actor 并发控制模型

目录 一、模型概述 二、模型特点 三、模型组成 四、模型优势 五、应用实例 一般来说&#xff0c;我们有两种策略来在并发线程中实现通信&#xff1a;共享内存和消息传递。大多数传统语言&#xff0c;并发线程之间的通信使用的都是共享内存&#xff0c;共享内存最大的问题就…

分糖果C++

题目&#xff1a; 样例解释&#xff1a; 样例1解释 拿 k20 块糖放入篮子里。 篮子里现在糖果数 20≥n7&#xff0c;因此所有小朋友获得一块糖&#xff1b; 篮子里现在糖果数变成 13≥n7&#xff0c;因此所有小朋友获得一块糖&#xff1b; 篮子里现在糖果数变成 6<n7&#xf…

为本地生活赛道从业者赋能,易播易赚开启“抖音直播分享会”

9月22日&#xff0c;由杭州易播易赚科技有限公司主办的“抖音直播分享会”在杭州市富阳区召开&#xff0c;此次会议吸引了来自全国各地的抖音直播从业者、有志于加入抖音直播事业的创业者以及行业内知名专家齐聚一堂&#xff0c;共同探讨行业发展趋势、分享实战经验&#xff0c…

tomcat版本升级导致的umask问题

文章目录 1、问题背景2、问题分析3、深入研究4、umask4.1、umask的工作原理4.2、umask的计算方式4.3、示例4.4、如何设置umask4.5、注意事项 1、问题背景 我们的java服务是打成war包放在tomcat容器里运行的&#xff0c;有一天我像往常一样去查看服务的日志文件&#xff0c;却提…

Mysql高级篇(中)——多版本并发控制 MVCC

多版本并发控制 MVCC 一、概述二、基本原理三、实现原理四、示例解释五、MVCC 优点六、现实中的实现七、MVCC 三剑客1. ReadView2. Undo Log3. Purge4. 三者之间的关系&#xff1a;5. 示例6. 总结 八、MVCC 整体操作流程⭐、readview1. 作用2. 工作机制3. 数据版本的可见性判断…

[云服务器15] 全网最全!手把手搭建discourse论坛,100%完成

首先&#xff0c;由我隆重地介绍Discourse&#xff1a; 这是一个优秀的论坛部署平台&#xff0c;相较于flarum Discuz!&#xff0c;有着更加简洁的画面、完全开源等优点&#xff0c;同时资源占用也不高&#xff01; 并且&#xff0c;这和我们亲爱的雨云论坛是有几分相似的哦&…

国庆偷偷卷!小众降维!POD-Transformer多变量回归预测(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现POD-Transformer多变量回归预测&#xff0c;本征正交分解数据降维融合Transformer多变量回归预测&#xff0c;使用SVD进行POD分解&#xff08;本征正交分解&#xff09;&#xff1b; 2.运行环境Matlab20…

Windows——解除Windows系统中文件名和目录路径的最大长度限制

第一步&#xff1a;打开本地组策略编辑器 按下Win R键打开运行窗口&#xff0c;输入 gpedit.msc 并回车&#xff0c;打开本地组策略编辑器。 第二步&#xff1a;开启 长路径设置 第三步&#xff1a;重启计算机

Windows环境Apache httpd 2.4 web服务器加载PHP8:Hello,world!

Windows环境Apache httpd 2.4 web服务器加载PHP8&#xff1a;Hello&#xff0c;world&#xff01; &#xff08;1&#xff09;首先需要安装apache httpd 2.4 web服务器&#xff1a; Windows安装启动apache httpd 2.4 web服务器-CSDN博客文章浏览阅读222次&#xff0c;点赞5次&…

Spark“数字人体”AI挑战赛_脊柱疾病智能诊断大赛_GPU赛道亚军比赛攻略_triple-Z团队

关联比赛: Spark“数字人体”AI挑战赛——脊柱疾病智能诊断大赛 triple-Z团队答题攻略 1 赛题分析 1.1 赛题回顾 本次比赛的任务是采用模型对核磁共振的脊柱图像进行智能检测。首先需要对5个椎体和6个椎间盘进行定位&#xff0c;这部分实际上就是11个关键点的检测任务&…

B2B商城交易解决方案:赋能企业有效重塑采购与销售新生态

在电商零售领域&#xff0c;商城系统始终是企业搭建商城的关键利器。 伴随着电商行业的蓬勃发展&#xff0c;各类新模式层出不穷&#xff0c;各种商城系统也应运而生&#xff0c;其中B2B商城更是最为常见的一种。 近年来&#xff0c;得益于电子商务的迅猛发展&#xff0c;B2B商…

C++入门基础知识92(实例)——实例17【实现一个简单的计算器】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于实现一个简单的计算器的相关内容&#x…

详细整理!!html5常用标签

文章目录 前言一、HTML简介1.HTML文件结构2.各标签意义 二、HTML标签介绍1.标题标签2.段落标签3. 换行标签4.hr标签5. span标签6.div标签7.img标签8.超链接标签9.注释标签10.空格11.格式化标签12.sup上标和sub下标13. pre预格式化标签14.table 表格标签table 标签基础内容合并单…

Java中异常的认识和创建

文章目录 前言一、异常的概念与体系结构 1.1 异常的概念1.2 异常的体系结构1.3 异常的分类二、异常的处理 2.1.防御式编程2.2 异常的抛出2.3 异常的捕获2.4 异常的处理流程三、自定义异常类 一、异常的概念与体系结构 1.1 异常的概念 在生活中&#xff0c;一个人表情痛苦&…

TI DSP TMS320F280025 Note16:EPWM的原理与使用

TMS320F280025 模数转换器(ADC) ` 文章目录 TMS320F280025 模数转换器(ADC)时基TB子模块计数比较CC子模块动作AQ子模块死区DB子模块斩波PC子模块错误联防模块TZ子模块数字比较DC子模块中断ET子模块EPWM的使用EPWMDriver.cEPWMDriver.h每个EPWM模块都包含多个子模块:时基TB子模…

系列二、案例实操

一、创建表空间 1.1、概述 在Oracle数据库中&#xff0c;表空间是一个逻辑存储单位&#xff0c;它是Oracle数据库中存储数据的地方。 1.2、超级管理员登录 sqlplus / as sysdba 1.3、创建表空间 create tablespace water_boss datafile C:\Programs\oracle11g\oradata\orcl\…

【NTN 卫星通信】基于NR的NTN RAN架构

1 引言 3GPP中,38.821协议中,研究了如何最大限度地减少对NG-RAN中新接口和协议的需求,以支持非地面网络。 研究了包括透传星和再生星的RAN架构。 2 基于透传星的NG-RAN架构 2.1 概述: 对于透传模式,卫星有效载荷在上行链路和下行链路方向上实现频率转换和射频放大器。它…

Python的异步编程

什么是协程&#xff1f; 协程不是计算机系统提供&#xff0c;程序员人为创造。 协程也可以被称为微线程&#xff0c;是一种用户态内的上下文切换技术。简而言之&#xff0c;其实就是通过一个线程实现代码块相互切换执行。 实现协程有那么几种方法&#xff1a; greenlet&…

推荐4个精准高效的录音转文字软件。

录音转文字在很多的场景中都能够为我们提供便利&#xff0c;比如&#xff1a;可以将课堂录音转换为文字&#xff0c;方便复习和整理笔记&#xff0c;可以将会议录音转换为文字&#xff0c;快速准确地记录内容&#xff0c;可以将采访录音转成文字&#xff0c;提高新闻稿件的撰写…