博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
class 2-3 小项目练习
阅读量:5244 次
发布时间:2019-06-14

本文共 17726 字,大约阅读时间需要 59 分钟。

空气质量分指数计算方法(框架)

1 def cal_liner(iaqi_lo,iaqi_hi,bp_lo,bp_hi,cp): 2     """范围缩放""" 3     iaqi =(iaqi_hi - iaqi_lo)*(cp -bp_lo) /(bp_hi - bp_lo) + iaqi_lo 4     return iaqi 5  6 def cal_pm_iaqi(pm_val): 7     if 0 <= pm_val <36: 8         pm_iaqi = cal_liner(0,50,0,35,pm_val) 9     elif 36 <= pm_val <76:10         pm_iaqi = cal_liner(0,100,35,75,pm_val)11     elif 76 <= pm_val < 116:12         pm_iaqi = cal_liner(0, 150, 75, 115, pm_val)13     else:14         pass15 16 def cal_co_iaqi(co_val):17     if 0 <= co_val <3:18         co_iaqi = cal_liner(0,50,0,3,co_val)19     elif 3 <= co_val <5:20         co_iaqi = cal_liner(0,100,2,4,co_val)21     else:22         pass23 24 def cal_aqi(param_list):25     pm_val = param_list[0]26     co_val = param_list[1]27     pm_iaqi = cal_pm_iaqi(pm_val)28     co_iaqi = cal_pm_iaqi(co_val)29     iaqi_list = []30     iaqi_list.append(pm_iaqi)31     iaqi_list.append(co_iaqi)32 33     aqi = max(iaqi_list)34     return aqi35 36 def main():37     print('请输入以下信息,使用空格分割')38     input_str = input('(1)PM2.5 (2)CO:')39     str_list = input_str.split(' ')40     pm_val = float(str_list[0])41     co_val = float(str_list[1])42     param_list = []43     param_list.append(pm_val)44     param_list.append(co_val)45     #调用AQI计算函数46     aqi_val = cal_aqi(param_list)47     print('空气质量指数为:{}'.format(aqi_val))48 49 if __name__ ==  '__main__':50     main()
View Code
  • JSON(javaScript Object Notation)是一种轻量级数据交换格式
  • 可以对复杂数据进行表达和存储,易于阅读和理解
  • 规则
    • 数据保存在键值对中
    • 键值对之间由逗号分隔
    • 花括号用于保存键值对数据组成的对象
    • 方括号用于保存键值对数据组成的数组
  • 采用对象,数组方式组织起来的键值对可以表示任何结构的数据
  • JSON格式是互联网上主要使用的复杂数据格式之一
  • JSON库是处理JSON格式的python标准库
  • 两个过程:
    • 编码,将python数据类型准换成json格式的过程
    • 解码,从json格式中解析数据对应到python数据类型的过程
      • dumps():将Python数据类型转换为JSON格式的过程
      • loads():将JSON格式字符串转换为Python数据类型
      • dump():与dumps()功能一致,输出到文件
      • load():与loads()功能一致,从文件读入
  • 列表排序
    • list.sort(func)
    • func指定排序的方法
    • func可以通过lambda函数实现
      --snip--    city_list.sort(key= lambda city:city['aqi']) #func:函数为lambda,city为元素    top5_list = city_list[:5] #切片拿取前5个元素    f = open('top5_aqi.json',mode='w',encoding='utf-8')    json.dump('top5_list',f,ensure_ascii=False)   #第二元素为打开文件对象,最后为编码格式,中文false    f.close
  • 1 import json 2  3 def process_json_file(filepath): 4     f = open(filepath,mode='r',encoding='utf-8') 5     json.load(f) 6     city_list = json.load(f) 7     return city_list 8  9 def main():10     filepath = input('请输入json文件名称:')11     city_list = process_json_file(filepath)12     city_list.sort(key= lambda city:city['aqi']) #func:函数为lambda,city为元素13     top5_list = city_list[:5] #切片拿取前5个元素14     f = open('top5_aqi.json',mode='w',encoding='utf-8')15     json.dump('top5_list',f,ensure_ascii=False)   #第二元素为打开文件对象,最后为编码格式,中文false16     f.close17 18 if __name__ ==  '__main__':19     main()
    View Code
  • CSV格式是一种通用的、相对简单的文件格式,在商业和科学领域广泛使用
  • 规则
    • 以行为单位
    • 每行表示一条记录
    • 以英文逗号分割每列数据(如果数据为空,逗号也要保留)
    • 列名通常放置在问价第一行
  • CSV文件操作
    • import csv
    • csv.writerow(list)将列表中的元素写入文件的一行中
  • CSV文件读取
    • import csv
    • csv.reader()将每行记录作为列表返回
    • 使用with语句操作文件对象
      with open('file_name') as somefile:    for line in somefile:        print(line)
    • 使用with语句,不管在处理文件过程中是否发生发生异常,都能保证with语句执行完毕后关闭文件,不需要close语句
--snip--lines.append(list(city_list[0].key()))  #使用list拿到city的keys    for city in city_list:        lines.append(list(city.values()))    f = open('aqi.csv','w',encoding='utf-8',newline='')  #newline为空表示末尾不加任何字符,否则默认加空行    writer = csv.writer(f)    for line in lines:        writer.writerow(line)--snip--
1 import json 2 import csv 3 def process_json_file(filepath): 4     f = open(filepath,mode='r',encoding='utf-8') 5     city_list = json.load(f) 6     return city_list 7  8 def main(): 9     filepath = input('请输入json文件名称:')10     city_list = process_json_file(filepath)11     city_list.sort(key= lambda city:city['aqi']) #func:函数为lambda,city为元素12     lines = []13     lines.append(list(city_list[0].key()))  #使用list拿到city的keys14     for city in city_list:15         lines.append(list(city.values()))16     f = open('aqi.csv','w',encoding='utf-8',newline='')  #newline为空表示末尾不加任何字符,否则默认加空行17     writer = csv.writer(f)18     for line in lines:19         writer.writerow(line)20 21 if __name__ ==  '__main__':22     main()
View Code
  •  OS模块
    • OS模块提供了与系统、目录操作相关的功能,不受平台限制
    • os.remove():删除文件
    • os.makedirs():创建多层目录
    • os.rmdir():删除单级目录
    • os.rename():重命名文件
    • os.path.isfile():判断是否为文件
    • os.path.isdir():判断是否为目录
    • os.path.join():链接目录,如path1链接path2为path1/path2
    • os.path.splitext():将文件分割成文件名与扩展名,如分割tmp.txt为tmp和.txt
      import csvimport osdef process_json_file(filepath):   #解码json文件    # f = open(filepath,mode='r',encoding='utf-8')    # city_list = json.load(f)    # return city_list    with open(filepath,mode='r',encoding='utf-8') as f:    #with语句不需要关闭文件        city_list =json.load(f)    print(city_list)def process_csv_file(filepath):    with open('filepath',mode='r',encoding='utf-8',newline='') as f:        reader = csv.reader(f)        for row in reader:            print(','.jion(row))     #通过逗号连接语句,.jion
      1 import json 2 import csv 3 import os 4 def process_json_file(filepath):   #解码json文件 5     # f = open(filepath,mode='r',encoding='utf-8') 6     # city_list = json.load(f) 7     # return city_list 8     with open(filepath,mode='r',encoding='utf-8') as f:    #with语句不需要关闭文件 9         city_list =json.load(f)10     print(city_list)11 def process_csv_file(filepath):12     with open('filepath',mode='r',encoding='utf-8',newline='') as f:13         reader = csv.reader(f)14         for row in reader:15             print(','.jion(row))     #通过逗号连接语句,.jion16 17 def main():18     filepath = input('请输入json文件名称:')19     filename,file_ext = os.path.splitext(filepath)20     if file_ext == '.json':21         process_json_file(filepath)22     elif file_ext == '.csv':23         process_csv_file(filepath)24     else:25         print('不支持文件格式!')26 27 if __name__ ==  '__main__':28     main()
      View Code

 网络爬虫:

  • 自动爬去互联网信息程序;利用互联网数据进行分析、开发产品
  • 步骤
    • 通过网络链接获取网页内容(字符串)
    • 对获得的网页内容进行处理

requests模块

  • requests模块时一个简洁且简单的处理HTTP请求工具,支持丰富的链接访问功能,包括url获取,HTTP会话,Cookie记录等
  • requests网页请求
    • get():对应HTTP的GET方式
    • post():对应HTTP的POST方式,用于传递用户数据
  • requests对象属性
    • status_code:HTTP请求的返回状态,200表示链接成功,400表示失败
    • text:HTTP相应内容的字符串形式,即URL 对应的页面内容
    • 更多方法参考:https://doc.python-requests.org/
import requestsdef get_html_text(url):    """返回url的文本"""    r = requests.get(url,timeout =30)    #print(r.status_code)    #显示状态,200为链接ok    return r.text   #获取文本def main():    city_pinyin = input('请输入城市拼音:')    url = 'http://pm25.in/'+city_pinyin    url_text = get_html_text(url)    #print(url_text)      #属性名r.text d调用为url.text    aqi_div='''
''' #注意复制范围,一直取值到数字的前面,可能会有空格 index = url_text.find(aqi_div) begin_index = index +len(aqi_div) #从开始索引号'<'加上文本长度 end_index = begin_index + 2 #再获取2位为AQI值 aqi_value = url_text[begin_index: end_index] print('空气质量为:{}'.format(aqi_value)) if __name__ == '__main__': main()

 网页解析

  • 解析器输出的树是由DOM元素和属性节点组成的。DOM的全称为:Document Object Model。它是HTML文档的对象化描述,也是HTML元素与外界(如Javascript)的接口。 DOM与标签有着几乎一一对应的关系,如下:   

    hello world

  • beautifulSoup解析网站(用于解析HTML或XML)
    • pip install beautifulsoup4
    • import bs4
    • 步骤
      • 创建BeautifulSoup对象
      • 查询节点
        • find, 找到第一个满足条件的节点
        • find_all,找到所有满足条件的节点
  • 例:创建BeautifulSoup对象 
    bs = BeautifulSoup(        url,        html_parser, 指定解析器    #一般默认lxml        encoding  指定编码格式(确保和网页编码格式一致)  #如果不一致会出现乱码        )
  •  查找节点
    • <a href='a.html' class='a_link'>next page</a>
    • 可按节点类型、属性内容访问
    • 按类型查找节点
      • bs.find_all('a')       #查找到所有a标签
    • 按属性查找节点
      • bs.find_all('a',href='a.html')     #查找a标签,到所有符合a.html属性
      • bs.find_all('a',href='a.html',string='next page')
      • bs.find_all('a',class_='a.link')        #注意:是class_
      • 或者bs.find_all('a',{'class':'a_link'})
import requestsfrom bs4 import BeautifulSoupdef get_city_aqi(city_pinyin):    url = 'http://pm25.in/'+city_pinyin    r = requests.get(url,timeout=30)    bs = BeautifulSoup(r.text,'lxml')    #bs = BeautifulSoup.find_all('div','span')     div_list= bs.find_all('div',{
'class':'span1'}) #遗漏 city_AQI=[] for i in range(8): div_content = div_list[i] #对其list进行遍历 aqi = div_content.find('div',{
'class':'value'}).text.strip() #AQI = bs.find_all('div','value').text.strip() #应以键值对出现 caption = div_content.find('div',{
'class':'caption'}).text.strip() #city_AQI = city_AQI.append((caption, aqi)) city_AQI.append((caption, aqi)) return city_AQIdef main(): city_pinyin = input('请输入城市拼音:') city_aqi =get_city_aqi(city_pinyin) print(city_aqi)if __name__ == '__main__': main()

 遍历城市

1 import requests 2 from bs4 import BeautifulSoup 3  4 def get_city_aqi(city_pinyin): 5     url = 'http://pm25.in/'+city_pinyin 6     r = requests.get(url,timeout=30) 7     bs = BeautifulSoup(r.text,'lxml') 8     div_list= bs.find_all('div',{
'class':'span1'}) 9 city_AQI=[]10 for i in range(8):11 div_content = div_list[i]12 aqi = div_content.find('div',{
'class':'value'}).text.strip()13 caption = div_content.find('div',{
'class':'caption'}).text.strip()14 city_AQI.append((caption, aqi))15 return city_AQI16 17 def get_all_cities():18 url = 'http://pm25.in/'19 city_list = []20 r = requests.get(url, timeout=30)21 bs = BeautifulSoup(r.text, 'lxml')22 city_all_name = bs.find_all('div', {
'class': 'bottom'})[1]23 city_link_list = city_all_name.find_all('a')24 #for i in city_all_name: 此段只要一个bottom元素,将无法输出25 for city_link in city_link_list:26 city_name = city_link.text27 city_pinyin = city_link['href'][1:]28 #r = city_all_name[1]29 #city_name = r.find('div',{'href':'city_link'}).text.strip()30 #city_link = r.find('div',{'href':'city_link'})[1:]31 city_list.append((city_name,city_pinyin))32 return city_list33 34 def main():35 city_list = get_all_cities()36 for city in city_list:37 city_name =city[0]38 city_pinyin = city[1]39 city_aqi =get_city_aqi(city_pinyin)40 print(city,city_aqi)41 42 if __name__ == '__main__':43 main()
View Code
--snip--def get_all_cities():    url = 'http://pm25.in/'    city_list = []    r = requests.get(url, timeout=30)    bs = BeautifulSoup(r.text, 'lxml')    city_all_name = bs.find_all('div', {
'class': 'bottom'})[1] city_link_list = city_all_name.find_all('a') #寻找所有bottom下的a标签 for city_link in city_link_list: city_name = city_link.text #取city_link文本 city_pinyin = city_link['href'][1:] #取其‘/’后的数字 city_list.append((city_name,city_pinyin)) return city_listdef main(): city_list = get_all_cities() for city in city_list: #对获取列表进行遍历输出 city_name =city[0] city_pinyin = city[1] city_aqi =get_city_aqi(city_pinyin) print(city,city_aqi) #注意为city,city_list将重复报错if __name__ == '__main__': main()

 字符串加列表 ‘abc’+[1,2,3]转换为['abc']+[1,2,3] 

存入转换为CSV格式

1 import requests 2 from bs4 import BeautifulSoup 3 import csv 4  5 def get_city_aqi(city_pinyin): 6     url = 'http://pm25.in/'+city_pinyin 7     r = requests.get(url,timeout=30) 8     bs = BeautifulSoup(r.text,'lxml') 9     div_list= bs.find_all('div',{
'class':'span1'})10 city_AQI=[]11 for i in range(8):12 div_content = div_list[i]13 aqi = div_content.find('div',{
'class':'value'}).text.strip()14 caption = div_content.find('div',{
'class':'caption'}).text.strip()15 city_AQI.append(aqi)16 return city_AQI17 18 def get_all_cities():19 url = 'http://pm25.in/'20 city_list = []21 r = requests.get(url, timeout=30)22 bs = BeautifulSoup(r.text, 'lxml')23 city_all_name = bs.find_all('div', {
'class': 'bottom'})[1]24 city_link_list = city_all_name.find_all('a')25 for city_link in city_link_list:26 city_name = city_link.text27 city_pinyin = city_link['href'][1:]28 city_list.append((city_name,city_pinyin))29 return city_list30 31 def main():32 city_list = get_all_cities()33 header = ['City','AQI','PM2.5/1H','PM10/H','CO/H','NO2/H','O3/1H','O3/8H','SO2/H',] #指定列名34 with open('china_city_AQI.csv','w',encoding='utf-8',newline='') as f:35 writer = csv.writer(f)36 writer.writerow(header)37 for i,city in enumerate(city_list): #enumerate科学计数法38 if (i+1)%10 ==0: #实时查看处理进度39 print('已处理{}条记录,共{}记录'.format(i+1,len(city_list)))40 city_name = city[0]41 city_pinyin = city[1]42 city_aqi = get_city_aqi(city_pinyin)43 row= [city_name]+city_aqi #字符串转换为列表格式[]44 writer.writerow(row)45 46 if __name__ == '__main__':47 main()
View Code
--snip--def main():    city_list = get_all_cities()    header = ['city','AQI','PM2.5/1H','PM10/H','CO/H','NO2/H','O3/1H','O3/8H','SO2/H'] #指定列名    with open('china_city_AQI.csv','w',encoding='utf-8',newline='') as f:        writer = csv.writer(f)        writer.writerow(header)        for i,city in enumerate(city_list):   #enumerate科学计数法            if (i+1)%10 ==0:                print('已处理{}条记录,共{}记录'.format(i+1,len(city_list)))            city_name = city[0]            city_pinyin = city[1]            city_aqi = get_city_aqi(city_pinyin)            row= [city_name]+city_aqi            writer.writerow(row)if __name__ ==  '__main__':    main()

Pandas库:

    • 是一个结构化数据的工具集  
    • 基础为Numpy,提供了高性能的矩阵运算
    • 应用,数据挖掘,数据分析
      • 学生成绩分析、股票数据分析  
    • 提供数据清洗功能  
  • Pandas的数据结构(Series)
    • 类似一维数组的对象  
    • 通过list构建Series
      • ser_obj = pd.Series(range(10))  
      • 例:
    • 由数据和索引组成
      • 索引在左,数据在右
      • 索引是自动创建的  
    • 获取数据和索引
      • ser_obj.index,ser_obj.values  
    • 预览数据
      • ser_obj.head(n) #输出数据前几条数据  
      • wer_obj.tail(n)  #数据数据后几条数据  
      • 例:
    • 通过索引获取数据
      • ser_obj[idx]  
    • 索引与数据的对应关系仍保持在数组的运算的结果中国  
    • 通过dict构建Series  
    • name属性
      • ser_obj.name, ser_obj.index.name  
  • DataFrame
    • 类似多维数组、表格数据(如,Excel,R中的data.frame
    • 每列数据可以是不同类型,what about ndarray?  
    • 索引包括列索引和行索引
    • 通过ndarray构建DataFrame  
    • 通过dict构建DataFrame  
    • 通过索引获取列数据(Series类型)
      • df_obj[col_idx]或df_obj.col_idx  
    • 增加列数据,类似dict添加key-value
      • df_obj[new_col_idx] = data  
    • 删除列
      • del df_obj[col_idx]
  •  索引操作
    • DataFrame索引
      • 列索引
        • df_obj[ 'label' ]   #label为标签名。。。
      • 不连续索引
        • df_obj[[ 'label1', 'label2' ]]  #中间的[]表示传进去的的为列表
          import pandas as pddef main():    aqi_data = pd.read_csv('china_city_AQI.csv')    #print(aqi_data.head(5))    #print(aqi_data['AQI'])    print(aqi_data[['city','AQI']]) #中间的中括号为列表if __name__ ==  '__main__':    main()
          View Code
  • 排序
    • sort_index,索引排序
      • 对DataFrame操作时注意轴方向
    • 按值排序
      • sort_values(by = 'label')    #label为标签名 AQI。。。
  • 常用统计计算
    • sum,mean,max,min.....
    • axis=0按列统计,axis=1 按行统计
    • skipna排除缺失值,默认为True
    • idmax,idmin,cumsum
  • 统计描述
    • describe产生多个统计数据
    • 常用统计计算和描述
      • count:非NA值得数量
      • describe:针对series或各DataFrame列计算汇总统计
      • min,max:计算最小值,最大值
      • argmin,argmax:计算能够获取到最小值和最大值的索引位置(整数)
      • idxmin,idxmax:计算能够获取到最小值和最大值的索引值
      • quantile:计算样本的分数位(0到1)
      • sum:值得总和
      • mean:值得平均数
      • median:值的算术中位数(50%分位数)
      • mad:根据平均值计算平均绝对离差
      • var:样本值的方差
      • std:样本值的标准差
import pandas as pddef main():    aqi_data = pd.read_csv('china_city_AQI.csv')    print('基本信息:')    print(aqi_data.info())    print('数据预览:')    print(aqi_data.head())    #基本统计    print('AQI最大值:', aqi_data['AQI'].max())    print('AQI最大值:', aqi_data['AQI'].min())    print('AQI最大值:', aqi_data['AQI'].mean())    #top10    top10_cities= aqi_data.sort_values(by=['AQI']).head(10)    print('空气质量最好的10个城市:',top10_cities)    #bottom10    #bottom10_cities = aqi_data.sort_values(by=['AQI']).tail(10)    bottom10_cities = aqi_data.sort_values(by=['AQI'],ascending= False).head(10)   #同理上述写法,降序排列    print('空气质量最差的10个城市:', bottom10_cities)    #保存csv文件    top10_cities.to_csv('top10_aqi.csv',index = False)   #index为不需要序列号    bottom10_cities.to_csv('top10_aqi.csv',index = False)if __name__ ==  '__main__':    main()

Pandas数据清洗

  • 处理缺失数据
    • dropna()丢弃缺失数据
    • fillna()填充缺失数据
  • 数据过滤
    • df[filter_condition]根据filter_condition对数据进行过滤
1 import pandas as pd 2  3 def main(): 4     aqi_data = pd.read_csv('china_city_AQI.csv') 5     print('基本信息:') 6     print(aqi_data.info()) 7     print('数据预览:') 8     print(aqi_data.head()) 9 10     #数据清洗,只保留AQI>0的数据11     # filter_condition = aqi_data['AQI'] > 012     # clean_data = aqi_data[filter_condition]或者13     clean_aqi_data = aqi_data[aqi_data['AQI'] > 0]14 15     #基本统计16     print('AQI最大值:', aqi_data['AQI'].max())17     print('AQI最大值:', aqi_data['AQI'].min())18     print('AQI最大值:', aqi_data['AQI'].mean())19 20     #top1021     top10_cities= clean_aqi_data.sort_values(by=['AQI']).head(10)22     print('空气质量最好的10个城市:',top10_cities)23     #bottom10_cities = clean_aqi_data.sort_values(by=['AQI']).tail(10)或者24     bottom10_cities = clean_aqi_data.sort_values(by=['AQI'],ascending= False).head(10)   #同理上述写法,降序排列25     print('空气质量最差的10个城市:', bottom10_cities)26 27 if __name__ ==  '__main__':28     main()
View Code
--snip--    #数据清洗,只保留AQI>0的数据    # filter_condition = aqi_data['AQI'] > 0    # clean_data = aqi_data[filter_condition]或者    clean_aqi_data = aqi_data[aqi_data['AQI'] > 0]--snip--

Pandas数据可视化

  • pandas提供了内建的绘图功能(基于matplotlib)
  • plot(kind,x,y,title,figsize)    #kind可以是’line’, ‘bar’, ‘barh’, ‘kde’
    • x,y横纵坐标对应的数据列
    • title:图像名
    • figsize:图像尺寸
    • 参照:https://blog.csdn.net/hustqb/article/details/54410670
  • 保存图片:plt.savefig()
  • 更多例子:http://pandas.pydata.org/pandas-docs/stable/visualization.html
import pandas as pddef main():    aqi_data = pd.read_csv('china_city_AQI.csv')    print('基本信息:')    print(aqi_data.info())    print('数据预览:')    print(aqi_data.head())    #基本统计    print('AQI最大值:', aqi_data['AQI'].max())    #top10    top10_cities= aqi_data.sort_values(by=['AQI']).head(10)    print('空气质量最好的10个城市:',top10_cities)    #bottom10    #bottom10_cities = aqi_data.sort_values(by=['AQI']).tail(10)    bottom10_cities = aqi_data.sort_values(by=['AQI'],ascending= False).head(10)   #同理上述写法,降序排列    print('空气质量最差的10个城市:', bottom10_cities)    #保存csv文件    top10_cities.to_csv('top10_aqi.csv',index = False)   #index为不需要序列号    bottom10_cities.to_csv('bottom10_aqi.csv',index = False)if __name__ ==  '__main__':    main()

 

转载于:https://www.cnblogs.com/Mack-Yang/p/9826019.html

你可能感兴趣的文章
Python函数(一)之杵臼之交
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
ASP.NET WebApi 基于OAuth2.0实现Token签名认证
查看>>
SendMail与Postfix的架构备忘
查看>>
Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216 java c# php js.docx...
查看>>
283. Move Zeroes把零放在最后面
查看>>
Visual Studio Code 打开.py代码报Linter pylint is not installed解决办法
查看>>
Python 数据类型
查看>>
Task 与 Activity
查看>>
Google Guava学习笔记——简介
查看>>
历时八年,HTML5 标准终于完工了
查看>>
17.树的子结构
查看>>
D - Mike and strings
查看>>
C++:多维数组的动态分配(new)和释放(delete)
查看>>
c#基础学习(0806)之抽象类实现多态
查看>>
S5PV210根文件系统的制作(一)
查看>>
51NOD 1244 莫比乌斯函数之和
查看>>
[bzoj1923]外星千足虫[高斯消元]
查看>>
centos下同时启动多个tomcat
查看>>
slab分配器
查看>>