模块:
一个模块就对应一个py文件
sudo pip install pygame python2安装一个pygame模块
sudo pip3 install pygame python3安装一个pygame模块
安装完成后,在交互模式中,import pygame 如果没有报错,就说明安装成功了,如果报错了,就说明安装没有成功。
自定义模块:
sendmsg.py
def test1():
print("发送消息中!!!!")
def test2():
print("----test2-----")
main.py
import sendmsg
sendmsg.test2()
sendmsg.test1()
python解释器 会将导入的模块 解释成 字节码 然后专门存到一个缓存文件xxxx.pyc中去。当主文件修改时,python解析器只需要重新解释主文件,直接调用模块的缓存文件就可以了。
main.py写法二:
from sendmsg import test1,test2 #也可以这样写 表示从sendmsg.py中导入 test()函数
#或者写成 from sendmsg import *
test1() #这样导入之后,就不需要写之前sendmsg
test2()
建议少使用*,因为用这种方式的导入的两个模板中假如有同名的方法,那么后面导入的模板的方法将覆盖之前导入的模板的方法。
import time as tt #给模块起一个小名
tt.sleep(3)
#注意当你导入一个模块的时候,解释器会先搜索当前路径下有没有这个模块,然后才会到系统存储模块的路径下面寻找,所以写文件名时最好不要写和 系统模块名相同的名字。
并且当你导入一个模块的时候,实际上,会将这个模块从头到尾执行一遍。
如何既在模块中对函数进行测试,又能在主函数导入模块时,让测试用的语句不要执行呢?
sendmsg.py
def test1():
print("----test1----")
def test2():
print("-----test2----")
if __name__ == "__main__":#当直接用python3运行该文件时,__name__的值为 "__main__"当将该文件作为模块导入时,__name__的值为 “sendmsg”
test1()
test2()
大程序的套路:
import xxx
class ClassName(object):
def xxx():
xxxx
def main():
xxxx
if __name__ == '__main__':
main()
__all__变量的用法:
sendmsg.py
__all__ = ["test1","test2","Test"]
#该变量必须是一个列表,在里面写入你允许别人使用的函数。这样别人在以from sendmsg import *的方式导入模块之后,只能使用特定的函数。如果别人使用 import sendmsg 的方式导入模块则没有任何作用。
def test1():
pass
def test2():
pass
def test3():
pass
def test4():
pass
class Test(object):
pass
main.py
from sendmsg import *
test1()
test3() #error 不能调用
包:
将多个模块放在一个文件夹中,并且在文件夹中创建一个名为 __init__.py的文件,这样的一个文件夹就成为了包。如果没有__init__.py文件,在python3中 通过 import 文件夹名 或者 from 文件夹名 import * 可以直接导入这个包 ,但是在python2中却行不通,有了__init__.py文件,在python2中也可以这样导入一个包。
在__init__.py文件中,通过写入一个__all__ = ["模块名"] ,来设置通过from 文件夹名 import *的方式允许使用的包中的模块名,如果没有写这个变量,一个模块也不能用。或者如果即使写了这个变量,但是通过 import 文件夹名的方式来导入模块,也不能调用任何模块
当你导入包时,__init__.py中的所有代码都会被执行!
__init__.py
__all__ = ['sendmsg'.'recmsg']
那么如何才能在以 import 文件夹名的方式 导入包的时候也可以 调用模块中的函数成功呢?
我们需要在 __init__.py 文件中,再导入 我们需要 用到的 模块。
__init__.py
__all__ = ['sendmsg'.'recmsg']
from . import sendmsg导入当前路径下的sendmsg 即 bao/sendmsg
from . import sendmsg
如何查看系统的模块在什么路径呢?在交互模式下,import os,然后os.__file__ 就会返回该路径。
那么如何将一个包或者一个模块,安装到系统目录下呢?
发布模块:
在包的同一目录下,创建一个setup.py
from distutils.core import setup #setup 是一个 函数
setup(name = "dongGe",version = "1.0",description = "dongGe's module",author = "dongGe",py_modules = ['包名.模块名','suba.bb','suba.cc'])
#通过命名参数的方式给setup传参
在该目录下,敲命令:python3 setup.py build
python3 setup.py sdist
当前文件夹下的dist文件中将会创建一个 tar.gz 包,可以将文件包 共享到 github.com上去,当然你可以去github.com上下载这样包,然后解包,在PKG.INFO中可以查看作者的信息。
在该文件夹中,输入命令sudo python3 setup.py install 就可以安装此包 到 系统中去了
给程序传参数:
给程序传参数.py
import sys
print(sys.argv) #输出['给程序传参数.py']
"""sys.argv 用一个列表来接受运行时传给程序的参数,注意第0个参数一定是程序的名字“”“
import sys
name = sys.argv[1]
print("热烈欢迎,%s的到来"%name)
列表推导式:
range的注意点:range本身就是一个列表,range(10,18) 表示[10,11,12,13,14,15,16,17]这个前闭后开区间。range的第三个参数是步长,例如:range(10,18,2) 不写默认为1
range有什么风险?在Python2中,1.range(1,100000) 申请了一个很大的内存空间,导致MemoryError 2.申请了一个很大的内存空间,最后忘了用,浪费了。
python3中并没有什么实际风险。pyhton3中例如rang(1,100000)并不会先占用大量内存空间来存储一个列表,而是,你要用这个列表的那个值,现生成一个值返回给你。
a = [I for I in range(1,18)]
#每循环一次就将i的值放入到列表中去
#列表生成式
print(a)
#[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
b = [11 for I in range(1,18)]
#每循环一次就将11放入到列表中去,所以列表中有17个11
c = [I for I in range(10) if I%2 == 0]
print(c)
#[0,2,4,6,8]
d = [I for I in range(3) for j in rang(2)]
#每执行一次for i 循环,都要执行 for j 循环 到结束
print(d) #[0,0,1,1,2,2]
集合:
用花括号定义的数据类型除了字典还有集合。
c = {11,22,33,11,22,33}
print(c)
#{11,22,33}集合中不能有重复的元素
列表如何去重?
方法一:
a = [11,22,33,44,11,22,33]
b = []
for I in a:
if I not in b:
b.append(i)
方法二:
a = [11,22,33,44,11,22,33]
f = set(a)
b = list(f)
小技巧:在交互模式下
输入一个集合b,然后b. 按下tab键可以查看所有集合的相关操作,help(b.xxx)可以查看某操作的用法。