Python模块:模块搜索顺序、内置属性(__file__和__name__)、开发原则

欢迎关注博主 python老鸟 或 前往 『Python自学网』, 从基础入门免费课程开始,逐步深入学习python全栈体系课程,适合新手入门到精通全栈开发。


免费专栏传送门:《Python基础教程

目录

一、模块的搜索顺序

1》Python解释器在导入模块时,对模块文件的搜索顺序:

2》文件和模块同名报错验证:

3》 模块内置属性__file__

二、开发原则

三、内置属性__name__

1》实际开发场景:

2》__name__属性:

3》代码测试演练:

4》在很多Python文件中都会看到以下格式的代码:


一、模块的搜索顺序

1》Python解释器在导入模块时,对模块文件的搜索顺序:

搜索顺序:

  1. 搜索当前目录指定模块名的文件,如果有就直接接导入
  2. 如果没有,就会到系统目录搜索指定模块名的文件

提醒:在开发时给文件起名,不要和系统的模块文件重名,如果重名可能导致原本能正常执行的程序就没办法执行了。

代码示例:

import random

ran = random.randint(0, 100)

print(ran)

正常执行结果:随机生成一个79的数字

 

注意:如果当前目录下存在一个random.py的文件,程序就没办法正常执行了。这个时候,Python的解释器会加载当前目录下的random.py,而不会加载系统的random模块。

2》文件和模块同名报错验证:

新建一个random.py文件和模块同名,可以看出PyCharm也给我们提示了(randinth函数有个灰色底纹),此时再来运行文件,报错


3》 模块内置属性__file__

Python中,每一个模块都有一个内置属性__file__,这个内置属性可以查看模块的完整路径。

分别从两种情况来看看完整路径:

1.random.py文件存在,和模块名冲突情况,如下图:

 

2删除random.py文件:

点击右键打开面板点击Delete,出现一个对话框点击OK后继续出现一个面板,这里我们点击Delete Anyway。

删除提示信息,random文件已经被其他文件件导入了,是否确定删除

3.删除后运行代码,查看random模块完整路径,如下图:

 


二、开发原则

原则:

每一个程序员开发出来的文件都应该是可以被导入的

  1. 一个独立的python文件就是一个模块
  2. 在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍

代码验证:文件中所有没有任何缩进的代码都会被执行一遍

md_模块文件代码:

print("小夏开发的模块文件")

md_测试导入文件代码:

import md_模块

print("+" * 30)

执行测试导入文件代码结果:

可以看出,模块中的输出代码也被打印出来了,模块可以看作是工具包,模块向外界提供工具——全局变量、函数、类。上面模块中利用print输出的代码并不是提供的工具——直接执行的代码不是向外界提供的工具

遇到一个问题:模块文件被导入时,能够直接执行的代码不需要被执行。

做个假设:

在小夏的模块文件中写了个函数,并调用函数测试这个函数是否可以正常运行。

代码如下:

def say_hello():
    print("小夏和你打招呼说:你好!")

# 模块文件被导入时,能够直接执行的代码不需要被执行
print("小夏开发的模块文件")
say_hello()

测试导入文件执行代码结果:

后台输出了分隔线,但是把小夏在模块中测试的代码也输出了,而这些测试代码并不需要被执行,如何就解决这个问题呢?利用__name__属性,请继续往下看!


三、内置属性__name__

1》实际开发场景:

在实际开发中,每一个模块都是独立开发的,大多都有专人负责,开发人员通常会在模块下方增加一些测试代码(仅在模块内使用,而被导入到其他文件中不需要执行)

2》__name__属性:

  1. __name__可以做到测试模块的代码只在测试情况下被运行,而在被导入时不会被执行
  2. __name__是python的一个内置属性,记录着一个字符串(保存的是一个字符串)
  3. 如果是被其他文件导入的,__name__就是模块名
  4. 如果是当前执行的程序,__name__是__main__(永远是固定的__main__)

3》代码测试演练:

1.在模块中执行__name__,执行结果永远都是__main__

2.被其他文件导入,在md_测试导入文件中执行结果——模块文件名:

3.让测试代码只有在执行模块时才会被运行

利用执行模块,__name__属性保存在字符串永远都是__main__这一点来进行判断:把测试代码放在判断里.

代码:

def say_hello():
    print("小夏和你打招呼说:你好!")

if __name__ == "__main__":
    # 如果执行模块,结果永远是__main__
    print(__name__)

    # 模块文件被导入时,能够直接执行的代码不需要被执行
    print("小夏开发的模块文件")
    say_hello()

模块文件依旧可以正常运行:

测试导入文件执行结果:测试代码不会被执行

 

4》在很多Python文件中都会看到以下格式的代码:

# 导入模块
# 定义全局变量
# 定义函数
# 定义类


# 在代码的最下方
def main():
    # 测试代码....
    pass

# 根据__name__判断是否执行下方代码
if __name__ == "__main__"
    main()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,让我逐行为您解释一下这段代码。 ```python from PIL import Image import os ``` 这两行代码分别导入了PIL库中的Image类和Python的os模块。 ```python folder_path = "path/to/folder" output_path = "path/to/output/folder" ``` 这两行代码分别定义了需要处理的文件夹路径和输出文件夹路径,您需要将其替换为实际的文件夹路径。 ```python tif_files = [f for f in os.listdir(folder_path) if f.endswith('.tif')] ``` 这行代码使用os模块中的listdir()函数获取文件夹中所有以.tif结尾的文件,并将其存储在一个列表中。 ```python grouped_tif_files = [tif_files[i:i+6] for i in range(0, len(tif_files), 6)] ``` 这行代码将上一步中获取的tif文件列表按照顺序分组,每组6个文件,并将其存储在一个新的列表中。 ```python for i, group in enumerate(grouped_tif_files): images = [] for file_name in group: file_path = os.path.join(folder_path, file_name) image = Image.open(file_path) images.append(image) output_file_name = f"output_{i}.tif" output_file_path = os.path.join(output_path, output_file_name) images[0].save(output_file_path, save_all=True, append_images=images[1:]) ``` 这段代码使用了一个for循环来遍历每个分组,将其合并为一个tif文件。在循环中,首先定义了一个空列表images,用于存储每个tif文件的图像数据。然后,使用一个嵌套的for循环,遍历当前分组中的每个tif文件,逐个将其打开并将其图像数据添加到images列表中。接下来,定义了输出文件名和输出文件路径,并将images列表中的第一个图像作为基础图像,将其余的图像添加到该基础图像之后,最后保存为一个新的tif文件。 希望这些解释对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王子玉博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值