热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Day2列表、字典、集合操作详解

本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。


Day2-列表、字典、集合

作者:矮哥

归档:学习笔记

2017/01/28


目 录

1.1 列表、元组操作... 1

1.2 字符串操作... 4

1.3 字典操作... 5

1.4 集合操作... 9

1.5 文件操作... 9

1.6 字符编码与转码... 11

1.1 列表、元组操作

列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作

定义列表

技术分享技术分享

1 >>> name = ["Aige","Jackson","Tom"]
2
3 >>> name
4
5 [‘Aige‘, ‘Jackson‘, ‘Tom‘]
6
7 >>>
8

view code

通过下标访问列表中的元素,下标从0开始计数

技术分享技术分享

1 >>> name[0]
2
3 ‘Aige‘
4
5 >>> name[1]
6
7 ‘Jackson‘
8
9 >>> name[2]
10
11 ‘Tom‘
12
13 >>> name[3] #没值就会报错
14
15 Traceback (most recent call last):
16
17 File "", line 1, in <module>
18
19 IndexError: list index out of range
20
21 >>>
22

view code

切片:取多个元素

技术分享技术分享

1 >>> name = ["Aige","Jackson","Tom","Can","David"]
2
3 >>> name[1:3] #取下标1至下标3之间的数字,包括1,不包括3
4
5 [‘Jackson‘, ‘Tom‘]
6
7 >>> name[1:-1] #取下标1至-1的值,不包括-1
8
9 [‘Jackson‘, ‘Tom‘, ‘Can‘]
10
11 >>> name[0:3]
12
13 [‘Aige‘, ‘Jackson‘, ‘Tom‘]
14
15 >>> name[:3] #如果是从头开始取,0可以忽略,跟上句效果一样
16
17 [‘Aige‘, ‘Jackson‘, ‘Tom‘]
18
19 >>> name[3:] #如果想取最后一个,必须不能写-1,只能这么写
20
21 [‘Can‘, ‘David‘]
22
23 >>> name[3:-1] #这样-1就不会被包含了
24
25 [‘Can‘]
26
27 >>> name[0::2] #后面的2是代表,每隔一个元素,就取一个
28
29 [‘Aige‘, ‘Tom‘, ‘David‘]
30
31 >>> name[::2] #和上句效果一样
32
33 [‘Aige‘, ‘Tom‘, ‘David‘]
34

view code

追加

技术分享技术分享

1 >>> names = ["Aige","Jackson","Tom","Can","David"]
2
3 >>> names.append("I am new friend")
4
5 >>> names
6
7 [‘Aige‘, ‘Jackson‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘]
8
9 >>>
10

view code

插入

技术分享技术分享

1 >>> names
2
3 [‘Aige‘, ‘Jackson‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘]
4
5 >>> names.insert(2,"强行从Jackson后面插入")
6
7 >>> names
8
9 [‘Aige‘, ‘Jackson‘, ‘强行从Jackson后面插入‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘]
10
11 >>>
12

view code

修改

技术分享技术分享

1 >>> names
2
3 [‘Aige‘, ‘Jackson‘, ‘强行从Jackson后面插入‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘]
4
5 >>> names[2]="谁叫你插的,走开"
6
7 >>> names
8
9 [‘Aige‘, ‘Jackson‘, ‘谁叫你插的,走开‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘]
10
11 >>>
12

view code

删除

技术分享技术分享

1 >>> names
2
3 [‘Aige‘, ‘Jackson‘, ‘谁叫你插的,走开‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘]
4
5 >>> del names[2] #指定位置删除
6
7 >>> names
8
9 [‘Aige‘, ‘Jackson‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘]
10
11 >>> names.remove("Tom") #指定元素删除
12
13 >>> names
14
15 [‘Aige‘, ‘Jackson‘, ‘Can‘, ‘David‘, ‘I am new friend‘]
16
17 >>> names.pop() #删除最后一个
18
19 ‘I am new friend‘
20
21 >>> names
22
23 [‘Aige‘, ‘Jackson‘, ‘Can‘, ‘David‘]
24
25 >>>
26

view code

扩展

技术分享技术分享

1 >>> names
2
3 [‘Aige‘, ‘Jackson‘, ‘Can‘, ‘David‘]
4
5 >>> b = ["扩展","I am",1,2,3]
6
7 >>> names.extend(b)
8
9 >>> names
10
11 [‘Aige‘, ‘Jackson‘, ‘Can‘, ‘David‘, ‘扩展‘, ‘I am‘, 1, 2, 3]
12
13 >>>
14

view code

拷贝

技术分享技术分享

1 >>> names = ["aige",["waihao","can"]]
2
3 >>> names
4
5 [‘aige‘, [‘waihao‘, ‘can‘]]
6
7 >>> names2 = names.copy() #浅COPY,只拷贝了一层
8
9 >>> names2
10
11 [‘aige‘, [‘waihao‘, ‘can‘]]
12
13 >>> names[0] = "AIGE"
14
15 >>> names
16
17 [‘AIGE‘, [‘waihao‘, ‘can‘]]
18
19 >>> names2
20
21 [‘aige‘, [‘waihao‘, ‘can‘]]
22
23 >>> names[1][0] = "外号"
24
25 >>> names
26
27 [‘AIGE‘, [‘外号‘, ‘can‘]]
28
29 >>> names2
30
31 [‘aige‘, [‘外号‘, ‘can‘]]
32
33 >>>
34
35 import copy
36
37 names4 = copy.copy(names)
38
39 names[1] = "CAN"
40
41 print(names,names4) #这个也是浅copy
42
43 names5 = copy.deepcopy(names)
44
45 names[0] = "哈哈"
46
47 names[2][0] = "阿雷克斯"
48
49 print(names,names5) #深copy 一般不用‘‘‘
50

view code

统计

技术分享技术分享

1 >>> count_list = [1,2,1,2,3,4,5,7,1,1,0]
2
3 >>> count_list.count("1")
4
5 0
6
7 >>> count_list.count(1)
8
9 4
10
11 >>>
12

view code

排序和翻转

技术分享技术分享

1 >>> names = ["aige","Can","Jack","Tom"]
2
3 >>> names
4
5 [‘aige‘, ‘Can‘, ‘Jack‘, ‘Tom‘]
6
7 >>> names.sort() #特别提醒,不同类型数据,不能排序
8
9 >>> names
10
11 [‘Can‘, ‘Jack‘, ‘Tom‘, ‘aige‘] #按照ASCII排序
12
13 >>> names.reverse()
14
15 >>> names
16
17 [‘aige‘, ‘Tom‘, ‘Jack‘, ‘Can‘]
18
19 >>>
20

view code

获取下标(索引)

技术分享技术分享

1 >>> names
2
3 [‘aige‘, ‘Tom‘, ‘Jack‘, ‘Can‘]
4
5 >>> names.index("Jack")
6
7 2
8
9 >>>
10

view code

元组

元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表

语法

1 names = ("Aige","jack","eric") #中括号换小括号,既是元组


1.2 字符串操作

特性:不可修改

技术分享技术分享

1 name = "my name is aige {names}"
2
3 print(name.capitalize()) #首字母大写
4
5 print(name.count("a")) #统计字母个数
6
7 print(name.center(20,"-"))
8
9 print(name.endswith("e")) #以什么结尾
10
11 print(name.find("aige")) #字符的索引,字符串可以切片
12
13 print(name.format(names="AIGE"))
14
15 print(name.isalnum()) #包含英文字符和阿拉伯数字
16
17 print(name.isalpha()) #纯英文字符
18
19 print(name.isdigit()) #是不是整数
20
21 print(name.isidentifier()) #判断是不是合法的标识符 是不是合法变量名
22
23 print(name.islower())
24
25 print(name.isnumeric()) #只有数字,不能有小数点
26
27 print(name.istitle()) #每个字母开头大写
28
29 print(name.isupper()) #大写
30
31 print(‘+‘.join([‘1‘,‘2‘,‘3‘]))
32
33 print( name.ljust(50,"*") ) #不够50字节用*号补上
34
35 print( name.rjust(50,"@"))
36
37 print( name.lower())
38
39 print( name.upper())
40
41 print( "\nalex\n".lstrip()) #去掉左边的空格和回车
42
43 print( "\nalex\n".rstrip()) #去右边
44
45 print("\n alex \n".strip()) #去两边
46
47 p = str.maketrans("abcdef","123456")
48
49 print("aige Zhang".translate(p)) #一一对应的换,有点类似shell:tr命令
50
51 print("aige aige".replace("a","A")) #替换
52
53 print("aige aige".replace("a","A",1)) #替换一个
54
55 print("aige aige".rfind(‘e‘)) #找到最后一个被找到的地方
56
57 print("bingo nice gogo".split()) #字符串转成列表
58
59 print("bingo \n hahaha".splitlines()) #换行符换成列表
60
61 print("aige".startswith("a"))
62
63 print("Aige zhang".swapcase()) #大小写转换
64
65 print("aige can".title())
66
67 print("aige aige ".zfill(30))
68

view code

1.3 字典操作

字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。

语法:

技术分享技术分享

1 info = {
2
3 ‘stu001‘:"aige", #键值和value对应关系
4
5 ‘stu002‘:"can", #通过key查找value
6
7 ‘stu003‘:"happy", #字典是无序
8
9 }
10

view code

字典的特性:

l dict是无序的

l key必须是唯一的,so 天生去重

增加

1 >>> names = {"stu001":"Aige","stu002":"Jack","stu003":"Tom"}
2
3 >>> names
4
5 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Tom‘}
6

修改

1 >>> names["stu004"] = "新人"
2
3 >>> names
4
5 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Tom‘, ‘stu004‘: ‘新人‘}
6
7 >>> names["stu004"] = "已经认识了:张三"
8
9 >>> names
10
11 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Tom‘, ‘stu004‘: ‘已经认识了:张三‘}
12

删除

技术分享技术分享

1 >>> names.pop("stu004")
2
3 ‘已经认识了:张三‘
4
5 >>> names
6
7 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Tom‘}
8
9 >>> names
10
11 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Tom‘}
12
13 >>> del names["stu003"]
14
15 >>> names
16
17 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘}
18
19 >>>
20
21 >>> names
22
23 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Jack‘, ‘stu004‘: ‘Tom‘, ‘stu005‘: ‘Harry‘, ‘stu006‘: ‘HengYuansan‘}
24
25 >>> names
26
27 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Jack‘, ‘stu004‘: ‘Tom‘, ‘stu005‘: ‘Harry‘, ‘stu006‘: ‘HengYuansan‘}
28
29 >>> names.popitem() ##随机删
30
31 (‘stu006‘, ‘HengYuansan‘)
32
33 >>> names.popitem()
34
35 (‘stu005‘, ‘Harry‘)
36
37 >>> names.popitem()
38
39 (‘stu004‘, ‘Tom‘)
40
41 >>>
42

view code

查找

技术分享技术分享

1 >>> info = {‘stu002‘: ‘LongZe Luola‘, ‘stu003‘: ‘XiaoZe Maliya‘}
2
3 >>> "stu002" in info
4
5 True
6
7 >>> info.get("stu002") #没有key值也不会报错
8
9 ‘LongZe Luola‘
10
11 >>> info["stu002"]
12
13 ‘LongZe Luola‘
14
15 >>> info["stu004"] #没有key值就会报错
16
17 Traceback (most recent call last):
18
19 File "", line 1, in <module>
20
21 KeyError: ‘stu004‘
22
23 >>> info.get("stu004")
24
25 >>>
26

view code

多级字典嵌套及操作

技术分享技术分享

1 av_catalog = {
2
3 "欧美":{
4
5 "www.youporn.com": ["很多免费的,世界最大的","质量一般"],
6
7 "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
8
9 "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
10
11 "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"]
12
13 },
14
15 "日韩":{
16
17 "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
18
19 },
20
21 "大陆":{
22
23 "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
24
25 }
26
27 }
28
29 av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来"
30
31 print(av_catalog["大陆"]["1024"])
32
33 #ouput
34
35 [‘全部免费,真好,好人一生平安‘, ‘服务器在国外,慢,可以用爬虫爬下来‘]
36
37 #嵌套了很多层 key尽量不写中文
38
39 av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来"
40
41 print(av_catalog["大陆"]["1024"])
42
43 #ouput[‘全部免费,真好,好人一生平安‘, ‘服务器在国外,慢,可以用爬虫爬下来‘]
44
45 print(av_catalog.values()) #打印所有得值 不包括key值
46
47 print(av_catalog.keys()) #打印所有得key
48
49 av_catalog.setdefault("taiwan",{"www.baidu.com":[1,2]}) #字典里有的不改变。没有的改变
50
51 print(av_catalog)
52
53 av_catalog.setdefault("taiwan",{"haha":[000]}) #字典里有
54
55 print(av_catalog)
56

view code

程序练习

程序: 三级菜单

要求:

1. 打印省、市、县三级菜单

2. 可返回上一级

3. 可随时退出程序

技术分享技术分享

1 #!/usr/bin/env python
2 # _*_ coding:utf-8 _*_
3
4 menu = {
5 ‘北京‘:{
6 ‘海淀‘:{
7 ‘五道口‘:{
8 ‘soho‘:{},
9 ‘网易‘:{},
10 ‘google‘:{}
11 },
12 ‘中关村‘:{
13 ‘爱奇艺‘:{},
14 ‘汽车之家‘:{},
15 ‘youku‘:{},
16 },
17 ‘上地‘:{
18 ‘百度‘:{},
19 },
20 },
21 ‘昌平‘:{
22 ‘沙河‘:{
23 ‘老男孩‘:{},
24 ‘北航‘:{},
25 },
26 ‘天通苑‘:{},
27 ‘回龙观‘:{},
28 },
29 ‘朝阳‘:{},
30 ‘东城‘:{},
31 },
32 ‘上海‘:{
33 ‘闵行‘:{
34 "人民广场":{
35 ‘炸鸡店‘:{}
36 }
37 },
38 ‘闸北‘:{
39 ‘火车战‘:{
40 ‘携程‘:{}
41 }
42 },
43 ‘浦东‘:{},
44 },
45 ‘山东‘:{},
46 }
47
48
49 exit_flag = False
50 current_layer = menu
51
52 layers = [menu]
53
54 while not exit_flag:
55 for k in current_layer:
56 print(k)
57 choice = input(">>:").strip()
58 if choice == "b":
59 current_layer = layers[-1]
60 #print("change to laster", current_layer)
61 layers.pop()
62 elif choice not in current_layer:continue
63 else:
64 layers.append(current_layer)
65 current_layer = current_layer[choice]

view code

1.4 集合操作

集合是一个无序的,不重复的数据组合,它的主要作用如下:

l 去重,把一个列表变成集合,就自动去重了

l 关系测试,测试两组数据之前的交集、差集、并集等关系

常用操作

技术分享技术分享

1 list_1 = [1,2,3,1,2,4,5,6]
2
3 list_2 = set(list_1)
4
5 list_3 = set([1,2,3,4,8,9,0])
6
7 print(list_2,type(list_2))
8
9 print(list_3,type(list_3))
10
11 print( list_2.intersection(list_3) ) #取交集
12
13 print( list_2 & list_3) #交集
14
15 #print( list_2.intersection_update(list_3)) #交集后给list_2赋值
16
17 print( list_2.union(list_3) ) #取并集
18
19 print( list_2 | list_3) #并集
20
21 print( list_2.difference(list_3) ) #差集
22
23 print( list_2 - list_3) #差集
24
25 print( list_3.difference(list_2) ) #差集
26
27 print( list_2.issubset(list_3)) #子集
28
29 list_4 = set([1,2])
30
31 print( list_4.issubset(list_1)) #4是1子集
32
33 print( list_2.symmetric_difference(list_3)) #对称差集 ,去掉了合集
34
35 print( list_2 ^ list_3) #对称差集
36
37 list_5 = set([10,15])
38
39 print(list_2.isdisjoint(list_5)) #没交集,返回True
40
41 list_5.add(999) #添加
42
43 print(list_5)
44
45 list_2.remove(3) #没值会报错
46
47 list_2.discard(3) #没值不会报错
48

view code

1.5 文件操作

对文件操作流程

1. 打开文件,得到文件句柄并赋值给一个变量

2. 通过句柄对文件进行操作

3. 关闭文件

现有文件如下

文件操作:

技术分享技术分享

1 #!/usr/bin/env python
2 # _*_ coding:utf-8 _*_
3
4 #data = open("aige",encoding="utf-8").read()
5 # f = open("aige",encoding="utf-8") #文件句柄,就是文件的内存对象
6 # data = f.read() #读到文件末尾
7 # data2 = f.read() #从末尾开始读。没有任何内容了
8 # print(data)
9 # print("-------------",data2)
10
11 # f = open("aige2","w",encoding="utf-8") #创建一个文件。覆盖之前的文件名了
12 #
13 # f.write("我爱北京天安门\n")
14 # f.write("天安门上太阳升")
15
16
17 # f = open("aige2","a",encoding="utf-8") #追加 #也不能读
18 # f.write("我爱北京天安门")
19 # f.close()
20 # f = open("aige",encoding="utf-8")
21 # print(f.readline()) #一行行的读
22 # print(f.readline())
23 # print(f.readline())
24 # print(f.readline())
25 # for i in range(5):
26 # print(f.readline())
27 # print(f.readlines()) #生成列表
28
29 # for index,line in enumerate(f.readlines()): # f.readlines()只适合读小文件 #取消打印第十行
30 # if index == 9:
31 # print("分割线----------------------")
32 # continue
33 # print(line.strip())
34 # count = 0
35 # for line in f: #效率高,比上面的高,上面是先加载整个文件到内存,下面是读一行删一行
36 # count += 1
37 # if count == 10:
38 # print("----------------")
39 # continue
40 # print(line)
41 # f = open("aige",encoding="utf-8")
42 # print(f.tell())
43 # f.read(5)
44 # print(f.tell())
45 # f.seek(0)
46 # print(f.tell())
47 # print(f.encoding)
48 # print(f.fileno()) #返回文件编号
49 # f.seekable() #判断文件是否可以跳转
50 # f.readable() #判断文件是否可读
51 # f.flush() #刷 把内存的写入硬盘
52 f = open("aige","a", encoding="utf-8")
53 # f.seek(10)
54 # f.truncate(100) #截断 无论seek到哪,都是从头开始截
55 f.close()
56
57
58
59

view code

打开文件的模式有:

r,只读模式(默认)。

w,只写模式。【不可读;不存在则创建;存在则删除内容;】

a,追加模式。【可读; 不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

r+,可读写文件。【可读;可写;可追加】

w+,写读

a+,同a

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

rU

r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

rb

wb

ab

1.6 字符编码与转码

http://www.cnblogs.com/yuanchenqi/articles/5956943.html


推荐阅读
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • andr ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • MATLAB实现n条线段交点计算
    本文介绍了一种通过逐对比较线段来求解交点的简单算法。此外,还提到了一种基于排序的方法,但该方法较为复杂,尚未完全理解。文中详细描述了如何根据线段端点求交点,并判断交点是否在线段上。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 以下实例展示了locals( ... [详细]
  • VPX611是北京青翼科技推出的一款采用6U VPX架构的高性能数据存储板。该板卡搭载两片Xilinx Kintex-7系列FPGA作为主控单元,内置RAID控制器,支持多达8个mSATA盘,最大存储容量可达8TB,持续写入带宽高达3.2GB/s。 ... [详细]
  • 本文介绍如何在Linux服务器之间使用SCP命令进行文件传输。SCP(Secure Copy Protocol)是一种基于SSH的安全文件传输协议,支持从远程机器复制文件到本地服务器或反之。示例包括从192.168.45.147复制tomcat目录到本地/home路径。 ... [详细]
  • 本文详细介绍了如何在CentOS 7操作系统上安装和配置Grafana,包括必要的依赖项安装、插件管理以及服务启动等步骤。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
author-avatar
anilshen_333
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有