Python和Javascript的闭包比较

同为脚本语言,python和Javascript具有相似的变量作用域,不像php,函数的内部的所有变量和外部都是隔绝的,也就是说,函数要想处理其外部的数据,必须使用参数把需要处理的数据传递进来(使用global关键词这里不讨论),而python和Javascript不同,如果在函数声明变量,它会逐级网上查找,直到返回着个值或者未定义。
那么这样说,python的闭包应该很简单了,像javascript一样,我们编写类似的代码:

def func1():
        a = 1
        def func2():
                a = a + 1
                return a
        return func2
re=func1()
print re()
print re()

…阅读更多>>

Python中用socket发送HTTP请求,数据接收不完整的问题

由于工作的需求,需要用python做一个类似网络爬虫的采集器。虽然Python的urllib模块提供更加方便简洁操作,但是涉及到一些底层的需求,如手动设定User-Agent,Referer等,所以选择了直接用socket进行设计。当然,这样的话,需要对HTTP协议比较熟悉,HTTP协议这里就不做讲解了。整个python的代码如下:

#!/usr/bin env python
import socket
host="www.baidu.com"
se=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
se.connect((host,80))
se.send("GET / HTTP/1.1\n")
se.send("Accept:text/html,application/xhtml+xml,*/*;q=0.8\n")
#se.send("Accept-Encoding:gzip,deflate,sdch\n")
se.send("Accept-Language:zh-CN,zh;q=0.8,en;q=0.6\n")
se.send("Cache-Control:max-age=0\n")
se.send("Connection:keep-alive\n")
se.send("Host:"+host+"\r\n")
se.send("Referer:http://www.baidu.com/\n")
se.send("user-agent: Googlebot\n\n")
print se.recv(1024)

…阅读更多>>

python中os.path.isfile()和os.path.isdir()均返回false的问题

今天在写一个linux下自动备份指定目录下的所有目录的脚本时,遇到了一个问题,由于我是需要备份目录,所以,需要判断扫描的文件是否为目录,当我用os.path.isdir()来判断的时候,发现所有文件均返回false,刚开始以为是系统兼容性问题,进一步测试,发现用os.path.isfile(),这些文件还是返回false,这肯定就是程序写的有问题了,代码如下:

#!/usr/bin/env python
# a python script to auto backup a directory's file by Hito
import os
Directory=raw_input("Please enter directory you want to backup:")   
dirs=os.listdir(Directory)
for filename in dirs:
    if os.path.isdir(filename):
        os.system("tar czvf "+filename+".tar.gz "+filename)

…阅读更多>>

PHP和Javascript的观察者模式对比

观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。—-维基百科

概念的东西本身就不好理解,我试图通过现实中的例子来说清楚这个观察者模式。我们知道,世界上最伟大的爱,莫过于母爱,母亲关心你的一切,你吃饱了吗,穿暖了吗,找到女朋友了吗…如果把天下的母亲归为一类,儿女归为一类,我们知道母亲是时刻关注着儿女的变化的,从观察者模式的角度来讲,母亲是观察者,观察着儿女们的一举一动,一切需求,儿女就是被观察者,他们的一切需求母亲都可以获知。那么,我们来做这样一个例子:

…阅读更多>>

Javascript中for循环为多个对象添加事件的问题

前一段时间在编写一个JS代码时遇到了这样的问题,在同一个父元素下有很多相同的li元素,我需要遍历这些元素,并给每个li元素都添加一个click时间,以显示当前li元素所在父元素的顺序。代码是这样的:

<ul>
<li>0</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<script>
var list=document.getElementsByTagName("li");
for (var i=0;i<list.length;i++){
    list[i].onclick=function(){alert(i)};
}
</script>

执行结果比较有意思,当我点击不同的li的时候,每次弹窗出来都是6!
这里就有两个问题,第一个问题是为什么最终的效果不是点击哪个,弹出相应的数字?第二个问题是,弹出的数字为什么是6,而不是5或者其它的数字呢?

...阅读更多>>

Javascript图片从模糊到清楚的过渡显示

在一些图片搜索网站,像Google,我们经常可以看到这样的效果,当我们搜索并查看一个图片时,可能这个图片看起来是非常模糊的,那么等一会之后呢,发现这个图片变清楚了,那么这个究竟是怎么实现的呢?首先,我想到的是在服务器传送图片的时候,能不能使用类似在线播放视频那种流媒体技术,先把图片的模糊信息传过来,然后再传送剩余的信息。实际上,这个想法是非常可笑的,第一:浏览器在加载图片的时候,就是慢慢的接受服务器传送的数据的,这点在浏览器加载比较大的图片的时候看的很明显,图片就是从上到下慢慢加载完成的,这本来就是流媒体的技术。第二,即使服务器能够做到先传一部分模糊数据过来,那么浏览器这时候已经把模糊数据加载好了,清晰的数据过来了,怎么去把原来的覆盖掉呢?显然,这是不行的。这个想法虽然不行,但是却给了我们一些提示,我们能不能把模糊的数据和清晰的数据分开呢?刚开始请求模糊的数据,过一段时间之后再请求清晰的数据?也就是说,干脆弄两中图片,一张模糊的,一张清晰的,浏览器默认是加载模糊的,等模糊的加载好之后,再去加载清晰的。
…阅读更多>>