Python程序练习(1)

from asyncio.constants import ACCEPT_RETRY_DELAY from urllib.request import urlopen webpage = urlopen('http://www.python.org') #假设要提取刚才所打开网页中链接About的相对URL,可使用正则表达式 import re text = webpage.read() m = re.search(b'<a href="([^"]+)" .*?>about</a>',text,re.IGNORECASE) m.group(1) '/about/' #如果要给下载的副本指定文件名,可通过第二个参数来提供。 urlretrieve('http://www.python.org','C:\\python_webpage.html') #代码清单14-3 基于SocketServer的极简服务器 from socketserver import TCPServer, StreamRequestHandler class Handler(StreamRequestHandler): def handle(self): addr = self.request.getpeername() print('Got connection from',addr) self.wfile.write('Thank you for connecting') server = TCPServer(('',1234),Handler) server.serve_forever() #代码清单14-4 分叉服务器 from socketserver import TCPServer,ForkingMixIN,StreamRequestHandler class Server(ForkingMixIN,TCPServer):pass class Handler(StreamRequestHandler): def handle(self): addr = self.request.getpeername() print('Got connection from',addr) self wfile.write('Thank you for connecting') server = Server(('',1234),Handler) server.serve_forever() #代码清单14-5 线程化服务器 from socketserver import TCPServer,ThreadingMixIN,StreamRequestHandler class Server(ThreadingMixIN,TCPServer):pass class Handler(StreamRequestHandler): def handle(self): addr = self.request.getpeername() print('Got connection from',addr) self.wfile.write('Thank you for connecting') server = Server(('',1234),Handler) server.serve_forever() #代码清单14-6 使用select的简单服务器 import socket,select s = socket.socket() host = socket.gethostname() port = 1234 s.bind((host,port)) s.listen(5) inputs = [s] while True: rs, ws, es = select.select(inputs,[],[]) for r in rs: if r is s: c,addr = s.accept() print('Got connection from',addr) inputs.append(c) else: try: data = r.recv(1024) disconnected = not data except socket.error: disconnected = True if disconnected: print(r.getpeername(),'disconnected') inputs.remove(r) else: print(data) #代码清单14-7 使用poll的简单服务器 import socket,select s = socket.socket() host = socket.gethostname() port = 1234 s.bind((host,port)) fdmap = {s.fileno():s} s.listen(5) p = select.poll() p.register(s) while True: events = p.poll() for fd,event in events: if fd in fdmap: c, addr = s.accept() print('Got connection from',addr) p.register(c) fdmap[c.fileno()] = c elif event & select.POLLIN: data = fdmap[fd].recv(1024) if not data:# 没有数据 --连接已关闭 print(fdmap[fd].getpeername(),'disconnected') p.unregister(fd) del fadmap[fd] else: print(data) #代码清单14-8 使用Twisted创建的简单服务器 from twisted.internet import reactor from twisted.internet.protocol import Protocol,Factory class SimpleLogger(Protocol): def connectionMade(self): print('Got connection from',self.transport.client) def connectionLost(self,reason): print(self.transport.client,'disconnected') def dataReceived(self,data): print(data) factory = Factory() factory.protocol = SimpleLogger reactor.listenTCP(1234,factory) reactor.run() #代码清单14-9 使用协议LineReceiver改进后的日志服务器 from twisted.internet import reactor from twisted.internet.protocol import Factory from twisted.protocols.basic import LineReceiver class SimpleLogger(LineReceiver): def connectionMade(self): print('Got connection from',self.transport.client) def connectionLost(self,reason): print(self.transport.client,'disconnected') def lineReceived(self,line): print(line) factory = Factory() factory.protocol = SimpleLogger reactor.listenTCP(1234,factory) reactor.run() #代码清单15-1 简单的屏幕抓取程序 from urllib.request import urlopen import re p = re.compile('<a href ="(/jobs/\\d+)/">(.*?)</a>') text = urlopen('http://python.org/jobs').read().decode() for url,name in p.findall(text): print('{} ({})'.format(name,url)) ''' <h1>Pet Shop <h2>Complaints</h3> <p>There is <b>no <i>way</b> at all</i> we can accept returned parrots. <h1><i>Dead Pets</h1> <p>Our pets may tend to rest at times,but rarely die within the warrantly period. <i><h2>News</h2></i> <p>We have just received <b>a really nice parrot. <p>It's really nice.</b> <h3><hr>The Norwegian Blue</h3> <h4>Plumage and <hr>pining behavior</h4> <a href="#norwegain-blue">More information<a> <p>Features: <body> <li>Beautiful plumage ''' #下面是Tidy修复后的版本: <!DOCTYPE html> <html> <head> <title></title> </head> <body> <h1>Pet Shop</h1> <h2>Complaints</h2> <p>There is <b>no <i>way</i></b> <i>at all</i> we can accept returned parrots.</p> <h1><i>Dead Pets</i></h1> <p><i>Our pets may tend to rest at times,but rarely die within the warrantly period.</i></p> <h2><i>News</i></h2> <p>We have just received <b>a really nice parrot.</b></p> <p><b>It's really nice.</b></p> <hr> <h3>The Norwegain Blue</h3> <h4>Plumage and</h4> <hr> <h4>pining behavior</h4> <a href="#norwegain-blue">More information</a> <p>Features:</p> <ul> <li>Beautiful plumage</li> </ul> </body> </html> #例如,假设你有一个混乱的HTML文件(messy.html),且在执行路径中包含命令行版Tidy,下面的程序将对这个文件运行Tidy并将结果打印出来: from subprocess import Popen,PIPE text = open('messy.html').read() tidy = Popen('tidy',stdin=PIPE,stdout=PIPE,stderr=PIPE) tidy.stdin.write(text.encode()) tidy.stdin.close() print(tidy.stdout.read().decode()) #代码清单15-2 使用模块HTMLParser的屏幕抓取程序 from urllib.request import urlopen from html.parser import HTMLParser def isjob(url): try: a,b,c,d=url.split('/') except ValueError: return False return a==d==''and b=='jobs' and c.isdigit() class Scraper(HTMLParser): in_link = False def handle_starttag(self,tag,attrs): attrs = dict(attrs) url = attrs.get('href','') if tag == 'a' and isjob(url): self.url=url self.in_link=True self.chunks=[] def handle_data(self,data): if self.in_link: self.chunks.append(data) def handle_endtag(self,tag): if tag == 'a' and self.in_link: print('{} ({})'.format(''.join(self.chunks),self.url)) self.in_link=False text = urlopen('http://python.org/jobs').read().decode() parser = Scraper() parser.feed(text) parser.close() #代码清单15-3 使用Beautiful Soup的屏幕抓取程序 from urllib.request import urlopen from bs4 import BeautifulSoup text = urlopen('http://python.org/jobs').read() soup = BeautifulSoup(text,'html.parser') jobs = set() for job in soup.body.section('h2'): jobs.add('{} ({})'.format(job.a.string,job.a['href'])) print('\n'.join(sorted(jobs,key=str.lower))) #代码清单15-4 简单的CGI脚本 #!/usr/bin/env python print('Content-type:text/plain') print()## 打印一个空行,以结束首部 print('Hello,world!') #代码清单15-5 显示栈跟踪的CGI脚本(faulty.cgi) #!/usr/bin/env python import cgitb;cgitb.enable() print('Content-type:text/html\n') print(1/0) print('Hello,world!') #代码清单15-6 从FieldStorage中获取单个值的CGI脚本(simple2.cgi) #!/usr/bin/env python import cgi from = cgi.FieldStorage() name = form.getvalue('name','world') print('Content-type:text/plain\n') print('Hello,{}!'.format(name)) #代码清单15-7 包含HTML表单的问候脚本(simple3.cgi) #!/usr/bin/env python import cgi form = cgi.FieldStorage() name = form.getvalue('name','world') print("""Content-type:text/html <html> <head> <title>Greeting Page</title> </head> <body> <h1>Hello,{}!</h1> <form action = 'simple3.cgi'> Change name <input type = 'text' name='name' /> <input type = 'submit' /> </form> </body> </html> """.format(name)) ''' 在这个脚本开头,与以前一样获取CGI参数name,并将默认值设置为'world'。如果在浏览器 中打开这个脚本时没有提交任何值,将使用默认值。 接下来,打印了一个简单的HTML页面,其中的标题包含参数name的值。另外,这个页面还 包含一个HTML表单,该表单的属性action被设置为脚本的名称(simple3.cgi)。这意味着提交表 单后,将再次运行这个脚本。这个表单只包含一个输入元素——名为name的文本框。因此,如果 你在文本框中输入新名字并提交表单,标题将发生变化,因为现在参数name包含值。 ''' #https://wiki.python.org/moin/WebFrameworks #JSON,http://www.json.org #代码清单16-1 简单的测试程序 from area import rect_area height = 3 width = 4 correct_answer = 12 answer = rect_area(height,width) if answer == correct_answer: print('Test passed') else: print('Test failed') #代码清单16-3 使用模块subprocess调用外部检查器 import unittest,my_math from subprocess import Popen,PIPE class ProductTestCase(unittest.TestCase): #在这里插入以前的测试 def test_with_PyChecker(self): cmd = 'pychecker','-Q',my_math.__file__.rstrip('c') pychecker = Popen(cmd,stdout=PIPE,stderr=PIPE) self.assertEqual(pychecker.stdout.read(),'') def test_with_PyLint(self): cmd = 'pylint','-rn','my_math' pylint = Popen(cmd,stdout=PIPE,stderr=PIPE) self.assertEqual(pylint.stdout.read(),'') if __name__ =='__main__':unittest.main() #代码清单17-1 一个简单的Java类(JythonTest.java) public class JythonTest { public void greeting(){ System.out.println("Hello,world!"); } } #$ javac JythonTest.java #代码清单17-2 一个简单的C#类(IronPythonTest.cs) using System; namespace FePyTest{ public class IronPythonTest{ public void greeting(){ Console.WriteLine("Hello,world"); } } } #对于Microsoft .NET,命令如下: #csc.exe /t:library IronPythonTest.cs #《C语言入门经典(第5版)》 《C程序设计语言(第2版)》 #NumPy(http://numpy.org) #一个简单的检测回文的C语言函数(palindrome.c) #include <string.h> int is_palindrome(char *text){ int i, n=strlen(text); for(i=0;I<=n/2;++i){ if(text[i] != text[n-i-1]) return 0; } return 1; } #代码清单17-4 检测回文的Python函数 def is_palindrome(text): n = len(text) for i in range(len(text) // 2): if text[i] != text[n-i-1
上一篇:【QEMU系统分析之实例篇(十九)】


下一篇:AI去衣技术在动画制作中的应用