Monthly Archives: 五月 2013

You are browsing the site archives by month.

这是一个最开始由Raymond Hettinger写的一个解决字母算术(alphametics)问题的程序,其思想是穷举,在这里将我加了注释的版本发出来。主要是找到所有不同字母,然后将所有数字穷举,利用translate()和eval()计算并验证。

  1. import re  
  2. import itertools  
  3.   
  4. def solve(puzzle):   
  5.     words = re.findall(‘[a-z]+’, puzzle.upper())                        # 找到谜题中所有字母   
  6.     unique_characters = set(”.join(words))                             # 找到所有出现的不同字母   
  7.     assert len(unique_characters) <= 10, ‘too many letters’             # 如果超过10个不同字母则返回字幕太多   
  8.     first_letters = {word[0] for word in words}                         # 将参与计算的元素的第一位分离出来   
  9.     n = len(first_letters)                                              # 用n统计共有多少个参与计算的元素   
  10.     sorted_characters = ”.join(first_letters) + \   
  11.         ”.join(unique_characters - first_letters)                      # 将所有参与运算的字母按“首字母+其他字母”组合   
  12.     characters = tuple(ord(c) for c in sorted_characters)               # 将字母转换成ascii码值   
  13.     digits = tuple(ord(c) for c in ’0123456789′)                        # 将数字转化成ascii码值   
  14.     zero = digits[0]   
  15.     for guess in itertools.permutations(digits, len(characters)):       # 用itertools.permutations生成所有可能   
  16.         if zero not in guess[:n]:   
  17.             equation = puzzle.translate(dict(zip(characters, guess)))   # 用translate把原字符串进行替换   
  18.             if eval(equation):                                          # 检测是否正确   
  19.                 return equation   
  20.   
  21. if __name__ == ‘__main__‘:   
  22.     import sys  
  23.     sys.argv.append(‘send + more == money’)                             # 在我的系统里sys.argv[1] = [], so…   
  24.     for puzzle in sys.argv[1:]:   
  25.         print(puzzle)   
  26.         solution = solve(puzzle)   
  27.         if solution:   
  28.             print(solution)  

 

照例把我的运行结果放出来(AMD Athlon TK-55,运行时CPU占用50%左右)

image Read More →

今天看Dive into Python 3 看到闭合与生成器,里面描述了一个使用闭合和文件来进行模式匹配的例子(P200),这里记录下。
先把我最后修改完的程序放出来:

  1. import re  
  2.   
  3. def build_match_and_apply_functions(pattern, search, replace):   
  4.   
  5.     def matches_rule(word):   
  6.         return re.search(pattern, word)   
  7.   
  8.     def apply_rule(word):   
  9.         return re.sub(search, replace, word)   
  10.   
  11.     return (matches_rule, apply_rule)   
  12.   
  13. rules = []   
  14.   
  15. with open(‘plural4-rules.txt’, encoding = ‘utf-8′) as pattern_file:   
  16.     for line in pattern_file:   
  17.         pattern, search, replace = line.split(none, 3)   
  18.         print(‘pattern:’, pattern, ‘search:’, search, ‘replace:’, replace, ‘\n’)   
  19.         rules.append(build_match_and_apply_functions(pattern, search, replace))   
  20.   
  21. def plural(noun):   
  22.     i = 1   
  23.     for matches_rule, apply_rule in rules:   
  24.         print(i, matches_rule(noun))   
  25.         i = i + 1   
  26.         if matches_rule(noun):   
  27.             return apply_rule(noun)   
  28.   
  29. if __name__ == ‘__main__‘:   
  30.     print(plural(‘box’))  

Read More →

”’在各种Python的书里翻了N多,最后还是选择了Dive into Python

话说刚开始打算看的就是Dive into Python,但是果断被那个恐怖的“第一个程序”吓住了,因为python处理字符串什么太过灵活以至于完全没有看懂,又在网上看到好多这本书的负面评论[1],于是就把这本书放下了。之后翻过《可爱的python》——发现果然不是我这种毫无脚本语言基础的人看得,翻了A byte of PythonBeginning Python From Novice to Professional 感觉这些书还是写的太细了,看着很没意思,毕竟我以前学过的编程语言也不少了,虽然没有脚本语言……不过Beginning Python From Novice to Professional 的项目时间部分看起来不错,有时间还是想看看。另外一个问题就是有的书不错但翻译不行或者是python2.x版本的书,经过层层筛选,最后决定看Python v3.0c1 documentation里的Tutorial,简洁,而且是3.0的版本,还是中英对照,怎么看都是理想的选择……但是,当我看到Data Structures时我终于受不了了,这也太简洁了,感觉什么都没说清嘛!而且程序的排版越来越差也真是让人难以忍受。晚上虽然没决定要看什么,但是随手在平板里点开了Dive into Python,发现这第一个程序其实不难啊,稍稍熟悉了脚本语言和Python简洁的风格我就发现已经能看懂这本书了,再往下翻感觉这本书其实既不罗嗦又不缺料,很适合我看啊,于是决定再翻开DiP…

”’

以上是一个Python风格的docstring。

DiP3的第一个程序:

  1. suffix = {1000: ['kb', 'mb', 'gb', 'tb', 'pb', 'eb', 'zb', 'yb'],   
  2.           1024: ['kib', 'mib', 'gib', 'tib', 'pib', 'eib', 'zib', 'yib']}   
  3.   
  4. def approximate_size(size, a_kilobyte_is_1024_bytes = true):   
  5.     ”’convert a file size to human-readable form.  
  6.  
  7.     keyword arguments:  
  8.     size                –  file size in bytes  
  9.     a_kilobyte_is_1024_bytes    –  if true(default), use multiples of 1024  
  10.                         if false, use multiples od 1000  
  11.     returns: string  
  12.     ”’  
  13.   
  14.     if size &lt; 0:   
  15.         raise valueerror(‘number must be non-negative’)   
  16.   
  17.     multiple = 1024 if a_kilobyte_is_1024_bytes else 1000   
  18.   
  19.     for suffix in suffix[multiple]:   
  20.         size /= multiple   
  21.         if size &lt; multiple:   
  22.             return ‘{0:.1f} {1}’.format(size, suffix)   
  23.   
  24.     raise valueerror(‘number too large’)   
  25.   
  26. if __name__ == ‘__main__‘:   
  27.         print(approximate_size(1000000000000, false))   
  28.         print(approximate_size(1000000000000))  

顺便show下Sublime Text的着色效果,真心很好看。

clip_image001

最坑的地方是一开始把if __name__ == ‘__main__’:的缩进位置打错了,怎么都出不了结果,郁闷死了……

Footnotes:
[1] 赖勇浩 为什么《Dive into Python》不值得推荐 Read More →