2012年12月19日 星期三

[Python]any() function

Python有個少見的Build-in Function叫做any(),這個function需要一個iterable的參數。如果此iterable中有任何一個item是true的話,any()會return True,否則的話就return False(包含iterable是empty的情況)。

any()和and、or一樣是Short-Circuiting Operator,也就是說碰到第一個item為True any()就會直接return True不繼續往下執行。

以下是兩個使用any()的例子:

1.判斷一個list中是否有負數
if any(x < 0 for x in numbers):
    print "some of the numbers are negative"
else:
    print "none of the numbers are negative"
2.檢查密碼是否含有一個大寫字母、一個數字、一個小寫字母
def checkPassword(data):
    'Return True if password strong and False if not'
    result = any(c.isupper() for c in data) and 
             any(c.isdigit() for c in data) and 
             any(c.islower() for c in data)
    return result

[C]使用getopt()來parsing command line的參數

在Linux底下我們經常會使用'-'來設定一些參數,比如說grep使用-n來設定顯示搜尋到的行數。
grep -n "test" ./*
當我們自己寫Linux程式時有沒有比較快的方法能parsing這些參數呢?Linux底下有個好用的function叫getopt(),他可以幫住我們來parsing這些參數。要使用getopt()必須要include unistd.h,以下是一個範例:
#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    char ch;
    int count;
    while ((ch = getopt(argc, argv, "d:t")) != EOF) {
        switch (ch) {
        case 'd':
            printf("-d %s\r\n", optarg);
            break;
        case 't':
            printf("-t\r\n");
            break;
        default:
            fprintf(stderr, "Unknown option: '%s'\n", optarg);
            return 1;
        }

    }
    //skip the option we read
    argc -= optind;
    argv += optind;

    for (count = 0; count < argc; count++) {
        puts(argv[count]);
    }
    return 0;
}
sway@mac$ gcc getopt.c -o getopt
sway@mac$ ./getopt -d test -t apple banana
-d test
-t
apple
banana
這邊要注意的是第8行getopt()的第三個參數"d:t"。d後面的:表示-d之後需要再指定一個參數,而此參數可在optarg中取得。t後面沒有:號表示之後不需要再指定參數。

第27行的puts會把不屬於-d -t的剩下所有參數都印出來,optind其實就是前面while迴圈處理到第幾個參數的index。

2012年12月17日 星期一

Head First C(深入淺出C)


這本書延續了Head First系列的傳統,用有趣的圖片和例子帶領大家更深入認識C。就如作者前言所寫,這是一本寫給已經學過C或是學過其他程式語言的人看的。書中只花了一個Chapter帶大家復習一下C的語法。因此不要被書名給騙了,這本書不適合完全沒有程式經驗的人看。如果你只是想學習C的語法這本書也不適合你。

我認為這本書很適合當C的第二本書,書中大部份篇幅都在講解一些較進階的議題。比如說程式在執行時的記憶體區段(stack, heap, code);為什麼char *str = "hello"無法被修改;指標以及函式指標的詳細解釋;union和bitfield。這些部分搭配深入淺出系列特有的圖型教學法,讓讀者可以很輕易地瞭解這些議題,這點是本書做的最好的地方。

這本書另一個值得推薦的地方是他介紹了一些其他C教學書不太會講到的地方。比如說gcc的參數,動態連接和靜態連接,Makefile的撰寫。這些都是實務上很常用到的東西。作者解釋的也非常好,難易適中。這也是為什麼我推薦這本書當作C第二本的原因。

書中後半段介紹了一些更深入的議題:process, fork, thread, socket, IPC。這部分大致上只是帶你了解有這些東西而已,更深入的部分還是建議去看其他專門探討此議題的書。

這本書的定位我覺得是在新手到進階之間,書中講解的議題是每個進階的C程式設計師都要知道的。很適合學過C想更進階的人看,看完這本書相信對C會有更深一層的認識。