fn

nodejs Async详解之二:工具类

旧时模样 提交于 2020-03-02 03:22:22
Async中提供了几个工具类,给我们提供一些小便利: memoize unmemoize log dir noConflict 1. memoize(fn, [hasher]) 有一些方法比较耗时,且对于相同的输入总是有相同的输出。这时可以使用memoize给它加个缓存,对于相同的参数只计算一次,以后就直接从缓存中取结果用了。 比如这里有一个很慢的函数: var slow_fn = function(x, y, callback) { console.log(‘start working for: ‘ + x+’,'+y); t.wait(100); console.log(‘finished: ‘ + x+’,'+y); callback(null, ‘im slow for: ‘+x+’,'+y); }; 可以用memoize生成一个新的带缓存的函数: var fn = async.memoize(slow_fn); 试试同样参数调用两次: fn(‘a’,'b’, function(err, result) { console.log(result); }); // 直接得到之前计算好的值 fn(‘a’,'b’, function(err, result) { console.log(result); }); 注意memoize的参数中还有一个hasher,它是做什么用的呢

30s源码刨析系列之函数篇

别来无恙 提交于 2020-03-01 21:42:10
前言 由浅入深、逐个击破 30SecondsOfCode 中函数系列所有源码片段,带你领略源码之美。 本系列是对名库 30SecondsOfCode 的深入刨析。 本篇是其中的函数篇,可以在极短的时间内培养你的函数式思维。 内容根据源码的难易等级进行排版,目录如下: 新手级 普通级 专家级 正文 新手级 checkProp const checkProp = (predicate, prop) => obj => !!predicate(obj[prop]); const lengthIs4 = checkProp(l => l === 4, 'length'); lengthIs4([]); // false lengthIs4([1, 2, 3, 4]); // true lengthIs4(new Set([1, 2, 3, 4])); // false (Set uses Size, not length) const session = { user: {} }; const validUserSession = checkProp(u => u.active && !u.disabled, 'user'); validUserSession(session); // false session.user.active = true; validUserSession

用rust写一个玩具解释器10(parser)

安稳与你 提交于 2020-03-01 19:45:54
介绍完中缀和前缀表达式 那么今天就把parser的代码全部贴出来 可跳过 use crate::ast::ast::ASTNode; use crate::ast::ast; use crate::mylexer::lexer; use crate::token::token; use std::collections::HashMap; pub enum Pri { LOWEST, ASSIGN , // 赋值 EQUALS , // ==, != LESSGREATER , // < ,> SUM , //+,- PRODUCT ,//*,/ PREFIX , // !,- CALL , // func() INDEX, // array[0], map[0] } macro_rules! get_pri { ($x:ident) => { Pri::$x as i8 }; } //这里嘛, 现在还没有更好的办法解决... fn get_precedence(t: token::TokenType) ->i8 { let map: HashMap<token::TokenType,i8> = { let mut mmap = HashMap::new(); mmap.insert(token::EQ, get_pri!(EQUALS)); mmap.insert(token:

22.Linux-块设备驱动之框架详细分析(详解)

独自空忆成欢 提交于 2020-03-01 13:57:29
1.之前我们学的都是字符设备驱动, 先来回忆一下 字符设备驱动: 当我们的应用层读写(read()/write())字符设备驱动时,是按字节/字符来读写数据的,期间没有任何缓存区,因为数据量小,不能随机读取数据,例如:按键、LED、鼠标、键盘等 2.接下来本节开始学习块设备驱动 块设备: 块设备是i/o设备中的一类, 当我们的应用层对该设备读写时,是按扇区大小来读写数据的,若读写的数据小于扇区的大小,就会需要缓存区, 可以随机读写设备的任意位置处的数据,例如 普通文件(*.txt,*.c等),硬盘,U盘,SD卡, 3.块设备结构: 段(Segments): 由若干个块组成。是Linux内存管理机制中一个内存页或者内存页的一部分。 块 (Blocks): 由Linux制定对内核或文件系统等数据处理的基本单位。通常由1个或多个扇区组成。(对Linux操作系统而言) 扇区(Sectors): 块设备的基本单位。通常在512字节到32768字节之间,默认512字节 4.我们以txt 文件为例, 来简要分析下块设备流程: 比如:当我们要写一个很小的数据到txt文件某个位置时, 由于块设备写的数据是按扇区为单位,但又不能破坏txt文件里其它位置,那么就引入了一个“缓存区”,将所有数据读到缓存区里,然后修改缓存数据,再将整个数据放入txt文件对应的某个扇区中

Python3函数之装饰器

℡╲_俬逩灬. 提交于 2020-03-01 10:45:05
不带参数的装饰器 from functools import wraps # 封装函数进行装饰,保留被装饰函数属性 def zsq(sc): # 设计一个装饰器函数,传入被装饰函数 @wraps(sc) def nsc(*args, **kwargs): # 设计它的封装 jg = sc(*args, **kwargs) # 调用被装饰函数,配合百搭 print('nsc function.') print(jg) return 0 return nsc @zsq def zzsc(): # 设计最终函数,也当做sc被装饰,这里百搭参数 '''zzsc...''' print('sc function.') return 1 # 返回值 # 定义过程: # 设计zzsc为被装饰函数,并作为输入函数参数被传入装饰器 # 装饰器封装一个函数,并传入百搭参数 # 装饰器返回封装函数,并把最终函数指向封装函数, # 这时候最终函数的参数(百搭参数) #执行过程: # 调用最终函数,传入百搭参数 # 执行封装函数。。 # 执行被装饰函数 #PS: # 装饰器的返回值肯定是封装函数 # 最终函数|被装饰函数的返回值,用于供封装函数可能使用 # 封装函数的返回值会成为最终函数的返回值被返回 装饰器的本质是函数,接收一个函数作为参数,并且返回一个函数 装饰器通常会返回一个封装函数

ES6相关实用特性

不想你离开。 提交于 2020-02-28 20:09:56
本文总结ECMAScript6相关实用特性 目录 let和const 箭头函数 class 对象字段 模板字符串 解构赋值 函数参数扩展 迭代器for...of 模块加载 map和weakmap set和weakset 对象代理 Symbol数据类型 类型方法的扩展 Promise规范 async和await Fetch let和const let 声明变量 const 声明常量 两者没有作用域提升 箭头函数 箭头函数不存在this调用模式的问题,函数在哪儿定义的this就是这个上下文 var fn = () => { console.log(this); } class 基本使用 class Demo { constructor(a, b) { // 构造函数 this.a = a; // 实例属性 this.b = b; } get myA () { // getter return this.a; } fn() { // 自定义函数 console.log(11); } static staticFn() { // 静态函数 console.log(22); } } const demo = new Demo(1, 2); console.log(demo.b); console.log(demo.myA); demo.fn(); Demo.staticFn(); 类继承

ES6学习笔记

时光怂恿深爱的人放手 提交于 2020-02-28 20:09:24
【第一课:ES发展历史】 ******************************************************************************* ******************************************************************************* ES -> ECMA标准 ES6 -> 2015年6月 ES6.0 ESnext ->下一代js语言 标准委员会(TC39)要求更改语言标准 提案->标准 Stage 0 展示阶段 Stage 1 征求意见阶段 Stage 2 草案阶段 Stage 3 候选阶段 Stage 4 定案阶段(标准) 【第二课:let,const】 ******************************************************************************* ******************************************************************************* 定义(声明)变量 ES5 作用域>>>>>函数作用域: <script> function fn() { for (var i = 0; i < 10; i++) { console.log(i) } }

setTimeout,setInterval的使用小结

冷暖自知 提交于 2020-02-28 12:42:18
① setTimeout 众所周知setTimeout(fn,time)是等待一段时间后,执行函数fn。 在这个等待是异步的,也就是他不会站着茅坑,当前JS队列中的其他任务会按序执行 但这里有个问题就是time毫秒过后的fn执行问题。是立即执行?不一定。 这就像是一个买票的队伍,有正在买票的,有排在后面等待买票的。而setTimeout就相当于刚排到fn买票的时候他突然发现钱包一时翻不出来。 所以他就让后面的人先买。过了time时间找到钱包后,如果现在没人买票的话,他可以立即买票。否则他就只能去排队了(当所有队列中的内容执行结束后才执行)。 <input type="text" id="io" /> <div id="test" style="width:200px;height:400px;overflow:scroll;"></div> <script> //这个函数的执行时间在IE下肯定是大于100ms的 function lost() { var test = document.getElementById("test"); var t1 = new Date(); var html = []; for (var i = 0; i < 10000; i++) { html.push('<span>look at here</span>'); } test.innerHTML

惰性函数

点点圈 提交于 2020-02-28 11:18:31
场景:不用每次都对同一个东西进行判断 function addEvent (type, el, fn) { if (window.addEventListener) { //这样不是很次进来都会对window.addEventListener进行判断 addEvent = function (type, el, fn) { el.addEventListener(type, fn, false); } } else if(window.attachEvent){ addEvent = function (type, el, fn) { el.attachEvent('on' + type, fn); } } } addEvent(); 来源: oschina 链接: https://my.oschina.net/u/2285087/blog/3157644

符号熵(附matlab代码)

蹲街弑〆低调 提交于 2020-02-28 05:42:04
符号熵 固定时间间隔下对系统进行采样取值的方法来追踪系统动态,熵是计算系统中包含可用信息大小的方法,可以用来度量系统的不确定性,从而描述符号的复杂性。 符号熵将数据转化为少量的符号模式,虽然失去了大量信息,但保留了动态系统的周期性,对称性等动力学性能,并且区分过程中采取下采样的方法,降低连续样本的独立性,使熵值增加。 符号熵的计算: 1.给定时间序列长度为N的X={x(1),x(2)…x(N)},将时间序列转换为X={x(1),x(2)…x(n)},且将其量化到0—q-1之间,q是量化等级,当q=2时,将时间量化为0或者1 r为量化阈值, 为样本均值 2.将符号序列进行重构: 为词序列,L为词序列长度 编码后序列的模式共 种,例如量化等级为2时,重构的词序列为时,序列模式共8种.分别为{000,001,010,011,100,101,110,111}. 3.自编码序列为 4.计算出每个模式在重构的符号序列中出现的概率,记为 其中i=1,2…m 代码部分 function [out]=sym_en_func(fn_1,q,m) N=length(fn_1); u=zeros(N-m+1,m); fn=zeros(1,N); fn_2=mapminmax(fn_1,-1,1); for i=1:N if abs(fn_2(i))>0.15 fn(i)=1; else fn(i)=0;