Tag Archives: python

windows下apache,python,django,mod_python的安装

这个内容研究了比较久,花了不少的时间,搞的我很蛋疼,对于新手来说,在Windows平台下面搞python,那就只有被python搞份。

我用的是xp系统,为什么还用这么老,这么没用的东西,我也很蛋疼。等入手了笔记本,要学的第一个东西就是ubantu。

好了,不多说。

首先一一下载,特别要注意的是mod_python,因为这个东西是有很强的版本限制的。如果python和apache的版本没有对应,那么是无法安装的。

首先安装python,这个就很简单了,直接下一步下一步,安装好后,在dos下面python一下,如果正常就ok了。然后设置下环境变量。

apache的安装也不说了,很简单,网上的带图片的安装教材一大堆。

然后就是django了,django的安装也很简单。解压以后把里面组件拷贝出来,比如放在d盘,然后在dos下面 python setup.py install,然后等命令结束就好了。其实它就是把东西copy到python的Lib目录的site-packages文件夹下面。其实site-packages就是专放第三方的组件包的。

然后在shell下面:

import django

django.VERSION

如果显示了版本信息,就OK了。

然后再是安装mod_python,其实这个东西也是很蛋疼的,不太友好。

下载好以后(一定要检查对应的版本),就是直接安装,第一步是选择python目录,其实也是个组件,同样放在site-packages下面,最后一部是apache的目录选择,我在这里出了点问题,如果我不选择目录呢,他会安装成功,如果选择了apache2.2这个目录,会显示安装失败。所以我没选择,最后会提示要手动操作一下。

1.LoadModule python_module modules/mod_python.so,把这个鬼畜放到apache的httpd.conf文件的LoadModule处,一定要放这儿。

2.把site-packages下生成的mod_python_so.pyd拷贝一份到apache的modules文件夹下面。

然后就是apache的配置了,具体就不写了可以参考

http://www.vimer.cn/2010/05/linux下搭建pythonapache环境.html

设置好后,就可以hello world了,其实我比较笨,有写问题折腾那么久了,静不下心,才花了如此多的时间,今天把心静下来,还是很快就解决了。

然后明天去试试安装mysqldb,那么最基本的生产环境就搭建好了。

Django的URL配置规则

django的URL配置跟php的还是有点类似的,因为django也是mvc模式的,也有人说django是mtv模式。

在django生产项目的时候,会自动生产4个文件,其中有一个urls.py文件是专门用来配置项目的url规则的。

在django中,每一个视图都对应着一个试图函数。

比如:如果有个hello视图,那么就一定有一个命名为hello的函数存在。

为了绑定视图函数和URL,我们使用urlconf。而配置urlconf就在默认生产的urls.py文件里面了。

from django.conf.urls.defaults import *

urlpatterns = patterns('',
)
这是默认下的情况,当然,还有些注释没无视了。
第一句就是调用一个特定的url模块了,第二个则是调用patterns函数,并返回给
urlpatterns,默认情况下,patterns只有第一个为空的参数。
URLpattern语法:
^,这个符号表示要求表达式对字符串的头部进行匹配。
$,这个与^相反,它是要求对尾部进行匹配。
在二者都存在的情况下,就是精确匹配了。django在检查url地址前,会去除前面的'/',
所以在匹配的时候,就不用写'/'了。
当然了,django支持任意的正则表达式来作为强有力的url映射。

		

python的迭代器和生成器

在python中,大多数容器对象都使用for来进行遍历。

那么啥是迭代器呢?

百度百科里面说:迭代器是一种对象,它能够用来遍历容器对象的所有元素,每个迭代器对象代表着容器中一个确定的地址。

python中的迭代器不仅仅可以迭代序列类型,还可以迭代非序列类型。包括用户定义的对象。

迭代器的用法在python中普遍而且统一。for语句在容器对象中调用iter()函数,这个函数会返回一个 定义了next()方法的迭代器对象。它在容器中逐一访问元素,没有后续元素,next()就会抛出一个异常,告知for循环结束。

这样的话就很好的可以给自己的类定义一个迭代器了。

比如:

class className:

def __iter__(self):

return self

def next(self):

…….

生成器:

生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变

生成器是创建迭代器的简单而强大的工具。

需要返回数据时候使用yield语句。

每次调用next()时,生成器回复它脱离的位置。

python的错误和异常

python中至少有两种错误,一种是语法错误- -,一种就是异常。

语法错误就没啥好说的了,解释器会提示syntax error,并且指向出错的行。很好解决。

比较麻烦的是异常了。

在程序运行时检测出的错误称之为异常。其实异常和php中的差不多,不同的是处理而已。

1.try/except语句

扑捉又python或你引起的错误,并且恢复。

工作流程:首先执行try字句,如果没有异常发生,那么except的字句就被python无视了。如果发生了异常,那么try子句的余下部分就被无视,然后except就会匹配扑捉异常的类型进行匹配,然后如果得到匹配,就会执行except的子句。如果在except中没有找到与之匹配的分支。就会传递到上一级的try语句中,如果还是找不到匹配,就直接抛出错误。

一个try语句能包含多个except语句,分别指定不同类型的异常。至多也只会有一个分支被执行。

try/except也可以追加一个else语句,它出现在所有except语句之后,当try没有抛出异常时候,就执行这个else的子句。

2.抛出异常

raise语句强制指定的异常发生。

比如:raise NameError, ‘name’或者raise NameError(name)

第一个参数是指定抛出异常的名称,第二个参数指定了异常的参数。

3.自定义异常

用户也可以创建新的异常类型来命名自己的异常,异常通常是直接或者间接的从exception类中派生。

比如:

class MyError(Exception):

def __init__(self, value):

self.value = value

def __str__(self):

return repr(self.value)

try:

raise MyError()

except MyError, e:

pass

4.finally

它在无论try是否抛出异常,最终都会执行的它的字句。

当然鸟,还有两个语句,一个是assert,它是有条件的在程序中触发异常,还有一个是with/as,这个是在python2.6以后实现环境管理器。

不说鸟,最近有时间研究django,开发一些小的web应用也好。

python的命名空间和作用域

因为类的定义借用了命名空间,所以要深入的接触类,先得了解python的命名空间和作用域。

命名空间是从命名到对象的映射。

不同命名空间中的命名是没有任何联系的。

python中的任何一个“.”之后的命名为属性,比如:在x.pro表达式中,pro就是对象x的属性。

严格的说,从模块中引用命名空间是引用属性,modelname.function中,modelname是一个模型对象,function是它的一个属性,因此,模块中的属性和模块中的命名有直接的隐射关系,因为他们共享同一个命名空间。

属性是可以是可读或写的,对于可写的属性,可以进行赋值,比如:modelname.value = ‘value’,可写的属性可以用del删除。

比如:del modelname.value。

不同命名空间在不同的时刻创建,并且有不同的生存周期。

包含内置命名的命名空间是在python的解释器启动时候就创建的,并且一直保留,不会被删除。

函数在被调用时候创建一个命名空间,而每一个递归也都拥有自己的命名空间。

作用域是python程序中一个命名空间可以直接访问的文本区域。在这里,直接访问的意思是查找命名时无需应用命名前缀。

尽管作用域是静态定义的,但是在使用的时候,他们都是动态的,每次执行的时候,至少有三个命名空间可以直接访问的作用域嵌套在一起。他们分别是局部的,它在最里面,首先被搜索,然后再是当前命名空间作用域,最后是系统内置的作用域。

它们的搜索顺序是:局部命名空间->当前命名空间->内置命名空间

一般的局部命名空间是函数的内部,递归的内部。

如果一个命名声明为全局,那么所有的赋值和引用都是直接针对包含模块全局命名的中级作用域。

作用域决定于源程序的文本。

其实呢,更好的理解还是得以后多写代码才成啊

python的OOP基础

OOP=面向对象。在python的世界里,一切都是对象。

现了解一些术语。

类:将一些变量和方法封装起来。

对象:类的实例,可以使用类中定义第方法和变量。

类的属性:类中变量和类中的变量统称为类的属性。

域:属于一个对象或者类的变量。

实例变量:属于类实例或者对象的变量。

类变量:属于类的变量。

class:用来创建类。

类中的方法和普通的函数:

他们都是一个能完成特定工作的代码块。只是名字不一样,还有一个不一样的就是,python类中的方法比普通函数要多一个self参数。self参数有点类似javascript中this,都是指向对象本身。

self参数的名称不是必须为self的,只是大家都这么用而已,习惯。

self在调用的时候并不需要赋值。

类的创建:

很简单,使用class,比如

class MyClass:

pass

类的属性都保存在缩进里面。

而实例化类也很简单。但是这个和php或者javascript中都有点不一样。因为python里面实例化是不需要new的。

比如我们要实例化前面定义的MyClass,我们可以:

obj =MyClass()

这样就OK了。

python类中方法的定义,我再次说明,self参数是必须的,如果不加,你懂的,会报错:

class ClassName:

def sayHello(self):

print ‘Hello’

obj = ClassName()

obj.sayHello()

定义还是比较简单的,只是要主要别忘记self参数。

__init__方法,这个类似于php中类的类的初始化,在python中__init__是类的初始化方法。当然,使用__init__方法也必须指定self参数。

比如:

class myClass:

def __init__(self, name):

self.name = name

def sayHi(self):

print ‘My name is ‘, self.name

obj = myClass(‘鬼畜’)

obj.sayHi()

这里现说一点啊,print ‘My name is ‘, self.name中的’,'号并不是字符串的连接符,+号才是,,号只是表示字符串显示在统一行上而已。

__init__方法中定义了一个name参数,那么在实例化的是时候,就必须为类赋值这个参数。

def __init__(self, name):

self.name = name

__init__中的两个name是不同的,self.name其实是这个对象的name,而后面那个name只是一个值,他对应的是__init__的名称为name的参数。

__init__方法不需要调用,因为在python中,类别调用的时候,__init__就已经被执行了。

类的变量和对象的变量:

其实它们都只是与类和对象的命名空间绑定的变量。只有在指定了类或者对象的情况下才能访问。

类的变量是由类的所有实例(对象)共享的,都能访问的。而对象的变量是只能由定义那个变量的对象才能访问。

他们都是在类中定义的,只是对象的变量是由对象来决定它的值的。

比如:

class myClass:

mystring = ”

def __init__(self, name):

self.name = name

在这里mystring就是类的变量,而__init__的参数name则是对象的变量。

继承:

这个就是实现代码最大化重用所用到的一个东西。

继承处理的就是类与子类的关系。子类能够访问父类的属性。而父类是不能够访问子类的属性的。

使用也很简单:

classs sail:

pass

class buy(sail):

pass

只要在创建子类时使用括号,然后在括号里面加上你想要继承的类。

注意点:

1.子类访问父类的时候,因为是不同的命名空间,所以必须指定类名。

2.子类继承父类时,父类的__init__方法不会被执行,所以要必须在子类中调用而执行。

3.父类的任何改动都会影响到子类,而子类的改动或者任何赋值,访问都不会影响父类。

好鸟,没鸟

python的模块基础

本来想继续深入函数的,发现还是算了,没那个必要,先折腾下python的模块。貌似有MVC的感觉啊。囧了。

模块是最高级别的程序阻止单元,它能够将数据和程序代码封装起来以便重用。说白了,就是白一坨代码和一对的数据放在一个单独的文件里面,等要用的时候再去import。

这里有三个鬼畜值得介绍说说:

1.import,它是指使客户端以一个整体获取一个模块,也就是说导入整个模块文件。

2.form,允许客户端从一个模块文件中获取特定的变量名。

3.reload,在不中止python的情况下,重新载入模块文件代码。

还有一个比较注意的地方就是,模块必须以py为文件名。但是导入的时候并不需要加上后缀,比如我们定义了一个demo.py,我们想在test里面导入,只需要import demo就好,不必加上py后缀。

通常模块里面的方法都是用在模块被import后,用模块名.方法名(属性名)调用的。

模块也可以包含一些执行语句,但是他们一般都是初始化用的,所以只在文件被第一次import的时候执行。

模块也可以导入其他的模块,而已一般import语句都写在文件开头,但是,这不是必须的。

python中以及嵌入了一些标准的模块库,可以直接使用。(但他们不是python语句的一部分)

模块最基础的三个作用:

1.实现代码的重用。

2.系统命名空间的划分,避免了变量名的冲突。

3.共享服务和数据。

每个python模块有有一个__name__,如果print它得到的结果是__main__,那么表示被用户单独运行。

其实每一个程序都可以看出一个模块,只要你指定py后缀。

在对python模块中的方法或者属性进行调用的时候,我们使用点调用。

import的工作原理:

1.找到模块文件

2.编译成位码。

3.执行模块的代码来创建其所定义的对象。

这三个步骤只是在程序执行时,模块第一次被导入才执行这三个步骤。在以后相同模块导入时,会跳过这三个步骤,直接提取内存中已加载的模块对象。

没鸟。

python的帮助文档和工具

好的,我们也不能一口吃成个胖子,这篇主要是文档和工具的学习,当然不是指开发工具。和python本身的工具。以及一些很蛋疼,却得注意一下的东西。

注释,python里面用#做单行的注释。python是没有多行注释的。

dir函数很重要,它能够列表出对象内所有可用的属性。我们只要将对象名称作为参数传递给dir就OK了。而这里有个小技巧,比如要查看列表的对象属性只需要dir([]),而字符串也可以这样写dir(”),当然了,字典和元组都可以这样,但是必须在shell脚本里面书写才行。

文档字符串。

这个鬼畜也是python特有的一个东西。文档字符串都是写成字符串(可以多行),放在模块文件,函数,以及类语句的顶端,就在任何可执行的代码前,当然了,前面有注释是不影响的(__doc__君表示#都是浮云啊),在python自动封装后,也就成了该对象的__doc__属性。

python的很多内置的对象都有文档字符串。你可以通过调用对象__doc__属性查看。

help函数

help函数就为鸟更好的显示你所需要的文档,特别是在对某些对象不属性的时候,或者某些内置函数不明白的时候。

好鸟。没鸟。

python的函数基础

其实在此之前还是有些东西准备深入的研究的,但是想想都比较复杂,就算了,这一篇就写写对于python函数的基础,下一篇写写文档方面的,然后明天再写python的迭代。很多东西的认知都比较浅,幸好没人看。

函数是啥?函数就是重用的程序段啊,混蛋。

python里面的函数有几个比较独特的地方:

1.依旧没有{}来定义代码块

2.使用def来定义一个函数,它创建了一个函数,并将其赋给一个变量名,而这个变量名也就是函数的名称鸟。

3.函数的参数被称为形参(ZZ表示,名称都是浮云)

4.支持return语句来返回值,如果没有指定就返回None(= =,废话),但是一般都无视这个值为none的返回值。

5.提供给函数调用的值称为实参。也就是调用函数使用给的参数,因为他们是一个实在的变量或者其他的内容,所以称为实参(浮云,都是浮云)

当然了,函数里面定义的变量都是有作用域的,这个作用域从它被定义的地方开始,一直到函数结束。它与外部所有的内容都没啥关系,很纯洁的一个变量。

有些时候呢,我们想在函数里面给一个外部的变量进行赋值。那么,python提供了global来定义变量为全局变量。

关键参数,这个概念也没啥新的,也就是说,在你定义一个函数的时候

del func(param1, param2,…):

pass

假设我们这个函数的形参灰常多,但是我真正在调用的时候呢,因为有些可能有默认值,或者只想指定其中的一部分。那么就可以用关键参数了,在使用关键参数的时候,我们使用和参数相同的名字而不是位置来给函数指定实参。

好处嘛,第一个就是不用担心位置的问题(这个确实不错),第二就是可以不为那些已经有默认值的形参进行赋值了。

好鸟,基础不基础我不知道,更多东西,线下解决。

python的运算符和表达式

大多数的语句也就是逻辑行都包行了表达式。

表达式可以分解成运算符和操作数。

python的运算符差不多也就是哪几个,+ – * \ and or no >= <= ** %  == !=当然了,肯定不只有这么,但是我平时用得笔记的多的就设这些了,基本够用了,但是因为我php是web方面的编写,而python我是不是很想面向web方面的。不知道会不会遇到比较复杂的运算符。

运算的优先级的问题不是什么大问题,多用括号,既简洁又明了。

来说说流程控制吧- -,当然了,在python里面,他未必叫流程控制,可能叫程序结构之类的。

if语句,这是必须的。

比如:

a = 1

b = 2

if  a< b:

print ‘ooxx’

else:

pirnt ‘ooxx’

貌似和php的没多大区别,当然了,python里面是没有大括号的。注意后面的冒号。但是还是有不一样的。

比如:

a = 1

b

if a > b:

pass

elif a< b:

pass

else:

pass

在python里面,elif的作用跟php里面的else if是相同的。python里面是没有switch语句的。所有在有些时候进行逻辑匹配都用if语句。而且if语句的表达式也不是用()包装的。

在这儿得说说python缩进的事情,python容许你使用封号作为一个语句的结束,但是你最好别使用,因为那样就没有python范儿了。同样python的语句块是不需要使用大括号{}的,python使用缩进。比如上面的写的if语句,缩进的结束就表示代码块的结束。(话说没有括号,还真是蛋疼菊紧啊)

当然了,python的if语句也支持单行if语句的

比如:if a == b : pass

while循环

while condition:

pass

else:

pass

condition是个返回true这false的表达式,pass是个空占位符,你可以无视他。这基本就是python的while循环的结构了。

while循环还有一个else的从句,else语句是在循环表达式返回false的时候运行的。

循环里面有一个break和continue语句来控制循环。break是用来打断程序的循环,即使循环的条件没有出现false,则还是会跳出。而且在使用break的时候,它是会跳出整个代码块,也就是说,while的else从句是不会被执行的(当使用break)。

continue语句也是跳出,但是它不是跳出语句块,而是跳出当前循环。也就是说,它跳出的不是代码块,是寂寞。- – ,好吧,它只是跳出当前次的循环,然后执行接下来的代码,它适用于for语句。

for in循环

for in就是遍历了,格式为:for <targer> in <object>

object是你想要遍历的对象,而target则是你赋值的目标。

在for循环中,会逐个将object对象中的元素赋值给target目标,然后为每个元素执行循环主体。

当然了,for语句也有一个else从句。如果循环完成的时候还没有break语句,则else的代码就被执行鸟。

有点类似与foreach循环,但是也不完全相同。

其实for in循环的作用非常大,在处理列表或者元组,字典的时候,for in是经常用到的。

任何序列都可以使用for in循环。

当然了,for in循环是灰常神奇的,还有一些更加复杂的迭代。线下研究。