标签:常用 res json 模块 print import foo 第二篇
- 模块
1 ''' 2 1、什么是模块? 3 模块就是一系列功能的集合体,分为三大类 4 I:内置的模块 5 II:第三方的模块 6 III:自定义的模块 7 一个python文件本身就一个模块,文件名m.py,模块名叫m 8 9 ps:模块有四种形式 10 1 使用python编写的.py文件 11 12 2 已被编译为共享库或DLL的C或C++扩展 13 14 3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包) 15 16 4 使用C编写并链接到python解释器的内置模块 17 18 2、为何有用模块 19 I:内置与第三的模块拿来就用,无需定义,这种拿来主义,可以极大地提升自己的开发效率 20 II:自定义的模块 21 可以将程序的各部分功能提取出来放到一模块中为大家共享使用 22 好处是减少了代码冗余,程序组织结构更加清晰 23 24 25 3、如何用模块 26 ''' 27 28 y=333 29 z=444 30 import foo 31 # 1、首次导入模块会发生3件事 32 # 1、执行foo.py 33 # 2、产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中 34 # 3、在当前文件中产生的有一个名字foo,该名字指向2中产生的名称空间 35 36 # 之后的导入,都是直接引用首次导入产生的foo.py名称空间,不会重复执行代码 37 # import foo 38 # import foo 39 # import foo 40 # import foo 41 42 43 # 2、引用: 44 # print(foo.x) 45 # print(foo.get) 46 # print(foo.change) 47 # 强调1:模块名.名字,是指名道姓地问某一个模块要名字对应的值,不会与当前名称空间中的名字发生冲突 48 # x=1111111111111 49 # print(x) 50 # print(foo.x) 51 52 # 强调2:无论是查看还是修改操作的都是模块本身,与调用位置无关 53 # import foo 54 # 55 # x=3333333333 56 # # foo.get() 57 # 58 # foo.change() 59 # print(x) 60 # 61 # print(foo.x) 62 # foo.get() 63 64 65 66 67 # 3、可以以逗号为分隔符在一行导入多个模块 68 # 建议如下所示导入多个模块 69 # import time 70 # import foo 71 # import m 72 73 # 不建议在一行同时导入多个模块 74 import time,foo,m 75 76 77 # 4、导入模块的规范 78 #I. python内置模块 79 #II. 第三方模块 80 #III. 程序员自定义模块 81 82 # import time 83 # import sys 84 # 85 # import 第三方1 86 # import 第三方2 87 # 88 # import 自定义模块1 89 # import 自定义模块2 90 # import 自定义模块3 91 92 93 # 5、import 。。。 as 。。。 94 # import foo as f # f=foo 95 # f.get() 96 97 98 # import abcdefgadfadfas 99 # # 100 # # abcdefgadfadfas.f1 101 # # abcdefgadfadfas.f2 102 # # abcdefgadfadfas.f3 103 104 105 # import abcdefgadfadfas as mmm 106 # 107 # mmm.f1 108 # mmm.f2 109 # mmm.f3 110 111 112 #6、模块是第一类对象 113 import foo 114 115 #7、自定义模块的命名应该采用纯小写+下划线的风格 116 117 118 #8、可以在函数内导入模块 119 def func(): 120 import foo
模块1 1# 一个python文件有两种用途 2 # 1、被当成程序运行 3 # 2、被当做模块导入 4 5 2# impot导入模块在使用时必须加前缀"模块." 6 # 优点:肯定不会与当前名称空间中的名字冲突 7 # 缺点:加前缀显得麻烦 8 9 # from ... import ...导入也发生了三件事 10 # 1、产一个模块的名称空间 11 # 2、运行foo.py将运行过程中产生的名字都丢到模块的名称空间去 12 # 3、在当前名称空间拿到一个名字,该名字与模块名称空间中的某一个内存地址 13 # from foo import x # x=模块foo中值0的内存地址 14 # from foo import get 15 # from foo import change 16 17 # print(x) 18 # print(get) 19 # print(change) 20 # x=333333333 21 # print(x) 22 # get() 23 # change() 24 # get() 25 26 # print(x) 27 # from foo import x # x=新地址 28 # print(x) 29 30 # from...impot...导入模块在使用时不用加前缀 31 # 优点:代码更精简 32 # 缺点:容易与当前名称空间混淆 33 # from foo import x # x=模块foo中值1的内存地址 34 # x=1111 35 36 37 # 一行导入多个名字(不推荐) 38 # from foo import x,get,change 39 40 # *:导入模块中的所有名字 41 # name='egon' 42 # from foo import * 43 # print(name) 44 45 from socket import * 46 47 48 # 了解:__all__ 49 # from foo import * 50 # print(x) 51 # print(get) 52 # print(change) 53 54 55 # 起别名 56 from foo import get as g 57 print(g) 58 59 3模块的搜索路径 60 # 无论是import还是from...import在导入模块时都涉及到查找问题 61 # 优先级: 62 # 1、内存(内置模块) 63 # 2、硬盘:按照sys.path中存放的文件的顺序依次查找要导入的模块 64 65 # import sys 66 # 值为一个列表,存放了一系列的对文件夹 67 # 其中第一个文件夹是当前执行文件所在的文件夹 68 # print(sys.path) 69 70 # import foo # 内存中已经有foo了 71 # foo.say() 72 # 73 # import time 74 # time.sleep(10) 75 # 76 # import foo 77 # foo.say() 78 79 80 # 了解:sys.modules查看已经加载到内存中的模块 81 import sys 82 # import foo # foo=模块的内存地址 83 # del foo 84 85 # def func(): 86 # import foo # foo=模块的内存地址 87 # 88 # func() 89 # 90 # # print('foo' in sys.modules) 91 # print(sys.modules) 92 93 94 import sys 95 # 找foo.py就把foo.py的文件夹添加到环境变量中 96 sys.path.append(r'/Users/linhaifeng/PycharmProjects/s14/day21/aa') 97 # import foo 98 # foo.say() 99 100 from foo import say
模块导入1 def register(name:"必须传入名字傻叉",age:1111111,hobbbies:"必须传入爱好元组")->"返回的是整型": 2 print(name) 3 print(age) 4 print(hobbbies) 5 return 111 6 7 # register(1,'aaa',[1,]) 8 # res=register('egon',18,('play','music')) 9 # res=register('egon',19,(1,2,3)) 10 11 print(register.__annotations__) #{'name': '必须传入名字傻叉', 'age': 1111111, 'hobbbies': '必须传入爱好元组', 'return': '返回的是整型'}
函数的类型提示1 ''' 2 1、包就是一个包含有__init__.py文件的文件夹 3 4 5 2、为何要有包 6 包的本质是模块的模块的一种形式,包是用来被当做模块导入 7 ''' 8 9 #1、产生一个名称空间 10 #2、运行包下的__init__.py文件,将运行过程中产生的名字都丢到1的名称空间中 11 #3、在当前执行文件的名称空间中拿到一个名字mmm,mmm指向1的名称空间 12 # import mmm 13 # print(mmm.x) 14 # print(mmm.y) 15 # mmm.say() 16 17 # from mmm import x 18 19 20 # 模块的使用者:egon老湿 21 22 # 环境变量是以执行文件为准备的,所有的被导入的模块或者说后续的其他文件引用 23 # 的sys.path都是参照执行文件的sys.path 24 import sys 25 sys.path.append('/aaaaaaaaaaaaaaaaaaaaaaaaaa') 26 # print(sys.path) 27 28 sys.path.append(r'/Users/linhaifeng/PycharmProjects/s14/day21/aa') 29 30 31 # import foo # foo下__init__.py 32 # # 33 # # 34 # foo.f1() 35 # foo.f2() 36 # foo.f3() 37 38 # from foo import f1,f2,f3,f4 39 40 # f1() 41 # f2() 42 # f3() 43 # f4() 44 45 # import foo 46 # foo.f4() 47 48 # 强调: 49 # 1.关于包相关的导入语句也分为import和from ... import ... 50 # 两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则: 51 # 凡是在导入时带点的,点的左边都必须是一个包,否则非法。 52 # 可以带有一连串的点,如import 顶级包.子包.子模块,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。 53 # 例如: 54 # from a.b.c.d.e.f import xxx 55 # import a.b.c.d.e.f 56 # 其中a、b、c、d、e 都必须是包 57 58 59 # 2、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间 60 # 61 # 3、import导入文件时,产生名称空间中的名字来源于文件, 62 # import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件 63 64 65 # import foo 66 # # print(foo.f1) 67 # # print(foo.f2) 68 # # print(foo.f3) 69 # # print(foo.f4) 70 # 71 # foo.f4() 72 73 # from foo import * 74 # print(f1) 75 # print(f2) 76 # print(f3) 77 # print(f4)
包的使用 - 常用模块1
1 # 时间模块优先掌握的操作 2 #一:time 3 import time 4 5 # 时间分为三种格式: 6 # 1、时间戳:从1970年到现在经过的秒数 7 # 作用:用于时间间隔的计算 8 9 # print(time.time()) 10 11 # 2、按照某种格式显示的时间:2020-03-30 11:11:11 12 # 作用:用于展示时间 13 14 # print(time.strftime('%Y-%m-%d %H:%M:%S %p')) 15 # print(time.strftime('%Y-%m-%d %X')) 16 17 # 3、结构化的时间 18 # 作用:用于单独获取时间的某一部分 19 20 # res=time.localtime() 21 # print(res) 22 # print(res.tm_year) 23 # print(res.tm_yday) 24 25 #二:datetime 26 import datetime 27 28 # print(datetime.datetime.now()) 29 # print(datetime.datetime.now() + datetime.timedelta(days=3)) 30 # print(datetime.datetime.now() + datetime.timedelta(weeks=1)) 31 32 33 34 # 时间模块需要掌握的操作 35 # 1、时间格式的转换 36 # struct_time->时间戳 37 import time 38 # s_time=time.localtime() 39 # print(time.mktime(s_time)) 40 41 # 时间戳->struct_time 42 # tp_time=time.time() 43 # print(time.localtime(tp_time)) 44 45 # 补充:世界标准时间与本地时间 46 # print(time.localtime()) 47 # print(time.gmtime()) # 世界标准时间,了解 48 # print(time.localtime(333333333)) 49 # print(time.gmtime(333333333)) 50 51 52 # struct_time->格式化的字符串形式的时间 53 # s_time=time.localtime() 54 # print(time.strftime('%Y-%m-%d %H:%M:%S',s_time)) 55 56 # print(time.strptime('1988-03-03 11:11:11','%Y-%m-%d %H:%M:%S')) 57 58 59 # !!!真正需要掌握的只有一条:format string<------>timestamp 60 # '1988-03-03 11:11:11'+7 61 62 # format string--->struct_time--->timestamp 63 # struct_time=time.strptime('1988-03-03 11:11:11','%Y-%m-%d %H:%M:%S') 64 # timestamp=time.mktime(struct_time)+7*86400 65 # print(timestamp) 66 67 # format string<---struct_time<---timestamp 68 # res=time.strftime('%Y-%m-%d %X',time.localtime(timestamp)) 69 # print(res) 70 71 # time.sleep(3) 72 73 # 了解知识 74 # import time 75 # print(time.asctime()) 76 77 78 import datetime 79 # print(datetime.datetime.now()) 80 # print(datetime.datetime.utcnow()) 81 82 print(datetime.datetime.fromtimestamp(333333))
时间模块1 import random 2 3 # print(random.random()) #(0,1)----float 大于0且小于1之间的小数 4 # print(random.randint(1, 3)) # [1,3] 大于等于1且小于等于3之间的整数 5 6 # print(random.randrange(1, 3)) # [1,3) 大于等于1且小于3之间的整数 7 # 8 # print(random.choice([111, 'aaa', [4, 5]])) # 1或者23或者[4,5] 9 # 10 # print(random.sample([111, 'aaa', 'ccc','ddd'],2)) # 列表元素任意2个组合 11 # 12 # print(random.uniform(1, 3)) # 大于1小于3的小数,如1.927109612082716 13 # 14 # item = [1, 3, 5, 7, 9] 15 # random.shuffle(item) # 打乱item的顺序,相当于"洗牌" 16 # print(item) 17 18 # 应用:随机验证码 19 20 # import random 21 # 22 # res='' 23 # for i in range(6): 24 # 从26大写字母中随机取出一个=chr(random.randint(65,90)) 25 # 从10个数字中随机取出一个=str(random.randint(0,9)) 26 # 27 # 随机字符=random.choice([从26大写字母中随机取出一个,从10个数字中随机取出一个]) 28 # res+=随机字符 29 30 31 import random 32 33 def make_code(size=4): 34 res='' 35 for i in range(size): 36 s1=chr(random.randint(65,90)) 37 s2=str(random.randint(0,9)) 38 res+=random.choice([s1,s2]) 39 return res 40 41 print(make_code(6))
random模块1 import os 2 3 # 获取某一个文件夹下所有的子文件以及子文件夹的名字 4 # res=os.listdir('.') 5 # print(res) 6 # 7 # 8 # size=os.path.getsize(r'/Users/linhaifeng/PycharmProjects/s14/day22/01 时间模块.py') 9 # print(size) 10 11 12 13 # os.remove() 删除一个文件 14 # os.rename("oldname","newname") 重命名文件/目录 15 16 17 18 # 应用程序----》"ls /" 19 # os.system("ls /") 20 21 # 规定:key与value必须都为字符串 22 23 # os.environ['aaaaaaaaaa']='111' 24 # print(os.environ) 25 26 27 # print(os.path.dirname(r'/a/b/c/d.txt')) 28 # print(os.path.basename(r'/a/b/c/d.txt')) 29 30 31 # print(os.path.isfile(r'笔记.txt')) 32 # print(os.path.isfile(r'aaa')) 33 # print(os.path.isdir(r'aaa')) 34 35 # print(os.path.join('a','/','b','c','d')) 36 37 38 39 40 # 推荐用这种 41 BASE_DIR=os.path.dirname(os.path.dirname(__file__)) 42 # print(BASE_DIR) 43 44 45 # BASE_DIR=os.path.normpath(os.path.join( 46 # __file__, 47 # '..', 48 # '..' 49 # )) 50 # print(BASE_DIR) 51 52 # 在python3.5之后,推出了一个新的模块pathlib 53 from pathlib import Path 54 55 # res = Path(__file__).parent.parent 56 # print(res) 57 58 59 # res=Path('/a/b/c') / 'd/e.txt' 60 # print(res) 61 62 # print(res.resolve())
os模块1 import sys 2 3 # python3.8 run.py 1 2 3 4 # sys.argv获取的是解释器后参数值 5 # print(sys.argv) 6 7 # src_file=input('源文件路径: ').strip() 8 # dst_file=input('目标文件路径: ').strip() 9 # 10 # src_file=sys.argv[1] 11 # dst_file=sys.argv[2] 12 # # 判断 13 # 14 # with open(r'%s' %src_file,mode='rb') as read_f,\ 15 # open(r'%s' %dst_file,mode='wb') as write_f: 16 # for line in read_f: 17 # write_f.write(line) 18 19 # python3.8 run.py src_file dst_file 20 21 22 # print('[%-50s]' %'#') 23 # print('[%-50s]' %'##') 24 # print('[%-50s]' %'###') 25 26 27 28 # import time 29 # 30 # res='' 31 # for i in range(50): 32 # res+='#' 33 # time.sleep(0.5) 34 # print('\r[%-50s]' % res,end='') 35 36 37 import time 38 39 40 def progress(percent): 41 if percent > 1: 42 percent = 1 43 res = int(50 * percent) * '#' 44 print('\r[%-50s] %d%%' % (res, int(100 * percent)), end='') 45 46 recv_size=0 47 total_size=1025011 48 49 while recv_size < total_size: 50 time.sleep(0.01) # 下载了1024个字节的数据 51 52 recv_size+=1024 # recv_size=2048 53 54 # 打印进度条 55 # print(recv_size) 56 percent = recv_size / total_size # 1024 / 333333 57 progress(percent)
sys&打印进度条 - 常用模块2
1 # 1、什么是序列化&反序列化 2 # 内存中的数据类型---->序列化---->特定的格式(json格式或者pickle格式) 3 # 内存中的数据类型<----反序列化<----特定的格式(json格式或者pickle格式) 4 5 # 土办法: 6 # {'aaa':111}--->序列化str({'aaa':111})----->"{'aaa':111}" 7 # {'aaa':111}<---反序列化eval("{'aaa':111}")<-----"{'aaa':111}" 8 9 # 2、为何要序列化 10 # 序列化得到结果=>特定的格式的内容有两种用途 11 # 1、可用于存储=》用于存档 12 # 2、传输给其他平台使用=》跨平台数据交互 13 # python java 14 # 列表 特定的格式 数组 15 16 # 强调: 17 # 针对用途1的特定一格式:可是一种专用的格式=》pickle只有python可以识别 18 # 针对用途2的特定一格式:应该是一种通用、能够被所有语言识别的格式=》json 19 20 21 # 3、如何序列化与反序列化 22 # 示范1 23 # import json 24 # # 序列化 25 # json_res=json.dumps([1,'aaa',True,False]) 26 # # print(json_res,type(json_res)) # "[1, "aaa", true, false]" 27 # 28 # # 反序列化 29 # l=json.loads(json_res) 30 # print(l,type(l)) 31 32 33 # 示范2: 34 import json 35 36 # 序列化的结果写入文件的复杂方法 37 # json_res=json.dumps([1,'aaa',True,False]) 38 # # print(json_res,type(json_res)) # "[1, "aaa", true, false]" 39 # with open('test.json',mode='wt',encoding='utf-8') as f: 40 # f.write(json_res) 41 42 # 将序列化的结果写入文件的简单方法 43 # with open('test.json',mode='wt',encoding='utf-8') as f: 44 # json.dump([1,'aaa',True,False],f) 45 46 47 # 从文件读取json格式的字符串进行反序列化操作的复杂方法 48 # with open('test.json',mode='rt',encoding='utf-8') as f: 49 # json_res=f.read() 50 # l=json.loads(json_res) 51 # print(l,type(l)) 52 53 # 从文件读取json格式的字符串进行反序列化操作的简单方法 54 # with open('test.json',mode='rt',encoding='utf-8') as f: 55 # l=json.load(f) 56 # print(l,type(l)) 57 58 59 # json验证: json格式兼容的是所有语言通用的数据类型,不能识别某一语言的所独有的类型 60 # json.dumps({1,2,3,4,5}) 61 62 # json强调:一定要搞清楚json格式,不要与python混淆 63 # l=json.loads('[1, "aaa", true, false]') 64 # l=json.loads("[1,1.3,true,'aaa', true, false]") 65 # print(l[0]) 66 67 # 了解 68 # l = json.loads(b'[1, "aaa", true, false]') 69 # print(l, type(l)) 70 71 # with open('test.json',mode='rb') as f: 72 # l=json.load(f) 73 74 75 # res=json.dumps({'name':'哈哈哈'}) 76 # print(res,type(res)) 77 78 # res=json.loads('{"name": "\u54c8\u54c8\u54c8"}') 79 # print(res,type(res)) 80 81 # 4、猴子补丁 82 # 在入口处打猴子补丁 83 # import json 84 # import ujson 85 # 86 # def monkey_patch_json(): 87 # json.__name__ = 'ujson' 88 # json.dumps = ujson.dumps 89 # json.loads = ujson.loads 90 # 91 # monkey_patch_json() # 在入口文件出运行 92 93 94 # import ujson as json # 不行 95 96 # 后续代码中的应用 97 98 # json.dumps() 99 # json.loads() 100 101 102 # 5.pickle模块 103 import pickle 104 # res=pickle.dumps({1,2,3,4,5}) 105 # print(res,type(res)) 106 107 # s=pickle.loads(res) 108 # print(s,type(s))
json&pickle模块1 """ 2 解析.ini(初始化类文件)配置文件 3 文件格式示例: 4 [alex] 5 name = alex Li 6 password = e99a18c428cb38d5f260853678922e03 7 expire = 2017-09-20 8 9 10 [egon] 11 name = egg lin 12 password = dddd 13 expire = 2018-01-01 14 """ 15 config=configparser.ConfigParser() 16 config.read('test.ini') 17 18 # 1、获取sections 19 # print(config.sections()) 20 21 # 2、获取某一section下的所有options 22 # print(config.options('section1')) 23 24 # 3、获取items 25 # print(config.items('section1')) 26 27 # 4、 28 # res=config.get('section1','user') 29 # print(res,type(res)) 30 31 # res=config.getint('section1','age') 32 # print(res,type(res)) 33 34 35 # res=config.getboolean('section1','is_admin') 36 # print(res,type(res)) 37 38 39 # res=config.getfloat('section1','salary') 40 # print(res,type(res))
configparser1 # 1、什么是哈希hash 2 # hash一类算法,该算法接受传入的内容,经过运算得到一串hash值 3 # hash值的特点: 4 #I 只要传入的内容一样,得到的hash值必然一样 5 #II 不能由hash值返解成内容 6 #III 不管传入的内容有多大,只要使用的hash算法不变,得到的hash值长度是一定 7 8 # 2、hash的用途 9 # 用途1:特点II用于密码密文传输与验证 10 # 用途2:特点I、III用于文件完整性校验 11 12 # 3、如何用 13 # import hashlib 14 # 15 # m=hashlib.md5() 16 # m.update('hello'.encode('utf-8')) 17 # m.update('world'.encode('utf-8')) 18 # res=m.hexdigest() # 'helloworld' 19 # print(res) 20 # 21 # m1=hashlib.md5('he'.encode('utf-8')) 22 # m1.update('llo'.encode('utf-8')) 23 # m1.update('w'.encode('utf-8')) 24 # m1.update('orld'.encode('utf-8')) 25 # res=m1.hexdigest()# 'helloworld' 26 # print(res) 27 28 29 30 # 模拟撞库 31 # cryptograph='aee949757a2e698417463d47acac93df' 32 # import hashlib 33 # 34 # # 制作密码字段 35 # passwds=[ 36 # 'alex3714', 37 # 'alex1313', 38 # 'alex94139413', 39 # 'alex123456', 40 # '123456alex', 41 # 'a123lex', 42 # ] 43 # 44 # dic={} 45 # for p in passwds: 46 # res=hashlib.md5(p.encode('utf-8')) 47 # dic[p]=res.hexdigest() 48 # 49 # # 模拟撞库得到密码 50 # for k,v in dic.items(): 51 # if v == cryptograph: 52 # print('撞库成功,明文密码是:%s' %k) 53 # break 54 55 56 # 提升撞库的成本=>密码加盐 57 import hashlib 58 59 m=hashlib.md5() 60 61 m.update('天王'.encode('utf-8')) 62 m.update('alex3714'.encode('utf-8')) 63 m.update('盖地虎'.encode('utf-8')) 64 print(m.hexdigest()) 65 66 67 68 69 # m.update(文件所有的内容) 70 # m.hexdigest() 71 # 72 # f=open('a.txt',mode='rb') 73 # f.seek() 74 # f.read(2000) # 巨琳 75 # m1.update(文见的一行) 76 # 77 # m1.hexdigest()
hashlib哈希1 import subprocess 2 3 obj=subprocess.Popen('echo 123 ; ls / ; ls /root',shell=True, 4 stdout=subprocess.PIPE, 5 stderr=subprocess.PIPE, 6 ) 7 8 print(obj) 9 res=obj.stdout.read() 10 print(res.decode('utf-8')) #123 ; ls / ; ls /root 11 12 err_res=obj.stderr.read() 13 print(err_res.decode('utf-8'))
subprocess
标签:常用,res,json,模块,print,import,foo,第二篇 来源: https://www.cnblogs.com/huahuawang/p/14724589.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。