> 백엔드 개발 > 파이썬 튜토리얼 > Python 시리즈 5 모듈

Python 시리즈 5 모듈

巴扎黑
풀어 주다: 2017-06-23 11:46:54
원래의
1378명이 탐색했습니다.

模块

1. 模块的分类

  模块,又称构件,是能够单独命名并独立地完成一定功能的程序语句的集合(即程序代码和数据结构的集合体)。

  (1)自定义模块

    自己定义的一些可以独立完成某个功能的一段程序语句,可以是一个文件,也可以是一个目录。

  (2)第三方模块

    是由其他人写的一些程序语句,我们可以用它来实现自己的功能。

  (3)内置模块

    是由python自己带的一些实现某种特定功能的组件。

2. 模块的导入

  (1)python默认的模块寻找路径

    当开始导入一个模快的时候,python默认的会先找到第一个路径去看一下是否有这个模块,如果没有接着再到下一个路径中去找,知道最后一个路径。

    从这个路径中我们可以知道,只要我们的模块在这个路径中,就可以被导入。

C:\Users\zhou\PycharmProjects\fullstack2\6_19\test
C:\python_software\python3.5.2\python35.zip
C:\python_software\python3.5.2\DLLs
C:\python_software\python3.5.2\lib
C:\python_software\python3.5.2C:\python_software\python3.5.2\lib\site-packages
로그인 후 복사
python默认寻找路径

  (2)自定义模块的导入

    <1>. 自定义模块在python的默认路径中

      第一种方式,导入文件,然后文件去调用函数

      下图左边的为目录树,lib,index和module1在同一目录下,module2,module3在lib目录下,右边的为index文件导入模块的方法。

      到操作某个文件的时候, 默认的就会把此文件的路径加入默认路径中。

        *  module1可以直接导入,因为与index在同一文件夹下

        * module2和module3要通过以下方式进行导入,因为他们不在一个目录中,要首先找到与index同级的目录才可以

      

      第二种方式,导入函数

      直接调用函数

      lib.module2:默认调用函数时,目录之间用点去分割

      

    <2>. 自定义模块不在python的默认路径中

       我们需要把自定义模块的路径加入到python默认的路径中,然后就可以像上面的的方法一样进行调用了。    

# sys模块在后面会有说明,此处的append是把D:路径加入# 然后D盘的所有模块就可以导入了import sys
sys.path.append('D:')for i in sys.path:print(i)
로그인 후 복사

  (3)内置模块和第三方模块的导入

    内置模块的和第三方模块的导入很简单,直接用import 模块名称  就可以了,因为内置模块和自定义模块的的路径其实就是在python的默认寻找路径中,所以可以直接用import导入。

    第三方模块的安装:

    <1>. 安装管理工具

      pip  install  requests

    <2>. 下载源码安装

一. os

  1. os模块的作用

    os(operating system)操作系统的意思,所以,从名字就可以看出来,此模块主要是和系统级别相关的一些功能。

  2. os模块的方法

 1 os.join(路径1, 路径2)                  把这两个路径合成一个路径 2     # 例题: 3         a = os.path.join('zhou\\PycharmProjects\\fullstack2\\6_1\\6_10','test1.py') 4         print(a) 5     # 结果: 6         zhou\PycharmProjects\fullstack2\6_1\6_10\test1.py 7          8 os.state(路径):                       显示当前路径的一些状态信息 如: 大小,uid,gid,修改时间,创建时间 9 os.getcwd():                         不需要参数,就是显示出当前文件所在目录10 os.mkdir(路径, 权限)                   windows下创建目录,注意是双斜杠11 12 os.rmdir()                           windows下删除目录, 如果目录不为空,则不能删除13     # 例题:  14         os.mkdir('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1', 640)15         os.rmdir('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1')16         17 os.makedir()                         递归创建目录18 os.removedir()                       递归删除目录19     # 例题: 6_1目录不存在,递归创建,然后remove递归删除20         os.makedirs('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10', 640)21         os.removedirs('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10')22         23 os.listdir(路径):                     列出当前目录下的所有内容,相当于list24 os.chdir(路径)                        改变当前路径,相当于cd25     # 例题:26         os.chdir('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10')27         print(os.getcwd())28         29 os.curdir                            返回到当前路径30 os.pardir                            返回到父目录31     # 例题:32         print(os.curdir)----> .33         print(os.pardir)----> ..34         35 os.rename(旧文件的名字,新文件的名字)      重命名36     # 例题:37     os.rename('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10\\test1','C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10\\test1.py')38 39 os.name                              当前操作系统的名称 windows下为"nt", linux下为"posix"40 os.pathsep                           用来分割路径的操作符  ";"41 os.linesep                           操作系统的换行符,windows下为"\t\n", linux下为"\n"42 os.sep                               操作系统特定的路径分隔符,windows下为"\", linux下为"/"43 os.environ                           当前操作系统的环境变量44     # 例题:45         print(os.sep)   
46         print(os.linesep) 在win下显示为两行空格(此处感觉有点奇怪,按理说应该是一行才对)47         print(os.pathsep)48         print(os.name)49         print(os.environ)50         51 os.basename()                        得到路径的基名52 os.dirname()                         得到路径的父目录53 os.path.exists()                     判断路径是否存在54 os.path.split()                      把路径的基名和父目录分割开来55 os.path.abspath()                    得到他的绝对路径56 os.path.isabs()                      判断是不是绝对路径,如果是返回True,如果不是返回Flase57     # 例题:58         a = os.path.dirname('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10')59         b = os.path.basename('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10')60         c = os.path.exists('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10')61         d = os.path.split('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10')62         e = os.path.abspath("test.py")63 64         print(a)65         print(b)66         print(c)67         print(d)68         print(e)69     # 结果:70         C:\Users\zhou\PycharmProjects\fullstack2\6_171         6_1072         True73         ('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1', '6_10')74         C:\Users\zhou\PycharmProjects\fullstack2\6_19\test.py75                 76 os.path.isfile()                     判断路径是不是一个文件77 os.path.isdir()                      判断路径是不是一个目录78 os.path.getatime()                   最后存取时间79 os.path.getctime()                   最后创建时间80 os.path.getmtime()                   最后修改时间81     # 例题:82         f = os.path.isfile('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10')83         g = os.path.isdir('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10')84         h = os.path.getatime('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10')85         i = os.path.getctime('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10')86         j = os.path.getmtime('C:\\Users\\zhou\\PycharmProjects\\fullstack2\\6_1\\6_10')87         print(f)88         print(g)89         print(h)90         print(i)91         print(j)92     # 结果:93         False94         True95         1497872812.446774596         1497864841.851299397         1497872812.4467745
로그인 후 복사
os的模块使用方法和事例

二. sys

  1. sys模块的作用

    sys(system)系统的意思,这个模块可供访问由解释器使用或维护的变量和与解释器进行交互的函数。

  2. sys模块的使用方法

sys.argv     传入文件的参数
sys.path     默认的模块查询目录
sys.version  Python的版本
sys.exit()   退出程序
sys.platform   使用的平台----->win32
sys.stdout.write()    打印不换行
로그인 후 복사

三. json

  1. json模块的作用

    当我们从网上的到一个网页的时候,一般会得到三种数据(从网站上得到的数据最终都是字符串)

      <1>. html  html我们都知道是一种标记语言,具有固定的格式。

      <2>. json  json不是一种语言,但是它具有固定的格式,就是类似字典,元组,列表的格式的字符串,我们可以功过json让其进行相互转换

      <3>. xml   xml是另一种语言,类似于html,也具备固定的格式,有tag,attitude,text等。可以通过xml进行解析

  2. json模块的使用方法

 1 json.loads()        将字符串格式的字典和元组转换成对应的字典或者元组 2     # 例题: 3         import json 4         s1 = &#39;&#39;&#39;{ 5             "name":"hu", 6             "age":1, 7             "gender":"man" 8         }&#39;&#39;&#39; 9         a = json.loads(s1)10         print(a, type(a))11     # 结果:12         {&#39;name&#39;: &#39;hu&#39;, &#39;age&#39;: 1, &#39;gender&#39;: &#39;man&#39;} <class &#39;dict&#39;>13     # 注意s1中不能出现单引号14 15 json.dumps()        将字典或者列表转换成字符串16         17     # 例题:18         import json19         s2 = {&#39;age&#39;: 1, &#39;gender&#39;: &#39;man&#39;, &#39;name&#39;: &#39;hu&#39;}20         a = json.dumps(s2)21         print(a, type(a))    
22     # 结果:   23         {"gender": "man", "age": 1, "name": "hu"} <class &#39;str&#39;>24         25 26 json.dump()     写入中文会是乱码,暂时没有找到转换字符的地方27     # 例题:28         s2 = {29         "name":&#39;zhou&#39;,30         "age":12,31         "gender":"woman"32         }33         import json34         json.dump(s2, open(&#39;test1&#39;, &#39;a&#39;, encoding=&#39;utf-8&#39;))35     # 结果: 追加到test1的内容36             {37         "name":"hu",38         "age":1,39         "gender":"man"40         }{"age": 12, "name": "zhou", "gender": "woman"}41         42         43         44 json.load()         将文件中的字符串转换成字典类型45     # 例题: test1 文件中的内容就是下面的字典46         import json47         a = json.load(open(&#39;test1&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;))48         print(a, type(a))49     # 结果:50         {&#39;name&#39;: &#39;hu&#39;, &#39;gender&#39;: &#39;man&#39;, &#39;age&#39;: 1} <class &#39;dict&#39;>   
로그인 후 복사

四. re

  1. re模块的作用

    re是正则表达式,主要用来对字符串的匹配

  2. re模块的使用方法

    re.match 只在开头进行匹配

    re.search 只匹配第一次匹配到的

    re.findall 匹配所有匹配到的

# 由结果我们可知,# 因为开头没有hu,所以a的返回值为None# 因为search只会匹配第一个,所以只显示了一次hu# 因为findall会匹配所有的,所以显示了两次import re
s1 = "hello, hu, hhh, hu"a = re.match("hu", s1)
b = re.search("hu", s1).group()
c = re.findall("hu", s1)print(a)print(b)print(c)
结果:

None
hu
[&#39;hu&#39;, &#39;hu&#39;]
로그인 후 복사
三种方法的解析

    分组的概念,如果没有分组,默认的groups和groupdict都是空

    group    默认所有的都会放入group中

    groups    只有分组的才会放在groups

    groupdict 只有是字典的才会放在groupdict

# ?P<名称>是字典的写入形式#  从结果我们可以看出来,groups放的是他的组的信息,和字典没有关系# 而groupdict放的是字典,和groups也没有关系import re
s1 = "huello, hu, hhh, hu"a1 = re.match("(?P<name>h)(u)", s1).group()
a2 = re.match("(?P<name>h)(u)", s1).groups()
a3 = re.match("(?P<name>h)(u)", s1).groupdict()print(a1)print(a2)print(a3)
结果:
hu
(&#39;h&#39;, &#39;u&#39;)
{&#39;name&#39;: &#39;h&#39;}
로그인 후 복사
match方法
# 因为他找的只是第一个,所以和match没有太大的区别,# 他们的结果也是一样的import re
s1 = "huello, hu, hhh, hu"a1 = re.search("(?P<name>h)(u)", s1).group()
a2 = re.search("(?P<name>h)(u)", s1).groups()
a3 = re.search("(?P<name>h)(u)", s1).groupdict()print(a1)print(a2)print(a3)
로그인 후 복사
search方法
# findall这个方法本深并没有什么分组不分组的,只是如果有小括号,他只会显示小括号里面的内容,并把他们组合成列表import re
s1 = "huello, hu, hhh, hu"a1 = re.findall("(h)(u)", s1)print(a1)
结果:
[(&#39;h&#39;, &#39;u&#39;), (&#39;h&#39;, &#39;u&#39;), (&#39;h&#39;, &#39;u&#39;)]
로그인 후 복사
findall方法  
import re
s1 = "huello, hu, hhh, hu"# 只要遇到“hu”字符串,就会进行切分,并且删除此字符串a1 = re.split(&#39;hu&#39;, s1)# 遇到第一个“hu”字符串,进行切分,并且删除此字符串,把字符串分割成两块a2 = re.split(&#39;hu&#39;, s1, 1)## 遇到第一个“hu”字符串,进行切分,不会删除此字符串,把字符串分割成三块a3 = re.split(&#39;(hu)&#39;, s1, 1)print(a1)print(a2)print(a3)


结果:
[&#39;&#39;, &#39;ello, &#39;, &#39;, hhh, &#39;, &#39;&#39;]
[&#39;&#39;, &#39;ello, hu, hhh, hu&#39;]
[&#39;&#39;, &#39;hu&#39;, &#39;ello, hu, hhh, hu&#39;]
로그인 후 복사
split方法

五. random

  1. random模块的作用

    random就是为了生成一个随机数

  2. random的应用

    <1>. 验证码的生成

 1 # 导入random模块 2 # 调用random.randrange()模块生成一个随机数 3 # 拼接字符串 4  5 import random 6 yanzhengma = str() 7 for i in range(6): 8     ran = random.randrange(0, 4) 9     if ran == 0 or ran == 2:10         yanzhengma += chr(random.randrange(65, 91))11     else:12         yanzhengma += str(random.randrange(0, 10))13 print(yanzhengma)
로그인 후 복사

六. hashlib

  1. hashlib模块的作用

    hashlib主要用来给字符串进行加密。加密的方法有md5, sha1,sha224, sha256,sha384,sha512

    md5算法是不能反解的

  2. hashlib模块的应用

    <1>. md5的应用  

    加盐是什么呢?

      虽然说md5加密不能反解,但是它只要是同一个密码,用md5生成之后还是一样的,因此,这样的密码还是不安全的,因此我们需要在原来的密码基础上在加上一段只有自己知道的字符,然后生成密码,这样就算是破解了也不会知道自己的密码(这就是我们所说的加盐)

 1 import hashlib 2 # 创建对象   加盐 3 hash = hashlib.md5(bytes(&#39;lljeg&#39;, encoding=&#39;utf-8&#39;)) 4 # 生成密码 5 hash.update(bytes(&#39;hu&#39;, encoding=&#39;utf-8&#39;)) 6 # 显示密码 7 print(hash.hexdigest()) 8  9 #18bd9197cb1d833bc352f47535c0032010 #498e327141378fa4d31e5b4c6543db22
로그인 후 복사

七. getpass

  1. getpass 模块的作用

    getpass主要用来在输入密码的时候不显示,防止密码泄露的。

  2. getpass的应用

    <1>. getpass密码隐藏输入  

# 导入getpass模块,然后使用getpass方法,就可以使密码隐藏输入# 注意的是有时候getpass模块在pycharm是没有办法使用的,只能在终端使用>>> import getpass>>> a = getpass.getpass("Password: ")
Password:>>> print(a)
legj>>>
로그인 후 복사

八. zipfile

  1. zipfile模块的作用

    zipfile主要用于对文件的压缩和解压。

  2. zipfile模块的使用

    <1>. 解压

= zipfile.ZipFile(,
로그인 후 복사

    <2>. 压缩

import zipfile# 创建一个压缩包,以追加的方式写入压缩包zi = zipfile.ZipFile(&#39;我的压缩包.zip&#39;, &#39;a&#39;)# 压缩一个文件到压缩包中zi.write(&#39;config&#39;)
zi.write(&#39;log&#39;)# 关闭压缩文件zi.close()
로그인 후 복사

九. subporcess

  1. subprocess模块的作用

    subprocess专门用于python执行系统命令

  2. subprocess模块的使用方法

 1 # 简单命令 2 call()                  输入是windows终端命令,当命令执行成功,返回1,结果直接打印在终端上(暂时不太清楚和check_all的区别) 3 check_call()            输入的是windows终端命令,当命令执行成功,返回1,否则返回0 
 4 check_output()          输入的是windows终端命令,会把结果返回给一个变量 
 5     # 例题: 6         a = subprocess.call(&#39;ipconfig&#39;, shell=True) 7         b = subprocess.check_call(&#39;ipconfig&#39;) 8         c = subprocess.check_output(&#39;ipconfig&#39;) 9         print(a, b, c)10     # 结果:  11         只有c会有返回值,a和b都是0 
12 #复杂命令13 subprocess.Popen        创建一个可执行复杂命令的对象14 subprocess.PIPE         开辟标准输入输出的管道15     # 例题:16         cmd = subprocess.Popen("python", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)17 18         cmd.stdin.write(&#39;print(1)\n&#39;)19         cmd.stdin.write(&#39;print(2)&#39;)20         cmd.stdin.close()21 22         a = cmd.communicate()23         print(a, type(a))24         25     # 结果:26         (&#39;1\n2\n&#39;, &#39;&#39;) <class &#39;tuple&#39;>
로그인 후 복사

十. logging

  1. logging模块的作用

    logging模块主要用来规范写入日志的格式和写入日志的时间,防止多线程同时修改日志,从而导致日志不安全。

  2. logging的使用方法

# 日志级别CRITICAL = 50FATAL = CRITICAL
    ERROR = 40WARNING = 30WARN = WARNING
    INFO = 20DEBUG = 10NOTSET = 0

写入同一个日志文件中 logging.basicConfig# 例子:import logging
        logging.basicConfig(
            filename=&#39;logging&#39;,
            format = &#39;%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s&#39;,
            datefmt=&#39;%Y-%m-%d %H:%M:%S %p&#39;,
            level=logging.INFO
        )
        logging.error(&#39;sss&#39;)# 结果:2017-06-19 22:18:41 PM - root - ERROR - <encoding error>: 1111写入不同的日志文件中
logging.FileHandler         定义日志文件
logging.Formatter           定义日志文件的格式
logging.Logger              定义日志文件的级别
log.addHandler              添加日志文件
log.critical                写入日志文件# 例子2:import logging# 定义格式file_1 = logging.FileHandler(&#39;log1&#39;, &#39;a&#39;)
        fmt1 = logging.Formatter(&#39;%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s&#39;)
        file_1.setFormatter(fmt1)

        file_2 = logging.FileHandler(&#39;log2&#39;, &#39;a&#39;)
        fmt2 = logging.Formatter()
        file_2.setFormatter(fmt2)#定义级别log = logging.Logger(&#39;lsl&#39;, logging.INFO)
        log.addHandler(file_1)
        log.addHandler(file_2)

        log.critical(&#39;kjjjj&#39;)
로그인 후 복사

十一. xml

  1. xml模块的作用

    由上面的介绍可知,我们去访问一下网站的时候,一般会返回给我们是三种数据,一个就是html,一个是json,一个就是xml,其实xml本身是一门语言,他具有特定的格式,比如tag(标签),attribute(属性),text(内容),基本上也就是这样的格式。下面的就是这样的一种xml语言

#<>中间的第一个单词被称为tag,tag后面的都是属性# 没有被<>包裹的就是text<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year age="19">2022</year>
        <gdppc>14110</gdppc>
    </country>
    <country name="Hu">
        <rank updated="yes">2</rank>
        <year age="19">2022</year>
        <gdppc>14110</gdppc>
    </country>
    <country name="Zhou">
        <rank updated="yes">2</rank>
        <year age="19">2022</year>
        <gdppc>14110</gdppc>
    </country>
    <tt name="hu" />
    <tt name="hu" />
    <tt name="hu" />
    <tt name="hu">
        <vv name="xiaozhou" />
    </tt>
    <tt name="hu">
        <vv name="xiaozhou" />
    </tt>
    <hu hu="sb">
        <zhou zhou="sb" />
    </hu>
</data>
로그인 후 복사
xml文档事例

  2. xml模块的使用方法

    <1>. xml模块对文档的解析

      a. 读取文件得到字符串进行解析

        .tag 得到节点的标签

        .attrib 得到节点的属性

        .text 得到节点的内容

# 导入模块from xml.etree import ElementTree as ET# 读取xml文件内容result = open(&#39;xml&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;).read()# 解析文件内容, 得到root节点的对象root = ET.XML(result)# 通过循环遍历root节点下的节点,得到第一层的标签,属性,和内容for node in root:print(node.tag, node.attrib, node.find("rank").text)


结果:
country {&#39;name&#39;: &#39;Liechtenstein&#39;} 2country {&#39;name&#39;: &#39;Hu&#39;} 2country {&#39;name&#39;: &#39;Zhou&#39;} 2
로그인 후 복사
解析方式一

      b. 直接打开文件进行解析

        .parse 直接打开文件进行解析

        .iter 寻找内容并进行迭代

        .set 设置节点的属性

        .write 写入

# 导入模块from xml.etree import  ElementTree as ET# 通过parse创建一颗树tree = ET.parse(&#39;xml&#39;)# 通过树找到其根节点root = tree.getroot()# 通过循环遍历root节点下的节点,得到第一层的标签,属性,和内容for node in root:print(node.tag, node.attrib, node.find("rank").text)

结果:
country {&#39;name&#39;: &#39;Liechtenstein&#39;} 2country {&#39;name&#39;: &#39;Hu&#39;} 2country {&#39;name&#39;: &#39;Zhou&#39;} 2
로그인 후 복사
解析方式二
# 导入模块from xml.etree import  ElementTree as ET# 通过parse创建一颗树tree = ET.parse(&#39;xml&#39;)# 通过树找到其根节点root = tree.getroot()# 通过循环遍历root节点下的节点,得到第一层的标签,属性,和内容for node in root.iter("year"):# print(node.tag, node.attrib, node.find("rank").text)print(node)
    new_year = int(node.text) + 1node.text = str(new_year)
    node.set("name", "hu")
tree.write("xml")
로그인 후 복사
修改属性和内容 

    <2>. xml模块创建xml文档

from xml.etree import ElementTree as ET# 创建几个节点ele = ET.Element(&#39;man&#39;, {&#39;hu&#39;:&#39;sb&#39;})
son = ET.Element(&#39;woman&#39;, {&#39;zhou&#39;:&#39;sbsb&#39;})

ele.append(son)# 创建一个tree,指向跟节点tree = ET.ElementTree(ele)
tree.write(&#39;outer.xml&#39;)
로그인 후 복사
创建方式一
from xml.etree import ElementTree as ET# 创建几个节点ele = ET.Element(&#39;man&#39;, {&#39;hu&#39;:&#39;sb&#39;})
son = ele.makeelement(&#39;woman&#39;, {&#39;zhou&#39;:&#39;sbsb&#39;})

ele.append(son)# 创建一个tree,指向跟节点tree = ET.ElementTree(ele)
tree.write(&#39;outer.xml&#39;)
로그인 후 복사
创建方式二
from xml.etree import ElementTree as ET

root = ET.Element(&#39;data&#39;, {&#39;sb&#39;:&#39;sb&#39;})
ET.SubElement(root, &#39;root&#39;, {&#39;sb&#39;:&#39;sb&#39;})

tree = ET.ElementTree(root)
tree.write(&#39;outer2&#39;)

tree.write(&#39;outer2&#39;, encoding=&#39;utf-8&#39;, xml_declaration=True)
로그인 후 복사
创建方式三

 

 

위 내용은 Python 시리즈 5 모듈의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿