sonar 比较js比较两个浮点数大小赌大小 怎么办

2018人阅读
JAVA(103)
前几天有位同学问我一个问题,为什么float和double不能直接用==比较?
结果会是flase
当时我只是简单的回答,因为精度丢失,比较结果是不对的。
那么,到底为什么不对呢? 此文略作整理记录。
类型升级(type promotion)
首先,来看看中的几种原生的数值类型进行==或!=比较运算的时候会发生什么。
如果运算符两边的数值类型不同,则首先会进行类型升级(type promotion),规则如下:
如果运算符任意一方的类型为double,则另一方会转换为double否则,如果运算符任意一方的类型为float,则另一方会转换为float否则,如果运算符任意一方的类型为long,则另一方会转换为long否则,两边都会转换为int
详情见官方文档&
然后,浮点数执行浮点数相等比较(int或者long执行整型相等比较)
那么,上面那个例子,float首先会被升级为double,然后执行浮点数相等比较。那为什么会返回flase呢?
结果为false
舍入误差(round-off error)
我们知道,根据IEEE 754,单精度的float是32位,双精度的double为64位,如下图:
其中,第一部分(s)为符号位,第二部分(exponent)为指数位,第三部分(mantissa)为基数部分。 这是科学计数法的二进制表示。
那么,既然位数是固定的,要表示像 1/3=0.3...或者pi=3.1415926..... 这样的无限循环小数,就变得不可能了。
根据规范,则需要将不能标识的部分舍掉。
第二,还与10进制不同的是,二进制对于一些有限的小数,也不能精确的标示。比如像0.1这样的小数,用二进制也无法精确表示。所以,也需要舍掉。
关于0.1无法用二进制精确表示,可以参见文章:&
补充:科学计数法及浮点数的二进制表示
首先,再来回忆一下,科学计数法是什么样子的。一个数,可以有多重表示方法。
例如,254可以有但不仅仅有以下几种表示:
上面这是10进制的表示方式,也就是基数为10的表示方式。 基数,就是上面例子中 25.4 * 10 这里的10,当然,指数是1.
但是如果基数是2,需要怎么转换呢?
看下面这个例子:
所以,经过这个转换,就可以用IEEE 754表示一个浮点数了。
单精度转换为双精度会发生什么
首先,我们来看,单精度浮点数0.1表示成二进制会是什么样子的:
结果是:001101
然后,双精度的浮点数0.1的二进制会是什么样子呢:
结果是:10
然后,在比较float==double的时候,首先,会将float进行类型升级,得到的新的double 的值会是什么样子:
结果是:00
我们可以看到,经过转换后的double的值已经和直接赋值的double的值不相等了。所以这样用==比较返回的值是false
用equals方法进行比较
既然,用==或者!=来比较非常坑爹,那可以用equals来进行比较吗?&我的答案是一定不能。
看看下面2个例子。
返回值是false
这是经常出现的场景,不过我简化了。试想,经过一系列运算过后,一个结果为0,一个结果为-0,结果不等。很难接受是吧?
如果上面那个列子只是坑,下面这个简直就是地雷了。
连续3个比较返回都是true,这个简直无法理解。
其实,在Java里面,a和b表示为NaN(Not a Number),既然不是数字,就无法比较嘛。
但是equals方法是比较2个对象是否等值,而不是对象的值是否相等,所以equals方法设计的初衷根本就不是用来做数值比较的。勿乱用。
关于equals方法,我另外一篇记录会做更多解释。
用compareTo方法进行比较
虽然说它在设计上是用于数值比较的,但它表现跟equals方法一模一样——对于NaN和0.0与-0.0的比较上面。
另外,由于舍入误差的存在,也可能会导致浮点数经过一些运算后,结果会有略微不同。
所以最好还是不要直接用pareTo和pareTo方法。
在进行浮点数比较的时候,主要需要考虑3个因素
NaN无穷大/无穷小舍入误差
NaN和无穷出现的可能场景如下
所以,要比较浮点数是否相等,需要做的事情是:
排除NaN和无穷在精度范围内进行比较
例如下面的列子:
当然,如果在要求精确的场合,例如金融计算中,可以考虑BigDecimal这个类。
它什么都好,就是效率略低。需要自行在性能和精度之间取舍。
为什么下面这种方式可能会出现精度问题
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7949561次
积分:68061
积分:68061
排名:第28名
原创:255篇
转载:2731篇
评论:721条
(35)(73)(46)(92)(17)(25)(37)(63)(7)(74)(67)(95)(177)(113)(86)(40)(43)(71)(14)(10)(17)(12)(6)(20)(27)(54)(71)(97)(74)(32)(2)(24)(21)(62)(60)(36)(23)(27)(46)(34)(76)(63)(121)(141)(74)(54)(120)(77)(42)(4)(12)(19)(1)(9)(15)(19)(18)(16)(31)(79)(68)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'有一些 PUC-Rio Lua(也就是没 JIT 的)和 Python 的 benchmark 对比。结论是 Python 比 C 大约慢 70 倍,Lua 大约慢 30-40 倍。&br&&br&Lua 是 register-based VM。所谓的寄存器,其实并不神秘,就是 runtime stack 的 topmost frame [1] 是可以被 VM 指令随机访问的。至于为什么 CPU 里的某种硬件也叫寄存器,原因在这里有解释:《&a href=&///?target=https%3A//techsingular.org//%25E4%25BB%%25B9%%2598%25AF%25E5%25AF%%25AD%%/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&什么是寄存器&i class=&icon-external&&&/i&&/a&》。&br&&br&Stack frame 可以被随机访问之后,在同一个 VM 指令里就可以用 native code 一次做很多事情。&br&&br&可以看云风的这篇 blog:《&a href=&///?target=http%3A///2005/12/compare_with_lua_5.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&云风的 BLOG: 虚拟机之比较,lua 5 的实现&i class=&icon-external&&&/i&&/a&》&br&&br&&a data-hash=&86adeef31aec82bf1604a& href=&///people/86adeef31aec82bf1604a& class=&member_mention& data-editable=&true& data-title=&@codedump& data-hovercard=&p$b$86adeef31aec82bf1604a&&@codedump&/a& 提到了 single-pass compiler 通过牺牲简洁性来提高性能。其实我认为在这方面 Lua 对复杂度的控制还是有很好的折衷:&a href=&///?target=https%3A//techsingular.org//lua-%25E7%259A%%25AF%25AD%25E8%25A8%%25AE%259E%25E7%258E%25B0%25E9%259A%25BE%25E5%25BA%25A6/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Lua 的语言实现难度&i class=&icon-external&&&/i&&/a&&br&&br&&br&&ol&&li&Stack frame 就是 stack 中属于同一个 function invocation 的所有 stack entries。&/li&&/ol&
有一些 PUC-Rio Lua(也就是没 JIT 的)和 Python 的 benchmark 对比。结论是 Python 比 C 大约慢 70 倍,Lua 大约慢 30-40 倍。 Lua 是 register-based VM。所谓的寄存器,其实并不神秘,就是 runtime stack 的 topmost frame [1] 是可以被 VM 指令随机访…
本质问题是&b&类型错误&/b&。&br&&br&C语言中,使用 variadic function 将导致实参的类型信息丢失,被调函数只能利用类似 format 字符串的方式去解释栈中的实参,一旦 format 字符串和实际传入的实参类型不匹配,将导致类型错误。&br&类型错误的结果多种多样,&printf(&%f&, 3)& 将整数位序列按双精度浮点数解释;而 &printf(&%s&, 3)&
将尝试在虚地址3开始的内存空间中寻找一个0结尾的字符序列,结果往往是 segmentation fault。&br&&br&---------------------------------------------------------------------------------------&br&再来解释题中的现象。&br&&br&首先,这个问题涉及 calling convention,因此,我先假设发布平台是 IA32/MSVC++ 的组合。&br&&br&这个组合下调用变参函数,小于4字节的整数按4字节压栈,float转换成double后再压栈。&br&&br&这是调用 printf 的指令,压栈4个参数共16字节:&br&&div class=&highlight&&&pre&&code class=&language-nasm&&&span class=&nf&&mov&/span&
&span class=&nb&&eax&/span&&span class=&p&&,&/span&&span class=&kt&&dword&/span& &span class=&nv&&ptr&/span& &span class=&p&&[&/span&&span class=&nv&&num&/span&&span class=&p&&]&/span&
&span class=&nf&&push&/span&
&span class=&nb&&eax&/span&
&span class=&nf&&mov&/span&
&span class=&nb&&ecx&/span&&span class=&p&&,&/span&&span class=&kt&&dword&/span& &span class=&nv&&ptr&/span& &span class=&p&&[&/span&&span class=&nv&&num&/span&&span class=&p&&]&/span&
&span class=&nf&&push&/span&
&span class=&nb&&ecx&/span&
&span class=&nf&&mov&/span&
&span class=&nb&&edx&/span&&span class=&p&&,&/span&&span class=&kt&&dword&/span& &span class=&nv&&ptr&/span& &span class=&p&&[&/span&&span class=&nv&&num&/span&&span class=&p&&]&/span&
&span class=&nf&&push&/span&
&span class=&nb&&edx&/span&
&span class=&nf&&push&/span&
&span class=&mh&&122DCF8h&/span&
&span class=&nf&&call&/span&
&span class=&kt&&dword&/span& &span class=&nv&&ptr&/span& &span class=&nb&&ds&/span&&span class=&p&&:[&/span&&span class=&mh&&12311ECh&/span&&span class=&p&&]&/span&
&span class=&nf&&add&/span&
&span class=&nb&&esp&/span&&span class=&p&&,&/span&&span class=&mh&&10h&/span&
&/code&&/pre&&/div&&br&而 printf 的实现,通过解析 format 字符串,调用 &stdarg.h& 中的 va_arg 来解释实参:&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&cp&&#define va_start _crt_va_start&/span&
&span class=&cp&&#define _crt_va_start(ap,v)
( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )&/span&
&span class=&cp&&#define _ADDRESSOF(v)
( &reinterpret_cast&const char &&(v) )&/span&
&span class=&cp&&#define _INTSIZEOF(n)
( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )&/span&
&span class=&cp&&#define va_arg _crt_va_arg&/span&
&span class=&cp&&#define _crt_va_arg(ap,t)
( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )&/span&
&/code&&/pre&&/div&&br&上面代码的意思是,在通过 va_start(args, format) 初始化args后,args将指向栈上 format 字符串后面的栈地址,之后每调用一次 va_arg(args, type) ,将args向前移动sizeof(type),并对齐到4字节(见_INTSIZEOF),这正好符合 IA32 的 calling convention 规则。&br&&br&对 format 字符串中的d标识,va_arg 调用是:&br&&div class=&highlight&&&pre&&code class=&language-c&& &span class=&n&&num&/span& &span class=&o&&=&/span& &span class=&n&&va_arg&/span&&span class=&p&&(&/span&&span class=&n&&args&/span&&span class=&p&&,&/span& &span class=&kt&&int&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&对 f、g、e 标识,调用是:&br&&div class=&highlight&&&pre&&code class=&language-c&& &span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&n&&flt&/span&&span class=&p&&(&/span&&span class=&n&&str&/span&&span class=&p&&,&/span& &span class=&n&&va_arg&/span&&span class=&p&&(&/span&&span class=&n&&args&/span&&span class=&p&&,&/span& &span class=&kt&&double&/span&&span class=&p&&),&/span& &span class=&n&&field_width&/span&&span class=&p&&,&/span& &span class=&n&&precision&/span&&span class=&p&&,&/span& &span class=&o&&*&/span&&span class=&n&&fmt&/span&&span class=&p&&,&/span& &span class=&n&&flags&/span& &span class=&o&&|&/span& &span class=&n&&SIGN&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&在 calling convention 中,实参的float被转换成double后再压栈,而float/double实参都使用f标识,正好对应上面的 va_arg(args, double) 。&br&&br&因此,&br&&div class=&highlight&&&pre&&code class=&language-text&&printf(&%d,%f,%d&, num, num,num);
&/code&&/pre&&/div&在 format 字符串后压栈 4 + 4 + 4 共12字节,而 printf 内部解释 format 字符串时,将依次调用 va_arg(args, int)、va_arg(args, double)、va_arg(args, int),移动args指针 4 + 8 + 4共计16字节的距离,其中最后一次va_arg调用,引用的内存已经属于caller的栈帧。&br&&br&第1次va_arg的调用,正确解释了第1个实参;第3次va_arg,将未知栈内存解释成int;而第2次va_arg的调用,将最后两个实参解释成double,它相当于:&br&&div class=&highlight&&&pre&&code class=&language-text&&int i2[] = {1, 1};
double f = *(double*)i2;
&/code&&/pre&&/div&在小端字节序中,其位序列是:&br&&div class=&highlight&&&pre&&code class=&language-text&&00 0001
&/code&&/pre&&/div&参照 IEEE-754 双精度浮点数的格式,这个数应该是一个非规格化浮点数,它的值等于 -1^0 * (0 + 2^-20 + 2^-52) * 2^-1022,即 2.e-314 。&br&&br&稍微修改问题中的代码可以证实:&br&&div class=&highlight&&&pre&&code class=&language-text&&printf(&%d,%f,%d\n&, num, num, num);
printf(&%d,%g,%d\n&, num, num, num);
&/code&&/pre&&/div&将输出:&br&&div class=&highlight&&&pre&&code class=&language-text&&1,0.
1,2.122e-314,0
&/code&&/pre&&/div&---------------------------------------------------------------------------------------&br&&br&有些答案提到了x64的结果不同,也顺道看下。假设平台是 x64/MSVC++。&br&&br&在 calling convention 方面,由于x64多了一组通用寄存器,因此函数调用倾向于尽量用寄存器传参,只有当实参个数太多时才将多余的参数压栈。具体来说,RCX, RDX, R8, R9 被用来传递整数、指针, XMM0, XMM1, XMM2, XMM3 被用来传递浮点数。相比 IA32,小于4字节的整数不需要先扩展成4字节,但单精度浮点仍然先被转换成双精度。&br&&br&但是,毕竟通过寄存器传参只是一个优化,calling convention 要求,即使头4个参数通过寄存器传递,caller仍然应该在压栈额外的实参后,再保留32字节的shadow space(对应4个64位寄存器),供callee在必要的时候将寄存器中的实参溢出到栈中。什么时候callee会溢出实参呢?除了寄存器分配阶段的溢出动作外,变参函数也需要将实参保存到栈中。回忆一下,&stdargs.h&中的宏,依赖所有实参都保存在栈中这一事实。&br&&br&看一下调用代码:&br&&div class=&highlight&&&pre&&code class=&language-nasm&&&span class=&nf&&mov&/span&
&span class=&nb&&r9d&/span&&span class=&p&&,&/span&&span class=&kt&&dword&/span& &span class=&nv&&ptr&/span& &span class=&p&&[&/span&&span class=&nv&&num&/span&&span class=&p&&]&/span&
&span class=&nf&&mov&/span&
&span class=&nb&&r8d&/span&&span class=&p&&,&/span&&span class=&kt&&dword&/span& &span class=&nv&&ptr&/span& &span class=&p&&[&/span&&span class=&nv&&num&/span&&span class=&p&&]&/span&
&span class=&nf&&mov&/span&
&span class=&nb&&edx&/span&&span class=&p&&,&/span&&span class=&kt&&dword&/span& &span class=&nv&&ptr&/span& &span class=&p&&[&/span&&span class=&nv&&num&/span&&span class=&p&&]&/span&
&span class=&nf&&lea&/span&
&span class=&nb&&rcx&/span&&span class=&p&&,[&/span&&span class=&nv&&_load_config_used&/span&&span class=&o&&+&/span&&span class=&mh&&80h&/span& &span class=&p&&(&/span&&span class=&mh&&013F8DCD30h&/span&&span class=&p&&)]&/span&
&span class=&nf&&call&/span&
&span class=&kt&&qword&/span& &span class=&nv&&ptr&/span& &span class=&p&&[&/span&&span class=&nv&&__imp_printf&/span& &span class=&p&&(&/span&&span class=&mh&&013F8E12E0h&/span&&span class=&p&&)]&/span&
&/code&&/pre&&/div&4个参数分别通过 RCX(64位指针)、EDX/R8D/R9D(32位整数)传递。&br&&br&但这样,变参函数是无法在内部通过 va_arg 来访问实参的,所以,printf 入口处就是将4个参数寄存器溢出到shadow space的动作:&br&&div class=&highlight&&&pre&&code class=&language-nasm&&&span class=&nf&&mov&/span&
&span class=&kt&&qword&/span& &span class=&nv&&ptr&/span& &span class=&p&&[&/span&&span class=&nb&&rsp&/span&&span class=&o&&+&/span&&span class=&mi&&8&/span&&span class=&p&&],&/span&&span class=&nb&&rcx&/span&
&span class=&nf&&mov&/span&
&span class=&kt&&qword&/span& &span class=&nv&&ptr&/span& &span class=&p&&[&/span&&span class=&nb&&rsp&/span&&span class=&o&&+&/span&&span class=&mh&&10h&/span&&span class=&p&&],&/span&&span class=&nb&&rdx&/span&
&span class=&nf&&mov&/span&
&span class=&kt&&qword&/span& &span class=&nv&&ptr&/span& &span class=&p&&[&/span&&span class=&nb&&rsp&/span&&span class=&o&&+&/span&&span class=&mh&&18h&/span&&span class=&p&&],&/span&&span class=&nv&&r8&/span&
&span class=&nf&&mov&/span&
&span class=&kt&&qword&/span& &span class=&nv&&ptr&/span& &span class=&p&&[&/span&&span class=&nb&&rsp&/span&&span class=&o&&+&/span&&span class=&mh&&20h&/span&&span class=&p&&],&/span&&span class=&nv&&r9&/span&
&/code&&/pre&&/div&&br&最后就是&stdarg.h&中的宏了:&br&&div class=&highlight&&&pre&&code class=&language-text&&#define _crt_va_arg(ap, t)
( ( sizeof(t) & sizeof(__int64) || ( sizeof(t) & (sizeof(t) - 1) ) != 0 ) \
? **(t **)( ( ap += sizeof(__int64) ) - sizeof(__int64) ) \
*)( ( ap += sizeof(__int64) ) - sizeof(__int64) ) )
&/code&&/pre&&/div&可以看到,小于等于8字节的实参,压栈的是值,大于8字节的实参,压栈的是指针,va_arg 会顺带将该指针解引用。&br&&br&再来看问题中的调用发生了什么事:&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&%d,%f,%d&&/span&&span class=&p&&,&/span& &span class=&n&&num&/span&&span class=&p&&,&/span& &span class=&n&&num&/span&&span class=&p&&,&/span&&span class=&n&&num&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&首先,4个实参被分别加载到RCX、RDX、R8、R9中,然后 printf 将传参寄存器中的值溢出到栈上,最后通过 va_arg(args, int)、va_arg(args, double)、va_args(args, int)来访问。这里的每次 va_arg 都将args推进8字节,它依次访问了shadow space中为RDX、R8、R9保留的空间。&br&&br&因此,第1、3次 va_arg 取得的是正确的实参,只有第2次 va_arg,将整形实参解释成 double。&br&在小端字节序中,该整形对应的位序列是:&br&&div class=&highlight&&&pre&&code class=&language-text&&00 0001
&/code&&/pre&&/div&也是一个非规格化浮点数,计算 -1^0 * (0 + 2^-52) * 2^-1022 的结果是 4.e-324。&br&&br&打印&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&%d,%f,%d&/span&&span class=&se&&\n&/span&&span class=&s&&&&/span&&span class=&p&&,&/span& &span class=&n&&num&/span&&span class=&p&&,&/span& &span class=&n&&num&/span&&span class=&p&&,&/span& &span class=&n&&num&/span&&span class=&p&&);&/span&
&span class=&n&&printf&/span&&span class=&p&&(&/span&&span class=&s&&&%d,%g,%d&/span&&span class=&se&&\n&/span&&span class=&s&&&&/span&&span class=&p&&,&/span& &span class=&n&&num&/span&&span class=&p&&,&/span& &span class=&n&&num&/span&&span class=&p&&,&/span& &span class=&n&&num&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&得到:&br&&div class=&highlight&&&pre&&code class=&language-text&&1,0.
&/code&&/pre&&/div&&br&---------------------------------------------------------------------------------------&br&&br&上面解释了问题是怎样发生的,再回过头来讨论下类型错误的话题。&br&&br&我们说,因为C语言的变参函数,导致类型信息信息丢失,库的实现方,无力检查类型一致。所以,在C语言中,我们只能尽量避免这种编码失误。好在,当 format 字符串是字面值时,很多编译器都可以通过警告来提示这种类型错误。而当 format 是运行时字符串时,似乎只能尽量通过部署更多的测试来覆盖可能的输入了。&br&&br&而在使用C++时,应该避免使用 variadic function,代之以 variadic templates,后者总能正确的传递类型信息。&br&简单的以 variadic templates 实现 printf,我们可以在发现char*实参遭遇d标识这种不匹配情况中,抛出异常,这里有个库 &a href=&///?target=http%3A//cppformat.github.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++ Format&i class=&icon-external&&&/i&&/a& 就是这么做的:&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&n&&format&/span&&span class=&p&&(&/span&&span class=&s&&&The answer is {:d}&&/span&&span class=&p&&,&/span& &span class=&s&&&forty-two&&/span&&span class=&p&&);&/span&
&span class=&c1&&// throws a FormatError exception with description &unknown format code 'd' for string&, because the argument &forty-two& is a string while the format code d only applies to integers.&/span&
&/code&&/pre&&/div&而因为我们正确的传递了实参的类型信息,大部分情况下,格式化字符串中甚至可以只保留位置、宽度、对齐等字段,比如:&br&&div class=&highlight&&&pre&&code class=&language-text&&print(&I'd rather be {1} than {0}.&, &right&, &happy&);
&/code&&/pre&&/div&实际上,强类型系统如.Net中的Format函数,都是上面这样的。&br&&br&---------------------------------------------------------------------------------------&br&&br&参考:&br&&a href=&///?target=http%3A//agner.org/optimize/calling_conventions.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&agner.org/optimize/call&/span&&span class=&invisible&&ing_conventions.pdf&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A//en.wikipedia.org/wiki/Double-precision_floating-point_format& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Double-precision floating-point format&i class=&icon-external&&&/i&&/a&
本质问题是类型错误。 C语言中,使用 variadic function 将导致实参的类型信息丢失,被调函数只能利用类似 format 字符串的方式去解释栈中的实参,一旦 format 字符串和实际传入的实参类型不匹配,将导致类型错误。 类型错误的结果多种多样,"printf("%f", …
我觉得大家都说的很有道理,列举了很多这类强人具有的素质。&br&不过题主如果想成为这种人,我觉得只需要记住一点:&b&做事一定要争取远远超过别人对你的期望。&/b&&br&&br&我观察到的这类牛人,基本都具有这种心态。平常人觉得做到这种程度就OK了,剩下的就不是我的责任了;但牛人往往会更进一步,最后交给你的东西往往会让你震惊,远远超过你的预期。我相信他们也享受这种成就感,从而形成了一种良性循环。有时候甚至给了我一种感觉,他们并没有把任务当做任务,而是当做自己的作品。&br&&br&比如我在知乎上看到了 &a data-hash=&413cac83ac9bb62b8c55c85f7f80722b& href=&///people/413cac83ac9bb62b8c55c85f7f80722b& class=&member_mention& data-editable=&true& data-title=&@徐强& data-hovercard=&p$b$413cac83ac9bb62b8c55c85f7f80722b&&@徐强&/a& 的一个回答:&a href=&/question//answer/& class=&internal&&你从上级那学到的最受用的一句话是什么?他让你最佩服的品质又是什么? - 徐强的回答&/a& 我对这个回答中他在微软的经历印象很深。&br&如他所说,他当时的演讲能力或许并不强,也没有自信,但他为了做好一个小时的讲座花了10多个晚上,做了大量的研究,准备了100多页的PPT。最后得到了mentor的高度肯定:“John, you really beyond our expectation!” 这件事给了他很大的正面影响,让他以后更加追求超出期望的感觉。&br&&br&如果形成了这种渴望超出同事期望、超出老板期望、超出自己期望的习惯,我相信你就能一步步超越自己,渐渐成为你曾经仰望的强者。
我觉得大家都说的很有道理,列举了很多这类强人具有的素质。 不过题主如果想成为这种人,我觉得只需要记住一点:做事一定要争取远远超过别人对你的期望。 我观察到的这类牛人,基本都具有这种心态。平常人觉得做到这种程度就OK了,剩下的就不是我的责任了;…
这个问答贴来自 &a href=&///?target=http%3A///What-are-the-10-must-know-algorithms-and-data-structures-for-a-software-engineer& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Quora&i class=&icon-external&&&/i&&/a&。&br&&p&&b&算法&/b&&/p&&ol&&li&图搜索 (广度优先、深度优先)深度优先特别重要&/li&&li&排序&/li&&li&动态规划&/li&&li&匹配算法和网络流算法&/li&&li&正则表达式和字符串匹配&/li&&/ol&&p&&b&数据结构&/b&&/p&&ol&&li&图 (树尤其重要)&/li&&li&Map&/li&&li&堆&/li&&li&栈/队列&/li&&li&Tries | 字典树&/li&&/ol&&p&&b&额外推荐&/b&&/p&&ul&&li&贪婪算法&/li&&li&概率方法&/li&&li&近似算法&/li&&/ul&上面是 Arjun Nayini 的推荐,下面是 Ken George 的推荐&p&注:下面这个没有特定优先级&/p&&p&算法:&/p&&ul&&li&三路划分-快速排序&/li&&li&合并排序(更具扩展性,复杂度类似快速排序)&/li&&li&DF/BF 搜索 (要知道使用场景)&/li&&li&Prim
/ Kruskal (最小生成树)&/li&&li&Dijkstra (最短路径算法)&/li&&li&选择算法&/li&&/ul&&p&数据结构&/p&&ul&&li&HashMap (真的要知道所有哈希结构)&/li&&li&图和树(红黑树很好学) (red-black trees are good to learn)&/li&&li&堆(优先级队列)&/li&&li&栈/队列(必须知道的基础内容)&/li&&li&Tries | 字典树&/li&&/ul&
这个问答贴来自 。 算法图搜索 (广度优先、深度优先)深度优先特别重要排序动态规划匹配算法和网络流算法正则表达式和字符串匹配数据结构图 (树尤其重要)Map堆栈/队列Tries | 字典树额外推荐贪婪算法概率方法近似算法上面是 Arjun Nayini 的推荐,…
我是1986前后开始学习编程的,最初用的是comx-pc1型电脑,到目前,已经编程近30年,自信符合题主“资深程序员”的标准。&br&我提高自己的方法很简单,就是自己编程,实现已有的程序的功能。&br&例1、学java的时候,对于网络这一块不太明白,比如三次握手,就逼着自己做了个代理服务器,做完以后,对于网络编程就算掌握了,顺便还掌握了线程的知识,而且对于浏览器访问服务器的整个流程都非常清楚了。&br&例2、开始web编程的时候,webwork里面的一些标签没看懂,就逼着自己做了个web服务器,一下子就明白了webwork为什么要这样设计。额外的好处是做web服务器的时候,顺便也把spring的很多东西也掌握了。&br&例3、炒股的时候,看到各种指标的使用心得,不太明白,就逼着自己做了一套股票软件,一下子就对各种指标的计算,运用烂熟于心。额外的好处是可以轻松实现选股及自动交易。&br&现在,我在做浏览器……&br&&br&COMX-PC1的主机:&br&&img src=&/a5dc76d09a4d350bcb0e12daf1c0f61b_b.jpg& data-rawwidth=&400& data-rawheight=&300& class=&content_image& width=&400&&&img src=&/b62e7fe2ce6e5f168ac5136ee4dea0b0_b.jpg& data-rawwidth=&400& data-rawheight=&300& class=&content_image& width=&400&&&img src=&/e5cb4cc9499ddbb0cf61b_b.jpg& data-rawwidth=&400& data-rawheight=&300& class=&content_image& width=&400&&&br&&img src=&/1dfb6b78ee3be16b9d5cf_b.jpg& data-rawwidth=&622& data-rawheight=&420& class=&origin_image zh-lightbox-thumb& width=&622& data-original=&/1dfb6b78ee3be16b9d5cf_r.jpg&&&br&附上两张COMX-PC1的说明书,缅怀逝去的青春&br&&img src=&/6ceac57d068ed0_b.jpg& data-rawwidth=&1080& data-rawheight=&1456& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/6ceac57d068ed0_r.jpg&&&br&&img src=&/44a04aa2dbe8adcbabfe8ca_b.jpg& data-rawwidth=&600& data-rawheight=&444& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/44a04aa2dbe8adcbabfe8ca_r.jpg&&&br&&br&留言中,很多都是我那评论风骚的签名……有必要说一下这个签名的由来:当年在学校读书的时候,有一门basic语言,教这门课的老师以前也没有接触过电脑,都是现学现卖,于是,出现了荒诞的一幕:老师上课给我们讲basic语言,放学之后,我给他们讲c语言。这事反响很强烈,学校小报来采访,我装逼似的轻描淡写:“无它,唯手熟尔”,这话本来出自《卖油翁》,就是熟能生巧的意思,不知道记者听错了还是存心的,最后小报出来后,看到的就是:“无她,唯手熟尔”,大囧。
我是1986前后开始学习编程的,最初用的是comx-pc1型电脑,到目前,已经编程近30年,自信符合题主“资深程序员”的标准。 我提高自己的方法很简单,就是自己编程,实现已有的程序的功能。 例1、学java的时候,对于网络这一块不太明白,比如三次握手,就逼着…
&div class=&highlight&&&pre&&code class=&language-js&&&span class=&kd&&function&/span& &span class=&nx&&interpret&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span&&span class=&p&&,&/span& &span class=&nx&&env&/span&&span class=&p&&,&/span& &span class=&nx&&ctx&/span&&span class=&p&&){&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span& &span class=&k&&instanceof&/span& &span class=&nb&&Array&/span&&span class=&p&&){&/span&
&span class=&k&&switch&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]){&/span&
&span class=&k&&case&/span& &span class=&s1&&'lambda'&/span&&span class=&o&&:&/span& &span class=&p&&{&/span&
&span class=&kd&&var&/span& &span class=&nx&&params&/span& &span class=&o&&=&/span& &span class=&nx&&form&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&];&/span&
&span class=&kd&&var&/span& &span class=&nx&&body&/span& &span class=&o&&=&/span& &span class=&nx&&form&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&];&/span&
&span class=&k&&return&/span& &span class=&nx&&ctx&/span&&span class=&p&&(&/span&&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&ctx&/span&&span class=&p&&){&/span& &span class=&k&&return&/span& &span class=&kd&&function&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&kd&&var&/span& &span class=&nx&&e&/span& &span class=&o&&=&/span& &span class=&nb&&Object&/span&&span class=&p&&.&/span&&span class=&nx&&create&/span&&span class=&p&&(&/span&&span class=&nx&&env&/span&&span class=&p&&);&/span&
&span class=&k&&for&/span&&span class=&p&&(&/span&&span class=&kd&&var&/span& &span class=&nx&&j&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span& &span class=&nx&&j&/span& &span class=&o&&&&/span& &span class=&nx&&params&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span&&span class=&p&&;&/span& &span class=&nx&&j&/span&&span class=&o&&++&/span&&span class=&p&&)&/span& &span class=&nx&&e&/span&&span class=&p&&[&/span&&span class=&nx&&params&/span&&span class=&p&&[&/span&&span class=&nx&&j&/span&&span class=&p&&]]&/span& &span class=&o&&=&/span& &span class=&nx&&arguments&/span&&span class=&p&&[&/span&&span class=&nx&&j&/span&&span class=&p&&];&/span&
&span class=&k&&return&/span& &span class=&nx&&interpret&/span&&span class=&p&&(&/span&&span class=&nx&&body&/span&&span class=&p&&,&/span& &span class=&nx&&e&/span&&span class=&p&&,&/span& &span class=&nx&&ctx&/span&&span class=&p&&)&/span&
&span class=&p&&}})&/span&
&span class=&p&&};&/span&
&span class=&k&&case&/span& &span class=&s1&&'if'&/span&&span class=&o&&:&/span& &span class=&p&&{&/span&
&span class=&kd&&var&/span& &span class=&nx&&test&/span& &span class=&o&&=&/span& &span class=&nx&&form&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&],&/span& &span class=&nx&&consequent&/span& &span class=&o&&=&/span& &span class=&nx&&form&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&],&/span& &span class=&nx&&alternate&/span& &span class=&o&&=&/span& &span class=&nx&&form&/span&&span class=&p&&[&/span&&span class=&mi&&3&/span&&span class=&p&&];&/span&
&span class=&k&&return&/span& &span class=&nx&&interpret&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&],&/span& &span class=&nx&&env&/span&&span class=&p&&,&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&c&/span&&span class=&p&&){&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&c&/span&&span class=&p&&)&/span& &span class=&k&&return&/span& &span class=&nx&&interpret&/span&&span class=&p&&(&/span&&span class=&nx&&consequent&/span&&span class=&p&&,&/span& &span class=&nx&&env&/span&&span class=&p&&,&/span& &span class=&nx&&ctx&/span&&span class=&p&&)&/span&
&span class=&k&&else&/span&
&span class=&k&&return&/span& &span class=&nx&&interpret&/span&&span class=&p&&(&/span&&span class=&nx&&alternate&/span&&span class=&p&&,&/span& &span class=&nx&&env&/span&&span class=&p&&,&/span& &span class=&nx&&ctx&/span&&span class=&p&&)&/span&
&span class=&p&&})&/span&
&span class=&p&&};&/span&
&span class=&k&&case&/span& &span class=&s1&&'callcc'&/span&&span class=&o&&:&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&nx&&interpret&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&],&/span& &span class=&nx&&env&/span&&span class=&p&&,&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&f&/span&&span class=&p&&){&/span&
&span class=&kd&&var&/span& &span class=&nx&&fctx&/span& &span class=&o&&=&/span& &span class=&kd&&function&/span&&span class=&p&&(){&/span& &span class=&k&&return&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&x&/span&&span class=&p&&){&/span& &span class=&k&&return&/span& &span class=&nx&&ctx&/span&&span class=&p&&(&/span&&span class=&nx&&x&/span&&span class=&p&&)&/span& &span class=&p&&}};&/span&
&span class=&k&&return&/span& &span class=&nx&&f&/span&&span class=&p&&(&/span&&span class=&nx&&fctx&/span&&span class=&p&&)(&/span&&span class=&nx&&fctx&/span&&span class=&p&&)&/span&
&span class=&p&&})&/span&
&span class=&p&&};&/span&
&span class=&k&&case&/span& &span class=&s1&&'quote'&/span&&span class=&o&&:&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&nx&&ctx&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&])&/span&
&span class=&p&&};&/span&
&span class=&k&&default&/span&&span class=&o&&:&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&nx&&interpretCall&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span&&span class=&p&&,&/span& &span class=&nx&&env&/span&&span class=&p&&,&/span& &span class=&nx&&ctx&/span&&span class=&p&&);&/span&
&span class=&p&&};&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span& &span class=&k&&else&/span& &span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&k&&typeof&/span& &span class=&nx&&form&/span& &span class=&o&&===&/span& &span class=&s1&&'string'&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&nx&&ctx&/span&&span class=&p&&(&/span&&span class=&nx&&env&/span&&span class=&p&&[&/span&&span class=&nx&&form&/span&&span class=&p&&])&/span&
&span class=&p&&}&/span& &span class=&k&&else&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&nx&&ctx&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span&&span class=&p&&)&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&kd&&function&/span& &span class=&nx&&interpretCall&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span&&span class=&p&&,&/span& &span class=&nx&&env&/span&&span class=&p&&,&/span& &span class=&nx&&ctx&/span&&span class=&p&&){&/span&
&span class=&k&&return&/span& &span class=&nx&&interpret&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&],&/span& &span class=&nx&&env&/span&&span class=&p&&,&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&callee&/span&&span class=&p&&){&/span&
&span class=&k&&return&/span& &span class=&nx&&interpret$&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span&&span class=&p&&.&/span&&span class=&nx&&slice&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&),&/span& &span class=&nx&&env&/span&&span class=&p&&,&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&args&/span&&span class=&p&&){&/span&
&span class=&k&&return&/span& &span class=&nx&&callee&/span&&span class=&p&&(&/span&&span class=&nx&&ctx&/span&&span class=&p&&).&/span&&span class=&nx&&apply&/span&&span class=&p&&(&/span&&span class=&kc&&null&/span&&span class=&p&&,&/span& &span class=&nx&&args&/span&&span class=&p&&)&/span&
&span class=&p&&})&/span&
&span class=&p&&})&/span&
&span class=&p&&}&/span&
&span class=&kd&&function&/span& &span class=&nx&&interpret$&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span&&span class=&p&&,&/span& &span class=&nx&&env&/span&&span class=&p&&,&/span& &span class=&nx&&ctx&/span&&span class=&p&&){&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&nx&&form&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span&&span class=&p&&)&/span& &span class=&k&&return&/span& &span class=&nx&&ctx&/span&&span class=&p&&(&/span&&span class=&kc&&null&/span&&span class=&p&&);&/span&
&span class=&k&&else&/span& &span class=&k&&return&/span& &span class=&nx&&interpret&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&],&/span& &span class=&nx&&env&/span&&span class=&p&&,&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&x0&/span&&span class=&p&&){&/span&
&span class=&k&&return&/span& &span class=&nx&&interpret$&/span&&span class=&p&&(&/span&&span class=&nx&&form&/span&&span class=&p&&.&/span&&span class=&nx&&slice&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&),&/span& &span class=&nx&&env&/span&&span class=&p&&,&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&x$&/span&&span class=&p&&){&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&x$&/span&&span class=&p&&)&/span& &span class=&k&&return&/span& &span class=&nx&&ctx&/span&&span class=&p&&([&/span&&span class=&nx&&x0&/span&&span class=&p&&])&/span&
&span class=&k&&else&/span& &span class=&k&&return&/span& &span class=&nx&&ctx&/span&&span class=&p&&([&/span&&span class=&nx&&x0&/span&&span class=&p&&].&/span&&span class=&nx&&concat&/span&&span class=&p&&(&/span&&span class=&nx&&x$&/span&&span class=&p&&))&/span&
&span class=&p&&})&/span&
&span class=&p&&})&/span&
&span class=&p&&}&/span&
&span class=&kd&&function&/span& &span class=&nx&&id&/span&&span class=&p&&(&/span&&span class=&nx&&x&/span&&span class=&p&&){&/span& &span class=&k&&return&/span& &span class=&nx&&x&/span& &span class=&p&&}&/span&
&span class=&kd&&var&/span& &span class=&nx&&env0&/span& &span class=&o&&=&/span& &span class=&p&&{&/span& &span class=&nx&&trace&/span&&span class=&o&&:&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&ctx&/span&&span class=&p&&){&/span& &span class=&k&&return&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&x&/span&&span class=&p&&)&/span& &span class=&p&&{&/span& &span class=&k&&return&/span& &span class=&nx&&ctx&/span&&span class=&p&&(&/span&&span class=&nx&&console&/span&&span class=&p&&.&/span&&span class=&nx&&log&/span&&span class=&p&&(&/span&&span class=&nx&&x&/span&&span class=&p&&))&/span& &span class=&p&&}}};&/span&
&span class=&nx&&interpret&/span&&span class=&p&&([&/span&&span class=&s1&&'trace'&/span&&span class=&p&&,&/span& &span class=&p&&[&/span&&span class=&s1&&'callcc'&/span&&span class=&p&&,&/span& &span class=&p&&[&/span&&span class=&s1&&'lambda'&/span&&span class=&p&&,&/span& &span class=&p&&[&/span&&span class=&s1&&'return'&/span&&span class=&p&&],&/span& &span class=&p&&[&/span&&span class=&s1&&'return'&/span&&span class=&p&&,&/span& &span class=&p&&[&/span&&span class=&s1&&'quote'&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&]]]]],&/span& &span class=&nx&&env0&/span&&span class=&p&&,&/span& &span class=&nx&&id&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&因为之前有人说我偷懒没做 call/cc,今天我就做它一回。全文按照 Danvy 他们的抽象解释模式写成,显式传递 Continuation。&br&&br&下面是个混淆版 :)&br&&div class=&highlight&&&pre&&code class=&language-js&&&span class=&kd&&function&/span& &span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&,&/span&&span class=&nx&&E&/span&&span class=&p&&,&/span&&span class=&nx&&K&/span&&span class=&p&&){&/span&&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span& &span class=&k&&instanceof&/span& &span class=&nb&&Array&/span&&span class=&p&&))&/span&&span class=&k&&return&/span& &span class=&nx&&K&/span&&span class=&p&&(&/span&&span class=&s2&&&string&&/span&&span class=&o&&==&/span&&span class=&k&&typeof&/span& &span class=&nx&&C&/span&&span class=&o&&?&/span&
&span class=&nx&&E&/span&&span class=&p&&[&/span&&span class=&nx&&C&/span&&span class=&p&&]&/span&&span class=&o&&:&/span&&span class=&nx&&C&/span&&span class=&p&&);&/span&&span class=&k&&switch&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]){&/span&&span class=&k&&case&/span&&span class=&s2&&&lambda&&/span&&span class=&o&&:&/span&&span class=&k&&return&/span& &span class=&nx&&K&/span&&span class=&p&&(&/span&&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&K&/span&&span class=&p&&){&/span&&span class=&k&&return&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&
&span class=&p&&){&/span&&span class=&k&&for&/span&&span class=&p&&(&/span&&span class=&kd&&var&/span& &span class=&nx&&e&/span&&span class=&o&&=&/span&&span class=&nb&&Object&/span&&span class=&p&&.&/span&&span class=&nx&&create&/span&&span class=&p&&(&/span&&span class=&nx&&E&/span&&span class=&p&&),&/span&&span class=&nx&&u&/span&&span class=&o&&=&/span&&span class=&mi&&0&/span&&span class=&p&&;&/span&&span class=&nx&&u&/span&&span class=&o&&&&/span&&span class=&nx&&C&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&].&/span&&span class=&nx&&length&/span&&span class=&p&&;&/span&&span class=&nx&&u&/span&&span class=&o&&++&/span&&span class=&p&&)&/span&&span class=&nx&&e&/span&&span class=&p&&[&/span&&span class=&nx&&C&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&][&/span&&span class=&nx&&u&/span&&span class=&p&&]]&/span&&span class=&o&&=&/span&&span class=&nx&&arguments&/span&
&span class=&p&&[&/span&&span class=&nx&&u&/span&&span class=&p&&];&/span&&span class=&k&&return&/span& &span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&],&/span&&span class=&nx&&e&/span&&span class=&p&&,&/span&&span class=&nx&&K&/span&&span class=&p&&)}});&/span&&span class=&k&&case&/span&&span class=&s2&&&if&&/span&&span class=&o&&:&/span&&span class=&k&&return&/span& &span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&],&/span&&span class=&nx&&E&/span&&span class=&p&&,&/span&&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&e&/span&&span class=&p&&){&/span&&span class=&k&&return&/span& &span class=&nx&&e&/span&
&span class=&o&&?&/span&&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&],&/span&&span class=&nx&&E&/span&&span class=&p&&,&/span&&span class=&nx&&K&/span&&span class=&p&&)&/span&&span class=&o&&:&/span&&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&[&/span&&span class=&mi&&3&/span&&span class=&p&&],&/span&&span class=&nx&&E&/span&&span class=&p&&,&/span&&span class=&nx&&K&/span&&span class=&p&&)});&/span&&span class=&k&&case&/span&&span class=&s2&&&callcc&&/span&&span class=&o&&:&/span&&span class=&k&&return&/span& &span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&],&/span&&span class=&nx&&E&/span&&span class=&p&&,&/span&&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&){&/span&&span class=&kd&&var&/span&
&span class=&nx&&E&/span&&span class=&o&&=&/span&&span class=&kd&&function&/span&&span class=&p&&(){&/span&&span class=&k&&return&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&){&/span&&span class=&k&&return&/span& &span class=&nx&&K&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&)}};&/span&&span class=&k&&return&/span& &span class=&nx&&C&/span&&span class=&p&&(&/span&&span class=&nx&&E&/span&&span class=&p&&)(&/span&&span class=&nx&&E&/span&&span class=&p&&)});&/span&&span class=&k&&case&/span& &span class=&s2&&&'&&/span&
&span class=&o&&:&/span&&span class=&k&&return&/span& &span class=&nx&&K&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&]);&/span&&span class=&k&&default&/span&&span class=&o&&:&/span&&span class=&k&&return&/span& &span class=&nx&&$c&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&,&/span&&span class=&nx&&E&/span&&span class=&p&&,&/span&&span class=&nx&&K&/span&&span class=&p&&)}}&/span&&span class=&kd&&function&/span& &span class=&nx&&$c&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&,&/span&&span class=&nx&&E&/span&&span class=&p&&,&/span&&span class=&nx&&K&/span&&span class=&p&&){&/span&&span class=&k&&return&/span& &span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&
&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&],&/span&&span class=&nx&&E&/span&&span class=&p&&,&/span&&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&e&/span&&span class=&p&&){&/span&&span class=&k&&return&/span& &span class=&nx&&$$&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&.&/span&&span class=&nx&&slice&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&),&/span&&span class=&nx&&E&/span&&span class=&p&&,&/span&&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&){&/span&&span class=&k&&return&/span& &span class=&nx&&e&/span&&span class=&p&&(&/span&&span class=&nx&&K&/span&&span class=&p&&).&/span&&span class=&nx&&apply&/span&&span class=&p&&(&/span&
&span class=&kc&&null&/span&&span class=&p&&,&/span&&span class=&nx&&C&/span&&span class=&p&&)})})};&/span& &span class=&kd&&function&/span& &span class=&nx&&$$&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&,&/span&&span class=&nx&&E&/span&&span class=&p&&,&/span&&span class=&nx&&K&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&&span class=&k&&return&/span& &span class=&nx&&C&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span&&span class=&o&&?&/span&&span class=&nx&&$&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&],&/span&&span class=&nx&&E&/span&&span class=&p&&,&/span&&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&e&/span&&span class=&p&&){&/span&
&span class=&k&&return&/span& &span class=&nx&&$$&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&.&/span&&span class=&nx&&slice&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&),&/span&&span class=&nx&&E&/span&&span class=&p&&,&/span&&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&){&/span&&span class=&k&&return&/span& &span class=&nx&&K&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&o&&?&/span&&span class=&p&&[&/span&&span class=&nx&&e&/span&&span class=&p&&]&/span&&span class=&o&&:&/span&&span class=&p&&[&/span&&span class=&nx&&e&/span&&span class=&p&&].&/span&&span class=&nx&&concat&/span&&span class=&p&&(&/span&&span class=&nx&&C&/span&&span class=&p&&))})})&/span&&span class=&o&&:&/span&&span class=&nx&&K&/span&&span class=&p&&(&/span&
&span class=&kc&&null&/span&&span class=&p&&)}&/span&&span class=&kd&&var&/span& &span class=&nx&&e&/span&&span class=&o&&=&/span&&span class=&p&&{&/span&&span class=&nx&&trace&/span&&span class=&o&&:&/span&&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&k&/span&&span class=&p&&){&/span&&span class=&k&&return&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&x&/span&&span class=&p&&){&/span&&span class=&k&&return&/span& &span class=&nx&&k&/span&&span class=&p&&(&/span&&span class=&nx&&console&/span&&span class=&p&&.&/span&&span class=&nx&&log&/span&&span class=&p&&(&/span&
&span class=&nx&&x&/span&&span class=&p&&))}}};&/span&&span class=&nx&&$&/span&&span class=&p&&([&/span&&span class=&s1&&'trace'&/span&&span class=&p&&,[&/span&&span class=&s1&&'callcc'&/span&&span class=&p&&,[&/span&&span class=&s1&&'lambda'&/span&&span class=&p&&,[&/span&&span class=&s1&&'return'&/span&&span class=&p&&],[&/span&&span class=&s1&&'return'&/span&&span class=&p&&,[&/span&&span class=&s2&&&'&&/span&&span class=&p&&,&/span&&span class=&mi&&42&/span&&span class=&p&&]]]]]&/span&
&span class=&p&&,&/span&&span class=&nx&&e&/span&&span class=&p&&,&/span&&span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&x&/span&&span class=&p&&){&/span&&span class=&k&&return&/span& &span class=&nx&&x&/span&&span class=&p&&});&/span&
&/code&&/pre&&/div&
function interpret(form, env, ctx){
if(form instanceof Array){
switch(form[0]){
case 'lambda': {
var params = form[1];
var body = form[2];
return ctx(function(ctx){ return function() {
var e = Object.create(env);
只是写一个简单解释器的话:&br&&br&1. 王垠大神的一篇简洁易懂的博客&br&2. 还有下面两篇用python实现的一个例子:(非常容易上手)&br&&a href=&///?target=http%3A///lispy.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&(How to Write a (Lisp) Interpreter (in Python))&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///lispy2.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&(An ((Even Better) Lisp) Interpreter (in Python))&i class=&icon-external&&&/i&&/a&&br&&br&上面的文章都介绍了每个特性的考虑方式,应该比较符合题主需求。
只是写一个简单解释器的话: 1. 王垠大神的一篇简洁易懂的博客 2. 还有下面两篇用python实现的一个例子:(非常容易上手)
上面的文章都介绍了每个特…
很有意思的结果。我不清楚numpy数组在哪些场合下慢过list,不过纠正一下题主的误解。&br&&br&python的list实现不是链表,而是动态数组。动态数组append/pop的均摊时间复杂度为O(1),而按下标随机访问跟一般数组无异,时间复杂度严格为O(1)。C++ STL中的vector也是动态数组。当然,从非尾部增删元素也是支持的,虽然慢就是了,应避免。&br&&br&关于python各种内建类型操作的时间复杂度,可参考&a href=&///?target=https%3A//wiki.python.org/moin/TimeComplexity& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TimeComplexity&i class=&icon-external&&&/i&&/a&&br&关于动态数组,可参考&a href=&///?target=https%3A//en.wikipedia.org/wiki/Dynamic_array& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Dynamic array&i class=&icon-external&&&/i&&/a&&br&&br&另外numpy数组单个元素随机访问比list慢没啥大不了的,后者是python实现内建,前者还有ffi的开销。numpy快的地方在于可以整向量/整矩阵地做算术运算,中间省了许多开销。你写个list comprehension来用list模拟向量算术,再来跟numpy比,会有质的不同。哪怕没链MKL优化的numpy也能把list爆出翔。
很有意思的结果。我不清楚numpy数组在哪些场合下慢过list,不过纠正一下题主的误解。 python的list实现不是链表,而是动态数组。动态数组append/pop的均摊时间复杂度为O(1),而按下标随机访问跟一般数组无异,时间复杂度严格为O(1)。C++ STL中的vector也是…
遇到安装问题的请尝试Anaconda这个Python发行版。下载安装后直接使用即可,它几乎预装了所有要用到的科学计算及可视化的库。&br&&br&有盆友在评论里说希望能有完整的教程,确实就这个答案来说,离实际使用还有很大的距离,网上相关的中文资料也不多。不过真要写起来这个答案也装不下,况且写在这个问题下也不是很恰当。等到那天我有专栏了再说吧,到时候也许会写一个关于可视化的系列教程。&br&&br&=======分割线======&br&&br&强烈推荐 Python 的绘图模块 &a href=&///?target=http%3A//matplotlib.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&matplotlib: python plotting&i class=&icon-external&&&/i&&/a& 。画出来的图真的是高端大气上档次,低调奢华有内涵~ 适用于从 2D 到 3D,从标量到矢量的各种绘图。能够保存成从 eps, pdf 到 svg, png, jpg 的多种格式。并且 Matplotlib 的绘图函数基本上都与 Matlab 的绘图函数名字都差不多,迁移的学习成本比较低。开源免费。如图所示(题目描述中的图在最后):&br&(以下图片均引用自 &a href=&///?target=http%3A//matplotlib.org/gallery.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Thumbnail gallery&i class=&icon-external&&&/i&&/a& )&br&&br&像这种普通的函数图象:&br&&img src=&/9dcde02a94b66149d7bff788e911a2d6_b.jpg& data-rawwidth=&440& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&440& data-original=&/9dcde02a94b66149d7bff788e911a2d6_r.jpg&&&div class=&highlight&&&pre&&code class=&language-python&&&span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&fill&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&y1&/span&&span class=&p&&,&/span& &span class=&s&&'b'&/span&&span class=&p&&,&/span& &span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&y2&/span&&span class=&p&&,&/span& &span class=&s&&'r'&/span&&span class=&p&&,&/span& &span class=&n&&alpha&/span&&span class=&o&&=&/span&&span class=&mf&&0.3&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&br&&br&以及这种 Scatter 图(中文不知道该怎么说…):&br&&img src=&/7f4dc2f170b652cf141b0e_b.jpg& data-rawwidth=&440& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&440& data-original=&/7f4dc2f170b652cf141b0e_r.jpg&&&br&&div class=&highlight&&&pre&&code class=&language-python&&&span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&scatter&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&n&&s&/span&&span class=&o&&=&/span&&span class=&n&&area&/span&&span class=&p&&,&/span& &span class=&n&&alpha&/span&&span class=&o&&=&/span&&span class=&mf&&0.5&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&br&&br&精致的曲线,半透明的配色。都显出你那高贵冷艳的X格,最重要的是只需一行代码就能搞定。从此以后再也不用忍受 Matlab以及GNUPlot 中那蛋疼的配色了。&br&&br&想画 3D 数据?没有问题 (不过用 mayavi 可能更方便一些):&br&&img src=&/eba48ff1d310b5fed9562884_b.jpg& data-rawwidth=&440& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&440& data-original=&/eba48ff1d310b5fed9562884_r.jpg&&&br&&div class=&highlight&&&pre&&code class=&language-python&&&span class=&n&&ax&/span&&span class=&o&&.&/span&&span class=&n&&plot_surface&/span&&span class=&p&&(&/span&&span class=&n&&X&/span&&span class=&p&&,&/span& &span class=&n&&Y&/span&&span class=&p&&,&/span& &span class=&n&&Z&/span&&span class=&p&&,&/span& &span class=&n&&rstride&/span&&span class=&o&&=&/span&&span class=&mi&&8&/span&&span class=&p&&,&/span& &span class=&n&&cstride&/span&&span class=&o&&=&/span&&span class=&mi&&8&/span&&span class=&p&&,&/span& &span class=&n&&alpha&/span&&span class=&o&&=&/span&&span class=&mf&&0.3&/span&&span class=&p&&)&/span&
&span class=&n&&cset&/span& &span class=&o&&=&/span& &span class=&n&&ax&/span&&span class=&o&&.&/span&&span class=&n&&contourf&/span&&span class=&p&&(&/span&&span class=&n&&X&/span&&span class=&p&&,&/span& &span class=&n&&Y&/span&&span class=&p&&,&/span& &span class=&n&&Z&/span&&span class=&p&&,&/span& &span class=&n&&zdir&/span&&span class=&o&&=&/span&&span class=&s&&'z'&/span&&span class=&p&&,&/span& &span class=&n&&offset&/span&&span class=&o&&=-&/span&&span class=&mi&&100&/span&&span class=&p&&,&/span& &span class=&n&&cmap&/span&&span class=&o&&=&/span&&span class=&n&&cm&/span&&span class=&o&&.&/span&&span class=&n&&coolwarm&/span&&span class=&p&&)&/span&
&span class=&n&&cset&/span& &span class=&o&&=&/span& &span class=&n&&ax&/span&&span class=&o&&.&/span&&span class=&n&&contourf&/span&&span class=&p&&(&/span&&span class=&n&&X&/span&&span class=&p&&,&/span& &span class=&n&&Y&/span&&span class=&p&&,&/span& &span class=&n&&Z&/span&&span class=&p&&,&/span& &span class=&n&&zdir&/span&&span class=&o&&=&/span&&span class=&s&&'x'&/span&&span class=&p&&,&/span& &span class=&n&&offset&/span&&span class=&o&&=-&/span&&span class=&mi&&40&/span&&span class=&p&&,&/span& &span class=&n&&cmap&/span&&span class=&o&&=&/span&&span class=&n&&cm&/span&&span class=&o&&.&/span&&span class=&n&&coolwarm&/span&&span class=&p&&)&/span&
&span class=&n&&cset&/span& &span class=&o&&=&/span& &span class=&n&&ax&/span&&span class=&o&&.&/span&&span class=&n&&contourf&/span&&span class=&p&&(&/span&&span class=&n&&X&/span&&span class=&p&&,&/span& &span class=&n&&Y&/span&&span class=&p&&,&/span& &span class=&n&&Z&/span&&span class=&p&&,&/span& &span class=&n&&zdir&/span&&span class=&o&&=&/span&&span class=&s&&'y'&/span&&span class=&p&&,&/span& &span class=&n&&offset&/span&&span class=&o&&=&/span&&span class=&mi&&40&/span&&span class=&p&&,&/span& &span class=&n&&cmap&/span&&span class=&o&&=&/span&&span class=&n&&cm&/span&&span class=&o&&.&/span&&span class=&n&&coolwarm&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&br&四行代码你就能拥有(后三行是画坐标平面上的等高线,严格的额说还是一行)。&br&&br&除此以外,不过你是矢量场,网络还是什么奇葩的需求都能够搞定:&br&&img src=&/b66a7c4a11bca84facd28f63f7faf856_b.jpg& data-rawwidth=&440& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&440& data-original=&/b66a7c4a11bca84facd28f63f7faf856_r.jpg&&&div class=&highlight&&&pre&&code class=&language-python&&&span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&streamplot&/span&&span class=&p&&(&/span&&span class=&n&&X&/span&&span class=&p&&,&/span& &span class=&n&&Y&/span&&span class=&p&&,&/span& &span class=&n&&U&/span&&span class=&p&&,&/span& &span class=&n&&V&/span&&span class=&p&&,&/span& &span class=&n&&color&/span&&span class=&o&&=&/span&&span class=&n&&U&/span&&span class=&p&&,&/span& &span class=&n&&linewidth&/span&&span class=&o&&=&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&n&&cmap&/span&&span class=&o&&=&/span&&span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&cm&/span&&span class=&o&&.&/span&&span class=&n&&autumn&/span&&span class=&p&&)&/span&
&span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&colorbar&/span&&span class=&p&&()&/span&
&/code&&/pre&&/div&&br&&br&&img src=&/c13df8fd7d8fe_b.jpg& data-rawwidth=&440& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&440& data-original=&/c13df8fd7d8fe_r.jpg&&&br&&div class=&highlight&&&pre&&code class=&language-python&&&span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&triplot&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&y&/span&&span class=&p&&,&/span& &span class=&n&&triangles&/span&&span class=&p&&,&/span& &span class=&s&&'go-'&/span&&span class=&p&&)&/span&
&span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&title&/span&&span class=&p&&(&/span&&span class=&s&&'triplot of user-specified triangulation'&/span&&span class=&p&&)&/span&
&span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&xlabel&/span&&span class=&p&&(&/span&&span class=&s&&'Longitude (degrees)'&/span&&span class=&p&&)&/span&
&span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&ylabel&/span&&span class=&p&&(&/span&&span class=&s&&'Latitude (degrees)'&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&br&&br&&img src=&/df11cd0289cc_b.jpg& data-rawwidth=&440& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&440& data-original=&/df11cd0289cc_r.jpg&&&div class=&highlight&&&pre&&code class=&language-python&&&span class=&n&&ax&/span& &span class=&o&&=&/span& &span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&subplot&/span&&span class=&p&&(&/span&&span class=&mi&&111&/span&&span class=&p&&,&/span& &span class=&n&&polar&/span&&span class=&o&&=&/span&&span class=&bp&&True&/span&&span class=&p&&)&/span&
&span class=&n&&bars&/span& &span class=&o&&=&/span& &span class=&n&&ax&/span&&span class=&o&&.&/span&&span class=&n&&bar&/span&&span class=&p&&(&/span&&span class=&n&&theta&/span&&span class=&p&&,&/span& &span class=&n&&radii&/span&&span class=&p&&,&/span& &span class=&n&&width&/span&&span class=&o&&=&/span&&span class=&n&&width&/span&&span class=&p&&,&/span& &span class=&n&&bottom&/span&&span class=&o&&=&/span&&span class=&mf&&0.0&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&br&&br&这还没完,Matplotlib 还支持Latex公式的插入,当别人画的图还是这个样子的时候(以下图片引用自&a href=&///?target=http%3A//reverland.org/python//matplotlib-tutorial/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Matplotlib Tutorial(译)&i class=&icon-external&&&/i&&/a&)&br&&img src=&/be83c4bef6acff35a7ef050_b.jpg& data-rawwidth=&576& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/be83c4bef6acff35a7ef050_r.jpg&&你能够把它变成这个样子:&br&&img src=&/605ab7e12cdd5b294fcbeaa283e3feae_b.jpg& data-rawwidth=&576& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&/605ab7e12cdd5b294fcbeaa283e3feae_r.jpg&&如果再搭配上 IPython 作为运行终端(这张图是自己的~):&br&&img src=&/df5c59d1de1d3028e9ceb06b40e6e613_b.jpg& data-rawwidth=&617& data-rawheight=&536& class=&origin_image zh-lightbox-thumb& width=&617& data-original=&/df5c59d1de1d3028e9ceb06b40e6e613_r.jpg&&&br&简直就是神器啊,有木有!&br&心动不如行动,还等什么?&br&(奉上教程一篇 &a href=&///?target=http%3A//reverland.org/python//matplotlib-tutorial/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Matplotlib Tutorial(译)&i class=&icon-external&&&/i&&/a&)&br&&br&&br&==== Update:
18:04 ====&br&经&a class=&member_mention& data-editable=&true& data-title=&@许铖& data-hash=&f82f331c9c57& href=&///people/f82f331c9c57& data-tip=&p$b$f82f331c9c57& data-hovercard=&p$b$f82f331c9c57&&@许铖&/a&同学提醒,再补充一句,matplotlib 还可以话 xkcd 风格的图呦~&br&&br&&img src=&/3328cfcbe479f0fedf77affe929bb925_b.jpg& data-rawwidth=&432& data-rawheight=&288& class=&origin_image zh-lightbox-thumb& width=&432& data-original=&/3328cfcbe479f0fedf77affe929bb925_r.jpg&&(图片引用自网络)&br&&br&此外结合 IPython Notebook 后更多精彩内容,请看&a href=&///?target=http%3A//nbviewer.ipython.org/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&nbviewer.ipython.org/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&==== Update:
20:04 ====&br&如果嫌安装麻烦并且恰好在 Windows 系统下的话可以尝试Python的一个发行版&a href=&///?target=https%3A///p/winpython/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&winpython -
Portable Scientific Python 2/3 32/64bit Distribution for Windows&i class=&icon-external&&&/i&&/a&。&br&&br&==== Update:
23:45 ====&br&鉴于&a class=&member_mention& data-editable=&true& data-title=&@van li& data-hash=&e7c9b4d7b280d8d20ecd67& href=&///people/e7c9b4d7b280d8d20ecd67& data-tip=&p$b$e7c9b4d7b280d8d20ecd67& data-hovercard=&p$b$e7c9b4d7b280d8d20ecd67&&@van li&/a&同学质疑 matplotlib 是否能画出题目中所示的图像,我在这里将题目中的图像用 matplotlib 画出来如下:&br&&br&&img src=&/df5d9b706531fbe492adfed_b.jpg& data-rawwidth=&815& data-rawheight=&615& class=&origin_image zh-lightbox-thumb& width=&815& data-original=&/df5d9b706531fbe492adfed_r.jpg&&代码在此处:&a href=&///?target=https%3A///coldfog/cfc6bb8b789& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/coldfog&/span&&span class=&invisible&&/cfc6bb8b789&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&img src=&/9b8c7c6f3f3b752adff2cb_b.jpg& data-rawwidth=&815& data-rawheight=&615& class=&origin_image zh-lightbox-thumb& width=&815& data-original=&/9b8c7c6f3f3b752adff2cb_r.jpg&&代码在此处:&a href=&///?target=https%3A///coldfog/5da63ab52& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/coldfog&/span&&span class=&invisible&&/5da63ab52&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&======== 更新======&br&&br&看到楼下有人说配色和好看,唉....那我也贴几个吧...只不过当初限于篇幅没有写而已。&br&&br&首先,python 有一个专门的配色包&a href=&///?target=https%3A///jiffyclub/brewer2mpl& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&jiffyclub/brewer2mpl 路 GitHub&i class=&icon-external&&&/i&&/a&,提供了从美术角度来讲的精美配色(戳这里感受&a href=&///?target=http%3A//colorbrewer2.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ColorBrewer: Color Advice for Maps&i class=&icon-external&&&/i&&/a&)。&br&此外还有一些致力于美化绘图的库,用起来也都非常方便,比如&a href=&///?target=https%3A///olgabot/prettyplotlib& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&olgabot/prettyplotlib 路 GitHub&i class=&icon-external&&&/i&&/a&。&br&&br&废话不多说,上图就是王道。&br&(一下图片来源网络)&br&&img src=&/84574fbf9ffed77c39d1549111cce3a5_b.jpg& data-rawwidth=&432& data-rawheight=&288& class=&origin_image zh-lightbox-thumb& width=&432& data-original=&/84574fbf9ffed77c39d1549111cce3a5_r.jpg&&&img src=&/6d477f83e9dbb6c2cbbadc_b.jpg& data-rawwidth=&342& data-rawheight=&249& class=&content_image& width=&342&&&img src=&/51ac0df6b936e7b67a3c_b.jpg& data-rawwidth=&369& data-rawheight=&264& class=&content_image& width=&369&&&br&有人可能会说需要复杂的设置,其实也不用。比如上边这幅图,只需要多加一个参数就好:&br&&div class=&highlight&&&pre&&code class=&language-python&&&span class=&n&&cmap&/span&&span class=&o&&=&/span&&span class=&n&&brewer2mpl&/span&&span class=&o&&.&/span&&span class=&n&&get_map&/span&&span class=&p&&(&/span&&span class=&s&&'RdBu'&/span&&span class=&p&&,&/span& &span class=&s&&'diverging'&/span&&span class=&p&&,&/span& &span class=&mi&&8&/span&&span class=&p&&,&/span& &span class=&n&&reverse&/span&&span class=&o&&=&/span&&span class=&bp&&True&/span&&span class=&p&&)&/span&&span class=&o&&.&/span&&span class=&n&&mpl_colormap&/span&&span class=&p&&,&/span&
&/code&&/pre&&/div&&br&楼下说到统计绘图。嘛 seaborn (&a href=&///?target=https%3A///mwaskom/seaborn& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/mwaskom/seab&/span&&span class=&invisible&&orn&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&) 是一个调用 matplotlib 的统计绘图库,上图:&br&&img src=&/0be48108d7cfea831fa6e4_b.jpg& data-rawwidth=&525& data-rawheight=&525& class=&origin_image zh-lightbox-thumb& width=&525& data-original=&/0be48108d7cfea831fa6e4_r.jpg&&代码一行,后边的几乎都是一行,没做其他设置,默认就这样。我就不贴其他的代码了:&br&&div class=&highlight&&&pre&&code class=&language-text&&g = sns.jointplot(x1, x2, kind=&kde&, size=7, space=0)
&/code&&/pre&&/div&&img src=&/6bdaaeed1a_b.jpg& data-rawwidth=&525& data-rawheight=&525& class=&origin_image zh-lightbox-thumb& width=&525& data-original=&/6bdaaeed1a_r.jpg&&&img src=&/521a87cbbdb693b87b6297_b.jpg& data-rawwidth=&600& data-rawheight=&412& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/521a87cbbdb693b87b6297_r.jpg&&&img src=&/1cfcfc76b6_b.jpg& data-rawwidth=&539& data-rawheight=&375& class=&origin_image zh-lightbox-thumb& width=&539& data-original=&/1cfcfc76b6_r.jpg&&&img src=&/f3ad883dd2a9df53edadf_b.jpg& data-rawwidth=&450& data-rawheight=&450& class=&origin_image zh-lightbox-thumb& width=&450& data-original=&/f3ad883dd2a9df53edadf_r.jpg&&&img src=&/d0faecb6b8eff4_b.jpg& data-rawwidth=&525& data-rawheight=&525& class=&origin_image zh-lightbox-thumb& width=&525& data-original=&/d0faecb6b8eff4_r.jpg&&&br&&br&这还有个更炫酷的可交互式的绘图,大家自己戳开看吧&a href=&///?target=http%3A//nbviewer.ipython.org/github/plotly/python-user-guide/blob/master/s0_getting-started/s0_getting-started.ipynb& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&nbviewer.ipython.org/gi&/span&&span class=&invisible&&thub/plotly/python-user-guide/blob/master/s0_getting-started/s0_getting-started.ipynb&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&哼哼,完爆了吧~~~~\(≧▽≦)/~
遇到安装问题的请尝试Anaconda这个Python发行版。下载安装后直接使用即可,它几乎预装了所有要用到的科学计算及可视化的库。 有盆友在评论里说希望能有完整的教程,确实就这个答案来说,离实际使用还有很大的距离,网上相关的中文资料也不多。不过真要写起…
2005年中期,用了几天学完了Python,随后两天用了十几个小时写了编译原理的课程设计,这是我大学阶段所有课程设计里唯一没有延期的。&br&&br&后来逐渐发现Python的简单可以把我的思想从编程语言的细节里解放出来,更关注实际要解决的问题。&br&&br&就喜欢上了。&br&&br&既然有人点赞,就再补充点。&br&&br&很多人关注起Python就是因为简单易懂,做Web很方便。但在深入CS学科的很多高级主题时,Python能发挥出更加强大无比的力量。而这来自于Python是个好胶水。&br&&br&坦白讲,Python不算最好的胶水,至少Lua做胶水就比Python好,API好用。但Python再算上强大的标准库、数据结构、友好的转义后,就脱颖而出了。&br&&br&在科学计算领域,NumPy和SciPy的存在解放了很多人的思想束缚。其底层C模块,性能一流。&br&&br&

我要回帖

更多关于 浮点数比较大小 的文章

 

随机推荐