猪行天下之Python基础——2.1 Python注释与模块

简介: 内容简述:1、注释2、模块

1、注释


注释是一段「解释性」文本,在程序运行时会被程序跳过,不做处理,一般是对代码的解释或提示,以此提高代码的可读性。写注释既方便了别人阅读代码,也方便自己日后回顾,而不用苦思冥想当初写这段代码的目的。当然注释也不是写的越多越好,应该「尽量避免没用的注释或写过多的废话」。


Python中提供了两种注释方式:「单行注释」和「多行注释」,单行注释通过#进行标识,多行注释则通过两个三引号来标识,代码示例如下:


# 这是一个单行注释
'''
这是一个多行注释
'''


2、模块


①模块的基本使用


就是一个Python文件,以.py结尾,包含了Python定义和声明。举个简单的例子:你可以把常用的代码块抽取出来,放到一个py文件中,然后在用到的地方对自己的模块进行引用。使用代码示例如下:


# 导入整个模块
import sys 
# 导入模块中的需要用到的部分
from sys import argv 
# 多个的时候可以用逗号隔开
from urllib.error import URLError, HTTPError 
# 导入模块中所有不是以下划线开头的名字,不建议这样做,如果同名会覆盖
# 定义过的名字;如果你硬想用这种导入方式,可以添加__all__成员来进行约束
# 比如:__all__ = ['a','b']
from sys import * 


另外,在导入自己的模块的时候,你可能遇到这样的问题:


写在模块里的测试代码都执行了!!!


你可以通过内置属性__name__来区分,当此模块作为程序运行时,会等于__main__,而作为一个模块导入到其他程序,则等于文件名字(去掉.py)。所以可以通过判断:__name__ 是否等于__main__ 来决定测试代码是否执行。


简单的代码示例如下:


if __name__ == '__main__':
    test()


接着说说几个问题


② 重复导入一个模块多次会怎么样?


答:第一次导入后就将模块名加载到内存中,后续的import只是对已加载到内存中的

模块对象增加一次引用,不会重新执行模块里的语句


③ 模块的搜索路径与顺序?


答:可以通过打印sys.path来查看模块的搜索路径,比如我的电脑:


[
'/Users/jay/Project/Python/Book/Chapter 6', 
'/Users/jay/Project/Python/Book',
'/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip',
'/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6',
'/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload',
'/Users/jay/Library/Python/3.6/lib/python/site-packages',
'/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages'
]


从上面不难看出Python对于模块的搜索顺序


程序所在目录 ===> 标准安装目录 ===> 标准库安装目录 ===> Python环境变量所包含的目录


所以,如果你自定义的模块与内置模块重名的话,会调用你的模块而非内置的模块,所以在命名模块的时候还是尽量别重名如果硬是要同名且两个模块都用到,可以使用「完整路径引入」,并使用as 关键字为模块设置别名。另外,如果你的模块都不在这些搜索路径里的话,可以通过调用sys.path.append("路径")临时把路径添加到搜索路径中。


④ __init__.py文件是做什么的?


答:标识文件所在的目录是一个python的模块包(package),一般是空文件,当然你也可以加点东西来控制包的导入行为,直接在__init__.py文件中批量导入所需模块,而不用一个个导入,如下所示(还可以将一些初始化的代码放入到该文件中。)


# xxx包里的__init__.py
import a
import b
import c    
# 调用这个模块的py文件
import xxx
print(xxx.a,xxx.b,xxx.c)
# 还可以利用上面讲到的__all__变量来简化下:
# xxx包里的__init__.py
__all__ = ['a','b,'c']
# 调用这个模块的py文件
from xxx import *


对了,还可以通过相对导入的方式导入模块,示例如下:


import .a import A  # 点号表示使用当前路径的a模块
import ..b import B # 两个点号表示访问上层的父类


⑤ 模块如何迁移到新的环境?


有时我们写的模块或者代码需要迁移到另一个设备上去运行,而你的脚本可能用到了一些依赖模块,如果pip命令一个个装显得有些繁琐,可以通过「pipreqs」模块来完成。

答:键入 pip install pipreqs 安装pipreqs模块,接着终端切换到项目路径,键入pipreqs 导出文件的存放路径 就可以导出一个requirements.txt的依赖文件,文件内容就是依赖的模块,复制到新的设备上,键入:pip install -r requirements.txt 即可自动下载安装需要用到的模块。另外,如果是想把电脑里Python环境中所有的模块迁移到另一台电脑,可使用命令导出依赖文件:pip freeze > requirement.txt,安装方法同pipreqs。


⑥ 模块的重载


上面说了重复导入模块,只是新增一个引用,而不会重新导入。有时可能需要在同一个会话中去更新模块,可以通过「imp标准库中的reload()函数」来完成。


from imp import reload  
load(模块名)


相关文章
|
2月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
79 4
|
1月前
|
Python
Python Internet 模块
Python Internet 模块。
127 74
|
2月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
131 63
|
2月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
2月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
23天前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
27 3
|
2月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
2月前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
59 5
|
2月前
|
JavaScript 前端开发 Python
python中的OS模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术及全栈开发经验,持续更新中,期待您的关注和支持!🎉🎉🎉
50 0
|
2月前
|
JavaScript 前端开发 Python
python中的platform模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术,助你成长。关注我,持续更新中!🎉🎉🎉
37 0

热门文章

最新文章