python程序介绍_Python编程简介

Python编程简介

博客分类:

看看照不照

我的第一个Python CGI''' 然后将它上传到你的OSO空间的cgi-bin目录下, 修改模式让它可执行, 就可以用Netscape来访问它了. 2)使用cgi模块 CGI最常见的功能是用来处理表格输入. 建议使用"import cgi"而不要使用"from cgi import *"来引入该 模块, 因其为了向后(backward)兼容而在名域(namespace)中定义 了一些你不想要的东西. 最好使用FieldStorage这个类, 其它类常是出于向后兼容性考虑. 只实体化这个类一次, 不用带参数. 该类有点象Python的字典,如 它有方法keys()来得到所有关键词, has_key()来看看它是否含有 某个关键词. 当有些HTML表格的项是空字串时会被忽略, 若你确实 想要它们, 可以在实体化FieldStorage时加上参数: keep_blank_values 第二个例子, 处理取姓名和地址的HTML表格, (我存为我OSO空间中的/cgi-bin/cgiTest2.py): #!/usr/bin/env python print "Content-Type: text/html\n" import cgi form = cgi.FieldStorage() form_ok = 0 if form.has_key("name") and form.has_key("addr"): form_ok = 1 if not form_ok: print '嘿, 忘了输名字或地址了吧?' else: print "

你的名字是:", form["name"].value print "

你的地址是:", form["addr"].value *注, 原说明书中有一行"return", 但我发现在OSO上它会引起错误, 所以将它改为上面else中的形式. 如果不用form['name'].value, 也可以用 form.getvalue ('name'), 后者还可以加带一个缺省参数. 当有好几个同名关键词的输入时, 二者皆返回一个字串数列. 如果一个表格栏代表上传文件名, 则在用value或getvalue方法时, 会将整个文件读入内存为一个字串. 这可能不是你想要的, 那你可 以用filename或file方法. 例如: fileitem = form["userfile"] if fileitem.file: #是上传文件; 数数多少行 linecount = 0 while 1: line = fileitem.file.readline() if not line: break linecount = linecount + 1 3)旧的类 SvFormContentDict 保存每个表格输入的单一值, 以字典的形式; 它假定没有同名关键词. FormContentDict, 类似上面, 但可以有同名关键词, 保存为字串 数列. FormContent, InterpFormContentDict 存在只是为了向极老的版 本兼容 4)函数 --- 当你需要更多的控制时 parse(fp) --- 在环境中或从一个文件fp中(缺省为stdin)处理请求. parse_qs(qs[, keep_blank_values, strict_parsing]) --- 处理字串请求, 返回字典 parse_qsl(qs[, keep_blank_values, strict_parsing]) --- 处理字串请求, 返回数列 parse_multipart(fp, pdict) --- 处理多部分(multipart/form-data)上传文件fp请求, --- 返回字典 parse_header(string) --- 处理MIME的头(如Content-Type)为主要值和参数字典 test() --- CGI测试. 它打印出最小HTTP的头, 和所获表格信息 print_environ() --- 打印shell环境 print_form(form) --- 打印表格 print_directory() --- 打印当前路径 print_environ_usage() --- 打印CGI所用的环境变量 escape(s[,quote]) --- 将字串s中的'&', '>', 'python") 7)测试 虽然许多CGI脚本通常只能在浏览器中运行, 但事前用python来运 行它一把, 也可以除去一些语法错误.

06518c3a0f730e08e7ffc573306f0ee6.gif去臭虫 可以给它一个请求, 例如向我的OSO中/cgi-bin/cgiTest2.py发出 请求: http://poorlinux.oso.com.cn/cgi-bin/cgiTest2.py?na me=xah&addr=unknown 如果产生错误404, 则是服务器找不到该cgi.py脚本; 若是其它错误, 比如500, 则是安装出了问题; 再下一步可能是调用cgi模块自带的测试函数: cgi.test() 其它的普通Python不能处理的错误的出错信息, 可能会保存服务 器的日志文件(log)中, 或被扔弃. 幸运的是, 你也可显示错误的回溯信息, 如下: #!/usr/bin/env python import sys import traceback print 'Contet-Type: text/html\n' sys.stderr = sys.stdout try: ...你的可能出错语句... except: print '\n\n ' traceback.print_exc() 若你怀疑引入traceback模块时出了问题, 甚至可以采用如下更 壮实的办法: #!/usr/bin/env python import sys sys.stderr = sys.stdout print 'Contet-Type: text/html\n' ...你的可能出错语句... 或者用 cgitb 反溯模块(traceback)来报错: import cgitb; cgitb.enable() 再或者, 在程序的开头, 早早就额外写一行: print 'Content-Type: text/html;\n' 有时候也能让本来不报错的cgi程序, 详详细细地报出来错误 -- 这是老朽向来秘而不宣的个人心得. 9)常见问题及解决办法 *)大多数HTTP服务器都缓冲CGI脚本的输出, 所以也就不能看到 CGI运行时的进展报告 *)事前总用"python script.py"来检查脚本的语法错误 *)使用外部程序时, 要确信它能被找到. 通常可以给出全路径名, 因为$PATH一般不会为在CGI脚本中设成一个很有用的值. *)当要读/写外部文件时, 要确保它们能被系统中任意用户读/写 *)不要试图给CGI脚本一个set-uid模式, 它在大多系统中不起作用, 并且也易产生安全问题. ################################################## #############  Python编程简介(九): 内建类型 有了前面的介绍, 这里想给大家稍微系统化一下, 主要是介绍内建 类型, 依据 Python 2.0 的>中第二章. 1) None, 空白Python对象. 有点象C中的NULL 2) 布尔(Boolean)运算与: and; 或: or; 非: not not的优先级小于非布尔算符.如 not x == y 将被解释为 not ( x == y ) 而 a == not b 是错误句法. 3) 比较 (基本与C相同): , >=, ==, !=, , is, is not 其中也是不等于算符, 已过时. Guido以前在ABC语言中使用 了它, 到现在还很有些舍不得丢掉. 4) 数值算符(也和C相仿): +, -, *, /, % abs(x) 取绝对值 int(x) 取整 long(x) 转型到长整数, 好象可以无限大 float(x) 转型到浮点数 complex(实部, 虚部) 成为复数, 也可直接写 实部+虚部j c.conjugate() 复数取共轭 divmod(x, y) 产生一对 ( int(x/y), x%y ) pow(x,y), x**y 二者都是乘方 顺便说一下, 乘号也可用在字串, 数列上: >>> a='ab'*3 >>> a 'ababab' >>> x=[0]*3 #可用来初始化数列 >>> x [0, 0, 0] 5) 整数的位操作符 (与C相同): |, ^, &, >, ~ 其中, ~x 是x的反,即0,1互换 x^y 是 x 非或 (exclusive or, 不知如何译才好) y, 如: >>> x=5 #即 0000 0101 >>> x^1 4 #只剩下 0000 0100 >>> x^2 7 #产生 0000 0111 6) 序列(Sequence): 含6类 (其中内存缓冲buffer类型极少使用) 6.1) 所有序列都支持如下运算: x in s, x not in s x在与不在序列s中 s + ss s, ss相并产生一个新序列 s*n, n*s n个序列相并 s[i], s[i:j] 取出某一(几)个值 len(s), min(s), max(s) 长度, 最小值, 最大值 序列分两类: *)可变的(mutable): 数列 *)不可变的(immutable): 字串, unicode字串, 元组(tuple), xrange (没看到buffer是属可变还是不可变的, 不管了, 反正极少用.) 单一码(unicode)字串, 写成u加上普通字串,如: u'abc' 6.2) 字串方法 (1.6版以前许多如下方法都只在string模块中) capitalize, center, count, encode, endswith, expandtabs, find, index, isalnum, isalpha, isdigit, islower, isspace, istitle, isupper, join, ljust, lower, lstrip, replace, rfind, rindex, rjust, rstrip, split, splitlines, startswith, strip, swapcase, title, translate, upper 许多都是可以望文生义的; 其中以r开头的表示从字串末尾开始 查找; find找不到子字串时返回-1, 而index则报错; lstrip是 去掉串首的空格/表格键, rstrip是去串尾的(含\n), strip是串 首串尾都去; title是把串中每个单词的第一个字母大写, 象标 题一样. 想具体了解某个方法如join, 可以在Python的交互式界面下: >>> s='aa' >>> print s.join.__doc__ S.join(sequence) -> string Return a string which is the concatenation of the strings in the sequence. The separator between elements is S. 6.3) xrange() 类似range()函数, 但所产生的是xrange类型(行为类似 元组) 而不是数列. 它的好处在: 不随参数的增大而增大内存. 我今早上用range(1e6), 发现python占了17M内存, 用range(1e7) Linux差点没死过去. (我有128M物理内存.) 后来用了xrange(1e7), 哇噻, 才用2M内存. 它有一个方法, tolist() 变成数列. 6.4) 可变值的: 数列(list) l[i], l[i:j] 取一个或几个值 del l[i:j] 删除 l.append(x), l.extend(x)在尾部增加 l.count (x) 计算x出现的次数 l.index (x) x第一次出现的位置 l.insert(i, x) 在i位置插入x l.pop([i]) 等同del l[i]; 缺省i时, 除去最后一个 l.remove(x) 删除第一个x l.reverse() 次序反转 l.sort([比较函数]) (按比较函数)排序 7) 映射(Mapping)类型: 字典 (dictionary, 目前仅有此一个类型) len(d) 计算长度 d[k] = x 赋值x给关键词k d[k] 取出关键词是k的值 del d[k] 删除 d.clear() 清除所有内容 d.copy() 拷贝,而=d只是增加一个参考(Reference) d.has_key(k) 若有关键词, 则返回1, 否则0 d.items() 产生内容为(关键词,值)的数列 d.keys() 关键词所组成的数列 d.update(b) 等于for k in b.keys(): d[k] = b[k] d.values() 值所组成的数列 d.get(k[, x]) 若有关键词k, 则给出d[k], (否则给出x) d.setdefault(k[, x]) 设置关键词k的缺省值x后, 返回x

06518c3a0f730e08e7ffc573306f0ee6.gif 其它类型 (不细述) 模块, 类与类的实体, 函数, 方法, 源码对象, 类型对象, 省略对象(Ellipsis), 文件 其中文件有方法(很多都是与C相对应的): close, closed, fileno, flush, isatty, mode, name, read, readline, readlines, seek, softspace, tell, truncate, write, writelines ##### 到此希望大家是感觉Python功能很丰富, 而不是繁/烦死了, ^_^ ################################################## #########################  Python编程简介(十): 内建函数 abs (x) 取绝对值 apply (函数, 参数 [,关键词]) buffer (对象[,位移offset[, 大小]]) callable (对象) 可调用则返回1, 否则0 chr (整数) 整数变字符: chr(97) ==> 'a', 是ord()的反函数 cmp (x,y) 返回负数(xy) coerce (x,y) 产生元组(x,y), 似乎用处不大 compile (字串, 文件, 类型) complex (实部 [,虚部]) delattr (对象, 名称) dir ( [对象] ) divmod (x, y) eval (表达式 [, 全局变量 [,局部变量] ] ) execfile (文件 [, 全局变量 [,局部变量] ] ) filter (函数, 数列) float (x) getattr (对象, 名称 [, 缺省值] ) globals () hasattr (对象, 名称) hash (对象) hex (x) id (对象) input ( [提示字串] ) int (x [,基数] ) intern (字串) isinstance(对象,类) issubclass(子类, 父类) len (s) list (序列) locals () long (x) map (函数, 数列, ...) max (s [, 参数 ...]) min (s [, 参数 ...]) oct (x) open (文件名 [, 模式 [, 缓冲大小] ] ) ord (字符) pow (x, y [,z]) range ([开始值,]终止值[,步长]) raw_input([提示字串]) reduce (函数, 序列 [, 初始器initializer]) reload (模块) repr (对象) round (x[,n]) setattr (对象, 名称, 数值) slice ([开始,]终止[,步长]) str (对象) tuple (序列) type (对象) unichr (整数) unicode (字串[,编码方法[,出错时报告哪种错误]]) vars ([对象]) xrange ([起始,]终止[,步长]) zip (序列, ...) ################################################## ########################  Python编程简介(十一): 速度技巧 有了前面的描述, 大家差不多知道什么是Python了. 最近因为在网 上看一两篇关于Python的运行速度问题, 不给大家介绍一下心里不 踏实, :-) 一个最常见的速度陷坑(至少是俺在没看到网上这篇介绍时陷进去 过好些次的)是: 许多短字串并成长字串时, 大家通常会用: shortStrs = [ str0, str1, ..., strN] #N+1个字串所组成的数列 longStr = '' for s in shortStrs: longStr += s 因为Python里字串是不可变的, 所以每次 longStr += s 都是将原 来的 longStr 与 str 拷贝成一个新字串, 再赋给longStr. 随着 longStr的不断增长, 所要拷贝的内容越来越长. 最后导至str0被 拷贝N+1次, str1是N次, ... . 那咋办呢 ? 咱们来看看Skip Montanaro先生的解说: http://musi-cal.mojam.com/~skip/python/fastpython. html 及可参考一下Guido van Rossum本人的: http://www.python.org/doc/essays/list2str.html 1)首先在大家应先学会怎么去找出速度瓶颈: Python自带有profile 模块: import profile profile.run ('想要检查的函数名()') 就会打印出那个函数里调用了几次其它函数, 各用了多少时间, 总共用了多少时间等信息 --- Nice ? 详请参阅>中的 profile模块的论述. 当然脑袋笨一点或是聪明一点的, 也可以用time模块中的time() 来显示系统时间, 减去上次的time()就是与它的间隔秒数了. 2)字串相并 就头上的例子而言,用 : longStr =''.join(shortStrs) 立马搞定, :-) 但如果shortStrs里面不都是字串, 而包含了些数 字呢 ? 直接用join就会出错. 不怕, 这样来: for i in range( len(shortStrs) ): shortStrs[i] = str( shortStrs[i] ) longStr = ''.join(shortStrs) 也即先将数列中所有内容都转化为字串, 再用join. 对少数几个字串相并, 应避免用: all = str0 + str1 + str2 + str3 而用: all = '%s%s%s%s' % (str0, str1, str2, str3) 3)数列排序: list.sort () 你可以按特定的函数来: list.sort( 函数 ), 只要这个函数接受 两参数, 并按特定规则返回1, 0, -1就可以. --- 很方便吧?但 会大大减慢运行速度. 下面的方法, 俺举例子来说明可能更容易 明白. 比方说你的数列是 l = ['az', 'by'], 你想以第二个字母来排序. 先取出你的关键词, 并与每个字串组成一个元组: new = map (lambda s: (s[1], s), l ) 于是new变成[('z', 'az'), ('y', 'by')], 再把new排一下序: new.sort() 则new就变成 [('y', 'by'), ('z', 'az')], 再返回每个元组中 的第二个字串: sorted = map (lambda t: t[1], new) 于是sorted 就是: ['by', 'az']了. 这里的lambda与map用得很好. 4)循环 比如for循环. 当循环体很简单时, 则循环的调用前头(overhead) 会显得很臃肿, 此时map又可以帮忙了. 比如你想把一个长数列 l=['a', 'b', ...]中的每个字串变成大写, 可能会用: import string newL = [] for s in l: newL.append( string.upper(s) ) 用map就可以省去for循环的前头: import string newL = map (string.upper, l) Guido的文章讲得很详细. 5)局域变量及 '.' 象上面, 若用 append = newL.append, 及换种import方法: import string append = newL.append for s in l: append (string.upper(s)) 会比在for中运行newL.append快一些, 为啥? 局域变量容易寻找. 俺自己就不比较时间了, Skip Montanaro的结果是: 基本循环: 3.47秒 去点用局域变量: 1.79秒 使用map: 0.54秒 6)try的使用 比如你想计算一个字串数列: l = ['I', 'You', 'Python', 'Perl', ...] 中每个词出现的次数, 你可能会: count = {} for s in l: if not count.has_key(s): count[s] = 0 else: count[s] += 1 由于每次都得在count中寻找是否已有同名关键词, 会很费时间. 而用try: count ={} for s in l: try: count[s] += 1 except KeyError: count[s] = 0 就好得多. 当然若经常出现例外时, 就不要用try了. 7)import语句 这好理解. 就是避免在函数定义中来import一个模块, 应全在 全局块中来import

06518c3a0f730e08e7ffc573306f0ee6.gif大量数据处理 由于Python中的函数调用前头(overhead)比较重, 所以处理大量 数据时,应: def f(): for d in hugeData: ... f() 而不要: def f(d): ... for d in hugeData: f(d) 这点好象对其它语言也适用, 差不多是放之四海而皆准, 不过对 解释性语言就更重要了. 9)减少周期性检查 这是Python的本征功能: 周期性检查有没有其它绪(thread)或系 统信号(signal)等要处理. 可以用sys模块中的setcheckinterval 来设置每次检查的时间间隔. 缺省是10, 即每10个虚拟指令 (virtual instruction)检查一次. 当你不用绪并且也懒得搭理 系统信号时, 将检查周期设长会增加速度, 有时还会很显著. ---编/译完毕. 看来Python是易学难精了, 象围棋? ################################################## ########################  Python编程简介(十二): ToDo / 未完待续 (要找工作/亲自到社会上讨钱讨饭吃了) *)global in function and class *)x=[ [0]*2 ] * 2 后, 赋值会有问题: x[0][0]=3 后, x[1][0] 也变成 3, ?! *)类定义中的同名函数与变量, 类大写/名词, 变量小写/名词, 方法小写/动词 *)常用模块(sys, os, os.path, commands, math, glob, dircache, time, sched, shutil, re cmath, xml, locale, gettext *)C/C++扩展 *)图象制作,处理, 包括captcha等: Python Imaging Libary *)网页/网络/Email: htmllib, urllib, urllib2, cookielib, email, smtplib, xml, soap *)集成开发环境: BOA, Glade 等 *)数组/矩阵处理: NumericPy *)实例介绍 

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2012-01-20 09:38

浏览 763

分类:非技术

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值