首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

NLTK基础教程学习笔记(五)

词性标注:词性(POS)常用的POS标记库Penn Treebank,PennTreeBank原本是一个NLP项目的名称,该项目主要是对相关语料进行标注,标注内容包括词性标注以及语法分析,其语料来自1989年的华尔街日报,包含2499篇文章。下面是Penn Treebank库编号 缩写 英文 中文1 CC Coordinating conjunction 并列连接词2 CD Cardinal number 基数3 DT Determiner 限定词4 EX Existential there 存在型there5 FW Foreign word 外文单词6 IN Preposition/subord, conjunction 介词/从属,连接词7 JJ Adjective 形容词8 JJR Adjective, comparative 形容词,比较级9 JJS Adjective, superlative 形容词,最高级10 LS List item marker 列表项标记11 MD Modal 情态动词12 NN Noun ,singular or mass 名词,可数或不可数13 NNS Noun, plural 名词,复数14 NNP Proper noun, singular 专有名词,单数15 NNPS Proper noun, plural 专有名词,复数16 PDT Predeterminer 前位限定词17 POS Possessive ending 所有格结束词18 PRP Personal pronoun 人称代名词19 PP$ Possessive pronoun 物主代词,所有格代名词20 RB Adverb 副词21 RBR Adverb, comparative 副词,比较级22 RBS Adverb, superlative 副词,最高级23 RP Particle 小品词24 SYM Symbol(mathematical or scientific) 符号(数学或科学)25 TO to To26 UH Interjection 感叹词27 VB Verb, base form 动词,基本形态28 VBD Verb, past tense 动词,过去式29 VBG Verb, gerund/present participle 动词,动名词/现在分词30 VBN Verb, past participle 动词,过去分词31 VBP Verb, non-3rd ps. sing. Present 动词,非第三人称单数现在式32 VBZ Verb, 3rd ps. sing. Present 动词,第三人称单数现在式33 WDT wh-determiner wh-限定词34 WP wh-pronoun wh-代词35 WP$ Possessive wh-pronoun 所有格wh-代词36 WRB wh-adverb wh-副词37 # Pound sign #符号38 $ Dollar sign 美元符号39 . Sentence-final punctuation 句点40 , Comma 逗号41 : Colon, semi-colon 冒号,分号42 ( Left bracket character 左括号43 ) Right bracket character 右括号44 “ Straight double quote 双引号45 ‘ Left open single quote 左单引号46 “ Left open double quote 左双引号47 ’ Right close single quote 右单引号48 ” Right close double quote 右双引号和中学时学的英语差不多。下面是一个简单的用POS语料库的例子: import nltk from nltk import word_tokenize s="I was watching TV" print(nltk.pos_tag(word_tokenize(s))) 结果: [('I', 'PRP'), ('was', 'VBD'), ('watching', 'VBG'), ('TV', 'NN')] 代码中先将文本进行表示化处理,再调用NLTK库中的pos_tag方法得到一组(词形,词性标签),可以看到很好地将一句话进行了标注。用POS语料库可以进行很多灵活的操作,如找出文本中所有的名词等: import nltk from nltk import word_tokenize s="I was watching TV" #print(nltk.pos_tag(word_tokenize(s))) tagged=nltk.pos_tag(word_tokenize(s)) allnoun=[word for word ,pos in tagged if pos in ['NN','NNP']] print (allnoun) 结果: ['TV'] 如果要找动词只需要改变pos的词性为 allnoun=[word for word ,pos in tagged if pos in ['VB','VBD','VBG ','VBN']]

优秀的个人博客,低调大师

NLTK基础教程学习笔记(二)

Python基础:字典(dictionary)也是最常用到的一种数据结构。在其他语言中被称为关联数组/存储。字典是一种键值索引型的数据结构,其索引键可以是一种不可变的类型,例如字符串和数字常被用来充当索引键。Python的字典结构是哈希表实现之一。哈希表是一种操作起来非常容易的字典结构,其优势在于通过简短的代码就能建立起非常复杂的数据结构。例子用字典来获取文本中各单词出现的频率: mystring="Monty Python! And the holy Grail !\n" word_frep={} for tok in mystring.split(): if tok in word_frep: word_frep[tok]+=1 else: word_frep[tok]=1 print(word_frep) 结果: {'holy': 1, 'the': 1, 'Python!': 1, '!': 1, 'Grail': 1, 'And': 1, 'Monty': 1} NLTK入门:先介绍了一个简单的爬虫例子,爬取了Python官网主页上的文本信息: import urllib.request response=urllib.request.urlopen('http://python.org/') html=response.read() print(len(html)) 这里和书上的不同对于我用的python3.5,urllib2包已经不能用了,用urllib.request代替。结果; 48907 接下来做一次探索性数据分析(EDA),对于一段文本域而言,EDA可能包含多重含义,这里只会涉及一个简单的例子,即该文档的主体术语类型。文字的主体和出现的频率等。对于之前从Python主页爬的文字域,我们先清除其中的html标签,做法是先用正则表达式选取其中的标记,包括数字和字符,转换为一个列表;版本1: import urllib.request response=urllib.request.urlopen('http://python.org/') html=response.read() #print(len(html)) tokens=[tok for tok in html.split()] print("Total no of tokens:" +str (len(tokens))) print(tokens[0:100]) 结果; Total no of tokens:2932 [b'<!doctype', b'html>', b'<!--[if', b'lt', b'IE', b'7]>', b'<html', b'class="no-js', b'ie6', b'lt-ie7', b'lt-ie8', b'lt-ie9">', b'<![endif]-->', b'<!--[if', b'IE', b'7]>', b'<html', b'class="no-js', b'ie7', b'lt-ie8', b'lt-ie9">', b'<![endif]-->', b'<!--[if', b'IE', b'8]>', b'<html', b'class="no-js', b'ie8', b'lt-ie9">', b'<![endif]-->', b'<!--[if', b'gt', b'IE', b'8]><!--><html', b'class="no-js"', b'lang="en"', b'dir="ltr">', b'<!--<![endif]-->', b'<head>', b'<meta', b'charset="utf-8">', b'<meta', b'http-equiv="X-UA-Compatible"', b'content="IE=edge">', b'<link', b'rel="prefetch"', b'href="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js">', b'<meta', b'name="application-name"', b'content="Python.org">', b'<meta', b'name="msapplication-tooltip"', b'content="The', b'official', b'home', b'of', b'the', b'Python', b'Programming', b'Language">', b'<meta', b'name="apple-mobile-web-app-title"', b'content="Python.org">', b'<meta', b'name="apple-mobile-web-app-capable"', b'content="yes">', b'<meta', b'name="apple-mobile-web-app-status-bar-style"', b'content="black">', b'<meta', b'name="viewport"', b'content="width=device-width,', b'initial-scale=1.0">', b'<meta', b'name="HandheldFriendly"', b'content="True">', b'<meta', b'name="format-detection"', b'content="telephone=no">', b'<meta', b'http-equiv="cleartype"', b'content="on">', b'<meta', b'http-equiv="imagetoolbar"', b'content="false">', b'<script', b'src="/static/js/libs/modernizr.js"></script>', b'<link', b'href="/static/stylesheets/style.css"', b'rel="stylesheet"', b'type="text/css"', b'title="default"', b'/>', b'<link', b'href="/static/stylesheets/mq.css"', b'rel="stylesheet"', b'type="text/css"', b'media="not', b'print,', b'braille,'] 版本2: import urllib.request import re response=urllib.request.urlopen('http://python.org/') html=response.read() html=html.decode('utf-8') tokens=re.split('\W+',html) print(len(tokens)) print(tokens[0:100]) 结果: 6221 ['', 'doctype', 'html', 'if', 'lt', 'IE', '7', 'html', 'class', 'no', 'js', 'ie6', 'lt', 'ie7', 'lt', 'ie8', 'lt', 'ie9', 'endif', 'if', 'IE', '7', 'html', 'class', 'no', 'js', 'ie7', 'lt', 'ie8', 'lt', 'ie9', 'endif', 'if', 'IE', '8', 'html', 'class', 'no', 'js', 'ie8', 'lt', 'ie9', 'endif', 'if', 'gt', 'IE', '8', 'html', 'class', 'no', 'js', 'lang', 'en', 'dir', 'ltr', 'endif', 'head', 'meta', 'charset', 'utf', '8', 'meta', 'http', 'equiv', 'X', 'UA', 'Compatible', 'content', 'IE', 'edge', 'link', 'rel', 'prefetch', 'href', 'ajax', 'googleapis', 'com', 'ajax', 'libs', 'jquery', '1', '8', '2', 'jquery', 'min', 'js', 'meta', 'name', 'application', 'name', 'content', 'Python', 'org', 'meta', 'name', 'msapplication', 'tooltip', 'content', 'The', 'official'] 注python3要用上 html=html.decode('utf-8') 否则会报错: cannot use a string pattern on a bytes-like object 接下来用NLTK的方式清理这些标签: import nltk import urllib from bs4 import BeautifulSoup response=urllib.request.urlopen('http://python.org/') html=response.read() html=html.decode('utf-8') soup=BeautifulSoup(html,'lxml') clean=soup.get_text() tokens=[tok for tok in clean.split()] print(tokens[:100]) 结果: ['Welcome', 'to', 'Python.org', '{', '"@context":', '"http://schema.org",', '"@type":', '"WebSite",', '"url":', '"https://www.python.org/",', '"potentialAction":', '{', '"@type":', '"SearchAction",', '"target":', '"https://www.python.org/search/?q={search_term_string}",', '"query-input":', '"required', 'name=search_term_string"', '}', '}', 'var', '_gaq', '=', '_gaq', '||', '[];', "_gaq.push(['_setAccount',", "'UA-39055973-1']);", "_gaq.push(['_trackPageview']);", '(function()', '{', 'var', 'ga', '=', "document.createElement('script');", 'ga.type', '=', "'text/javascript';", 'ga.async', '=', 'true;', 'ga.src', '=', "('https:'", '==', 'document.location.protocol', '?', "'https://ssl'", ':', "'http://www')", '+', "'.google-analytics.com/ga.js';", 'var', 's', '=', "document.getElementsByTagName('script')[0];", 's.parentNode.insertBefore(ga,', 's);', '})();', 'Notice:', 'While', 'Javascript', 'is', 'not', 'essential', 'for', 'this', 'website,', 'your', 'interaction', 'with', 'the', 'content', 'will', 'be', 'limited.', 'Please', 'turn', 'Javascript', 'on', 'for', 'the', 'full', 'experience.', 'Skip', 'to', 'content', '▼', 'Close', 'Python', 'PSF', 'Docs', 'PyPI', 'Jobs', 'Community', '▲', 'The', 'Python', 'Network'] 下面是用nltk进行词频的统计: import nltk import urllib from bs4 import BeautifulSoup response=urllib.request.urlopen('http://python.org/') html=response.read() html=html.decode('utf-8') soup=BeautifulSoup(html,'lxml') clean=soup.get_text() tokens=[tok for tok in clean.split()] #print(tokens[:100]) Freq_dist_nltk=nltk.FreqDist(tokens) print(Freq_dist_nltk) for k,v in Freq_dist_nltk.items(): print(str(k)+':'+str(v)) 结果: <FreqDist with 614 samples and 1117 outcomes> up:2 ==:1 now:3 document.getElementsByTagName('script')[0];:1 Best:1 "url"::1 -:1 core:1 [];:1 Statements:1 ga.src:1 s.parentNode.insertBefore(ga,:1 tkInter,:1 international:1 Trac,:1 Legal:1 Beginner’s:1 While:1 'Apple'),:1 here.:2 FOSDEM:2 Brochure:2 2018-01-09:1 Windows:3 programmers:1 Stories:3 Essays:2 _gaq.push(['_setAccount',:1 Interpretation:1 Up:1 Chat:1 discussed:1 Logo:2 window.jQuery:1 Search:1 List:2 comprehensions:1 processing:1 ?:1 b,:1 PyCon:2 'Banana'),:1 <:1 Easy:1 Diversity:3 1.:1 Contributing:1 Top:2 Learn:3 go.:1 User:4 even:1 Notice::1 for?:1 Arts:2 sure:1 programs:1 functions:2 it's:1 control:3 document.location.protocol:1 web2py:1 Government:2 Event:2 -,:1 tools:1 /:4 our:2 Industrial:1 A:2 Smaller:1 Scientific:3 compound:1 knows:1 About:2 Tru64,:1 rendering:1 Security:1 classic:1 Sign:3 have:1 Check:1 Solaris,:1 Copyright:1 quickly,:1 Javascript:2 =:14 Launch:1 Runs:1 987:1 Events:11 an:3 Whet:1 Getting:2 hire:1 Unicode):1 join:1 Mailing:2 Foundation:3 will:1 Roundup:1 Web:1 Hi,:1 learn.:1 Developer's:3 Submit:3 Django,:1 built-in:1 (PEPs)::1 GO:1 Types:1 I'm:2 lists.:1 Girls:1 alpha:1 used:2 Not:1 name):1 math:1 Started:3 Latest:1 Proposals:1 Python!"):1 21:1 to:17 55:1 expected;:1 syntax:2 Documentation:3 Latest::1 other:4 6,:1 }:2 programmers.:1 Engineering:2 limited.:1 Website:1 Talks:2 PSF:4 faster:1 can:3 lists:1 Numeric::1 3.6.4,:1 Implementations:2 377:1 Django:1 n::1 list:2 Data:1 pipeline.:1 —:2 Larger:1 relaunched:1 programming:4 PyGObject,:1 appetite:1 (1,:1 website,:1 Intuitive:1 structure:1 Python.:2 Linux,:1 ©2001-2018.:1 argument:1 IPython:1 Forums:2 What:1 a,:2 Kivy,:1 SciPy,:1 Pyramid,:1 for,:1 output:1 For:1 available.:2 own:1 one:1 **:1 "WebSite",:1 //:1 Meetup:1 You’d:1 Skip:1 (with:1 144:1 arithmetic:1 running:1 Conduct:2 turn:1 motion:1 Archive:4 allows:1 ['Banana',:1 is:',:1 Light:1 users:1 community-run:1 Contact:1 Compaq:1 speak:1 indentation:1 Issue:1 fruits:1 0:1 course.:1 operators:1 Upcoming:1 straightforward::1 re-code):1 Tracker:1 3.6.4:5 The:5 General:1 fruit:1 systems:1 Welcome:1 fib(n)::1 8:2 all:1 Become:1 versions!:1 release:1 job:1 you:1 '.google-analytics.com/ga.js';:1 daily.:1 languages:1 610:1 document.write('<script:1 manipulated:1 together:1 Quick:1 new:1 Powered:1 product):1 ≡:1 print(a,:1 of:17 Calculations:1 Tim:1 language,:1 ...:7 2018:2 Defined:1 input('What:1 essential:1 frames:1 2018-02-02:2 end=':1 Fibonacci:1 Flask,:1 use?:1 Lists:4 %s.':1 Please:1 functions.:2 'Lime']:1 development:1 Initiatives:1 standard:1 "potentialAction"::1 types:1 s:1 languages):1 [2,:1 enumerate:1 Donate:1 picture:1 Looking:1 "@type"::2 ():1 fib(1000):1 protect,:1 Enhancement:1 in:8 more:2 Jobs:2 +:1 Register:1 Menu:1 Code:2 Hello,:1 thousands:1 experienced:1 document.createElement('script');:1 2018-01-23:1 Practices:1 (and:1 future:1 grouping.:1 by:3 [(0,:1 News:11 0,:1 ['BANANA',:1 for…:1 true;:1 day.:1 library,:1 Flow:1 with:7 pick:1 number:2 Ansible,:1 4,:1 Software:6 (function():1 as:2 ga:1 testing.:1 OpenStack:1 easy:2 5.666666666666667:1 machines:1 last:1 find:1 Mac:2 environment:1 production:2 Source:2 print("Hello,:1 Special:2 3:8 'http://www'):1 '):1 fourth:2 keyword:1 docs.python.org:1 ▲:3 'LIME']:1 ga.type:1 per:1 System:1 3.:1 Fortenberry:1 Bug:1 Success:3 Awards:2 Input,:1 Development::3 Pandas,:1 3.7.0a4:1 print('Hi,:1 statements:1 arrays:1 name?:1 the:19 "http://schema.org",:1 twists,:1 parentheses:1 Platforms:2 "@context"::1 community:1 This:1 usual:1 growth:1 lets:1 are:5 Books:2 Alternative:2 ~800:1 Audio/Visual:2 effectively.:1 way:1 Back:2 89:1 Development:2 'Apple',:1 ILM:1 })();:1 arguments,:2 is::1 Our:1 some:1 Reset:1 "query-input"::1 *:2 Functions:1 four:1 "target"::1 Chelyabinsk:1 Rackspace:1 sliced:1 2:3 place:1 source:1 list(enumerate(fruits)):1 content:2 Privacy:1 def:1 License:2 key,:1 not:1 Simple:2 FAQ:2 very:1 PyPI:1 34:1 interaction:1 n:1 installers:1 Python:60 Conferences:2 float:1 numbers:1 Wiki:2 Guide:6 'Lime')]:1 Facebook:1 Buildbot,:1 ||:2 extensible:1 PyQt,:1 ::1 >>>:24 experience.:1 assignment:1 Community:7 Pythology:1 numbers::1 #:9 compositing:1 facilitate:1 quickly:1 series:1 IRC:3 advance:1 a+b:1 ga.async:1 arbitrary:1 Administration::1 var:3 2017-12-06:1 _gaq:2 for:11 Salt,:1 or:2 Core:1 PEP:2 Magic:1 Education:2 board:1 and:22 Legon:1 your:4 tens:1 language:2 mission:1 support:1 was:1 >_:1 Python,:1 while:2 Site:1 Applications:2 name?\n'):1 17:2 about:3 2017-12-19:2 that:5 version:1 Thousands:1 available:3 returns:1 jobs.python.org:1 position:1 'APPLE',:1 Interactive:1 _gaq.push(['_trackPageview']);:1 Groups:2 modeling,:1 promote,:1 X,:1 233:1 Merchandise:2 understands.:1 Non-English:2 Network:1 batch:1 3.5.5rc1:1 optional:1 Mentorship:1 product:5 floor:1 Expect:1 on:4 8]:1 Interest:2 %:1 which:1 'text/javascript';:1 print(loud_fruits):1 Socialize:1 0.5:1 Member:1 {:3 capable:1 One-Day:1 candidate:1 Whether:1 full:1 ('https:':1 Group:4 Close:1 "https://www.python.org/search/?q={search_term_string}",:1 In:2 developer,:1 fruits]:1 function:1 data:1 loud_fruits:1 Experienced:1 Downloads:2 Status:1 you're:2 expression:1 flow:2 python-dev:1 online.:1 indexed,:1 3::4 Google+:1 (known:1 is:16 src="/static/js/libs/jquery-1.8.2.min.js"><\/script>'):1 Python's:1 Use:1 its:1 3.4.8rc1:1 trying:1 clean:1 use:1 13:1 2018-02-03:3 Policy:1 3.6.4rc1:1 download:1 "SearchAction",:1 Beginner's:2 (2,:1 Conference::1 work:3 +,:1 planned:1 code:4 s);:1 range:1 this:2 overview.:1 loop:1 RSS:1 be:3 All:3 Bottle,:1 Business:2 tutorials:1 Twitter:1 runs:1 beginners:1 defining:2 GUI:1 Speed:1 OS:3 provide:1 learn:1 division:2 IRIX,:1 'https://ssl':1 [fruit.upper():1 if,:1 ▼:1 Start:1 diverse:1 Python.org:1 Shell:1 1:5 first:1 name:1 X:2 Download:1 releases:3 384:1 More:9 wxPython:1 Compound:1 Other:2 any:1 b:2 pipeline:1 along:1 related:1 integrate:1 PySide,:1 print('The:1 5:2 print():1 "required:1 Docs:6 &:3 Tornado,:1 Python!:1 name=search_term_string":1 "https://www.python.org/",:1 'UA-39055973-1']);:1 Get:1 simple:2 Help:3 guides,:1 Quotes:2 a:10 Index:2 mandatory:1 2.7.14:1 图表:

优秀的个人博客,低调大师

NLTK基础教程学习笔记(一)

先来介绍一下相关的python基础:list:list是python中最基础的数据结构相对于其他语言中的数组:例子: >>>list=[1,2,3,4] >>>print (list) 结果:python是一种解释性语言,会在对其计算的同时检查其中的变量类型,我们在声明这些变量时无需对其进行初始化和类型声明,但在这里list中的包含一些整数对象,不能直接关联到print上,后者只能接受String类型的对象,所以要将列表元素转换为String类型。例子: >>>print('First element:'+str(list[0])) >>>print('Last element:'+str(list[-1])) >>>print('First three element:'+str(list[0:2])) >>>print(‘Last three element:’+str(list[-3:0])) 结果: First element:1 Last element:4 First element:1,2,3 Last element:2,3,4 常见的对字符串操作的函数:split():一个能基于默写分隔符来对于字符串进行切割的方法。如果你没有为其提供具体参数则默认空格为其分隔符。 >>>mystring="Monty Python! And the holy Grail !\n" >>>print (mystring.split()) 结果: ['Monty', 'Python!', 'And', 'the', 'holy', 'Grail', '!'] strip():一个可以从字符串中删除其尾随空白符(如‘n’,'nr')的方法例子: >>> print(mystring.strip()) Monty Python! And the holy Grail ! 通过rstrip()和lstrip()可以选择剥离字符串左边还是右边尾部的空白符upper()/lower():可以用来改变字符串中字母的大小写例子 >>> print(mystring.upper()) MONTY PYTHON! AND THE HOLY GRAIL ! replace()可以替换目标字符串中的某个子串例子: >>> print(mystring.replace('!',',')) Monty Python, And the holy Grail , 在NLP中正则表达式是另一个非常重要的技能。正则表达式(regular expression)能对字符串进行有效地匹配的模式,能从大量凌乱的文本数据中提取出有意义的信息。正则表达式一般有:(句号):用于匹配除换行字符外的任意单字符。w:用于匹配某一字符或者数字,相当于[a-z A-Z 0-9]W:用于匹配任意非单词性字符s:用于匹配任意单个空白字符,包括换行,返回制表等,相当于[nrt]S:用于匹配单个任意非空白字符。’t:用于匹配制表符。n:用于匹配换行符。r:用于匹配返回符。d:用于匹配十进制数字。^:用于匹配相关字符的开始位置。$:用于匹配先关字符串结尾位置。:用于低效特殊字符的特殊性。如要匹配$符号,则在前面加上.下面是一个使用字符串的子串搜索模块re来查找字符对象的例子。 import re mystring="Monty Python! And the holy Grail !\n" if re.search('Python' ,mystring): print("we found Python") else: print("No") 结果: We found Python findall()是一个用于对字符串进行全部模式查找的函数。他会按照给定模式对字符串进行查找,并列出其中所有匹配的对象: import re mystring="Monty Python! And the holy Grail !\n" print(re.findall("!",mystring)) 结果: ['!', '!'] findall()返回两个对象的列表。

优秀的个人博客,低调大师

jQuery学习(第一天)

js的回顾 遇到的问题 1.window.onload只能使用一个(事件覆盖问题) 2.代码的容错性不强 3.浏览器兼容性问题 4.代码量较多,书写很繁琐 5.代码很乱到处都是 6.动画效果我们很难实现 jQuery的基本使用 image.png min:它是压缩过的版本 区别:我们开发过程中,会用未压缩的版本,或者压缩的。 项目上线的时候,我们要用压缩过的版本。 版本问题: 1.1.xxx 版本 jQuery-1.11.1.js 2.2.xxx 版本 不再支持IE6、7、8 引包 1.要把我们的jQuery源文件拿到我们的项目里面来 2.在我们的页面中引用jQuery文件 image.png 问题: image.png 如果遇到这种问题,那肯定是没有引用我们的jQuery源文件。 用jQuery之前,先引入jQuery,然后,再去写我们的jQuery代码。 入口函数的书写方式(两种) $(document).ready(function(){ }); $(function(){ }); 2018-01-08 17-16-29 的屏幕截图.png 事件处理程序 事件源 js:document.getElementById("id"); jq:$("#id") 2.事件 js:document.getElementById("id").onclick = function(){//语句} jq:$("#id").click(function(){//语句}) 区别: jQuery事件不带on 简单的练习 使显示的div框隐藏起来 //引包 <script src="js/jquery.js"></script> //给定格式 <style type="text/css"> * { margin: 0; padding: 0; } div { height: 200px; background: #000000; margin-bottom: 10px; /*display: none;*/ } </style> //具体函数代码 <script> //入口函数 $(document).ready(function () { //语句 $("#click").click(function () { $("div").hide(); }); }); </script> . . . //页面主体(body) <input type="button" value="我是按钮" id="click" /> <div></div> JQuery详细介绍 $的问题 js命名规则: a)Js命名归法:下划线、字母、$、数字 b)但是不能以数字作为开头var $ = “我是$符号”; jQUery的两个变量:$ 和 jQuery jQuery占用了我们两个变量:$ 和 jQuery js入口函数与jQuery入口函数的区别 1.Js的window.onload事件是等到所有内容,以及我们的外部图片之类的文件加载完了之后,才回去执行 2.jQuery的入口函数 是在 html所有标签都加载之后,就回去执行。 js创建对象 三种方式 var obj = {} var obj1 = new Object(); var obj2 = Object.create(); 1跟2的区别: 推荐使用第一个方式 第二种方式存在效率问题,因为要new对象,会涉及到原型查找的问题。 jquery选择器 回顾css选择器 image.png image.png jquery选择器 image.png image.png 规律:$(selector).css(“background”,”red”); Console.log();在控制台(网页)打印 具体实现 image.png image.png image.png 设置多个样式为$("#...").css({...}); 根据自己的意愿设置的时候 函数内的参数为形参(可自定义) 设置某一个时需要进行相应的判断 jQuery是什么 jQuery就是javascript的一个库,把我们常用的一些功能进行了封装,方便我们来调用,提高我们的开发效率。 ####### Javascipt跟jQuery的区别 Javascript是一门编程语言,我们用它来编写客户端浏览器脚本。 jQuery是javascript的一个库,包含多个可重用的函数,用来辅助我们简化javascript开发 image.png 故:jQuery能做的javascipt都能做到,而javascript能做的事情,jQuery不一定能做到。 jQuery其他选择器 层级选择器 image.png * 层级选择器选择了选择符 后面那个元素,比如,div > p,是选择>后面的p元素。 过滤选择器 基本选择器 image.png image.png 属性选择器 image.png image.png mouseover/mouseout事件跟mouseenter/mouseleave事件的区别 mouseover/mouseout事件,鼠标经过的时候会触发多次,每遇到一个子元素就会触发一次。mouseenter/mouseleave事件,鼠标经过的时候只会触发一次 推荐使用mouseenter/mouseleave dom对象与jQuery对象之间的相互转换 jQuery对象转换成DOM对象: 方式一:$(“#btn”)[0] 方式二:$(“#btn”).get(0) DOM对象转换成jQuery对象: $(document) -> 把DOM对象转成了jQuery对象var btn = document.getElementById(“bt n”);btn -> $(btn); 鼠标事件的几种方法 <script> $(document).ready(function () { //第一种 // mouseenter事件 是 鼠标经过时触发的事件 /*$(".wrap li").mouseenter(function () { $(this).children("ul").show(); }); $(".wrap li").mouseleave(function () { $(this).children("ul").hide(); });*/ //第二种 hover 传两个参数 /*$(".wrap li").hover(function () { //alert("1"); $(this).children("ul").show(); }, function () { $(this).children("ul").hide(); });*/ //第三种 hover 传一个参数 进行必要的判断 /*$(".wrap li").hover(function () { /!*alert("1");*!/ var $this = $(this).children("ul"); var isShow = $this.css("display"); if(isShow === "block") { $this.hide(); } else { $this.show(); } });*/ //第四种 hover 传一个参数 (给一个‘slideToggle’ 切换 的效果) $(".wrap li").hover(function () { $(this).children("ul").slideToggle(); }); }); </script> 实例 image.png image.png

优秀的个人博客,低调大师

C++ template 学习归纳总结4

我们在这篇文章来说说typename关键字吧。这个关键字是在c++的标准化过程中引入的,目的在于说明template中的某个表示符号是一个类型,而不是其他的东西,看下面的代码: template <typename T> class MyClass { typename T::SubType * ptr; … }; 第一个typename我就不多说了,大家都知道,我来说一下第二个。他的意思是说T::SubType是class T内部定义的一个类型,从而ptr是一个指向【T:SubType类型】的指针。 如果在上面的代码中,没有第二个typename关键字的话,编译器会以为SubType是class Type的一个static成员。于是会被编译器理解为一个具体的东西,从而导致T::SubType * ptr 所表达的意思是两个数进行相乘。 关于这个知识的应用比较多的是STL中,比如: #include <iostream> // print elements of an STL container template <typename T> void printcoll (T const& coll) { typename T::const_iterator pos; // iterator to iterate over coll typename T::const_iterator end(coll.end()); // end position for (pos=coll.begin(); pos!=end; ++pos) { std::cout << *pos << ' '; } std::cout << std::endl; } 下面我们来看看另外一个有意思的问题。那就是”.template”,大家仔细查看下面的代码: template<int N> void printBitset (std::bitset<N> const& bs) { std::cout << bs.template to_string<char,char_traits<char>, allocator<char> >(); } 大家注意到没有,。这个例子中的“.template”比较怪,但是如果没有他的话,那么编译器无法知道后面的“<”是模板参数的开始。而不是一个小于号。注意,只有当位于 点号之前的物件取决于某一个template parameter的时候,这种情况才会发生,以上的例子中,bs受控于N。也就是显式指明模板函数调用。可以理解为指名点姓的调用模板成员函数而非普通的。 结论是“.template”或者”->template”记号只能在templates中使用。而且他们必须紧跟在于template parameter相关的某个物件。 其实这里关于这个”.template”,笔者也没有搞懂,不知道哪位大牛搞懂了,麻烦指教一下,谢谢了。 下面我们来看看成员模板: 先看看下面的例子: Stack<int> intStack1, intStack2; // stacks for ints Stack<float> floatStack; // stack for floats … intStack1 = intStack2; // OK: stacks have same type floatStack = intStack1; // ERROR: stacks have different types 默认的赋值运算要求左右两边拥有相等的类型。但是如果把赋值运算定义为一个模板,就可以使得类型不同,但是元素可以隐式转换,比如: template <typename T> class Stack { private: std::deque<T> elems; // elements public: void push(T const&); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); } // assign stack of elements of type T2 template <typename T2> Stack<T>& operator= (Stack<T2> const&); }; 我们来实现它看看:关键代码如下: template <typename T> template <typename T2> Stack<T>& Stack<T>::operator= (Stack<T2> const& op2) { if ((void*)this == (void*)&op2) { // assignment to itself? return *this; } Stack<T2> tmp(op2); // create a copy of the assigned stack elems.clear(); // remove existing elements while (!tmp.empty()) { // copy all elements elems.push_front(tmp.top()); tmp.pop(); } return *this; } 下面我们测试一下啊: Stack<int> intStack; // stack for ints Stack<float> floatStack; // stack for floats … floatStack = intStack; // OK: stacks have different types, // but int converts to float 当然这个运算并不改变stack和其元素的类型,赋值完成转换,floatstack返回的任然是float。但是这个技术并不是说任何两个类型都能进行赋值,比如下面的代码就不行: Stack<std::string> stringStack; // stack of ints Stack<float> floatStack; // stack of floats … floatStack = stringStack; // ERROR: std::string doesn't convert to float 你知道为什么了吗? 当然,和以前一样,你也可以在将内部容器的类型也参数化: template <typename T, typename CONT = std::deque<T> > class Stack { private: CONT elems; // elements public: void push(T const&); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); } // assign stack of elements of type T2 template <typename T2, typename CONT2> Stack<T,CONT>& operator= (Stack<T2,CONT2> const&); }; 此时的赋值运算实现代码为: template <typename T, typename CONT> template <typename T2, typename CONT2> Stack<T,CONT>& Stack<T,CONT>::operator= (Stack<T2,CONT2> const& op2) { if ((void*)this == (void*)&op2) { // assignment to itself? return *this; } Stack<T2> tmp(op2); // create a copy of the assigned stack elems.clear(); // remove existing elements while (!tmp.empty()) { // copy all elements elems.push_front(tmp.top()); tmp.pop(); } return *this; } ============================================================================== 本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/03/08/2384871.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

C++学习第三天

一些基础就可以略过了,看书不能太呆板。 如果把一本书看完了,剩下的就是在实际项目中进行整合,训练,然后整理成笔记。 每天敲点程序,记点笔记。 变量作用域 代码: #include <iostream> #include <string> #include <conio.h> std::string s1 = "hello"; //全局 int main(){ std::string s2 = "world"; //局部 std::cout<<s1<<" "<<s2<<std::endl; int s1 = 42; //局部+隐式全局 std::cout<<s1<<" "<<s2<<std::endl; getch(); return 0; } 结果:hello world42 world判断代码输出结果 代码: #include <iostream> #include <string> #include <conio.h> int i = 42; int main(){ int i = 100,sum = 0; for(int i = 0;i!=10;++i) sum += i; std::cout<<i<<" "<<sum<<std::endl; getch(); return 0; } 结果:100 45 用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private。一旦使用了using声明,我们就可以直接引用名字,而不需要再引用改名字的命名空间了。 代码: #include <iostream> #include <string> #include <conio.h> using std::cin; using std::string; using std::cout; int main(){ string s; cin>>s; cout<<s; getch(); return 0; } #include <iostream> #include <string> #include <conio.h> using std::cin; using std::string; using std::cout; using std::endl; int main(){ string st("The expense of spirit\n"); cout<<"The size of "<<st<<"is"<<st.size() <<" characters,including the newline"<<endl; getch(); return 0; } 结果:The size of The expense of spiritis22 characters,including the newline 本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/archive/2013/04/11/3014962.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

学习大数据前提,制造linux环境

大数据,linux环境是必须的,基本的linux操作也是必须的,如果不会,可以学下,很快就上手。 获得linux环境方式: windows上部署虚拟机,然后虚拟机中搭载linux,运行速度慢,不方便。 双系统,windows10 + censOS ,大数据需要集群,这个也不方便。 安装方式可以看这里 http://xueliang.org/article/detail/20160912181035032 购买云主机,然后远程连接,最接近企业开发,方便增加计算机集群。我用的这种方式。我使用的阿里云的esc,按量计费,很便宜。 选择按量计费 按固定宽带 然后你可以用浏览器的远程连接 阿里云自带浏览器远程连接 putty连接 也可以用xshell连接,随你

优秀的个人博客,低调大师

c语言基础学习02_helloworld

=============================================================================涉及到的知识点有:include有两种用法、{}大括号用法解释、C语言自定义名字的要求、c语言库函数printf的解释、编译错误有两种、调用system函数、c语言编译过程、操作系统结构、指令集中的cpu架构 、QT常用快捷键、vs常用快捷键 =============================================================================将windows的可执行文件上传到linux,看能够执行吗?sftp> put a.exe 出现下面错误:没有权限;拒绝访问-bash: ./a.exe: Permission denied那我们提升下a.exe的权限试试chmod u+x a.exe 则出现下面错误:不能执行二进制文件:执行格式错误-bash: ./a.exe: cannot execute binary file: Exec format error说明windows的可执行文件不能再linux系统下执行 fatal error 致命错误 =============================================================================#include的意思是头文件包含,使用c语言库函数需要提前包含所用到的库函数对应的头文件c语言中如果要用到printf函数,在使用前必须 #include <stdio.h>-----------------------------------------------------------------------------include有两种用法:1、#include <文件名> 说明需要包含的文件在系统目录下2、#include “文件名” 说明需要包含的文件在当前目录下-----------------------------------------------------------------------------可执行代码必须放在{}大括号里面; 在c语言中一行只写一个分号是可以的,表示是空语句。c语言中一组大括号里也可以再有多组大括号。-----------------------------------------------------------------------------int a; //定义一个变量。extern int b; //声明一个变量。-----------------------------------------------------------------------------C语言自定义名字的要求:可以使用大小写字母、下划线、数字,但第一个字母必须是字母或者下划线。且字母区分大小写。(注意:BASIC语言不区分大小写)----------------------------------------------------------------------------- printf 是c语言库函数,功能是:向标准输出设备输出一个字符串(注意:标准输出设备不仅仅指的是控制台、屏幕,还有打印机等等什么的。)printf 函数只能用在控制台程序里面(就是字符界面下的),不能用在图形界面下,即不能把一个字符串输出到窗口里面。可以通过命令 man 3 printf 来查看。 -----------------------------------------------------------------------------编译错误有两种warning 不影响编译,只是警告。error 编译器彻底罢工了,不干活了。----------------------------------------------------------------------------- 第一种写法: int main(){ return 0;} 第二种写法: void main(){ return ; //或者可以这句话不用写} 对c语言,两种写法都对,但对于C++来讲,只支持第一种写法。-----------------------------------------------------------------------------在main函数中return 0; 代表程序执行成功,return -1; 代表程序执行失败。-----------------------------------------------------------------------------c语言文件的扩展名是.c,C++文件的扩展名就是cpp linux系统并不用后缀名来区分文件;Linux不像Windows一样区分文件后缀的,所以是可以改的,而且不影响使用的。 1,mv可以移动文件,也可以用作更改文件名。 2,修改命名:mv fileName.type fileName.newType就可以更改文件后缀了。 3,但是一些特定的文件不要随意更改,例如配置文件。=============================================================================在使用system之前需要包含stdlib.h这个头文件,调用system函数,可以在c语言的代码中执行另外一个程序-----------------------------------------------------------------------------如果在命令行执行一个程序,那么这个程序的调用者就是操作系统; 如果在代码中通过system,执行一个程序,那么这个程序的调用者就是自己写的代码本身。 c语言所有的库函数调用,只能保证语法是一致的,但不能保证执行结果是一致的,同样的,库函数在不同的操作系统下执行结果可能是一样的,也可能是不一样的。 不同平台下的c语言的库函数只能保证调用语法一样,但不能保证执行结果也是一样的。(因为c语言对硬件的要求、对操作系统的要求太多啦!)所以用C语言在不同的平台写代码的时候,可能会有一些移植的工作量。-----------------------------------------------------------------------------POSIX是一个标准,只要符合这个标准的函数,在不同的系统下执行的结果就可以一致。如果有符合posix标准的函数,尽量使用。 Unix和Linux很多库函数都是支持POSIX的,但windows支持的比较差。(曾经微软说过要表示大力支持,但说得多做得少!)所以说,如果将Unix代码移植到Linux一般代价很小,如果把windows代码移植到Unix或者linux就比较麻烦。-----------------------------------------------------------------------------system 返回的是一个整数。即system的返回值就是所被调用程序中main函数的return的值。 =============================================================================c语言编译过程1、预编译 --> 2、编译 --> 3、链接-----------------------------------------------------------------------------预编译命令:gcc -o cc1.c c1.c -E 或者 gcc -o cc1.c -E c1.c 或者 gcc -E c1.c -o cc1.c(注意:-o 作用是指定输出文件的名字,如果不加-o的话,则生成的文件名字总叫a.out)预编译c1.c,预编译之后得到的文件的名字叫cc1.c。(注意:编译后的名字可以随意起,但是呢我们知道预编译后的文件还是文本的.c文件,所以为了好区分起名字为 xxx.c)在c语言中#开头的语句又叫预编译指令。#include <stdio.h>预编译的功能之一:会把include包含的头文件内容做一个简单的替换,即替换到.c文件里面去。......//此处省略1万行......预编译的功能之二:会把代码中的注释去掉。-----------------------------------------------------------------------------编译的命令:gcc -o cc1.o cc1.c -c 或者 gcc -o cc1.o -c cc1.c 或者gcc -c cc1.c -o cc1.o编译cc1.c,编译之后得到的文件名字叫cc1.o.编译的功能是:把文本的c语言编译为二进制指令。-----------------------------------------------------------------------------链接的命令:gcc -o c1 cc1.o 或者 gcc cc1.o -o c1(注意:gcc没有单独的链接参数) 将系统库函数与cc1.o进行链接(简言之合并),得到可执行的程序,该程序的名字叫c1。 我们想知道在linux系统下到底链接来了什么库来呢?(即可执行程序需要用到什么库呢?)使用命令 ldd c1 查看。 (注意;用c语言写的代码依赖的库最少,如果使用其他语言依赖的库更多哦!!需要装好多包包。)那么在windows系统下的可执行程序需要用到什么库呢?使用一个小软件Depends.exe可以查看的到。 =============================================================================操作系统结构 1、用户模式 我们目前写的程序都是在用户模式下运行的。2、内核模式 操作系统本身、设备驱动等这些软件是在内核模式下运行的。-----------------------------------------------------------------------------一个CPU的一个寄存器可以放8个二进制位。例如:0000 00001111 1111则这个CPU就是8位的CPU。-----------------------------------------------------------------------------一个CPU的一个寄存器可以放16个二进制位。0000 0000 0000 00001111 1111 1111 1111则这个CPU就是16位CPU。-----------------------------------------------------------------------------总线有三种:数据总线、地址总线、控制总线。总线在大多数时候和CPU的寄存器位数是相同的。 8位CPU的总线是8位。1111 1111f f256BYTE(255字节) 16位CPU的总线是16位。1111 1111 1111 1111f f f f65536BYTE(64k字节) 32位CPU的总线是32位。1111 1111 1111 1111 1111 1111 1111 1111f f f f f f f f32位CPU管理内存有一个最大值,4G字节 = 4 x 1024M = 4 x 1024 x 1024 x 1024Byte(字节)。 64位CPU的总线是64位。1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111f f f f f f f f f f f f f f f f理论上64位CPU管理内存是:2^64个字节,但同时又取决于综合的指标:比如主板、操作系统的支持等等。但至少是远远大于4G的。 如果寄存器是64位,但总线是32位,这种cpu叫准64位CPU。(即里面可以做到很宽,但是外面的工艺却达不到) 若在64位的CPU架构上运行了64位的软件操作系统,那么这个系统是64位的;若在64位的CPU架构上运行了32位的软件操作系统,那么这个系统是32位的。-----------------------------------------------------------------------------指令集中的cpu架构 精简指令集RISC(服务器端用的)比如:SPARC、ARM属于精简指令集。 复杂指令集CISC(比如Inter的CPU)比如:X86属于典型的复杂指令集。-----------------------------------------------------------------------------cpu内部里面所有的计算都得在寄存器里面来完成。 cpu内部的寄存器还有名字哦:8位cpu(x86构架) 16位CPU 32位CPU 64位CPU a ax,al,ah eax rax b bx,bl,bh ebx rbx c cx ecx rcx d dx edx rdx-----------------------------------------------------------------------------使用Qt时,再用到system函数时,会出现一个控制台的窗口。为什么呢?答:因为system函数在windows系统下就是一个基于控制台的函数(就是字符界面的函数),所以即使在图形界面下调用system也会出现一个控制台窗口。那么如何在图形界面下调用该函数又不显示控制台呢?答:可以换另外一个函数啊!该函数是 WinExec("notepad",SW_NORMAL); 但是该函数需要包含一个头文件是 #include <windows.h>。 QT常用快捷键Ctrl + I 自动格式化代码Ctrl + / 注释代码/取消注释代码Ctrl + r 不调试运行代码Ctrl + b 编译代码但不运行代码Alt + enter 自动完成类函数定义F9 设置断点F5 调试运行F10 next调试F11 step调试-----------------------------------------------------------------------------vs常用快捷键Ctrl + F5 不调试运行代码Ctrl + k,Ctrl + f 自动格式化代码Ctrl + k,Ctrl + c 注释代码Ctrl + k,Ctrl + u 取消注释代码Ctrl + Shift + b 编译,不运行代码F5 调试运行F9 设置断点 注意:C语言以分号结尾的,而不是以行结尾的。=============================================================================我的GitHub地址: https://github.com/heizemingjun 我的博客园地址: http://www.cnblogs.com/chenmingjun 我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun Copyright ©2018 黑泽明军 【转载文章务必保留出处和署名,谢谢!】

优秀的个人博客,低调大师

[Android学习笔记二] View转化Bitmap

在View类中的onDraw方法的参数Canvas是View绘制的背景,要将View转换为Bitmap实际上就是让Canvas上的绘制操作绘制到Bitmap上。 View转化为Bitmap也称为截屏,让用户看到的View视图转化为图片的过程。 关于View转化Bitmap涉及到的View类中的方法有: 1 2 3 4 5 protected void onDraw(Canvascanvas) public void buildDrawingCache() public void destroyDrawingCache() public BitmapgetDrawingCache() public void setDrawingCacheEnabled( boolean enabled) 下面是常见的几个View截屏的示例: 1.View转Bitmap 1 2 3 4 5 6 7 8 9 10 11 public final BitmapscreenShot(Viewview){ if ( null ==view){ throw new IllegalArgumentException( "parametercan'tbenull." ); } view.measure(View.MeasureSpec.UNSPECIFIED,View.MeasureSpec.UNSPECIFIED); view.layout( 0 , 0 ,view.getMeasuredWidth(),view.getMeasuredHeight()); view.setDrawingCacheEnabled( true ); view.buildDrawingCache(); Bitmapbitmap=view.getDrawingCache(); return bitmap; } 2. Activity转Bitmap,不带状态栏 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public final BitmapscreenShot(Activityactivity){ if ( null ==activity){ throw new IllegalArgumentException( "parametercan'tbenull." ); } Viewview=activity.getWindow().getDecorView(); view.setDrawingCacheEnabled( true ); view.buildDrawingCache(); Bitmapb1=view.getDrawingCache(); Rectframe= new Rect(); view.getWindowVisibleDisplayFrame(frame); int statusBarHeight=frame.top; Pointpoint= new Point(); activity.getWindowManager().getDefaultDisplay().getSize(point); int width=point.x; int height=point.y; Bitmapb2=Bitmap.createBitmap(b1, 0 ,statusBarHeight,width,height-statusBarHeight); view.destroyDrawingCache(); return b2; } 3. ScrollView转长Bitmap(类似锤子便签的截长图) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public final BitmapscreenShot(ScrollViewscrollView){ if ( null ==scrollView){ throw new IllegalArgumentException( "parametercan'tbenull." ); } int height= 0 ; Bitmapbitmap; for ( int i= 0 ,s=scrollView.getChildCount();i<s;i++){ height+=scrollView.getChildAt(i).getHeight(); scrollView.getChildAt(i).setBackgroundResource(android.R.drawable.screen_background_light); } bitmap=Bitmap.createBitmap(scrollView.getWidth(),height,Bitmap.Config.ARGB_8888); final Canvascanvas= new Canvas(bitmap); scrollView.draw(canvas); return bitmap; } 本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1711443,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册