Python–re正则入门教程,全程实操超详细

thbcm阅读(226)

Hello,大家好呀,我们今天的目标是,30 分钟内明白正则表达式是什么,并对它有一些基本的了解,并且在自己的程序或网页里使用它。本文全程实操,只要跟着练,你一定会有收获。好课推荐:正则表达式浅析;实战推荐:正则表达式

一、单字符匹配

1、匹配某个字符串:

text = “abcdef”

ret = re.match(‘a’,text)

print(ret.group())

2、点(.):匹配任意的字符(除了’\n’):

text = “\nabcdef”

ret = re.match(‘.’,text)

print(ret.group())

3、\d:匹配任意的数字:

text = “abcdef”

ret = re.match(‘\d’,text)

print(ret.group())

4、\D:匹配任意的非数字:

text = “cabedf”

ret = re.match(‘\D’,text)

print(ret.group())

5、\s:匹配的是空白字符(包括:\n,\t,\r和空格):

text = “\nabdef”

ret = re.match(‘\s’,text)

print(“*”*30)

print(ret.group())

print(“*”*30)

6、\S:非空白字符:

text = “ababdef”

ret = re.match(‘\S’,text)

print(“*”*30)

print(ret.group())

print(“*”*30)

7、\w:匹配的是a-z和A-Z以及数字和下划线:

text = “1bc”

ret = re.match(‘\w’,text)

print(“*”*30)

print(ret.group())

print(“*”*30)

8、\W:匹配的是和\w相反的:

text = “+bc”

ret = re.match(‘\W’,text)

print(“*”*30)

print(ret.group())

print(“*”*30)

9、[] 组合的方式,只要满足中括号中的某一项都算匹配成功:

text = “cba”

ret = re.match(‘[1c]’,text)

print(“*”*30)

print(ret.group())

print(“*”*30)

10、使用组合的方式 [0-9] \d:

text = “abc”

ret = re.match(‘[^0-9]’,text)  # ^符号表示非

print(“=”*30)

print(ret.group())

print(“=”*30)

11、使用组合的方式实现 \w:

text = “+bc”

ret = re.match(‘[^a-zA-Z0-9_]’,text)

print(“=”*30)

print(ret.group())

print(“=”*30)

二、多字符匹配

1、*:匹配 0 个或者多个字符:

text = “-cba”

result = re.match(‘\D*’,text)

print(result.group())

2、+:匹配 1 个或者多个字符:

text = “1cba”

result = re.match(‘\w+’,text)

print(result.group())

3、?:匹配前一个字符 0 个或者 1 个:

text = “-cba”

result = re.match(‘\w?’,text)

print(result.group())

4、{m}:匹配 m 个字符:

text = “+1cba”

result = re.match(‘\w{2}’,text)

print(result.group())

5、{m,n}:匹配 m-n 之间的个数的字符:

text = “1cba+”

result = re.match(‘\w{1,3}’,text)

print(result.group())

三、正则表达式案例

1、验证手机号码:手机号码的规则是以 1 为开头,第二位可以是 34587,后面那 9 位可为任意数字。

text = “17751632549”

result = re.match(“1[34587]\d{9}”,text)

print(result.group())

2、验证邮箱:邮箱的规则是邮箱名称是用数字、英文字符、下划线组成的,然后是 @ 符号,接着为域名。

text = “w3cschool@163.com”

result = re.match(“\w+@[a-z0-9]+\.[a-z]+”,text)

print(result.group())

3、验证 URL:URL 的规则是前面是 http 或者 https 或者是 ftp 然后再加上一个冒号,再加上两个斜杠,再后面就是可以出现任意非空白字符了。

text = “https://www.w3cschool.cn/minicourse/play/quick_scrapy”

result = re.match(“(http|https|ftp)://\S+”,text)

print(result.group())

4、验证身份证:身份证的规则是,总共有 18 位,前面 17 位都是数字,后面一位可以是数字,也可以是小写的 x,也可以是大写的 X。

text = “35215669985213654x”

result = re.match(“\d{17}[\dxX]”,text)

print(result.group())

四、开始/结束/贪婪和非贪婪

1、^:以…开头:

text = “hello world”

result = re.search(“^world”,text)

print(result.group())

2、$:以…结尾:

text = “hello world”

result = re.search(“hello$”,text)

print(result.group())

text = “”

result = re.search(“^$”,text)

print(result.group())

3、|:匹配多个字符串或者表达式:

text = “https://www.w3cschool.cn/minicourse/play/quick_scrapy”

result = re.match(“(http|https|ftp)://\S+”,text)

print(result.group())

4、贪婪和非贪婪:

text = “12345”

result = re.search(“\d+?”,text)

print(result.group())

案例 1:提取 html 标签名称:

text = “<h1>这是一级标题</h1>”

result = re.search(“<.+?>”,text)

print(result.group())

案例 2:验证一个字符是不是 0-100 之间的数字:

text = “100”

result = re.match(“0$|[1-9]\d?$|100$”,text)

print(result.group())

四、转义字符和原生字符串

1、Python 中的转义字符:

text = r”hello\nw3cschool”

print(text)

2、正则表达式中的转义字符:

text = “apple price is $9.9,range price is $8.8”

result = re.findall(“\$\d+”,text)

print(result)

3、原生字符串和正则表达式:

正则表达式的字符串解析规则:

  • 先把这个字符串放在 Python 语言层面进行解析。
  • 把 Python 语言层面解析的结果再放到正则表达式层间进行解析。

text = “\cba c”

result = re.match(“\\\\c”,text) # \\\\c =(Python语言层面)> \\c =(正则表达式层面)> \c

result = re.match(r”\\c”,text) # \\c =(正则表达式层面)> \c

print(result.group())

五、分组

text = “apple price is $9.9,orange price is $8.8”

result = re.search(‘.+(\$\d+).+(\$\d+)’,text)

print(result.groups())

group()/group(0):匹配整个分组

group(1):匹配第一个分组

group(2):匹配第二个分组

groups():获取所有的分组

六、re 中常用的函数

1、findall:查找所有满足条件的

text = “apple price is $9.9,orange price is $8.8”

result = re.findall(r’\$\d+’,text)

print(result)

2、sub:根据规则替换其他字符串

text = “nihao zhongguo,hello w3cschool”

new_text = text.replace(” “,”\n”)

new_text = re.sub(r’ |,’,’\n’,text)

print(new_text)

html = “””

<div class=”job-detail”>

     <p>1. 3年以上相关开发经验 ,全日制统招本科以上学历</p>

     <p>2. 精通一门或多门开发语言(Python,C,Java等),其中至少有一门有3年以上使用经验</p>

     <p>3. 熟练使用ES/mysql/mongodb/redis等数据库;</p>

     <p>4. 熟练使用django、tornado等web框架,具备独立开发 Python/Java 后端开发经验;</p>

     <p>5. 熟悉 Linux / Unix 操作系统 </p>

     <p>6. 熟悉 TCP/IP,http等网络协议</p>

     <p>福利:</p>

     <p>1、入职购买六险一金(一档医疗+公司全额购买商业险)+开门红+全额年终奖(1年13薪,一般会比一个月高)</p>

     <p>2、入职满一年有2次调薪调级机会</p>

     <p>3、项目稳定、团队稳定性高,团队氛围非常好(汇合员工占招行总员工比例接近50%);</p>

     <p>4、有机会转为招商银行内部员工;</p>

     <p>5、团队每月有自己的活动经费,法定节假日放假安排;</p>

     <p>6、办公环境优良,加班有加班费(全额工资为计算基数,加班不超过晚上10点,平日加班为时薪1.5倍,周末加班为日薪2倍,周末加班也可优先选择调休,管理人性化)。</p>

 </div>

“””

new_html = re.sub(r'<.+?>’,””,html)

print(new_html)

3、split:根据规则分割字符串

text = “nihao zhongguo,hello world”

result = re.split(r’ |,’,text)

print(result)

4、compile:编译正则表达式

text = “apple price is 34.56”

r = re.compile(r”””

 \d+ # 整数部分

 \.? # 小数点

 \d* # 小数部分

 “””,re.VERBOSE)

result = re.search(r,text)

result = re.search(r”””

\d+ # 整数部分

\.? # 小数点

\d* # 小数部分

“””,text,re.VERBOSE)

print(result.group())

如果想要在正则表达式中加注释,那么需要在正则表达式的函数最后加一个`re.VERBOSE`。

HTML5表单自动验证

thbcm阅读(195)

在html5中,在增加了大量的表单元素与属性的同时,也增加了大量在提交时对表单与表单内新增元素进行内容有效性验证的功能,接下来我们来说一下自动验证。

在html5中,通过对元素使用属性的方法,可以实现在表单提交时履行自动验证的功能,在履行代码后,将在表单提交时自动验证输入的内容是不是为数字,如果验证通不过,将显示问题信息文字。

接下来我们来看一下在html5中追加的关于对元素内输入内容进行限制的属性的指定。

1.required属性

html5 中新增的 required 属性可以利用在大多数输入元素上(除隐藏元素,图片元素按钮上)。在提交时,如果元素中内容为空白。则不允许用户提交,同时在浏览器中显示信息提示文字,提示用户在这个元素中必须输入内容,效果如图:

2.pattern属性

新增的 input 元素,比如 email,number,URL等,要求输入内容符合一定的格式,对 input 元素使用 pattern 属性,并且将属性值设置为某个格式的正则表达式,在提交时会检查其内容是不是符合给定格式。当输入的内容不符合给定格式时,则不允许提交,同时在浏览器中显示信息提交文字,提交输入的内容必须符合给定格式,代码如下,要求输入内容为1个数字与3个大写字母:

3.min属性max属性

min 与 max 这两个属性是日期类型或数值类型的 input 元素的专用属性,他们限制了在 input 元素中输入的数值与日期的范围。

4.step属性

step属性控制input元素中的值增加过减少时的步骤。例如当你想让用户输入的值在0与100之间,但必须是5的倍数时,你可以指定step为5,代码以下:

有关HTML更多标签属性可以阅读:HTML参考手册

系统的学习HTML,可以采用边学边练的学习模式:HTML微课

Java常见基础知识面试题—-你懂几个?

thbcm阅读(207)

大家好呀,小编今天给大家分享一些 Java 常见的基础知识面试题,为即将要面临春招,以及正在寻找工作的小伙伴们提前支支招。

推荐好课:Java基础入门到框架实践深入解析Java面向对象

一、八种基本数据类型的大小,以及他们的封装类

数据类型 封装类 大小
byte Byte 1 字节
short Short 2 字节
int Integer 4 字节
long Long 8 字节
float Float 4 字节
double Double 8 字节
boolean Boolean /
char Character 2 字节


二、switch 能否用 string 做参数?

switch 语句中的变量类型可以使 byte,short,int,char。从 jdk1.7 后可以使用 String 类型,是通过 switch 中的 String.hashcode 将 String 转换成 int 进行判断。

三、equals 与 == 的区别

== 操作符是用来比较两个变量的值是否相等,即就是比较变量在内存中的存储地址是否相同,equals()方法时 String 类从 Object 类中继承的,被用来检测两个对象的内容是否相同。

四、String s = new String(‘abc’);创建了几个 object 对象?

会创建一个 String 类型的变量 s。在类加载到此处之前没有出现“abc”字面量的话,加载此处会创建一个对应“abc”的 String 常量对象。在符合规范的 JVM 上,执行到此处 new 关键字会创建一个 String 对象。

五、 Object有哪些公用方法?

  1. clone() 创建斌返回此对象的副本
  2. equals() 判断
  3. getclass() 返回 object 的运行类
  4. hashcode() 返回对象的哈希码值
  5. notify() 唤醒正在等待对象监听器的单个进程
  6. notifyAll() 唤醒正在等待对象监听器的所有进程
  7. wait() 导致当前线程等待,直到另一个线程调用该对象的 notify() 方法或 notifyAll() 方法
  8. toString() 返回此对象的字符串表示形式
  9. finalize() 当垃圾收集确定不需要该对象时,垃圾回收器调用该方法

六、Java的四种引用,用到的场景

  • 强引用:垃圾回收器不会回收
  • 软引用:如果内存空间足够,垃圾回收器就不会进行回收,如果内存空间不足,垃圾回收器就会进行回收
  • 弱引用:一旦发现了只有弱引用的对象,垃圾回收器就会进行回收。
  • 虚引用:如果发现该对象还具有虚引用,就会在回收该对象之前,吧这个虚引用加入到与之关联的引用队列中。

七、静态变量和实例变量的区别

静态变量前要加上关键字 static,实例变量则不会。

实例变量是属于某个对象的属性,必须创建了实例对象,其中的实例变量才会分配空间,才能使用这个实例变量。静态变量不属于任何的实例对象,而是属于类,也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,就会被分配空间。总之就是,静态变量不需要创建任何的对象就可以直接使用,而实例变量需要先创建实例对象才能被使用。

八、 Overload 和 Override 的区别

重载 Overload 表示的是同一个类中可以有多个相同名称的方法,但这些方法的参数列表不同,即就是参数参数或参数类型不同。重载时返回值当然可以不一样,但是如果参数列表完全一致时,不能通过返回类型不一致而实现重载,这是不可以的。

重写 Override 表示子类中的方法可以与父类中的方法名称和参数完全相同,通过子类创建的对象来调用这个方法时,将调用子类中定义的方法,即就是子类中的该方法将父类的该方法覆盖了。子类覆盖父类方法时只能抛比父类更少或者更小的异常。重写的方法其返回必须和被覆盖的方法返回一致。

九、抽象类和接口的区别

抽象类可以有默认的方法进行实现,可以有构造器,可以有 main 方法进行运行,可以直接在该类中添加实现的方法接口没有默认的方法进行实现,没有构造器,不可以使用 main 方法进行运行,在接口中添加方法时需要在具体实现的类中添加方法。

十、 Java面向对象的特征与含义

  1. 封装:封装的目的在于实现程序的“高内聚,低耦合”,防止程序相互依赖而带来的变动影响。封装是保证是把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和他操作的数据放在同一个类中;
  2. 抽象:抽象就是找出事物的相似和共性,然后将这些事物归为同一类,这个类只考虑这些事物的相似和共性,忽略和当前主题不相关的因素;
  3. 继承:子类继承父类的内容作为自己的内容,可以加入新的内容或者是修改父类的内容而更加适合特殊的需要。提高了额程序的可重用性和可扩张性;
  4. 多态:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

十一、java多态的实现

接口实现,继承父类进行方法重写,

同一个类中进行方法重载。

十二、运行时异常和一般异常的区别

异常表示程序运行过程中可能出现的非正常状态。运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见的运行错误。java 编译器要求方法必须声明抛出可能出现的非运行时异常,但是并不要求必须声明抛出未被捕获的异常。

十三、Java语言如何进行异常处理,throws,throw,try catch finally 代表什么意义,try 块中可以抛出异常吗?

Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在 Java 中,每个异常都是一个对象,它是 Throwable 类或其它子类的实例。当一个

方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java 的异常处理是通过 5 个关键词来实现的:try、catch、throw、throws 和 finally。一般情况下是用 try 来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。

用try来指定一块预防所有”异常”的程序。紧跟在 try 程序后面,应包含一个 catch 子句来指定你想要捕捉的”异常”的类型。

throw 语句用来明确地抛出一个”异常”;

throws 用来标明一个成员函数可能抛出的各种”异常”;

Finally 为确保一段代码不管发生什么”异常”都被执行一段代码;

可以在一个成员函数调用的外面写一个 try 语句,在这个成员函数内部写另一个 try 语句保护其他代码。每当遇到一个 try 语句,”异常”的框架就放到堆栈上面,直到所有的 try 语句都完成;

如果下一级的 try 语句没有对某种”异常”进行处理,堆栈就会展开,直到遇到有处理这种”异常”的 try 语句。

十四、 try catch finally,try里有return,finally还执行么?

  1. finally 语句总会执行;
  2. 如果 try、catch 中有 return 语句,finally 中没有 return,那么在 finally 中修改除包装类型和静态变量、全局变量以外的数据都不会对 try、catch 中返回的变量有任何的影响(包装类型、静态变量会改变、全局变量);
  3. 尽量不要在 finally 中使用 return 语句,如果使用的话,会忽略 try、catch 中的返回语句,也会忽略 try、catch 中的异常,屏蔽了错误的发生;
  4. finally 中避免再次抛出异常,一旦 finally 中发生异常,代码执行将会抛出 finally 中的异常信息,try、catch 中的异常将被忽略。

十五、 Java 中 final、finally 和 finalize 的区别

  • final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承;内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……
  • finally 是异常处理语句结构的一部分,表示总是执行;
  • finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方法总被调用。

十六、String、StringBuffer与StringBuilder的区别

  • String 表示内容不可修改的字符串,StringBuffer 表示内容可以修改的字符串;
  • String 覆盖了 equals()方法和 hashcode()方法,而 StringBuffer 没有覆盖两个方法,,所以 StringBuffer 对象存储到 java 集合类中时会出现问题;
  • StringBulider 也表示内容可以修改的字符串,但是其线程是不安全的,运行效率高。

十七、error和exception区别

  • error 表示有可能恢复但比较困难的的一种严重问题,程序是不能进行处理的;
  • exception 表示一种设计或者实现问题。

十八、Java 中的异常处理机制和简单原理和应用

JAVA 程序违反了 JAVA 的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括 2 种情况:

一种是JAVA类库内置的语义检查。例如数组下标越界,会引发 IndexOutOfBoundsException; 访问 null 的对象时会引发  NullPointerException。

另一种情况就是 JAVA 允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用 throw 关键字引发异常。所有的异常都是 java.lang.Thowable 的子类。

十九、 常见的运行时异常

系统异常是 RuntimeException 的子类,常见的系统异常有:

  • ArrayIndexOutOfBoundsException – 数组越界访问
  • ClassCastException – 类型转换异常
  • NullPointerException – 试图访问一空对象的变量、方法或空数组的元素
  • IllegalArgumentException – 方法的参数无效
  • NoClassDefFoundException – JAVA运行时系统找不到所引用的类

二十、 Set 里面的元素不能重复,用什么方法区分重复与否?

  • Set里的元素是唯一不能重复的,元素是否重复使用 equals() 方法进行判断。
  • equals() 方法和 == 方法决定引用值是否指向同一对象 equals() 在类中被覆盖,为的是两个分离的对象的内容和类型相匹配的话,返回真值。

二十一、HashMap 和 Hashtable 的区别

  1. Hashtable 是基于 Dictionary 类的,HashMap 是 Map 接口的一个实现类;
  2. Hashtable 是线程安全的,即是同步的;HashMap 线程不是安全的,不是同步的;
  3. HashMap 可以将空值作为 key 或 value。

二十二、 HashMap、LinkedHashMap、TreeMap的区别

  1. HashMap 是根据键的 hashcode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,取得的数据完全是随机的;
  2. LinkedHashMap 保存了记录的插入顺序,在使用 Iterator 进行遍历的时候,先得到的肯定是先插入的数据,可以在构造时带参数,按照应用次数来进行排序;
  3. TreeMap 实现 SortMap 接口,能够把它保存的记录根据键排序。默认的是升序排序,也可以指定排序的比较器,进行遍历的时候得到的是排序过的记录。

二十三、HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底层实现。

  1. HashMap 是 java 数据结构中两大结构数组和链表的组合。HashMap 底层数组,数组中的每一项又是一个链表。程序会先根据key的hashcode()方法返回值决定该 Entry 在数组中的存储位置,如果该位置上没有元素,就会将元素放置在此位置上,如果两个 Entry 的 key 相同,会调用 equals,返回值是 true 则覆盖原来的value值,返回 false 则会形成 Entry 链,位于头部。
  2. ArrrayList 的底层实现是数组,在执行 add 操作时,会先检查数组大小是否可以容纳新的元素,如果不够就会进行扩容。然后会将原来的数据拷贝到新的数组中。
  3. LinkedList 底层是一个链表,其实现增删改查和数据结构中的操作完全相同,而且插入是有序的。
  4. LinkedHashMap 的底层结构式是双链表,其他的逻辑处理与 HashMap 一致,同样没有锁保护,多线程使用时存在风险。
  5. ConcurrentHashMap 是 segment 数组结构和 HashEntry 数组结构组成的,segment 在 ConcurrentHashMap 中充当锁的角色,HashEntry 用于存储键值对数据。segment 的结构是数组和链表,一个segment中有一个 HashEntry,每个 HashEntry 是一个链表结构的元素。对 HashEntry 中的数据进行修改时,需要先获得它所对应的 segment 锁。每个 ConcurrentHashMap 默认有 16 个 segment。

二十四、迭代器Iterator

Iterator 提供了统一遍历操作集合元素的统一接口,Collection 接口实现 Iterator 接口。每个集合都通过实现 Iterator 接口中的iterator() 方法返回实例,然后对元素进行迭代操作,但是在迭代元素的时候不能使用集合的方法删除元素,否则会抛出异常,可以使用 Iterator 接口中的 remove() 方法进行删除。

二十五、Map、Set、List、Queue、Stack的特点与用法。

1、Map 是以键值对的形式进行存储的,其中 key 是唯一不可重复的,value 的可以重复,当插入的值是 key 相同,后加入的会将已有的覆盖。他有几个具体的实现类,包括 Treemap 和 HashMap,TreeMap 是有序的,HashMap 是无序的。

2、List 有序,可重复

|–ArrayList

底层数据结构是数组,查询快,增删慢,线程不安全,效率高

|–Vector

底层数据结构是数组,查询快,增删慢,线程不安全,效率高

|–LinkedList

底层数据结构是链表,查询慢,增删块,线程安全,效率低

3、Set 无序,唯一

|–HashSet

底层数据结构是哈希表

如何保证元素的唯一性:

依赖两个方法,hashCode() 和 equals()

|–LinkedHashSet

底层数据结构是链表和哈希表,由链表保证元素有序,由哈希表保证元素唯一

|–TreeSet 底层数据结构是红黑树,

如何保证元素的排序:

自然排序:让元素所属的类实现 Comparable 接口

比较器排序:让集合接收一个 Comparator 的实现类对象

如何保证元素的唯一性:

根据比较的返回值是否是 0 来决定的

4、Query 队列遵循先进先出的原则,不允许插入null值,其中提供了相应的进队和出队的方法,建议使用offer() 方法来添加元素,使用poll() 方法删除元素

5、Stack遵从后进先出的原则,继承自 Vector。他通过 5 个操作对 Vector 类进行扩展,它提供了 push 和 pop 操作,以及去堆栈顶点的peek() 方法,测试堆栈是否为空的 empty 方法

6、使用方法:

如果涉及到堆栈,队列等操作,建议使用 List

对于快速插入和删除元素建议使 用LinkedList

需要快速随机访问元素建议使用 ArrayList

二十六、Collection 包结构

Collection 是集合类的上级接口,是单列集合。继承他的接口主要有 Set 和 List.

Set接口的子接口有:HashSet,TreeSet

List接口的子接口有:Arraylist,LinkedList,Vector

二十七、Collection 与 Collections 的区别。

Collection 是集合类的上级接口,继承他的接口有 Set 和 List;

Collections 是针对集合类的一个帮助类,它提供一系列的静态方法实现集合的搜索,排序,线程安全等操作。

二十八、 Colection 框架中实现比较要实现什么接口?

comparable:只包含 compareTo() 方法

comparator:compare() 和 equals()

二十九、Collection框架的结构

集合框架(Collection Framework)泛指 java.util 包的若干个类和接口。如 Collection, List, ArrayList, LinkedList, Vector( 自动增长数组), HashSet, HashMap 等;

集合框架中的类主要封装的是典型的数据结构,如动态数组,链表,堆栈,集合,哈希表等;

集合框架类似编程中经常用到的工具类,使得编码这专注于业务层的实现,不需要从底层实现相关细节—“数据结构的封装”和”典型算法的实现”。

三十、 快速失败(fail-fast)和安全失败(fail-safe)的区别。

Iterator 的安全失败是基于对底层集合做拷贝,因此它不受源集合修改的影响。util 包下的所有集合类都是快速失败的,util.concurren包下面的所有类都是安全失败的。

推荐好课:Java开发实例:坦克大战游戏Java零基础之io流详解

XML跟HTML有哪些差别?XML的优势在哪?

thbcm阅读(211)

一、XML导读

XML 是独立于软件和硬件的信息传输工具。XML 是 W3C 的推荐标准。XML 无所不在,当我们看到 XML 标准突飞猛进的开发进度,和大批的软件开发商采取这个标准的日新月异的速度时,真的是不由感叹这真的使人叹为观止。

目前,XML 在 Web 中起到的作用不会亚于一直作为 Web 基石的 HTML 。XML 是各种利用程序之间进行数据传输的最经常使用的工具,并且在信息存储和描写领域变得越来越流行。想要学习XML,可以通过XML.DOM教程

二、XML基本概述

XML(可扩大标记语言),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包括各种的信息比如文章等。

它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合万维网传输,提供统一的方法来描写和交换独立于利用程序或供应商的结构化数据。是 Internet 环境中跨平台的、依赖于内容的技术,也是现今处理散布式结构信息的有效工具。早在1998年,W3C 就发布了 XML1.0 规范,使用它来简化 Internet 的文档信息传输。

三、什么是XML?

  1. XML 是指可扩大标记语言(EXtensible Markup Language)
  2. XMl 是一种标记语言,很类似 HTML (超文本标记语言)
  3. XML 的设计主旨是传输数据,而非显示数据
  4. XML 标签没有被预定义,您需要自行定义标签
  5. XML 被设计为具有自我描写性
  6. XML 是 W3C 的推荐标准

四、XML与HTML的主要差异

  1. XML 和 HTML 为不同的目的而设计
  2. XML 被设计为传输和存储数据,其焦点是数据的内容
  3. HTML 被设计用来显示数据,其焦点是数据的外观
  4. HTML 旨在显示信息,而 XML 旨在传输信息
  5. XML 不是对 HTML 的替换,XML 是对 HTML 的补充
  6. XML 不会替换 HTML,理解这一点很重要。在大多数 Web 利用程序中,XML 用于传输数据,而 HTML 用于格式化并显示数据

五、为何需要 XML

  1. 解决了数据传输不规范的问题
  2. 可以非常好的描写树形结构的事物
  3. 可以用作配置文件

六、没有任何行动的 XML

XML 是不作为的。或许这有点难以理解,但是 XML 不会做任何事情。XML 被设计用来结构化、存储和传输息。

我们在这里举一个在记事本书写的简单例子来讲明一下。

下面是一个书籍列表,存储为 XML:

<?xml version=”1.0″ encoding=”gb2312″?> 
<书籍列表> 
    <计算机书籍> 
        <bookname>XML利用大全</bookname> 
        <price>39.00</price> 
    </计算机书籍> 
    <计算机书籍> 
        <bookname>Java利用大全</bookname>
        <price>139.00</price> 
    </计算机书籍> 
    <计算机书籍>
        <bookname>Oracle利用大全</bookname> 
        <price>59.00</price>
    </计算机书籍>
</书籍列表>

上面的这条便签具有自我描写性。它具有标题和留言,同时包括了发送者和接受者的信息。但是,这个 XML 文档依然没有做任何事情。它仅仅是包装在 XML 标签中单纯的信息。我们需要编写软件或程序,才能传送、接收和显示出这个文档。

七、XML仅仅是纯文本

 XML 没什么特别的。它仅仅是纯文本而已。有能力处理纯文本的软件都可以处理 XML。不过,能够读懂 XML 的应用程序可以有针对性地处理 XML 的标签。标签的功能性意义依赖于利用程序的特性。这里的内容我们会在以后的内容中逐步体会到 XML 标签的作用。

八、通过 XML 您可以发明自己的标签

上例中的标签没有在任何 XML 标准中定义过(比如<bookname>和<price>等等)。这些标签是由文档的创作者发明的。这是由于 XML 没有预定义的标签。XML 允许创作者定义自己的标签和自己的文档结构。

在 HTML 中使用的标签(和 HTML 的结构)是预定义的。HTML 文档只使用在 HTML 标准中定义过的标签(比如<p>,<h1>等等)。

九、XML树结构

我们在上面的书籍实例中可以看出 XML 文档构成了一种树结构,它从“根部”开始,然后扩大到“枝叶”。

一个 XML 文档实例

XML使用简单的具有自我描写性的语法:

<?xml version=”1.0″ encoding=”UTF⑻”?> 
<note> 
    <to>George</to> 
    <from>John</from> 
    <heading>Reminder</heading> 
    <body>Don’t forget the meeting!</body>
</note>

第一行是 XML 声明。它定义 XML 的版本(1.0)和所使用的编码(UTF-8,GBK等);

下一行描写文档的根元素(像在说:“本文档是一个便签”):<note>;

接下来4行描写根的4个子元素(to、from、heading和body):
<to>George</to>
<from>John</from>

<heading>Reminder</heading>
<body>Don’t forget the meeting!</body>;

最后一行定义根元素的结尾:</note>。

从本例可以假想,该 XML 文档包括了John给George的一张便签。

XML 具有出色的自我描写性,你同意吗?

XML 文档构成一种树结构

XML 文档必须包括根元素。该元素是所有其他元素的父元素。

XML 文档中的元素构成了一棵文档树。这棵树从根部开始,并扩大到树的最底端。

所有元素都可具有子元素:

<root> <child> <subchild>…..</subchild> </child> </root>

父、子和同胞等术语用于描写元素之间的关系。父元素具有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。所有元素都可具有文本内容和属性(类似 HTML 中)。

实例:

上图表示下面的 XML 中的一本书:

<bookstore>

    <book category=”COOKING”> 

        <title lang=”en”>Everyday Italian</title> 

        <author>Giada De Laurentiis</author> 

        <year>2005</year> 

        <price>30.00</price> 

    </book> 

    <book category=”CHILDREN”> 

        <title lang=”en”>Harry Potter</title> 

        <author>J K. Rowling</author> 

        <year>2005</year> 

        <price>29.99</price> 

    </book> 

    <book category=”WEB”> 

        <title lang=”en”>Learning XML</title> 

        <author>Erik T. Ray</author> 

        <year>2003</year> 

        <price>39.95</price> 

    </book> 

</bookstore>

例子中的根元素是<bookstore>。文档中的所有<book>元素都被包括在<bookstore>中。<book>元素有 4 个子元素:

<title>、< author>、<year>、<price>。

十、XML用处

XML 经常使用于简化数据的存储和共享

(1)XML 把数据从 HTML 分离

如果你需要在 HTML 文档中显示动态数据,那末每当数据改变时将花费大量的时间来编辑 HTML。通过 XML,数据能够存储在独立的XML 文件中。这样你就能够专注于使用 HTML 进行布局和显示,并确保修改底层数据不再需要对 HTML 进行任何的改变。通过使用几行JavaScript,你就能够读取一个外部 XML 文件,然后更新 HTML 中的数据内容。

(2)XML简化数据同享

在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。这让创建不同利用程序可以同享的数据变得更加容易。

(3)XML简化数据传输

通过 XML,可以在不兼容的系统之间轻松地交换数据。对开发人员来讲,其中一项最费时的挑战一直是在因特网上的不兼容系统之间交换数据。由于可以通过各种不兼容的利用程序来读取数据,以 XML 交换数据下降了这类复杂性。

(4)XML简化平台的变更

升级到新的系统(硬件或软件平台),总是非常费时的。必须转换大量的数据,不兼容的数据常常会丢失。XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩大或升级到新的操作系统、新利用程序或新的浏览器。

(5)XML使您的数据更有用

由于 XML 独立于硬件、软件和利用程序,XML 使您的数据更可用,也更有用。不同的利用程序都能够访问您的数据,不单单在 HTML 页中,也能够从 XML 数据源中进行访问。通过 XML,您的数据可供各种浏览装备使用(手持的计算机、语音装备、新闻浏览器等),还可以供盲人或其他残障人士使用。

(6)XML用于创建新的Internet语言

很多新的Internet语言是通过XML创建的,其中的例子包括:

  • XHTML – 最新的HTML版本
  • WSDL – 用于描写可用的web service
  • WAP 和 WML – 用于手持装备的标记语言
  • RSS – 用于RSS feed的语言
  • RDF 和 OWL – 用于描写资源和本体
  • SMIL – 用于描写针针对web的多媒体

您还可以通过XML实例去实践并掌握

以及XML测验评估您的学习状况

Python—-数据可视化之matplotlib饼图、柱状图

thbcm阅读(203)

matplotlib 库除了可以绘制曲线图, 还可以绘制统计图形,这篇文章介绍饼图、柱状图等几种常用统计图形的绘制方法。 推荐好课:Python 自动化办公用Python自动办公做职场高手

1、饼图

使用 pie() 方法绘制饼图: 

import matplotlib.pyplot as plt

print(‘\n—–欢迎来到w3cschool.cn’)  

plt.rc(‘font’,family=’Arial’,size=’9′)

plt.rc(‘axes’,unicode_minus=’False’)

labels = [‘Strawberry’, ‘Apple’, ‘Banana’, ‘Pear’, ‘Orange’]

sizes = [39, 20, 55, 30,25] # 每个元素的值,会自动根据该值计算百分比

explode = [0.1, 0.2, 0, 0, 0]  # 每个元素的膨胀距离,这里指定了第0和第1个

 

fig, ax = plt.subplots()

ax.pie(sizes, explode=explode, labels=labels, autopct=’%1.1f%%’, shadow=True, startangle=0) 

# autopct 精度 startangle 第1个元素的起始角位置,其他元素逆时针方向组织,shadow 是否使用阴影

ax.axis(‘scaled’)  #设置饼图的样式,设置为equals显示的会是圆形    

fig.savefig(‘matplot-basic-pie.jpg’)

plt.show()

效果如图所示:

ax.pie() 方法参数:

  • sizes:各元素的绝对数值大小,相对百分比会根据这些值计算;
  • explode:各个部分向外弹出的值;
  • autopct:百分比的显示精度;
  • shadow:是否显示阴影;
  • startangle:起始元素的位置,就是表示labels[0]的起始角位置,剩下的元素会逆时针方向组织。

2、柱状图

使用bar()方法绘制柱状图:

import matplotlib.pyplot as plt

import numpy as np

print(‘\n—–欢迎来到w3cschool.cn’)  

plt.rc(‘font’,family=’Arial’,size=’9′)

plt.rc(‘axes’,unicode_minus=’False’)

    

fig, ax = plt.subplots()

fruit = (‘Banana’, ‘Strawberry’, ‘Watermelon’, ‘Apple’, ‘Papaya’, ‘Tomatoes’)

weight = (100,135,50,83,92,66)

ax.bar(fruit, weight, align=’center’,width=0.7)

ax.set_ylabel(‘Weight’)#设置x轴标签

ax.set_title(‘Histogram’)

fig.savefig(‘matplot-bar.jpg’)

plt.show()

效果如图所示:

bar()参数:

  • 第1个固定参数:x坐标点名称
  • 第2个固定参数:y坐标值
  • align:对齐方式;
  • width:柱宽度;

3、水平柱状图

使用barh()方法绘制水平柱状图:

import matplotlib.pyplot as plt

import numpy as np

print(‘\n—–欢迎来到w3cschool.cn’)   

plt.rc(‘font’,family=’Arial’,size=’9′)

plt.rc(‘axes’,unicode_minus=’False’)

    

fig, ax = plt.subplots()

fruit = (‘Banana’, ‘Strawberry’, ‘Watermelon’, ‘Apple’, ‘Papaya’, ‘Tomatoes’)

y_pos = np.arange(len(fruit))

weight = (100,135,50,83,92,66)

ax.barh(y_pos, weight, align=’center’,height=0.7)

ax.set_yticks(y_pos)#设置y轴坐标

ax.set_yticklabels(fruit)#设置y轴标签

ax.invert_yaxis()  # 设置标签从上到下,更符合阅读习惯

ax.set_xlabel(‘weight’)#设置x轴标签

ax.set_title(‘Horizontal bar chart’)

fig.savefig(‘matplot-hor-bar.jpg’)

plt.show()

效果如图所示:

barh() 方法参数:

  • 第1个固定参数:y轴坐标;
  • 第2个固定参数:宽度值,实际上对应的是x轴的长度;
  • align:对齐方法,可选center和edge,表示柱图的位置和对应y轴坐标的关系;
  • height:柱图y方向的高度

ax.invert_yaxis()表示将y坐标反转,这样更符合阅读习惯,第0个元素在最上方显示。

4、分组柱状图

分组柱状图就是柱状图的组合形式,实际是2个柱状图合并在一起显示:

import matplotlib.pyplot as plt

import numpy as np

 

print(‘\n—–欢迎来到w3cschool.cn’)  

plt.rc(‘font’,family=’Arial’,size=’9′)

plt.rc(‘axes’,unicode_minus=’False’)

fruit = (‘Banana’, ‘Strawberry’, ‘Watermelon’, ‘Apple’, ‘Papaya’, ‘Tomatoes’)

weight = (100,135,50,83,92,66)

count = (20,15,30,53,22,36)

x = np.arange(len(fruit))

    

fig, ax = plt.subplots()

width = 0.4

ax.bar(x-width/2, weight,  width=width,label=’weight’)

ax.bar(x+width/2, count,  width=width,label=’number’)   

 

ax.set_title(‘Grouping histogram’)

ax.set_ylabel(‘Weight / number’)#设置y轴标签

ax.set_xticks(x)          #设置x轴坐标值

ax.set_xticklabels(fruit) #设置x轴坐标标签

fig.savefig(‘matplot-bar-group.jpg’)

ax.legend()               #显示图例

plt.show()

效果如图所示:

bar()入参的第1个参数不是直接使用分类形式的tuple,而是根据分类的数量重新定义的numpy数组,这样2个柱形图就可以根据该数值加减宽度的一半实现并排放置。

用法类似pyplot.plot(),多了个参数where表示划线阶梯在该点的前中后哪个位置,可以是’pre’,’mid’,’post’等三种类型,默认’pre’。

Python 字符切片解读

thbcm阅读(191)

今天小编在学习的 Python 的时候,学到切片字符这部分,总是有很多疑惑,为什么明明 [1:5] ,但是输出结果中总是输出到 4,不会输出到 5。下面我们举例说明:

test1 = ‘Hello World!’

test2 = “w3cschool!”

print (“test1[0]: “, test1[0])

print (“test2[1:5]: “, test2[1:5])

运行结果:

test1[0]:  H

test2[1:5]:  3csc

解析:

在上面的代码中,第一个print很好理解,因为代码的索引通常都是从0 开始的,对于test1 = ‘Hello World!’ 来说,索引编号为

字符 H e l l o W o r l d !
索引编号 0 1 2 3 4 5 6 7 8 9 10 11

通过上面的索引编号可以看出,print (“test1[0]: “, test1[0]) 输出的应该是索引为0 的字符,即:H。

字符 w 3 c s c h o o l !
索引编号 0 1 2 3 4 5 6 7 8 9

这时候小编同理比较认为第二个 print——print (“test2[1:5]: “, test2[1:5]) 通过如上表格可以发现,应该是输出:3csch 。结果打印出来的结果是 : 3csc 小编是百思不得姐,为啥子呢,后来再往下学,心里也一直记挂这个问题,差点都掉发了(赶紧摸摸头顶有没有又秃一分!!)

经过查找资料发现,在 Python 中,截取的时候如果用了 [ : ] ,那么这次截取采取左闭右开的原则,截取的时候右边的是开环,也就是说是不包含的,就如上写的 test2[1:5],其中 5 是不包含在内的,所以最后的输出结果,其实只打印到 4 就结束了。故输出结果应该是 3csc。

总结

  1. python 中可使用 [ ] 截取字符
  2. Python 中截取时如果用了 [ : ] ,那么采用的原则是左闭右开,左侧包含,右侧的元素是不会被包含的。
  3. Python 中的字符串,list,tuple 的截取都适用上述原则

JavaScript类型、运算符、对象和方法总结

thbcm阅读(180)

JavaScript 是一种面向对象的动态语言,它包括类型、运算符、标准内置( built-in)对象和方法。它的语法来源于 Java 和 C,所以这两种语言的许多语法特性一样适用于 JavaScript。需要注意的一个主要区分是 JavaScript 不支持类,类这一概念在 JavaScript 通过对象原型(object prototype)得到延续(有关 ES6 类的内容参考这里Classes)。另外一个主要区分是 JavaScript 中的函数也是对象,JavaScript 允许函数在包括可履行代码的同时,能像其他对象一样被传递。

1、number详解

Javascript中采取全浮点计算(双精读64位)注意 !在某些运算中会出错   eg:0.1 + 0.2 = 0.30000000000000004我们也能够使用JavaScript提供的Math内置对象,和 内置函数parseInt();另外JavaScript还提供了parseFloat(),但是它只支持解析十进制数字在parseInto(“123”,10)  //123      –>10的含义是十进制

parseInt(“010”, 10); //10

parseInt(“010”); // 8 如果没有第2个参数,那末以0开头就是8进制 0x开头就是16进制

parseInt(“0x10”); // 16

如何把二进制转为整数值?

parseInt(“10011”,2);

当第一个参数不是数字型字符串parseInt(“hello”, 10); 

// NaNNaN是一个特殊值 用它与任何数字计算 结果都是NaN

另外  还有两个特殊值  Infinity  和 -Infinity  (正无穷和负无穷)用内置函数  isFinite( )可以判断一个变量是不是为 Infinity   -Infinity    NaN

2、字符串

JavaScript 中的字符串是一个 Unicode 字符序列

每个编码单元由一个 16 位二进制数表示。每个 Unicode 字符由一个或两个编码单元来表示。

“hello”.charAt(0); // “h”

“hello, world”.replace(“hello”, “goodbye”); // “goodbye, world”

“hello”.toUpperCase(); // “HELLO”

“hello”.length; // 5

3、其他类型(null 和 undefined)

null 的本质是一个空值,必须使用 null 关键字才能访问

undefined 是一个未定义类型的对象(也是一个对象),它表示一个未初始化的值,也就是还没有被分配值。(JavaScript 允许声明变量但不对其赋值,一个未被赋值的变量就是 undefined 类型)

布尔型:(true / false)其他类型对其转化

flase , 0 , ”  ” , NaN , null , undefined 都会在 JavaScript 需要一个布尔值变量的时候隐式转换为 false (其他的都会转化为 true)

4、变量

在JavaScript中声明一个变量用var

var a; 

var name = “simon”;

var a;

 var name = “simon”;

在JavaScript中的语句块中 是没有作用域的

5、运算符

JavaScript 的算术操作符包括 +、-、*、/ 和 % ——求余(与模运算不同)。赋值使用 = 运算符,另外还有一些复合运算符,如 += 和 -=,它们等价于 x = x op y。

+可以用来连接字符串

“3” + 4 + 5; // 345

3 + 4 + “5”; // 75

1 === true; //false

123 === “123”; // false

123 == “123” // true

1 == true; // true

6、控制结构

if()…else if()…else()

while()

do…while()

for( ; ; )/for( : )

  1. 短路与:var name = o && o.getName();
  2. 短路或:var name = otherName || “default”;
  3. 3元运算符:var allowed = (age > 18) ? “yes” : “no”;
  4. 多重分支时可使用 基于一个数字或字符串的 switch 语句:(在 switch 的表达式和 case 的表达式是使用 === 严格相等运算符进行比较的:)

switch(action) {

case ‘draw’:

drawIt();

break;

case ‘eat’:

eatIt();

break;

default:

doNothing();

}

switch(1 + 3){

case 2 + 2:

yay();

break;

default:

neverhappens();

}

7、对象

对象的创建方式:

1.var obj = new Object();

2.var obj = {} —>对象字面量

var obj = {

name:”carrot”,

“for”:”Max”,

details:{

color:”orange”,

size:12

}

}

可以用链式访问:

obj.details.color;//orange

可以用中括号访问:

obj [ detail ] [ color ];

对象类型:(像是 Java 中的一个类)

function Person(name,age){

    this.name = name;

    this.age = age;     

}

创建一个 Person 的对象:

var You=new Person(“zhangjiahui”,”23″);

可用 You.name=”ZJH”; 来赋值

可用 var name=You.name; 来赋值

obj[“name”] = “Simon”;

js数据可视化实战之本地时间轴

thbcm阅读(179)

背景需求

使用 D3 绘制图表一般都会绘制一个坐标轴,但是用 D3 画过图的同学都知道默许情况下绘制的坐标轴刻度是英文的。但是我们要的刻度是中文的。怎样办呢?且看本文讲授如何绘制本地时间轴。

绘制效果

实现效果如何?先来一睹为快!

默认格式化:

d3.time.format(“%b %Y”)

本地格式化:

zh.timeFormat(“%Y年%b”)

实现思路

思路很简单:

定义简体中文本地化

用本地时间格式化函数格式化数轴的刻度值

关键技术

定义新的简体中文本地化

//简体中文本地化 
var zh = d3.locale({ decimal: “.”, thousands: “,”, grouping: [3], currency: [“¥”, “”], 
dateTime: “%a %b %e %X %Y”, 
date: “%Y/%-m/%-d”, time: “%H:%M:%S”, periods: [“上午”, “下午”], 
days: [“星期日”, “星期1”, “星期2”, “星期3”, “星期4”, “星期5”, “星期6”], 
shortDays: [“星期日”, “星期1”, “星期2”, “星期3”, “星期4”, “星期5”, “星期6”], 
months: [“1月”, “2月”, “3月”, “4月”, “5月”, “6月”, “7月”, “8月”, “9月”, “10月”, “101月”, “102月”], 
shortMonths: [“1月”, “2月”, “3月”, “4月”, “5月”, “6月”, “7月”, “8月”, “9月”, “10月”, “101月”, “102月”] });

定义时间比例尺

//时间比例尺 var timeScale = d3.time.scale() .domain([new Date(2015, 0, 1), new Date(2016, 1, 1)]) .range([0, width-40]);

指定轴的比例尺和格式化函数

//时间轴 var axis = d3.svg.axis() .scale(timeScale) .tickFormat(zh.timeFormat(“%Y年%b”))//指定为本地格式化函数 .orient(“bottom”)

绘制数轴

//添加时间轴 var svg = d3.select(“body”).append(“svg”) .attr(“width”, width+200) .attr(“height”, height) .append(“g”) .attr(“class”, “axis”) .attr(“transform”, “translate(” + 20 + “,” + height/2 + “)”) .call(axis);

调剂刻度样式

//旋转文字 d3.selectAll(g.tick text).attr(transform,translate(30,20)rotate(30))

本例很简单,可使用下面的代码测试效果,你学会了吗?

完全代码

<meta charset=”utf⑻”> 
<style> body{ font-weight:bold; } 
.axis path, 
.axis line { fill: none; stroke: #000; shape-rendering: crispEdges; } 
</style> 
<body> 
<script src=”../../d3.js”> <script> 
//简体中文本地化 
var zh = d3.locale({ decimal: “.”, thousands: “,”, grouping: [3], currency: [“¥”, “”], 
dateTime: “%a %b %e %X %Y”, date: “%Y/%-m/%-d”, 
time: “%H:%M:%S”, 
periods: [“上午”, “下午”], 
days: [“星期日”, “星期1”, “星期2”, “星期3”, “星期4”, “星期5”, “星期6”], 
shortDays: [“星期日”, “星期1”, “星期2”, “星期3”, “星期4”, “星期5”, “星期6”], 
months: [“1月”, “2月”, “3月”, “4月”, “5月”, “6月”, “7月”, “8月”, “9月”, “10月”, “101月”, “102月”], 
shortMonths: [“1月”, “2月”, “3月”, “4月”, “5月”, “6月”, “7月”, “8月”, “9月”, “10月”, “101月”, “102月”] }); 
//svg宽,高 
var width = 1000,height = 500; 
//时间比例尺 
var timeScale = d3.time.scale() .domain([new Date(2015, 0, 1), new Date(2016, 1, 1)]) .range([0, width-40]); 
//时间轴 
var axis = d3.svg.axis() .scale(timeScale) .tickFormat(zh.timeFormat(“%Y年%b”)) .orient(“bottom”) 
//添加时间轴 
var svg = d3.select(“body”).append(“svg”) .attr(“width”, width+200) .attr(“height”, height) .append(“g”) .attr(“class”, “axis”) .attr(“transform”, “translate(” + 20 + “,” + height/2 + “)”) .call(axis); 
//旋转文字
 d3.selectAll(g.tick text).attr(transform,translate(30,20)rotate(30)) script>

可以查看更多JavaScript实例

以及JavaScript对象实例

Python学到什么程度可以面试工作?

thbcm阅读(205)

最近小编在逛各大博客网站的时候总是会看到这么一个问题:Python 学到什么程度可以面试工作,程度这个词,衡量起来总是很难去把握那么一个点,小编在这给大家搜集了一些 Python 常见的面试题,如果你能够掌握了那么你去找一个初级 Python 开发岗相信不是问题。推荐好课:Python3 进阶Python Django框架

一、基础知识

1. 列出 5 个常用 Python 标准库?

import os

import sys

import re

import math

import time

import datetime

import random

import threading

import multiprocessing


2. Python 的内建数据类型有哪些?

int、float、complex         # 数值型

bool            # 布尔型

str             # 字符串

list            # 列表

tuple           # 元组

dict            # 字典


3. 简述 with 方法打开处理文件帮我我们做了什么?

  • with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的清理操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等;
  • with 语句即上下文管理器,在程序中用来表示代码执行过程中所处的前后环境。上下文管理器:含有__enter____exit__方法的对象就是上下文管理器。
  • enter():在执行 with 语句之前,首先执行该方法,通常返回一个实例对象,如果 with 语句有 as 目标,则将对象赋值给 as 目标。
  • exit():在执行 with 语句结束后,自动调用__exit__()方法,用户释放资源,若此方法返回布尔值 True,程序会忽略异常。
  • 使用环境:文件读写、线程锁的自动释放等。

with context_expression [as target(s)]:

    with-body

这里 context_expression 要返回一个上下文管理器对象,该对象并不赋值给as子句中的 target(s),而是会将上下文管理器的__enter__() 方法的返回值赋值给target(s)。


4. Python 的可变和不可变数据类型?

  • 不可变数据类型:即数据被创建之后,数据的值将不再发生改变,有数值、字符、元祖类型;
  • 可变数据类型:数据别创建之后,数据的值可以发生变化,有列表、字典、集合类型。


5. Python 获取当前日期?

import datetime

import time

print(time.time())           # 时间戳

print(time.strftime(“%Y-%m-%d %H:%M:%S %w”, time.localtime()))  # 年月日时分秒

print(datetime.datetime.now())      # 年月日时分秒


6. 统计字符串每个单词出现的次数。

def word_amount(sentence):

    split_list = sentence.split()

    dict_result = {}

    for word_name in split_list:

        if word_name not in dict_result.keys():

            dict_result[word_name] = 1

        else:

            dict_result[word_name] += 1

    return dict_result

if __name__ == ‘__main__’:

    sentence = “I can because i think i can”

    dict_result = word_amount(sentence)

    print(dict_result)

或者:

if __name__ == ‘__main__’:

    sentence = “I can because i think i can”

    result = {word: sentence.split().count(word) for word in set(sentence.split())}

    print(result)

或者:

from collections import Counter

if __name__ == ‘__main__’:

    sentence = “I can because i think i can”

    counts = Counter(sentence.split())

    print(counts)


7. 用 python 删除文件和用 linux 命令删除文件方法。

import os

os.remove(“demo.txt”)

rm demo.txt


8. 写一段自定义异常代码?

class printException(Exception):

    pass

def testRaise():

    raise printException(‘printErr’)

if __name__ == ‘__main__’:

    try:

        testRaise()

    except printException, e:

        print e


9. 举例说明异常模块中 try except else finally 的相关意义。

def read_filedata(file_name):

    file_obj = “”

    try:

        # 需要检测的异常代码片段

        file_obj = open(file_name, “r”)

        result_data = file_obj.read()

    except IOError, e:

        # 发生“IOError”异常进行处理的代码片段

        file_obj = “文件不存在:”+ str(e)

    else:

        # 没有引发“IOError”异常执行的代码片段,返回读取到的数据

        return result_data

    finally:

        # 不管有没有引发错误都会执行的代码片段,isinstance()用于判断一个数据类型

        if isinstance(file_obj, str):

            return file_obj

        elif isinstance(file_obj, file):

            file_obj.close()

        else:

            return “未知错误,请检查您的代码…”

if __name__ == ‘__main__’:

    result = read_filedata(“abc.txt”)

    print(result)


10. 遇到 bug 如何处理?

  • 首先查看报错信息,根据报错信息找到相应代码,通常一般的数据结构或者算法错误只要找到报错代码就可以顺利解决;
  • 如果遇到暂时不能解决的错误先不要慌,我们可以使用编译器的 Debug 模式或者自己在代码中加注断点进行代码排查;
  • 如果依然不能解决 bug,我们可以拷贝报错信息,在搜索引擎中进行搜索。没有人写代码不出 bug,如果你在一个 bug 上耗费时间超过半小时,可以与其他同事探讨(注意节制,可能有些费同事);
  • 另辟蹊径:方法总比困难多,在进行快速开发时,我们应该优先实现功能而不是拘泥于运行效率,所以遇到一些暂时不能解决的 BUG 可以考虑另外的实现方法。

二、语言特性

1. 谈谈对 Python 的了解和其他语言的区别?

Python 是一门语法简洁优美,功能强大无比,应用领域非常广泛,具有强大完备的第三方库的一门强类型动态,可移植,可扩展,可嵌入的解释型编程语言。

强类型语言、弱类型语言的区别:

  • 如果语言经常隐式地转换变量的类型,那这个语言就是弱类型语言,如果很少会这样做,那就是强类型语言。Python 很少会隐式地转换变量的类型,所以 Python 是强类型的语言。
  • 强类型语言和弱类型原因其判断的根本是是否会隐式进行语言类型转变。强类型原因在速度上可能略逊于弱类型语言,但是强类型定义语带来的严谨性又避免了不必要的错误。
  • 强类型语言包括:Java、.net、Python、C++ 等语言。其中 Python 是动态语言,是强类型定义语言,是类型安全的语言,Java 是静态语言,是强类型定义语言,也是类型安全的语言;弱类型语言包括:VB,PHP,JavaScript 等语言。其中 VBScript 是动态语言,是一种类型不安全的原因。

动态语言、静态语言的区别:

  • 动态类型语言:动态性语言是指在运行期间才去做数据类型检查的语言,也就是说动态类型语言编程时,永远不用给任何变量指定数据类型,该语言会在第一次赋值给变量时,在内部将数据类型记录下来**。Python 和 Ruby 就是一种典型的动态类型语言,其他的各种脚本语言如 VBScript 也多少属于动态类型语言。
  • 静态类型语言:静态类型语言与动态类则刚好相反,它的数据类型在编译期间检查,也就是说在写程序时要声明所有变量的数据类型,C/C++ 是静态类型语言的典型代表,其他静态语言还有 C#、Java 等。
  • 对于动态语言与静态语言的区分,其根本在于数据类型是在运行期间检查还是在编译期间检查。

编译型语言、解释型语言的区别:

  • 编译型语言:需要将一段程序直接翻译成机器码(对于 C/C++ 这种非跨平台的语言)或者中间码 (Java 这种跨平台语言,需要虚拟机再将中间码印射成机器码)。一般需经过编译 (compile)、链接 (linker) 这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。
  • 解释型语言:使用解释器将源码逐行解释成机器码并立即执行,不会进行整体性的编译和链接处理,相比编译型语言省了道工序。
  • 一个像是吃饭等菜都上全了再开动,一个像是吃火锅,边涮边吃,时机不一样。
  • 解释型语言的优点:跨平台容易,只需提供特定平台的解释器;缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。


2. 简述解释型和编译型编程语言?

可参考上一条的解释内容。


3. Python 的解释器种类以及相关特点?

  • CPython:官方版本的解释器。这个解释器是用C语言开发的,所以叫 CPython。在命令行下运行 python 就是启动 CPython 解释器。CPython 是使用最广的 Python 解释器。
  • IPython:IPython 是基于 CPython 之上的一个交互式解释器,也就是说,IPython 只是在交互方式上有所增强,但是执行 Python 代码的功能和 CPython 是完全一样的。CPython 用>>>作为提示符,而 IPython 用I n [序号]: 作为提示符。
  • PyPy:它的目标是执行速度。PyPy 采用J IT 技术,对 Python 代码进行动态编译(注意不是解释),所以可以显著提高 Python 代码的执行速度。绝大部分 Python 代码都可以在 PyPy 下运行,但是 PyPy 和 CPython 有一些是不同的,这就导致相同的 Python 代码在两种解释器下执行可能会有不同的结果。
  • Jython:Jython 是运行在 Java 平台上的 Python 解释器,可以直接把 Python 代码编译成 Java 字节码执行。
  • IronPython:IronPython 和 Jython 类似,只不过 IronPython 是运行在微软 .Net 平台上的 Python 解释器,可以直接把Python 代码编译成 .Net 的字节码。


4. 说说你知道的 Python3 和 Python2 之间的区别?

编码:Python2 的默认编码是 asscii,这也是导致 Python2 中经常遇到编码问题的原因之一,至于是为什么会使用 asscii 作为默认编码,原因在于 Python 这门语言诞生的时候还没出现 Unicode。Python3 默认采用了 UTF-8 作为默认编码,因此你不再需要在文件顶部写 # coding=utf-8 了。

字符串:Python2 中字符的类型,str:已经编码后的字节序列,unicode:编码前的文本字符;而 Python3 中字符的类型,str:编码过的 unicode 文本字符,bytes:编码前的字节序列。

可以认为字符串有两种状态,即文本状态和字节(二进制)状态。Python2 和 Python3 中的两种字符类型都分别对应这两种状态,然后相互之间进行编解码转化。编码就是将字符串转换成字节码,涉及到字符串的内部表示;解码就是将字节码转换为字符串,将比特位显示成字符。

在 Python2 中,str 和 unicode 都有 encode 和 decode 方法。但是不建议对 str 使用 encode,对 unicode 使用 decode, 这是Python2 设计上的缺陷。Python3 则进行了优化,str 只有一个 encode 方法将字符串转化为一个字节码,而且 bytes 也只有一个 decode 方法将字节码转化为一个文本字符串。

print:Python2 中的 print 是语句;Python3 中的 print 是函数。例如:

>>> print(“hello”, “world”)

(‘hello’, ‘world’)

# py3

>>> print(“hello”, “world”)

hello world

这个例子就比较明显了,在 py2 中,print 语句后面接的是一个元组对象,而在 py3 中,print 函数可以接收多个位置参数。如果希望在 Python2 中把 print 当函数使用,那么可以导入 future 模块中的 print_function。

import:python2 默认是按照相对路径导入模块和包,python3 默认则是按照绝对路径导入。

input:Python3:input 解析输入为str字符型;Python2:input 解析输入为int型,raw_input 解析输入为 str 类型。

算法符:在 Python2 中,/ 执行传统除法,对于整数执行截断除法,浮点数执行浮点除法(保留小数部分,即使整除);// 执行 Floor 除法,截除掉余数并且针对整数操作数返回一个整数,如果有任何一个操作数是浮点数,则返回一个浮点数。在 Python3 中,/ 总是执行真除法,不管操作数的类型,都会返回包含任何余数的浮点结果;// 执行 Floor 除法,截除掉余数并且针对整数操作数返回一个整数,如果有任何一个操作数是浮点数,则返回一个浮点数。

int/long:Python3 里,只有一种整数类型 int,大多数情况下,它很像 Python2 里的长整型。Python2 有为非浮点数准备的 int 和 long 类型。int 类型的最大值不能超过 sys.maxint,而且这个最大值是平台相关的。

True和False:在 Python2 中,True 和 False 是两个全局变量(名字),在数值上分别对应 1 和 0,既然是变量,那么它们就可以指向其它对象。Python3 修正了这个缺陷,True 和 False 变为两个关键字,永远指向两个固定的对象,不允许再被重新赋值。

迭代器:在 Python2 中很多返回列表对象的内置函数和方法在 Python3 都改成了返回类似于迭代器的对象,因为迭代器的惰性加载特性使得操作大数据更有效率。

例如:Python2 中使用 xrange() 来创建一个迭代器对象,使用 range() 创建一个 list 数组(要生成很大的数字序列的时候,用 xrange 会比 range 性能优很多,因为不需要一上来就开辟一块很大的内存空间);Python3 中使用 range() 创建迭代器对象,移除了 xrange() 方法。

另外,字典对象的 dict.keys()、dict.values() 方法都不再返回列表,而是以一个类似迭代器的 view 对象返回。高阶函数 map、filter、zip 返回的也都不是列表对象了。Python2 的迭代器必须实现 next 方法,而 Python3 改成了__iter__()、next。

nonlocal:在 Python2 中可以在函数里面可以用关键字 global 声明某个变量为全局变量,但是在嵌套函数中,想要给一个变量声明为非局部变量是没法实现的,在 Pyhon3,新增了关键字 nonlcoal,一般使用在闭包中的,使变量使用外层的同名变量。

LEGB作用域的理解:python3 的 local, global, nonlocal 简析


5. Python3 和 Python2 中 int 和 long 区别?

可参考上一条的解释内容。


6. xrange 和 range 的区别?

可参考上上一条的解释内容。

scrapy 调用 parse(),parse() 调用 func() 使用 yield

thbcm阅读(179)

在scrapy中调用parse()方法,parse()方法中调用其他函数func(),func需要返回Item,使用方法如下:

#在parse()中调用其他yield函数,需要写成写成循环并yield其中的内容

def parse():

    # 正确调用

    for item in parse_comment(a, b):

        yield item

    # 错误调用,无法得到数据

    parse_comment(a, b)

def parse_comment(a,b):

    for a in b:

        yield c

yield

yield 的作用就是把一个函数变成一个生成器(generator),带有yield的函数不再是一个普通函数.Python解释器会将其视为一个generator,单独调用(如fab(5))不会执行fab函数,而是返回一个 iterable 对象!

在for循环执行时,每次循环都会执行fab函数内部的代码,执行到yield b时,fab函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

结论:yield要使用在循环中,这样生成器才有使用的意义。

def fab(max):

   n, a, b = 0, 0, 1

   while n < max:

      # print b

      yield b

      # print b

      a, b = b, a + b

      n = n + 1

print(fab(5))  # 输出:<generator object fab at 0x00000000069D8A68>

for n in fab(5):

    print n    # 依次1,1,2,3,5

#对于含有yield的函数,外部要以迭代的方式调用,当函数执行结束时,generator 自动抛出 StopIteration 异常,表示迭代完成。

# 在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。

def ff(max):

   a,b = 0,1

   yield max  # yield不在循环中,这里已经到函数最后所以直接返回,相当于return

for n in ff(5):

   print n    # 输出:5

推荐好课:Python 静态爬虫Python Scrapy网络爬虫

联系我们