包和模块

typora-root-url: ./
我的听课笔记,课程链接:https://www.bilibili.com/video/BV194411r7a8

2-python-饱和模块-作用

  1. 封装一些工具代码,供其他模块调用。模块开发思想!

  2. 有效的对程序进行分解,方便代码的管理和维护

  3. 防止同一模块命名重复问题

    name = "asd"
    name = "qwe"
    print(name)
    

    #模块1   name_module.py
    name = "asd"
    
    #模块2
    name = "qwe"
    print(name_module.name)   #asd
    

3-python-包和模块-分类

  1. 标准的包和模块:

    安装好python后系统自动安装的模块,只有手动调入和自动调入之分!!!

    1. 安装好python后,自动帮我们安装好的一些模块,可以直接导入使用。比如在lib目录下的包和模块os

      import os 
      
    2. 每个安装了python的用户的电脑上都有这些模块。在自己的电脑上写的某个系统模块的代码,到其他人的电脑上同样可以运行。

    3. 特殊的包和模块:内建的包和模块,就是当在我们编码过程中,python自动帮我们导入的模块,不用自己手动调用!比如print()

    import builtins  #bulitsin就是内建模块
    print(dir(builtins))#看一下内建模块里面的资源
    builtins.print("xxx")
    
  2. 三方的包和模块:

    1. 有些功能系统没有实现,或者实现了但是比较复杂,就有开发人员开发了一些比较方便的模块供其他人使用(这些模块可能用到了系统的某些模块,也可能没用),其他开发人员需要安装才可以用。
  3. 自定义的包和模块:

    1. 自己写好的一些模块发布给别人用,就变成了第三方包和模块。

4-python-包和模块的创建

  1. 创建模块:直接创建一个xxx.py文件即可,在其他文件这样调用import xxx.

  2. 创建包:创建一个文件夹,在python2中务必创建一个__init.py__文件,python3.3版本往后可以不用创建,但是为了代码的兼容性,建议还是创建。

    创建一个包p1,p1中有一个Tool模块,怎么导入呢?import p1.Tool。怎么调用其中的变量呢?p1.Tool.num

  3. __init__.py文件的作用:第一次调用包的时候,会自动执行这个文件的代码!

5-python-包和模块-包和模块的基本信息

基本信息包括:名称、内容、位置。

  1. 模块的名称和包的名称不加后缀。

  2. 参看标准模块的位置:

    import os
    #没有__file__属性的python库无法使用此方法查询
    print(os.__file__)#会打印出包的位置,我的位置C:\Users\HP\AppData\Local\Programs\Python\Python36-32\Lib
    
  3. python2和python3不兼容,就是因为他们的标准包是不一样的(比如参数的个数)!

  4. 包的内容怎么查看?

    1. ctrl+点击包名
    2. 查看包模块的属性和方法:dir(包名)函数。

6、7、8、9、10-python-包和模块-包和模块的导入-常规导入

  1. 常规导入

    1. import M

    2. 同时导入多个模块,就要通过逗号分隔:import M1,M2

    3. 如果是某个包里面的模块,就要通过点语法来定位:import 包名.模块

    4. 导入模块时,给模块起个别名:import M as 别名import numpy as np,pandas as pd,这样使用的时候就不需要写一长串路径了。有一个应用场景:

      if file_ectension == "txt":#如果扩展名是:.txt
          import text_parse
          txt_parse.open()
       txt_parse.read()
          txt_parse.close()
      

    elif file_extension == “doc”:#如果扩展名是:.doc
    import doc_parse
    doc_parse.open()
    doc.parse.read()
    doc.parse.close()
    #-------------------减少冗余
    if file_ectension == “txt”:#如果扩展名是:.txt
    import text_parse as p
    elif file_extension == “doc”:#如果扩展名是:.doc
    import doc_parse as p

    p.open()
    p.read()
    p.close()

    
    5. 使用的时候要加名称前缀:`M1.num`,使用资源通过点语法定位`包名.模块名.资源`。
    
    ```python
    # 导入sys整个模块
    import sys
    # 使用sys模块名作为前缀来访问模块中的成员
    print(sys.argv[0])
    
    1. 使用资源时候,就要通过点语法来指明:包名.模块名,这里当作对象来处理资源!路径一定要写完整!

      p1.my_moudle.run()#当作属性来处理
      
    2. 注意:如果导入一个包,那么不会导入任何模块,所以是错误的。有以下两种解决方法:

      1. 应该以from...import...的形式导入。
      2. 在init文件中再次导入模块。
    3. from语句的导入,语法:from A import B as C

11、12、13-python-包和模块-from导入-从包导入模块

  1. 从多层级的包里面导入模块要注意不要把包拆开,保证import后面的路径最简

from p1.sub_p import sub_xxx
from p1 import sub_p.sub_xxx #这是错误的


2. 注意在使用资源的时候不要加点语法

```python
from other import num as n1, num2, num3
print(other.num)#错误
print(num)#对的,不要加路径

from other.tool import num 
print(num)

  1. 注意事项:保证import后面的路径最简!

    from 大包 import 小包.模块 #错误
    fromimport 模块.子资源 #错误
    

14-python包和模块-包和模块的导入-from导入特例

  1. from 模块 import *
  2. from 包 import *

他们表示批量的导入资源!这种方式要慎用,因为很可能造成变量名的重复!没有__all__=[...]时,会导入模块中的所有非下划线资源!

  1. 从模块中批量的导入信息:被导入的模块中如果有__all__["a","b","c"](必须是一个元素为字符串的列表),这样通过下面的方式导入资源的时候,可以自动导入__all__里面的资源

    fromimport *
    fromimport *
    
  2. 从包中批量的导入信息:假设现在有包p1,包里面有tool1模块、tool2模块,还有一个init文件,里边有__all__=["tool1(模块1)","tool2(模块2)"]。可通过下面的语法来导入模块调用资源

    fromimport *
    #--------
    访问时不需要加包名!!!
    print(tool1.num)
    print(tool2.num)
    

15、16-python-包和模块-导入模块底层做的事

第一次导入时:

  1. 在自己当下的命名空间里执行所有代码。

    #模块1  other.py
    num = 1
    def run():
        print(num)
       
    #主文件 test.py
    num = 2
    import other 
    other.run()
    #这时输出1,不是2!!!因为是在被导入的模块的命名空间里执行所有代码!不会与主文件里面的代码产生矛盾!
    
  2. 创建一个模块对象并为其分配内存地址,并将模块所有的顶级变量以属性的形式绑在模块对象上,这个对象的类型是模块,模块的名称就是文件名!

  3. 在import位置引入import后面的变量名称到当前命名空间(通过import指向一个模块对象other模块对象!)。

第二次导入时(在同一个主文件前后导入两次):直接执行上面的第3步。

注意1:函数也是一个命名空间,所以在函数中导入一个包,也只能在函数内部使用。

注意2:

  1. 两种导入方式都会大致执行上面的步骤。from other import num1也会执行所有代码,产生一个模块对象,而不是执行其中一部分!与import的区别只是拿那些东西来用!
  2. 多次导入模块该模块不会执行多次。
  3. 两种方式不存在哪一种更节省内存,区别在于把那一部分内容拿来使用。

17、18、19-python-包和模块-检索路径以及检索路径的修改

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LJN94Tij-1606269400788)(/tupian_包和模块/导入路径.png)]

  1. 内置模块的优先级>路径列表(sys.path)。

  2. sys.path里边:

    import sys
    print(sys.path)#打印路径列表
    

    当前目录

    环境变量PYTHONPATH种指定的路径列表(不一定会有)

    特定路径下的.pth文件中的路径列表

    在python安装路径的lib库中搜索

  3. 怎么在sys.path里边追加路径:

    import sys
    sys.path.append(r"路径,到具体的文件")#r表示原始字符串
    

    注意,这个方式是单次有效的,只有有命令sys.path.append(r"路径,到具体的文件")#r表示原始字符串的源文件才有效,而其他的文件无效!!!

20、21-python-包和模块-模块检索路径-修改方式2、3

怎么改环境变量呢?

  1. 新建一个名为PYTHONPATH的环境变量!注意:pycharm对PYTHONPATH的路径支持不是很好,所以修改后任不可用!可以手动添加!

    环境变量的修改
  2. 添加.path文件,这是一个配置文件!

    在那里创建呢?

    import site
    print(site.getsitepackages())#输出目录,在这些目录里边添加!
    

    在此目录添加一个文本文件,后缀改为:.pth,然后就可在里边加上路径名称(到文件上一层目录),多个路径回车分隔!

22-python-包和模块-模块检索路径-第二次导入

第一次导入模块时,从上面的路径去找模块,第二次导入时,从已经加载的模块去找,然后直接用,不会再找了!怎么查看已经加载的模块呢?

import sys
print(sys.modules)

23、24、25-python-包和模块的导入-导入场景-局部导入、覆盖导入、循环导入

某个局部范围导入,这样就可以不用在主文件中都执行一遍模块文件,从而节省了运行时间:

def run():
    import other
    print(other.num1)
    print(other.num2)
#在函数的命名空间才可以用!在函数外边是用不了other里面的东西的!

覆盖导入:

  1. 场景1:自定义模块和非内置的标准模块重名,根据前者的存储位置,有可能前者会覆盖后者!自定义模块不要与后者重名!标准模块在lib里面!自定义的模块会覆盖标准模块!!!

    import  sys
    print(sys.path)#打印出sys.path,也就是包的检索路径!如果加入的
    
  2. 场景2:自定义模块和内置模块重名,内置模块肯定会覆盖自定义!如果特别想用自定义模块,使用from包名import...来指定特定的模块!

    from 包和模块 import sys   #这样就可以使用自定义sys了
    

循环导入:

  1. 有两个模块,在A里边导入了B,同时在B里面导入了A。这样就造成了循环导入!循环导入就是下边这个流程:

    #-------模块一other
    import test
    o1 = "o1"
    o2 = "o2"
    print(test.t1)
    print(test.t2)
    #-------模块二test
    import  other
    t1 = "t1"
    t2 = "t2"
    print(other.o1)
    print(other.o2)
    
  2. 第二种情形:

    #-------模块一other
    import test
    o1 = "o1"
    o2 = "o2"
    print(test.t1)
    print(test.t2)
    #-------模块二test
    import  other
    t1 = "t1"
    t2 = "t2"
    print(other.o1)
    print(other.o2)
    

26-python-包和模块-导入场景-循环导入

概念:两个功能相近的包,根据需求优先选择其中一个导入!

应用场景:有两个包A、B,他们功能相近,想优先使用A,而且要做到在没有A的情况下,使用B备用!

try:
    import other2 as o
except ModuleNotFoundError:
    import other as o
    
print(o.o1)

27-python-包和模块-导入场景-包内导入-上

包内导入:在包里面A模块用B模块的资源!分为两类:绝对导入和相对导入

  1. 绝对导入:参照sys.path进心检索,比如指明包和模块名称的情况import afrom a import b,python3是这样python2不同!

  2. 相对导入:使用.来代指相对路径

    1. .根据模块名称所获取的当前目录。
    2. ..根据模块名称所获取的上层目录。

    例如:from.import afrom ..import a

当我们尝试去使用解释器去执行一个py文件的时候,解释器就会确定当前文件所在目录,然后,把这个目录添加到sys.path中,添加过之后,再往后,基本上sys.path就已经确定。

包和模块这个目录下没有tool2,所以会报错!!!

28-python包和模块-包和模块的导入-包内导入-中(相对路径)

可以通过下面这个办法解决问题:from p1 import Tool2,应因为p1在包和模块这个路径里面,但是如果p1这个包被改成了p2,那么,所有的导入命令都要改!!相对路径的办法就可以解决这个问题!!!

如果py文件直接以脚本的形式执行,那么他的名称就是__main__,如果使用模块的形式进行加载的,那么他的名称是由加载的路径决定的!比如包名.子包名.模块。包名就是顶级包(top-level package)!

并不是..就是上面两层目录,也不是.就是当前目录!这里的...表示的是从模块名称找,而不是在模块的目录找!

29-python包和模块-包和模块的导入-包内导入-下

在python2中,import tool2相当于python3中的from . import tool2,也就是说,python2中是隐式的相对导入!!!

结论:以后在编写代码的时候,包内导入使用相对导入,保外导入使用绝对导入!

30-python-包和模块-三方包和模块的安装-理论基础-包管理项目

三方模块和标准模块的区别:

  1. 标准模块:
    1. 官方发布
    2. 使用可靠,几乎无bug,即使有bug也会有团队立即修复
    3. 有健全的只用说明
  2. 三方模块:
    1. 网友提供
    2. 文档不健全
    3. 更新不及时或者无更新
    4. 功能有bug

一般大多数人有需求的功能才会做成标准模块!

什么是安装模块?就是把别人的代码搞到本地,让我们来使用。

安装方式:

  1. 源码安装:自己动手去某个地方下载,然后安装到本地。
  2. 包管理器安装:只需要一个或者几个命令就可以安装。

31-python包和模块-包管理项目简史:

  1. distutils:
    1. 产生背景:它是由官方开发的,1998年—2000年。
    2. 角色定位:属于python标准库,也就是安装python时,会自动安装此模块。
    3. 功能特点:只需要通过合适的命令运行一个叫做setup.py文件;只能处理简单的包安装。
  2. setuptools(基于distutils):
    1. 产生背景:自从distutils开发停止以后,一些开发人员在他的基础上开发自己的工具,其中最成功的就是setuptools,
    2. 角色定位:属于第三方库。
    3. 特点:频繁的更新;自动依赖处理(将模块A依赖的模块都一起下载);egg分发格式;easy_install命令(一个脚本);disturils兼容。
  3. disribute(基于setuptools):
    1. 产生背景:xiansetuptools开发缓慢,且不支持python3,网友以为会同distutils一样停止开发,另一批工作人员有基于setptools(fork)创建了名为distribute的库。
    2. 角色定位:三方库,需要安装。
    3. 功能特点:bug少;支持python3。
    4. 现状:2013年setuptools和distribute两个开发组织决定再一次合并到setuptools项目中,所以,distribute被放弃,setuptools又成为正主!

总结:目前,官方支持且认可度较高的包管理器有两个:distutils和setuptools:

  1. distutils:是标准库的一部分,可以处理简单的安装,通过setup.py进行安装。
  2. setuptools:自带了一个esay_install安装脚本,后来出现更牛逼的pip来代替它,引入了.egg格式,后来出现更好的.whl格式来代替它!

32、33-python包和模块-理论基础-包和模块的形式、安装方式

  1. 源码:

    1. 单文件模块,
    2. 多文件模块(由包管理器开发的项目,不管是由setuptools开发的项目还是由distutils开发的项目都包含setup.py文件,因为setuptools是基于distutils的)。
  2. .egg格式:是setuptools引入的一种格式,setuptools可以识别它,安装它。

  3. .whl格式:本质就是.zip格式,是为了替代.egg。

python官方提供的包托管的网站:pipy.python.org。

安装方式

  1. 本地安装:
    1. 单文件模块:直接拷贝到文件夹。
    2. 多文件模块(带setup.py):通过setup.py脚本安装。
    3. .egg:使用setuptools自带的安装脚本easy_install进行安装。
    4. .whl:使用pip进行安装。
  2. 远程安装:
    1. easy_install
    2. pip
    3. pycharm
  3. 安装源:
    1. python官网:pypi.python.org/simple。
    2. 镜像网站:豆瓣、阿里、中国科技大学。

34-python-包和模块-单文件的安装

直接拷贝到文件夹,任意一个sys.path的路径之中,一般存放在Lib/site-package文件夹中。

35、36-python-包和模块-本地安装-带setup.py文件的包安装

步骤如下:

  1. 打开命令行工具
  2. 切换到setup.py文件所在目录(setup.py都在包的目录里面)
  3. python2:执行python setup.py install;python3:执行python3 setup.py install

注意:

  1. 如果项目使用的是distutils打包的,上面命令可以直接使用。如果项目使用setuptools打包的,上面命令就有报错。因为distutils为标准模块,所以只要安装了python,就这个模块。本地没有setuptools的话,是不能解压缩setuptools打包的模块。
  2. 这时候,需要先安装setuptools模块,方法为:
    1. 先下载setuptools安装包(zip格式)。
    2. 解压,然后再setup.py所在的的目录,执行python3 setup.py install
    3. 这时候,lib/site-package里面就有了setuptools,就可以通过setuptools来安装包了。
  3. 但是,如果这个包依赖了其他模块,就需要联网才可以下载!

37-python包和模块-本地安装-.egg格式的安装

  1. .egg文件是使用setuptools的自带的安装脚本easy_install进行安装的,要求先安装setuptools
  2. 语法:easy_install_ xxx.egg
  3. 怎样安装呢?打开命令行,切换到.egg文件所在的目录,执行easy_install_ xxx.egg(包名)

38、39、40-python包和模块-本地安装-whl格式的包安装(通过pip)

怎样安装呢?

  1. 打开命令行,切换到.whl文件所在的目录,执行easy_install_ xxx.whl(包名)。如果依赖其他包,则需要联网。
  2. 使用pip安装:首先的安装pip,然后再命令行中输入:pip install 路径xxx.whl(包名).

41-python 包和模块-第三方包和模块-远程安装

只需再命令行操作,不需要切换目录!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-abpYpY5H-1606269400790)(C:\Users\HP\Desktop\python包和模块笔记\tupian_包和模块\pip远程安装.png)]

42-python 包和模块-第三方包和模块安装-easy_install-多个python版本的切换安装

如果一个电脑同时有python2和python3,当使用easy_install_ xxx(包名)远程安装的时候,请问是安装到python2还是python3中呢?是安装在python3中的,因为在环境变量里边,python3的路径在python2的前面!怎么指定安装在那个版本的python里面呢?easy_install-N.N,N.N用于指明安装到那个版本的python中,例如:

  1. 安装到python2.7.14中:easy_install-2.7 requests
  2. 安装到python3.6.3中:easy_install-3.6 requests

43-python包和模块-三方包的安装-easy_install-安装多个包版本

注意:最新安装的包就是活动版本(导入包时导入的版本)!是最新安装的包,而不是最新版本!

44-python-包和模块-easy_install升级某个包

怎么升级呢?使用这个命令:easy_install --upgrade requests,或者:easy_install -U requests

如果忘了怎么怎么查看帮助呢?easy_install -h

45、46-python包和模块-三方包的安装-easy_install-卸载包

当我们安装某个库的时候,会做两件事:

  1. 在site_packages路径里面加入包文件。
  2. 在site_packages这个路径里边创建.pth文件,并且把包的路径放到.pth文件里面。

怎么卸载呢?有两个方案:

  1. 方案一(手动卸载):

    1. 删除.pth文件里面的记录。
    2. 删除site_packages路径里面的包文件,这个也不一定要删,因为可能是其他包的依赖包。
    3. 依赖包不建议删除,因为不一定是要卸载的包有依赖。
  2. 方案二(命令卸载):

    使用命令easy_install -m 包名,这个命令只会在.pth文件文件里面删除记录,而不会删除包文件!在下节将说明这只是一个巧合!

47-python包和模块-easy_install-多版本运行时的选择

  1. -m的真正含义是让某个库支持多版本,并且可以在运行时候切换。
  2. -m在easy_install.pth中把对应的记录删除,这样如果不直接指明包的版本就无法导入包了。
  3. 删除了以后,如果像使用某个版本,需要以下步骤:
    1. import pkg_resources
    2. pkg_resources.require("requests==2.18.3(必须是完整的版本)")
    3. import requests

48-python包和模块-easy_install-切换安装源

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iqG8d6zW-1606269400792)(C:\Users\HP\Desktop\python包和模块笔记\tupian_包和模块\切换安装源.png)]

注意:压缩包的后缀名为.egg,要删除.zip!

49、50-python包和模块-pip-单次、永久切换安装源

  1. pip的学习文档:http://pip.pypa.io/en/stable。

  2. 切换安装源:

    1. 单次修改:

      pip install --index-url http://pypi.douban.com/simple/requests,指定检索,也就是只到一个地址检索指定包。

      pip install --extra-index-url http://pypi.douban.com/simple/requests,扩展检索,当没有在官方pipy里面检索到的时候,才会到扩展地址检索。

    2. 永久性的修改:

      1. 在C盘中找到目录: C:\Users\用户名

      2. 查看在Roaming文件夹下新建pip文件夹(如果已经存在就跳过此步)

      3. 在pip文件夹中创建一个pip.ini文件

      4. 使用记事本的方式打开pip.ini文件,写入:

      [global]
      index-url = http://pypi.douban.com/simple
      [install]
      trusted-host=pypi.douban.com
      
      1. 完成

51-pytho-包和模块-pip-安装在不同python版本环境中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t6nBhlOI-1606269400795)(C:\Users\HP\Desktop\python包和模块笔记\tupian_包和模块\pip安装在不同版本中.png)]

52-python包和模块-三方包和模块的安装-pip查看包

查看所有包:命令行中输入pip list

查看所有没有被依赖的包:命令行中输入pip list --not-required

查看所有过期的包(不是最新版本):命令行中输入pip list --outdated

查看某个库的具体信息:命令行中输入pip show 包名

53-python包和模块-三方包和模块的安装-pip检索包

当忘了某个包的全名,可以通过检索来查看包的全名,命令为:pip search 包名关键字。这时是在默认的官网地址检索,是比较慢的。现在要在指定的地址检索,用这个命令:pip search -i https://pypi.tuna.tsinghua.edu.cn/simple 包名关键字

54-python包和模块-三方包和模块的安装-pip安装指定版本的库

  1. pip install "request == 2.18"
  2. pip install "request >= 2.0"
  3. pip install "request > 2.0,<3.0"

5-python包和模块-三方包和模块的安装-pip升级包

通过这个命令进行更新:pip install --upgrade requests。会将三方包一起升级。

56-python包和模块-三方包和模块的安装-pip卸载包

通过这个命令卸载:pip uninstall 包名。注意:

  1. 如果是通过easy_install安装的,会自动删除easy_install.pth文件中对应的路径,会自动删除对应的.egg文件。
  2. 如果是通过pip install安装的,会直接删除对应的包文件。pip安装的包不会有路径文件!!!

56-python包和模块-三方包和模块的安装-pip生成冻结需求的文本

将所有安装包记录生成一个文本文件:pip freeze。与pip list相比,这个命令会将大家都有的包(比如pip)过滤掉!

步骤如下:

  1. 切换到某一个目录:cd 路径
  2. 输入命令:pip freeze > ./xxxx.txt

当别人拿到这个文本文件,步骤如下:

  1. 在site_packages路径里面执行:pip install -r requirement.txt

57-python包和模块-三方包和模块的安装-三方库的版本说明

版本由三部分组成:n1.n2.n3(如pandas 1.0.5)。

  1. n3:当版本bug修复之后,n3+1。

  2. n2:增加了一个小功能,n2+1。

  3. n1:修改了之前的功能,或者添加了一个新功能(修改了之前的api),n1+1。api理解为某个函数增加了参数。修改了n1,要注意是否要升级。

删除easy_install.pth文件中对应的路径,会自动删除对应的.egg文件。
2. 如果是通过pip install安装的,会直接删除对应的包文件。pip安装的包不会有路径文件!!!

56-python包和模块-三方包和模块的安装-pip生成冻结需求的文本

将所有安装包记录生成一个文本文件:pip freeze。与pip list相比,这个命令会将大家都有的包(比如pip)过滤掉!

步骤如下:

  1. 切换到某一个目录:cd 路径
  2. 输入命令:pip freeze > ./xxxx.txt

当别人拿到这个文本文件,步骤如下:

  1. 在site_packages路径里面执行:pip install -r requirement.txt

57-python包和模块-三方包和模块的安装-三方库的版本说明

版本由三部分组成:n1.n2.n3(如pandas 1.0.5)。

  1. n3:当版本bug修复之后,n3+1。

  2. n2:增加了一个小功能,n2+1。

  3. n1:修改了之前的功能,或者添加了一个新功能(修改了之前的api),n1+1。api理解为某个函数增加了参数。修改了n1,要注意是否要升级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值