DIYism schooner能逆风行驶的纵帆船是生命的极好象征,贝努利效应正是化逆为顺的经典!--呆仁 收藏本站 涂鸦本站 来信本站 跟我MSN 跟我QQ GTalk 思想农业天文生物文化饮食娱乐硬件健康语言心理网络物理政治个人编程软件工具 php学习笔记
javascript学习笔记
flash学习笔记
css学习笔记
xsl学习笔记
sql学习笔记
ubuntu安装配置
centos安装配置
damnsmall安装配置
python学习笔记
呓语录
(np2r)
==========================================================================================
1.安装python到D:\progxp\Python
2.复制python安装目录内msvcr71.dll到system32,复制python24.dll到Apache2\bin
3.安装mod_python
4.设置一个环境变量PYTHONHOME="D:\progxp\Python"(需要重启系统)
5.在apache的httpd.conf添加:
  LoadModule python_module modules/mod_python.so
  ...
  AddHandler mod_python .psp .psp_ #测试服务器里才用.psp_
  PythonHandler mod_python.psp #这里必须这么写
  PythonDebug On #测试服务器里才On
  ...
  DirectoryIndex index.psp index.php index.htm
  ...
  NameVirtualHost 127.0.0.1:80
  <VirtualHost 127.0.0.1:80>
  ServerName psp.diy
  DocumentRoot E:\www\PSPApps\ROOT
  </VirtualHost>
6.重启Apache,在index.psp里用<%='hell'%>测试一下
注意:mod_python并没有类似php的open_basedir,不能做互相隔离的虚拟web服务器
==========================================================================================
与python的print不同,mod_python用req.write输出内容到网页:
req.write(str(345)) #str()函数可以用反引号来代替:`aArr`,`aInt`等等
<%=345<br>%> #该方法会自动用str()预处理输出内容,不管输出内容是否字串
==========================================================================================
1."#"是单行注释符(而非"//"):
#$str='jack'
遗憾的是目前python没有多行注释或内嵌注释(内嵌注释更重要,像php里:echo /*kk*/'hell';暂时可用"#...\<换行>"代替)
2.";"是断行符:
sum=3+4;req.write(str(sum)+'<br>')
3."\"是续行符:
aDict={'a':'jack',\
       'b':1982,\
       '1':'hell'\
      }
req.write(str(sum)+'<br>')
4.函数块/对象块:
def myfun(x,y):sum=x+y;return str(sum)
或:
def myfun(x,y):
     'sum x and y' #单行文档,本质是个单行字串常量,要注意缩进对齐(放在外面对齐后可以假装注释,不能用于代码后注释)
     '''sum #多行文档,本质是个多行字串常量,首行要注意缩进对齐(放在外面对齐后可以假装注释,不能用于代码后注释)
        x and y
     '''
     sum=x+y
     return str(sum)
class myClass:
       'my very first class'
       version = 0.1
注意只能同块缩进,并且缩进格数都要相同
由于不需要{}来区分块了,有条件将块名露出一个字节来了,定为惯例
==========================================================================================
创建空对象:
class aClass:pass
aObject=aClass()
aObject.age=13
==========================================================================================
python是动态类型定义的(初次赋值时确定类型,跟php类似)
同时也是强制类型定义的(这点比php好),不会自动进行类型转换,必须人工类型转换:
int(),long(),float(),str(),tuple()
==========================================================================================
python里的所有赋值都是传址, 有点像js, 要传值可以先作空运算再赋值
接龙赋值:a=b=10 #最好不用,容易与"a=(b=10)"混淆
编队赋值:x,y,z=5,4,3 #最好不用,如果x/y/z关系真的很紧密,将它们组成词典型更符合人类逻辑
==========================================================================================
Dynamic Programming Language(动态语言或动态编程语言)
Dynamically Typed Language(动态类型语言)
Statically Typed Language(静态类型语言)
动态语言是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化,
JavaScript\Ruby\Python等都属于动态语言,而C\java等语言则不属于动态语言,动态语言一般也都是动态类型语言
==========================================================================================
注意python的long型只跟存储器容量(硬盘)有关,可以认为是无限,这与其它语言的有限long不同(无限太酷了,不过一般不必用)
==========================================================================================
str型(字串str)可以用单引号或双引号,不同于php的是python多行字串要用三引号('''或""",用转义符\n比较麻烦),
(推荐用单引号,但不同于php在python下单引号内转义符生效),
字串可以认为是特种tuple
字串取元和切片(皆只读):
aStr='Python'
aStr[0]=='P'
aStr[-1]=='n'
aStr[1:3]=='yt'
aStr[n:m]==''(n>=m时)
aStr[1:]==aStr[1:None]=='ython' #None可以用来切片(可用隐式写法)但不能用来取元
aStr[:3]=='Pyt'
aStr[:-2]=='Pyth'
+号用来连接字串:aStr+bStr
*号用来重复字串:aStr*n
==========================================================================================
list型和tuple型(发音/tju:pl/,源自n-tuple:n倍体,n维体):
list型(列单型)像是php数字索引数组
tuple型(元组型或枚列型)像是只读单列型,像mysql里的enum枚举型,不是特别需要只读的时候推荐都用list型
列单型和枚列型都像字串型一样取元和切片,其中列单型的取元和切片都可以赋值:
aList=['a',123,'jack',456,aStr]
aList[1]='helloworld'
aList[1:3]=['helloworld',1234]
aList[3:None]=['helloworld',1234] #None可以用来切片(可用隐式写法)但不能用来取元
aList[1:3]='helloworld' #把字串tuple的前两元'h','e'赋给了aList[1]和aList[2],tuple赋值给list倒是不用转型
aList[1:3]=('hello','hell') #tuple赋值给list倒是不用转型,不用写成list:['hello','hell']
aList.append('peter') #附加元素
==========================================================================================
None被算作字串,但None和空串''不是一个概念
python的函数返回的对象可以直接用(遗憾php不行):aStr='a,b,c';req.write(aStr.split(',')[1])
==========================================================================================
dictionary型(词典型)像是php的字串索引数组(但次序不被控制),严格要求必须有索引且为字串:
(str,list,tuple都是sequence型(序列型),而词典型不是,它有着奇怪的次序:
1,0,3,2,5,4,7,6,9,8,A,<同小写>,Z,a,c,b,e,d,g,f,i,h,k,j,m,l,o,n,q,p,s,r,u,t,w,v,y,x,z
如果需要key-value对的序列,想到用list来构造:[['a','A'],['b','B'],...],
但是要对索引排序时很麻烦,而dictionary型可以用dict_keys=aDict.keys();dict_keys.sort()排序,
所以在这种需要下还是另用一个list来记录dictionary的key的原始次序
)
aDict={'host':'earth', 'port':80}
aDict['host']='earth'
aDict['']='moon'
aDict[None]='sun' #None在这里不能采用隐式写法
aDict.keys()以list返回所有键
aDict.values()以list返回所有值
==========================================================================================
python中没有常量const概念, 因为解释型语言无所谓编译时替换常量, 可以自己实现不可二次赋值的只读变量或对象属性:
# const.py:
class _const:
      def __setattr__(self,name,value):
          if self.__dict__.has_key(name):
             raise TypeError,"Can't rebind %s.%s"%(self.__class__.__name__,name)
          self.__dict__[name]=value
import sys
sys.modules[__name__]=_const()
#不import的话不要上两行, 直接:
const=_const()

# test.py
import const
const.MAGIC=23
const.MAGIC=88
print const.MAGIC

#一般为了性能不用这么做, 只要变量名全大写就可以了
==========================================================================================
运算符:
**是乘方号:2**3==8(而php中是用函数pow(2,3))
不等号推荐用!=
并没有++n,n--(太好了,早看不惯这个东东)
==========================================================================================
接龙比较:3<4<7    # same as: (3<4) and (4<7)
==========================================================================================
python不支持switch,而统一采用if-elif-...-else(因为switch的执行过程就是if-else):
if   x==1:
      req.write('a')
elif x==2: #注意:elseif缩成了elif
      req.write('b')
elif x==3:
      req.write('c')
else :
      req.write('d')
因为有严格的缩进控制,即使使用if-else嵌套也不会造成混淆:
if   x==1:
      req.write('a')
      if   x==2:
            req.write('b')
else :
      if   x==3:
            req.write('d')
==========================================================================================
while循环:
counter=0
while counter<5:
       req.write(str(counter)+'<br>')
       counter=counter+1
==========================================================================================
for遍历:
(类似c的for循环被放弃了(这种应该用while),python里的for遍历类似php的foreach,
但限定为单遍历变量,遍历域可以是list也可以是tuple)
1.计数循环:
for i in range(6): #range(n)函数产生list(0到n-1整数列)
      req.write(str(i)+'<br>')
2.词典遍历:
aDict={'b':'jack',\
       'a':1982,\
       '1':'hell'\
      }
ord_dict=['b','a','1'] #保存aDict的key的原始次序
for key in ord_dict:
        req.write(str(aDict[key])+'<br>')
==========================================================================================
文件操作:
(跟php类似,除了没有file_get_contents和file两个函数(可用open('...','r+').read(),open('...','r+').readlines()),
而且不能直接读取web文件,还有psp运行的当前路径不在该psp所在文件夹而在apache内(据说是因为mod_python只是python的
转译器,而python是多线程的,同一运行文件没有确定current working directory),因而open函数不方便使用相对路径(见'取
得当前psp所在文件夹'),而这点也许正好可以避免多重文件包含时相对路径冲突
********尚不知道怎么约束mod_python的文件访问在一个windows系统上的一定范围内***********
)
1.读操作:
fh=open('E:\www\PHPApps\LOCAL\index.php','r+') #第二个参数留空时代表'r',新建文件时用'w+',binary操作时用'rb+'
aLine=fh.readline() #读取当前行到str,含换行符
leftLines=fh.readlines() #读取当前行后所有行(含换行符)到list(并无参数指定读取行数)
leftContent=fh.read(num_after) #读取当前字节后参数个字节(-1或负数或留空代表剩余所有)到str
fh.seek(0,0) #指向相对于文件头(第二参数0:头,1:现,2:尾)0字偏移位置
fh.tell() #取得当前文件指针位置
fh.close()
行定位函数:
def seek_ln(fh, start)
     fh.seek(0,0)
     for i in range(start)
           fh.readline()
2.写操作:
fh.truncate(num_left) #将文件截尾剩参数个字节(留空代表剩余0)
fh.write(str) #将参数字串从文件当前指针处开始覆写,虽写操作还有writelines方法,但因换行不同建议不使用
==========================================================================================
取得当前psp所在文件夹:
req.write(os.getcwd()+'<br>') #得到D:\progxp\Apache Group\Apache2
req.write(os.path.dirname(__file__)+'<br>') #D:\progxp\Python24\lib\site-packages\mod_python
req.write(os.path.dirname(req.filename)+'<br>') #得到E:/www/PHPApps/LOCAL/test,这才是当前psp所在文件夹
req.write(req.document_root()+'<br>') #得到web服务根目录:E:/www/PHPApps/LOCAL
==========================================================================================
捕获错误:
(根据不同错误作处理,无错误则无需处理,还有try-finally似乎不需要,可以在try-except-else过后写必须执行的代码):
try:
    ...
    retval=float(object)
except IOError:
    retval='could not read file'
except (ValueError, TypeError):
    retval='object type cannot be converted to float'
except Exception, diag:
    retval=str(diag)
else:
    retval='great'
==========================================================================================
枚列一个module内所有class的名字:
import pyclbr
moduletobrowse = pyclbr.readmodule("file_base_name")  #比如test.py就只输入test
for i in moduletobrowse.items():
    print i[0]
==========================================================================================

  您的网址:(可能:)呆元:2385年09月16日(17-10-20)访客总人次:433220(自k5a1)  
Copyleft 2364-2378 DIYism
Powered by Ubuntu Server & ZPC-GX
全民备TOR 安全上网