大前端

也许你低估了defaultdict的偷懒能力!

算法

也许你低估了defaultdict的偷懒能力!

今天来和大家聊聊日常经常使用到的偷懒方法 --> defaultdict defaultdict示例 字典作为日常使用频率较高的一种数据类型,常会遇到判断key是否在字典中的情况。 这时,我们是否按照如下代码写的: d = dict() if 'key' in d: d['key'] += 1 else: d['key'] = 0 print(d['key']) # 1 我们每次都需要判断后再进行相关操作。 但是,当我们使用了defaultdict后,就可以偷懒的简化if else 的格式了: from collections import defaultdict d = defaultdict(int) d["key&

《Learning Scrapy》1 Scrapy介绍

算法

《Learning Scrapy》1 Scrapy介绍

第1章Scrapy介绍 欢迎来到Scrapy之旅。通过这本书,我们希望可以让你从一个只会一点或零基础的Scrapy初学者,达到熟练使用这个强大的框架海量抓取网络和其他资源的水平。在本章里,我们会向你介绍Scrapy,以及Scrapy能做什。 HelloScrapy Scrapy是一个健壮的抓取网络资源的框架。作为互联网使用者,你可能经常希望可以将网上的资源保存到Excel中(见第3章),以便下线时使用或进行计算。作为开发者,你可能经常希望将不同网站的资源整合起来,但你清楚这么做的复杂性。Scrapy可以帮助你完成简单和复杂的数据提取。 Scrapy是在数年的、以健壮高效的方式提取网络资源的经验上开发的。使用Scrapy,你只需进行一项设置,就可以抵过其它框架使用多个类、插件和配置。看一眼第7章,你就可以知道仅需几行代码就可以完成大量工作。 从卡发着的角度,你会喜欢Scrapy的基于时间的架构(见第8章和第9章)。它可以让我们进行串联操作,清洗、形成、丰富数据,或存入数据库等等,同时不会有太大的性能损耗。从技术上说,基于事件的机制,Scrapy可以让吞吐量摆脱延迟,同时

线性表

线性表

1.基本概念 n个数据元素的有限序列 2 抽象数据类型(ADT) 数据对象:{a1,a2,.....,an},每个元素类型为DataType。 数据关系:除第一个元素外,每一个元素有且只有一个直接前驱元素;除最后一个元素外,每个元素有且只有一个直接后驱。一对一的对应关系。 基本操作: InitList(*L): 初始化操作,建立一个空列表L。 ListEmpty(L): 若列表为空,返回True,否则返回False。 ClearList(*L): 将线性表清空。 GetElem(L,i,*e): 将线性表L中第i个位置的元素值返回给e。 LocateElme(L,e): 查找线性表L中与给定值e相等元素的位置,如果查找成功,返回序号,否则返回0。 ListInsert(*L,i,e): 在线性表L第i个位置插入元素e,长度加1。 ListDelete(*L,

树

算法

1.基本概念 树:是n(n>=0)个结点的有限集。在任意一颗非空树种:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2....Tn,其中每一个集合本身又是一棵树,并且称为根的子树。 度:结点拥有的子树数。 叶节点/终端结点:度为0的结点。 分支结点/非终端结点:度非0的结点。 树的度:结点度的最大值。 树的深度/高度:树中结点的最大层次。 有序树/无序树:树中各节点的各子树从左至右,不能互换的树。否则为无序树。 森林:若干棵互不相交的树的集合。 2.抽象数据类型(ADT) 数据对象:由若干相同数据类型的结点组成的集合 数据关系:

Javascript学习笔记1 理解对象 属性 原型对象

大前端

Javascript学习笔记1 理解对象 属性 原型对象

属性类型 对象属性包括两种类型:数据属性和访问器属性 数据属性 包含一个数据值的位置,在这个位置可以读取和写入值。其包括4个特性:configurable(能否删除或修改,默认为true),enumerable(能否通过for-in语句返回属性,默认为true),writeable(能否修改属性的值,默认为true),value(属性值,默认为undefined) var person = { name: "zjw" }; 访问器属性 不包含数据值,其包含一对儿getter和setter函数,用于读取和写入访问器属性。其包括4个特性:configurable(能否删除或修改),enumerable(能否通过for-in语句返回属性),get(读取属性时调用的函数,默认为undefined),set(写入属性时调用的函数,默认为undefiend)。在属性前面加上下划线(_)用于表示只能通过对象方法访问的属性。 var book = { _year: 2004, edition: 1 }; Object.defineProperty(

Javascript学习笔记3 函数表达式 闭包

Javascript学习笔记3 函数表达式 闭包

函数声明提升:执行代码之前会先读取函数声明(但是使用函数表达式命名定义函数时,使用前必须赋值) sayhi(); //错误,函数还未赋值 var sayhi = function(){ alert("hi"); }; 闭包 是指有权访问另一个函数作用域中的变量的函数 创建函数时Scope 调用函数时Scope function makeFunc() { var name = "Mozilla"; function displayName() { //内部函数 alert(name); } return displayName; } 在另一个函数的内部定义的函数会将外部函数的活动对象添加到它的作用域链中 var myFunc = makeFunc(); //调用外部函数,返回内部函数 myFunc(); //"Mozilla" 虽然外部函数已经执行完毕,但仍然可以访问到外部函数中定义的变量 闭包只能取得外部函数中任何变量的最后一个值(最终值) function createFuncti

Javascript学习笔记4 BOM

大前端

Javascript学习笔记4 BOM

window对象 BOM:浏览器对象模型,其核心对象是window,表示浏览器的一个实例。其作为Global对象,在全局作用域中声明的变量和函数都会变成window对象的属性和方法 windowframesnametopparentself frames[0],frames[1]... frames["name"] top.frames[0] window.frames[0] 窗口位置:screenLeft和screenTop属性(相对屏幕左边和上边的位置),或者screenX和screenY。moveTo(x,y)移动窗口至新的x,y坐标,moveBy(x_relative,y_relative)水平和垂直方向上的移动像素值 窗口大小:innerWidth和innerHeight属性(页面视图大小),outerWidth和outerHeight浏览器窗口本身大小。resizeTo(x,y)改变窗口大小至新宽度和高度,resizeBy(x_relative,y_relative)

Javascript学习笔记5 DOM

大前端

Javascript学习笔记5 DOM

DOM:文档对象模型,针对HTML和XML文档的一个API,DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的结构 Node类型 所有的节点类型都继承自Node类型,每个节点都有个nodeType属性,表明节点的类型。 重要的类型包括: * Node.ELEMENT_NODE (1) 元素节点 * Node.ATTRIBUTE_NODE (2) 属性节点 * Node.TEXT_NODE(3) 文本节点 * Node.DOCUMENT_NODE (9) 文档节点 属性 nodeType:保存着节点类型,例如,若是元素节点,该值等于1 nodeName:若是元素节点,那么则是标签名 nodeValue:若是元素节点,该值为null childNodes:保存一个NodeList对象,可以通过方括号访问子节点。(子节点可能元素、文本节点、注释等,在遍历时务必注意判断节点类型) var firstChild

Javascript学习笔记7 DOM2和DOM3

大前端

Javascript学习笔记7 DOM2和DOM3

样式 style对象 任何支持style特性的HTML元素在Javascript中都有个style属性。其包含着通过HTML的style特性指定的所有样式信息(不包括外部样式表) div.style.color = "red"; div.style.backgroundcolor = "white"; div.style.width = "100px"; 除此之外,style对象还具有一些属性和方法 div.style.cssText = "width: 25px; height: 20px"; //style特性中的css代码,可以重写 div.style.length //css属性的个数 div.style.getPropertyValue("color"); //取得某特性的值,返回字符串 div.style.

ES6学习笔记14 Generator 函数

算法

ES6学习笔记14 Generator 函数

简介 Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。 执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。 形式上,Generator 函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,定义不同的内部状态。 function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator(); 调用 Generator 函数后,该函数并不执行,返回的也不是函数运行结果,

ES6学习笔记15 Generator 函数的异步应用

大前端

ES6学习笔记15 Generator 函数的异步应用

异步 所谓”异步”,简单说就是一个任务不是连续完成的,可以理解成该任务被人为分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段。 回调函数 JavaScript 语言对异步编程的实现,就是回调函数。所谓回调函数,就是把任务的第二段单独写在一个函数里面,等到重新执行这个任务的时候,就直接调用这个函数。回调函数的英语名字callback,直译过来就是”重新调用”。 fs.readFile('/etc/passwd', 'utf-8', function (err, data) { if (err) throw err; console.log(data); }); 上述读取文件的函数中,第三个参数就是回调函数,等到读取结果返回后,它才会执行 Generator函数 传统的编程语言使用”协程”来解决异步编程问题,所谓协程,意思是多个线程互相协作,完成异步任务。

设计模式读书笔记

大前端

设计模式读书笔记

1. 策略模式 1. 定义 策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。 2. 示例代码 每个鸭子都会引用实现QuackBehavior接口的对象,鸭子对象不亲自处理呱呱叫行为,而是委托给quackBehavior引用的对象 public class Duck { QuackBehavior quackBehavior; public void performQuack() { quackBehavior.quack(); } } 3. 优缺点 优点 * 算法可以自由切换 * 避免使用多重条件判断 * 扩展性良好 缺点 * 策略类会增多 2. 观察者模式 1. 定义 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 2. 示例代码 被观察者可以通过registerObserver和removeObserver注册和移除观察自己的观察者,当自身发生变化时(setChanged可增加附加条件),可以调用notifyObse