在Python中,一个.py文件就称之为一个模块(Module),包含所有你定义的函数和变量的文件。
好处:最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。模块可以被其他地方引用。使用模块还可以避免函数名和变量名冲突。
自己创建模块时要注意命名,不能和Python自带的模块名称冲突。模块名要遵循Python变量命名规范,不要使用中文、特殊字符;
标准模块文件:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- ' a test module ' __author__ = 'Michael Liao' import sys def test(): args = sys.argv if len(args)==1: print('Hello, world!') elif len(args)==2: print('Hello, %s!' % args[1]) else: print('Too many arguments!') if __name__=='__main__': test()
第1行和第2行是标准注释,第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行,第2行注释表示.py文件本身使用标准UTF-8编码;
第4行是一个字符串,表示模块的文档注释,任何模块代码的第一个字符串都被视为模块的文档注释;
第6行使用__author__变量把作者写进去,这样当你公开源代码后别人就可以瞻仰你的大名;
_name__属性来使该程序块仅在该模块自身运行时执行。每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。若是被引入,下面的代码则不运行。
import sys:导入sys模块。
from fibo import fib, fib2 两种导入模块的方法
内置的函数 dir(xx) 可以找到模块内定义的所有名称。没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称:
作用域:
正常的函数和变量名是公开的(public),可以被直接引用,比如:abc
,x123
,PI
等;
类似__xxx__
这样的变量是特殊变量,可以被直接引用,但是有特殊用途,我们自己的变量一般不要用这种变量名;
类似_xxx
和__xxx
这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc
,__abc
等;(只是不应该,从编程习惯上不应该引用private函数或变量。)
外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。
def _private_1(name): return 'Hello, %s' % name def _private_2(name): return 'Hi, %s' % name def greeting(name): if len(name) > 3: return _private_1(name) else: return _private_2(name)
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
可以有多级目录,组成多级层次的包结构。
若在pycharm中,导入包有问题,可能的一个问题,请参考:https://blog.csdn.net/whalefall/article/details/88317715,每一个包都做一下Mark Directory as Sources Root。
用户可以每次只导入一个包里面的特定模块,比如: import sound.effects.echo
这将会导入子模块:sound.effects.echo。 他必须使用全名去访问: sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
还有一种导入子模块的方法是: from sound.effects import echo
这同样会导入子模块: echo,并且他不需要那些冗长的前缀,所以他可以这样使用: echo.echofilter(input, output, delay=0.7, atten=4)
还有一种变化就是直接导入一个函数或者变量: from sound.effects.echo import echofilter
同样的,这种方法会导入子模块: echo,并且可以直接使用他的 echofilter() 函数: echofilter(input, output, delay=0.7, atten=4)
注意当使用 from package import item 这种形式的时候,对应的 item 既可以是包里面的子模块(子包),或者包里面定义的其他名称,比如函数,类或者变量。
import 语法会首先把 item 当作一个包定义的名称,如果没找到,再试图按照一个模块去导入。如果还没找到,抛出一个 :exc:ImportError 异常。
反之,如果使用形如 import item.subitem.subsubitem 这种导入形式,除了最后一项,都必须是包,而最后一项则可以是模块或者是包,但是不可以是类,函数或者变量的名字。
安装第三方模块,可以使用pip: pip install Pillow
也可以安装Anaconda,若每次要激活,参考这个:
解决办法:
1,在命令行输入conda info --envs后有如下提示:
E:pythonConda>conda info --envs
# conda environments:
base * E:pythonConda
2,在命令行输入conda activate +(base后面的路径),按照我的就是输入conda activate E:pythonConda,回车解决问题!!!
__name__属性
#!/usr/bin/python3 # Filename: using_name.py if __name__ == '__main__': print('程序自身在运行') else: print('我来自另一模块')
说明: 每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。
说明:__name__ 与 __main__ 底下是双下划线, _ _ 是这样去掉中间的那个空格。
参考自:菜鸟python3和廖老师的python3