• Python 的默认参数

    Python的默认参数为编程带来了极大地便利,但同时误用默认参数也产生了不小的陷进。

    默认参数的求值

    在Python(34)的Documentation中,有这样一段叙述:

    Default parameter values are evaluated from left to right when the function definition is executed.

    Python的默认参数是从左向右求值。看下面这段代码:

    param = [1, 3, 2, 4]
    
    def func(a=param.copy(), b=param.sort(), c=param.copy()):
        print(a, b, c)
    
    if __name__ == '__main__':
        func()
    
  • Java JNI 初探

    什么是 JNI ?

    JNI(Java Native Interface),Java 本地接口,是一个本机编程接口,提供了Java与C,C++语言的通信。JNI的主要实现方式为在Java中通过System.loadLibrary来加载C/C++编写的DLL。以此来调用C/C++实现的函数。

    Java调用C++

    Java语言的写法:

    package com.sighingnow.maker;
    
    /**
     * @author Tao He
     * 
     */
    public class Maker {
    
        static {
            System.loadLibrary("Maker");
        }
    
        @SuppressWarnings("javadoc")
        public native int DisplayMakerInfo(String info);
    
        @SuppressWarnings("javadoc")
        public static void main(String[] args) {
            int length = (new Maker()).DisplayMakerInfo("Hello Maker JNI !");
            System.out.println(length);
        }
    }
    

    native关键字定义的方法用C/C++实现。

  • 寻找第K大的数

    朴素的寻找第 $K$ 大元素可以排序,再找到第 $k$ 个,时间复杂度为 $O(n \times \log{n})$,但由于只需要第 $k$ 大,因此这样会造成很大的时间上浪费。 维护一个 $k$ 大的堆的时间复杂度为 $O(n \times \log{k})$,有所改进,但时间复杂度仍不够优,且实现复杂。而基于分治思想的算法可以在 $O(n)$的时间内找到 第 $k$ 大的数。

  • 巧用异或(XOR)运算

    异或(Exclusive or, XOR)是一种逻辑运算,在一些情境下,巧用异或运算能够很高效地解决问题。

    异或运算的定义

    异或运算的符号是^,其定义如下:

    a xor b = (a & ^b) | (^a & b)
    

    真值表:

    a b a xor b
    0 0 0
    0 1 1
    1 0 1
    1 1 0
  • K-近邻算法(KNN)

    K-近邻算法(KNN, K Nearest Neighbors)是最基本、最简单、最有效的分类算法之一。KNN算法精度高、对异常值不敏感,可以有效地处理数据缺失的情况,但同时,KNN 算法的计算时间复杂度和空间复杂度都很高,特别是运行时需要载入全部数据,会占用很大的内存空间。

    KNN算法的基本原理:输入未分类的(没有标签的)新数据时,将新数据的每个特征与样本集中的数据所对应的特征进行比较,然后提取出最相似的分类,作为新数据的分类。 一般来说,选取样本集中最相似的前 $k$ 个元素作为分类标准。通常来说,$k$ 的值不大于20,选择这 $k$ 个最相似元素中出现次数最多的分类作为新数据的分类。

  • Sleep Sort

    Sleep Sort 是一种通过多线程的不同休眠时间的排序方法。可以很简单地用Shell脚本实现。

    #! /bin/bash
    
    function func() {
        sleep "$1"
        echo "$1"
    }
    
    while [ -n "$1" ]
    do
        func "$1" &
        shift
    done
    wait
    
  • Python PEP 8 简单汇总

    PEP 8 是Python的代码风格指南(Style Guide for Python Code),其中很多内容都来自Guido van Rossum。PEP 8 从代码格式、注释、空白、变量名、参考及权利声明等方面出发,主要提到了以下这些关于Python代码风格的问题。

    代码格式(Code lay-out)

    缩进(Indentation)

    每一级缩进使用4个空格。当一行过长需要折行时,应该保持与换行的界定符的垂直对齐。如下例:

    # Aligned with opening delimiter.
    foo = long_function_name(var_one, var_two,
                         var_three, var_four)
    

    或者下一行采用8个空格的缩进,与其他的正常缩进区别开来,例如:

  • Mathematica 输入与输出

    基本输出

    Mathematica的基本输出命令是Print,具体用法为:

    • Print[expr]

      输出 expr. 

    例如:

    Print["Hello world"]
    Hello world
    Print[2^10]
    1024
    

    Print命令也可以一次输出多项内容(用逗号,隔开),输出时每项内容之间无间隔:

    Print["Hello world", 2^10]
    Hello world1024
    
  • cx_Freeze打包Python应用程序

    cx_Freeze是一个打包Python应用的工具,通过cx_Freeze,可以制作Windows平台、MacOS平台、以及Linux平台的二进制可执行程序,使得Python应用能够在没有安装Python环境的机器上运行。

    cx_Freeze的安装

    同很多Python的第三方库类似,cx_Freeze也可以通过如下命令安装:

    pip install cx_Freeze
    

    或者从官网下载安装包,解压后,切换目录至解压后的根目录,运行命令

    python setup.py install
    

    即可。

  • Mathematica 笔记本(notebook)

    本文主要记录Mathematica笔记本(notebook)使用过程中的一些小细节(Tips)。

    注释

    所有包含在(**)之间的内容为注释内容,都会被Mathematica内核忽略。

    Mathematica区分字母大小写

    所有的Mathematica命令都是以大写字母开头的,Mathematica区分字母大小写。因此,为了避免冲突,所有的用户定义符号都应当用小写字母开头。

    函数参数

    Mathematica中用方括号[]表示函数参数。例如:


Subscribe via RSS