可可熊D窝

Keep it simple, stupid


  • 首页

  • 关于

  • 标签182

  • 分类8

  • 归档359

  • 搜索

Python与Lua分别实现一个计数器

发表 2009-03-31 | 分类 Life | 评论数:
| 字数: 1.1k | 阅读 ≈ 1 分钟
1
2
3
4
5
6
7
8
9
10
11
12
13
14
	>   function newCounter ()
>> local i = 0
>> return function () -- anonymous function
>> i = i + 1
>> return i
>> end
>> end
>
> c1 = newCounter()
> print(c1())
1
> print(c1())

2

Lua同Python类似,也可以嵌套定义函数,不过Lua嵌套函数可以访问上层闭包函数的局部变量,而在这个内嵌函数中这些变量不是全局变量,也不是局部变量,而是一种upvalue,与C语言中的static修饰的变量类似,所以在这里可以利用这个特性完成这个计数器。

Python:

1
2
3
4
5
6
7
8
9
def counter(last=[1]):
... next = last[0] + 1
... last[0] = next
... return next
...
counter()
2
counter()
3

今天看Lua的时候觉得Python也应该有比较简单的办法写个计数器,找到一篇文章介绍这个小技巧,其中有一句话:

However, if named parameters are given mutable default values, the parameters can act as persistent memories of previous invocations. Lists, specifically, are handy mutable objects that can conveniently even hold multiple values.

Lua作为一个嵌入式(嵌入到其它语言中)的脚本语言,在很多地方与Python类似,这几天在看Programming in Lua 。
this is quote text

Comments

草儿: 靠,你的文章对我来说越来越深奥了,都快成天书了。

tocer: 用 itertools.count 算不算? from itertools import count counter = count(1) for i in range(10): print counter.next()

cocobear: 没用过这个库 不错

更新PyFetion && getsong

发表 2009-03-24 | 分类 Life | 评论数:
| 字数: 2.3k | 阅读 ≈ 2 分钟

给PyFetion加入了HTTP代理的支持,HTTP发送方式中。TCP发送方式也可能会加上吧,使用SocksiPy这个库吧,有时间再说。

改PyFetion的时候发现urllib2的一个问题:
先看下面这段代码:

import urllib2
headers = [("Content-Type","application/oct-stream"),]
opener = urllib2.build_opener()
opener.addheaders = headers
urllib2.install_opener(opener)
print "after install_opener"

ret = opener.open('http://www.dict.cn',data="word=ss")
print ret.read()

抓包发现发送的内容为:

POST / HTTP/1.1> 
Accept-Encoding: identity> 
Content-Length: 7> 
Host: www.dict.cn> 
Content-Type: application/x-www-form-urlencoded> 
Connection: close> 

word=ss

这里我在代码里已经指定了HTTP的header: Content-Type,但是发出去的时候却被改变了。

通过分析urllib2的代码,找到:

if request.has_data():  # POST
    data = request.get_data()
    if not request.has_header('Content-type'):
        request.add_unredirected_header(
            'Content-type',
            'application/x-www-form-urlencoded')
    if not request.has_header('Content-length'):
         request.add_unredirected_header(
           'Content-length', '%d' % len(data))

scheme, sel = splittype(request.get_selector())
sel_host, sel_path = splithost(sel)
if not request.has_header('Host'):
    request.add_unredirected_header('Host', sel_host 
    or host)
    for name, value in self.parent.addheaders:
    #这里的parent是opener对象
    name = name.capitalize()
    if not request.has_header(name):
        request.add_unredirected_header(name, value)

urllib2发现如果是POST数据的话自己添加了Content-Type,接着才去追加opener对象中的headers,这时已经有Content-Type了,所以opener对象增加的Content-Type就无效了。

解决办法是创建request对象,在request对象中设置Content-Type:

request = urllib2.Request(url,headers=headers,data=body)

不知道是上面的示例代码写法不规范呢?还是算Python的一个小问题呢?

最近发现周董的不少歌挺好听,于是找个脚本来下载周董的歌(从百度mp3中), getsong就进入了眼的视野,不过不支持下载某个歌手的全部歌曲,俺自己加上去,正在下载周董的歌:
[cocobear@cocobear getsong]$ ./getsong.py -a 周杰伦>
正在下载第1首(共104首) 歌手:周杰伦 曲名:她的睫毛>
已经成功下载《周杰伦 - 她的睫毛》>
…….

不过这会儿断了,getsong好像又有bug了,今天就不折腾了,明天再整整吧,看书,睡觉了。

Comments

cocobear: UI界面是指getsong还是PyFetion呢? 蟒蛇有毒,小心中毒!

Sutra: 不知道删除好友功能是不是必须的。因为听说有个好友人数上限问题。

kongove: 这个getsong很好用~我和张斌正在读源码~

cocobear: 这个和发短信没什么关系啊,你别加那么多人就行了啊.

xia_chip: 要是做个UI界面就更加爽了,最近也在研究蟒蛇!

草儿: 靠,现在你真勤快。

admin: 请问最新版的PyFetion在哪里下载呢?

cocobear: code.google.com/p/pytool/

更新两个小脚本

发表 2009-03-20 | 分类 Life | 评论数:
| 字数: 769 | 阅读 ≈ 1 分钟

一个是以前写的导出抓虾收藏的工具,增加了保存抓虾上文章的功能,因为只导出链接有些文章地址可能已经失效。

另一个就是pysdcv,前面文章介绍过了,整理了一下,测试了一下,然后放在了google code上面,直接使用星际译王的词典,查一个单词大概0.15秒的时间:

cocobear@0-0 /home/cocobear/Work/pytool/pysdcv $ make > 
gcc lookup.c -g -I/usr/include/python2.5 -lz -shared -fPIC -o lookup.so> 
cocobear@0-0 /home/cocobear/Work/pytool/pysdcv $ time ./pysdcv.py test> 
*[test]> 
n. 测试, 试验, 化验, 检验, 考验, 甲壳> 
vt. 测试, 试验, 化验> 
vi. 接受测验, 进行测试> 
【医】 试验, 测验> 
【经】 检验, 试验, 测试> 
相关词组:> 
  put sth to the test> 
  stand the test> 
  give a test> 
  take a test> 
  test sb's ability> 

real    0m0.164s> 
user    0m0.143s> 
sys    0m0.010s

如果是未使用gzip压缩过的dict文件,则0.05秒左右。

Comments

可可熊: 几行代码的一个玩具,呆呵。

Kermit: 确实比较慢,不过对用户影响不大,呵呵。

可可熊: 一年之计在于春嘛

草儿: 这几天你勤快的很嘛

一月培养一个好习惯--练字

发表 2009-03-19 | 分类 Life | 评论数:
| 字数: 389 | 阅读 ≈ 1 分钟

早就看到弥缝发起的活动:一个月培养一个好习惯,也练过那么几天字,不过荒废了,不知道怎么最近看着人家写得漂亮的书法作品很是喜欢,终于下定决定要把钢笔字先写好,别二十多岁的人了,写出来的字还像个小学生一样,太丢人了!

记得小时候还写过一段时间的毛笔字,都不记得后来为什么没坚持下去,为了让自己能坚持下去,使用弥缝介绍的“习惯培养清单”。

发在博客里的目的是希望能更好的监督自己,每月总结一次。

Comments

Amankwah: 我也想,但是,我知道我没戏了,遂不想了~ 你加油!兄弟支持你!

可可熊: 为什么没戏呢老大,我的字是太糗了!

Kermit: 刚看完WangCong讲语法,紧接着就看你要练书法,汗……

rhlei: 哈哈,我是在学习写字。用的是小学时候的庞中华~

luguo: 恩,加油~~我是没培养好习惯的习惯~~哈哈~

草儿: 真不知道你要练到什么时候才能练好。

用Python QQ写一个挂QQ工具

发表 2009-03-19 | 分类 Life | 评论数:
| 字数: 1k | 阅读 ≈ 1 分钟

Python QQ是好早以前就有的一个项目,不过因为很久没更新过,以前看到的时候不能登录,所以没怎么关注过,最近代码被开发者放在了google code上面,也做了些改动,目前可以登录,发送,接收消息了,不过不是很稳定。最近看了看这个项目的代码,对整个socket-qq分枝有了全面了解。在代码设计上也学到了不了东西:-)

Python QQ是在Windows上面开发的,所以我在Linux下测试的时候还有不少问题,最近改了改,然后做了个挂QQ的工具给草儿同学,很不完善的,也很不稳定,使用wxPython+threading完成,GUI+多线程确实是很折腾人的,在多线程更新GUI上使用了wx.CallAfter函数,可以查看limodou博客的介绍。

截个图上来:
oqq

先不发布了,继续完善Python QQ。

Comments

Amankwah: 很好,很强大,也是对QQ协议进行黑盒分析?

可可熊: 老大,那是别人已经在做的项目,Python QQ,我只是学习了一下,然后利用那个做了个小工具,俺表达的这么不清楚吗?

cocobear: 目前好像又不可以使用了 TX的东西整天变,没办法。

草儿: 正因为天天变,才督促你天天更新,要不你不就没事做了,呵呵~

mage: 使用socket-qq,可以登录成功,但是 list 就提示“Python-QQ:网络中断或已失去活 动的网络连接,请重新登陆” 请问下cocobear,这个问题怎么解决的 另我python-qq日志都提示login sucess,但界面提示登陆失败 多谢

mage: socket-qq提示“Python-QQ:网络中断或已失去活动的网络连接,请重新登陆”的问题我解决了,是由于登陆根IP的问题。 现在socket-qq经常碰到”Python-QQ:非常抱歉地通知您,现在是上线高峰时间,暂时不能同时使用更多QQ/TM”,请问你是怎么解决的 python-qq依然登陆不上去,日志是提示log success了的,改了登录根ip,也改了 模拟的客户端版本号 多谢

小白: 万恶,留言还得填邮箱。 看起来不错,下了这个代码,一直就没去读。。。

草儿: 非常感谢,终于发出来一个版本了。

leo: 我的QQ_ver=0x07DA后,执行登录命令的时候报出:您现在使用的是一个非公开的QQ/TM版本。

可可熊: 这个代码已经很老了,腾讯协议升级太快了。

1…121314…72
cocobear

cocobear

爱折腾的技术宅一枚

359 日志
8 分类
182 标签
RSS
GitHub E-Mail Twitter 豆瓣
友情链接
  • 王聪
  • 老大
0%
© 2007 – 2020 cocobear | 521k | 7:54
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Gemini v6.7.0
Hosted by GitHub Pages