Python小白学习教程从入门到入坑------第十九课 异常模块与包【下】(语法基础)

一、内置全局变量__name__

在Python中,有一些内置的全局变量和特殊变量,它们是由Python解释器预定义的,可以在代码的任何地方直接使用。

这些变量通常用于提供关于当前解释器状态的信息,或者用于控制解释器的行为

在Python中,__name__是一个内置的特殊变量,也被称为"魔法变量"或"双下划线变量"

它并不是传统意义上的"全局变量",因为它不是由用户定义的,而是由Python解释器自动为每个模块和脚本设置的

然而,由于其作用范围是整个模块,并且可以在模块中的任何地方访问,所以有时会被非正式地称为"全局变量"(在模块范围内)

1.1 语法

if name == "main" :

(用来判断当前运行的脚本是否是主程序,而不是被其他脚本导入的模块)

1.2 作用

用来控制py文件在不同的应用场景执行不同的逻辑

1.3 name 使用案例

**if name == "main" :**这行代码通常用于在脚本被直接运行时执行一些操作,而在脚本被导入为模块时不执行这些操作

这样做的好处是,你可以让你的Python文件既可以作为脚本直接运行(执行一些特定的任务,比如运行测试、作为程序的入口点等),也可以作为模块被其他脚本导入,提供函数、类和变量等

1、文件在当前程序执行(即自己执行自己):name == "main"

2、文件被当作模块被其他文件导入:name== 模块名,下面的代码不会被显示出来

eg:

python 复制代码
# myscript.py  
  
def my_function():  
    print("Hello from my_function in myscript!")  
  
if __name__ == "__main__":  
    # 这段代码只有在myscript.py被直接运行时才会执行  
    print("myscript.py is being run directly")  
    my_function()

如果你直接运行 myscript.py **,**输出将是:

python 复制代码
myscript.py is being run directly  
Hello from my_function in myscript!

但是,如果你从另一个Python脚本中导入 myscript.py ,比如:

python 复制代码
# another_script.py  
  
import myscript  
  
myscript.my_function()

然后运行another_script.py,输出将是:

python 复制代码
Hello from my_function in myscript!

注意: 在 another_script.py 的执行过程中, myscript.py 中的**if name == "main":**块没有执行,因为 myscript.py 是被导入的,而不是直接运行的

因此, myscript.py 中的print("myscript.py is being run directly") 语句没有打印出来

二、包

2.1 包的基础信息

含义:包就是项目结构中的文件夹/目录

与普通文件夹的区别:包是含有__init__.py 的文件夹

作用:包就是将有联系的模块放到同一个文件夹下,并且在这个文件夹中创建一个名字为

init .py文件,那么这个文件夹就称之为包,有效避免模块名称冲突问题,让结构更清晰。

包的本质依然是模块,包又可以包含包

2.2 包的应用

2.2.1 新建包

在Pycharm中新建包:右键项目名 -> new -> Python Package

eg(汉化版):

2.2.2 导入包

注意:

1、import 导入包时,首先执行**init.py**文件的代码

2、不建议在 init 中编写Python模块,尽量保证__init__ 的内容简单

**导包方式一:**import pack_01

在Python中,使用import语句来导入包或模块是一种基本且常见的做法。若你有一个名为pack_01的包,并希望在你的Python脚本或交互式环境中使用它,你可以按照以下方式导入:

python 复制代码
import pack_01

这条语句会告知Python解释器去搜索名为pack_01的包,并将其内容加载到当前的命名空间中。但请注意,这里所说的是"内容",实际上是指pack_01包下的__init__.py文件所定义的内容

若__init__.py为空,或未定义任何类或函数等,那么直接导入pack_01后,你可能无法直接访问包内的其他模块或函数(除非它们在__init__.py中被显式导入)

若你希望在导入包后能够直接使用其内部的模块或函数,你可以在__init__.py文件中添加相应的导入语句,例如:

python 复制代码
# pack_01/__init__.py  
from .module1 import function1  
from .module2 import Class2

完成上述设置后,当你执行import pack_01时,function1和Class2将被导入,你可以通过pack_01.function1()和pack_01.Class2() 的方式调用它们

**导包方式二:**from pack_01 import fuction

如果你更习惯于直接访问包内的模块或函数,而非通过包名作为前缀,你还可以使用from ... import ...的语法来导入:

python 复制代码
from pack_01 import module1, module2  
# 或者直接导入特定的函数或类  
from pack_01.module1 import function1

在导入module1和module2后,你可以直接通过module1.some_function() 和 module2.SomeClass() 来调用它们

而如果你导入了特定的函数或类,如function1,则可以直接使用 function1() 进行调用,无需再通过模块名作为前缀

2.3 all

all 变量:一个列表,可以控制要引入的东西(模块、函数、类等)

在Python中,all 是一个特殊的变量,它是一个字符串列表,用于定义当从包或模块中使用**from ... import ***语句时应该导入哪些名称(模块、函数、类等)

这个变量提供了一种方式来控制导入的命名空间,避免导入不必要的或可能引发冲突的名称

当你在一个包的 init.py 文件或单独的模块文件中定义 all 时,你实际上是在告诉Python解释器:"当有人尝试使用 from mypackage import * 或 from mymodule import * 时,只应该导入这个列表中的名称。"

例如,假设你有一个包 mypackage,其结构如下:

python 复制代码
mypackage/  
    __init__.py  
    module1.py  
    module2.py

在 mypackage/init.py 文件中,你可以定义 all 来控制导入:

python 复制代码
# mypackage/__init__.py  
  
__all__ = ['module1', 'some_function']  
  
from .module1 import some_function  
# 注意:这里我们没有直接导入 module2,因为它不在 __all__ 列表中

然后,在另一个脚本中,如果你尝试:

python 复制代码
from mypackage import *

这将只会导入 module1(作为模块对象)和 some_function(从 module1 中导入的函数)

注意:由于 module2 没有在 all 列表中,它不会被导入

然而,有一个重要的点需要注意:all 只影响**from ... import ***形式的导入。如果你显式地指定了要导入的名称,all 将不会有任何效果。例如:

python 复制代码
# 这将导入 module2,即使它不在 __all__ 列表中  
from mypackage import module2

今天的分享就到这里了,欢迎大家一起交流讨论学习,不当之处烦请大家指出~

相关推荐
2401_832131951 分钟前
Python单元测试(unittest)实战指南
jvm·数据库·python
猷咪26 分钟前
C++基础
开发语言·c++
IT·小灰灰27 分钟前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧29 分钟前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q29 分钟前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳029 分钟前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾30 分钟前
php 对接deepseek
android·开发语言·php
vx_BS8133033 分钟前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计
2601_9498683633 分钟前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
gzxx2007sddx40 分钟前
windows vnpy运行过程及问题记录
python·量化·vnpy