深度学习-推荐系统-CV-NLP人工智能/模式识别/机器学习精华专题大数据,机器学习,人工智能

Python札记44_模块(sys、copy)

2019-07-15  本文已影响0人  皮皮大

Python的强大不仅体现在它拥有强大的自有模块(标准库),同时还体现在它有海量的第三方库。

模块的自信来自于,模块是拿来即用的,不用自己编写


什么是模块

模块在Python中就是一个.py的程序。同样是一个py的程序既可以当做程序来执行,也可以当做模块来引入。
比如现在有有个文件mokuai.pyD:\Python\datalearning\mokuai.py中,模块中有个函数可以说是方法lang

image.png
import sys   # sys是标准库
sys.path.append("D:\Python\datalearning\mokuai.py")    # python中所有的模块加入到sys.path 中
import mokuai    # 将程序作为整个模块导入
mokuai.lang()  # 调用模块中的函数即方法,执行得到结果

查看模块mokuai的具体特殊属性:

['__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 'lang']   # 代码中定义的属性
>>mokuai.__name__   # 模块的属性__name__的值就是模块名称
'mokuai'

模块位置

为了能够让Python器知道我们写的模块在什么位置,需要用sys.path.append("绝对路径")。在Python中将所有可饮用的模块加入到sys.path里面。

import sys 
import pprint
pprint.pprint(sys.path)

['D:\\Python\\datalearning',
 'D:\\Python\\lib',
 'D:\\Python',
 'c:\\users\\admin\\venv',
 '',
 'c:\\users\\admin\\venv\\lib\\site-packages',
 'c:\\users\\admin\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.7.egg',
 'c:\\users\\admin\\venv\\lib\\site-packages\\win32',
 'c:\\users\\admin\\venv\\lib\\site-packages\\win32\\lib',
 'c:\\users\\admin\\venv\\lib\\site-packages\\Pythonwin',
 'c:\\users\\admin\\venv\\lib\\site-packages\\IPython\\extensions',
 'C:\\Users\\admin\\.ipython',
 'D:\\Python\\datalearning\\mokuai.py']   # 找到模块所在的位置

模块文件可以放置到任意指定的位置,只需要添加到环境变量即可。


_all_作用

定义两个变量和两个函数(方法),其中一个带上双下划线的是私有变量

public_var = "I am public"   
_private_var = "I am private"  # 私有变量

def public():
    print("hello python")

def _private():
    print("hello java")
image.png

被视为私有的变量、函数或者类没有访问权限。改进方法:使用__all__

__all__ = ['_private_var', 'public']    # 增加__all__变量,告诉解释器可以访问这两个变量。

public_var = "I am public"
__private_var = "I am private"  # 私有变量

def public():
    print("hello python")

def private():
    print("hello java")
image.png image.png

包和库

包和库比模块大。包里面有很多的模块。三者的大小是:模块--->包--->库(从小到大)。一个包由很多的模块(.py文件)组成。此时包就是熟悉的目录,那怎么引用包中的模块呢?

解决办法:在目录中放置一个init.py文件。init.py文件是一个空文件,这样目录中的其他py文件就可以当做模块引用。比如Peter目录下面有两个模块:.py1和.py2

>>import Peter.py1  # 导入模块
>>Peter.py1.lang  # (lang是py1中的方法),调用模块的方法

# 另一种导入方法
>>from Peter import py1
>>py1.lang

标准库

pprint:让字典格式化输出

import pprint       # 导入模块
a = {"name": "shenzhen", "lang": "python", "number": 123}
pprint.pprint(a)   # 调用模块的方法

# 结果
{'lang': 'python', 
'name': 'shenzhen',
 'number': 123}

from pprint import *  # 表示导入模块pprint的所有方法
import pprint  as pt   # 导入模块简写
from pprint import pprint as pt 

查看模块的信息,以pprint为例

>>dir(pprint)

['PrettyPrinter',
 '_StringIO',
 '__all__',
 '__builtins__',
 '__cached__',
 '__doc__',   # pprint.__doc__    查看整个文档信息
 '__file__',  # 模块位置
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 '_builtin_scalars',
 '_collections',
 '_perfcheck',
 '_recursion',
 '_safe_key',
 '_safe_repr',
 '_safe_tuple',
 '_sys',
 '_types',
 '_wrap_bytes_repr',
 'isreadable',
 'isrecursive',
 'pformat',
 'pprint',
 're',
 'saferepr']

>>help(pprint.isreadable)     # 查看模块的属性

标准库

sys

>>import sys
>>print(sys.__doc__)

This module provides access to some objects used or maintained by the
interpreter and to functions that interact strongly with the interpreter.
import sys 
for i in range(10):
    if i == 6:
        sys.exit()     # 相当于是break
    else:
        print(i)

copy

copy模块中最重要的就是copydeepcopy

import copy    # 导入模块

class Mycopy:   # 定义类
    def __init__(self,value):   # 初始化并传入参数
        self.value = value  # 定义属性的值
    
    def __repr__(self):   # 显式输出值
        return str(self.value)
    

foo = Mycopy(100)  # 调用类并且实例化
a  = ["Peter", foo]  # 列表a包含字符串和实例的值
b = a[:]    # 通过切片复制
c = list(a)
d = copy.copy(a)    # 浅拷贝
e = copy.deepcopy(a)   # 深拷贝

a.append("python")
foo.value = 24

print("a:{0}\n b:{1}\n c:{2}\n d:{3}\n e:{4}".format(a,b,c,d,e))

结果

a:['Peter', 24, 'python']
 b:['Peter', 24]
 c:['Peter', 24]
 d:['Peter', 24]
 e:['Peter', 100]
上一篇下一篇

猜你喜欢

热点阅读