pythonDay04:模块 列表生成式

模块:

一个模块就对应一个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)可以查看某操作的用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值