【實習】暑期實習之python筆試題(一)


近期忙於找一個暑期實習的公司,無奈個人水平實在太水,合適的公司也不是很多,筆試題目也積累了一些,整理一下好了。

公司 A

題目一:編寫一個腳本main.py,使用方式如下:

main.py -u http://www.sohu.com -d 'a=1,b=2,c=3' -o /tmp/index.html

功能要求:打開-u指定的頁面,將頁面中所有的鏈接后面增加參數a=1&b=2&c=3(需要考慮鏈接中已經存在指定的參數的問題), 然后保存到-o指定的文件中。

 

題目二:編寫一個 ab(Apache Benchmark)的替代程序,請盡可能的兼容 ab 你所認為重要的功能和參數。

 

題目三:

有配置文件有類似下面的配置:

http://m.sohu.com/c/5/|財經|200

http://m.sohu.com/|體育|200

http://m.sohu.com/n/346620805/|信號|200

 

編寫一個腳本,要求如下:

1. 讀取配置文件,對每一個url進行檢查.

   例如http://m.sohu.com/c/5/, 這個url返回的結果應該包含"財經"兩個字,並且HTTP狀態碼是200, 否則報錯。

2. 需支持並行的檢查多個鏈接

 

Solutions:

我選做的是第一題和第三題。

第一題不難,主要解決的是打開某個url並遍歷其中的所有鏈接,以前寫爬蟲的時候搞過這些東西就比較簡單了,同時也涉及到了基本的I/O操作,考的還是比較基本的吧。比較生疏的是命令行參數問題,平時用的比較多但是自己貌似沒實現過,趁這個機會也看了一下有關的問題,不過鑒於問題比較簡單我就用了getopt解決了,其實有可以實現更加復雜的命令行參數的方法的。

有關的連接可以看一下這里: http://blog.csdn.net/jiang1013nan/article/details/5854378

代碼如下:

 1 # _*_ coding: utf-8 _*_
 2 '''
 3 題目一:編寫一個腳本main.py,使用方式如下:
 4 main.py -u http://www.sohu.com -d 'a=1,b=2,c=3' -o /tmp/index.html
 5 功能要求:打開-u指定的頁面,將頁面中所有的鏈接后面增加參數a=1&b=2&c=3
 6 (需要考慮鏈接中已經存在指定的參數的問題), 然后保存到-o指定的文件中。
 7 '''
 8 import urllib2
 9 import re
10 import sys,getopt
11 opts, args = getopt.getopt(sys.argv[1:],'hu:d:o:')
12 
13 def Tryurlopen(url,d,o):
14     d = getd(d)
15     patterns = re.compile('<a\s(?:.*?\s)*?href=[\'"](.*?)[\'"].*?>')
16     f = urllib2.urlopen(url)
17     contents = f.read()
18     m = re.findall(patterns, contents)
19     file = open(o,'w')
20     for ele in m:
21         #print ele
22         if '&' in ele or '?' in ele: #url后面有參數
23             ele += '&' + d
24         elif ele[-1:] == '/':
25             ele += d
26         else:
27             ele += '/' + d
28         file.writelines(ele + '\n')
29     file.close()
30 
31 def getd(d):
32     changeresult = ''
33     dtest = d.split(',')
34     for dele in dtest:
35         changeresult += dele + '&'
36     changeresult = changeresult[:-1]
37     return changeresult
38 
39 def main(argv):#利用getop模塊實現基本的命令行參數處理
40     url = ''
41     d = ''
42     orietion = ''
43     for op, value in opts:
44         if op =='-u':
45             url = value
46         elif op == '-d':
47             d = value
48         elif op == '-o':
49             orietion = value
50 
51     Tryurlopen(url,d,orietion)
52 
53 if __name__ == '__main__':
54     main(sys.argv)
55 
56     

第二題時間原因我沒有做,只是大體的了解了一下,有興趣的同學可以參考一下的鏈接:

http://blog.csdn.net/jhonguy/article/details/7576155

第三題考察的有基本的I\O操作,對獲得的URL內容的處理,返回的HTTP狀態碼可以分析header解決,以及用多線程讀取同一文件,涉及到了鎖與同步的問題,也沒有特別偏的東西吧,看來公司都是比較注重基礎知識的,唉自己基礎這么不扎實怎么辦,還要繼續努力呀。

代碼如下:

  1 # _*_ coding: utf-8 _*_
  2 '''
  3 題目三:
  4 有配置文件有類似下面的配置:
  5 http://m.sohu.com/c/5/|財經|200
  6 http://m.sohu.com/|體育|200
  7 http://m.sohu.com/n/346620805/|信號|200
  8 
  9 編寫一個腳本,要求如下:
 10 1. 讀取配置文件,對每一個url進行檢查.
 11    例如http://m.sohu.com/c/5/, 這個url返回的結果應該包含"財經"兩個字,並且HTTP狀態碼是200, 否則報錯。
 12 2. 需支持並行的檢查多個鏈接 
 13 
 14 '''
 15 import re
 16 import urllib2
 17 import threading
 18 from os.path import getsize
 19 import os,time
 20 rlock = threading.RLock() #
 21 curPosition = 0 #當前讀取到的文件位置
 22 '''設計檢查url的函數(完成)'''
 23 def TestUrl(line):
 24 
 25     m = line.split('|')
 26     url = m[0]
 27     tag = m[1]
 28     #print  tag
 29     f = urllib2.urlopen(url)
 30     statuscode = f.getcode()
 31     contents = f.read()
 32     if tag in contents and statuscode == 200:
 33         print 'The url %s is true'   %url
 34     else:
 35         print 'The url %s is wrong.' %url
 36 
 37 
 38 ''' 設計支持並行連接的程序'''
 39 
 40 class Resource(object):
 41     def __init__(self, fileName):
 42         self.fileName = fileName
 43         #分塊大小
 44         self.blockSize = 1000
 45         self.getFileSize()
 46     #計算文件大小
 47     def getFileSize(self): #獲取文件有多少行,即多少個url
 48         fstream = open(self.fileName,'r')
 49         fstream.seek(0,os.SEEK_END)
 50         self.fileSize = fstream.tell()
 51         fstream.close()
 52 
 53 class Reader(threading.Thread):
 54     def __init__(self, res):
 55         self.res = res
 56         super(Reader,self).__init__()
 57     def run(self):
 58         global curPosition
 59         fstream = open(self.res.fileName, 'r')
 60         while True:
 61             #鎖定共享資源
 62             rlock.acquire()
 63             startPosition = curPosition
 64             if (startPosition + self.res.blockSize) < self.res.fileSize:
 65                 curPosition = endPosition = (startPosition + self.res.blockSize) 
 66             else:
 67                 curPosition = endPosition = self.res.fileSize
 68             #釋放股共享資源
 69             rlock.release()
 70             if startPosition == self.res.fileSize:
 71                 break
 72             elif startPosition != 0:
 73                 fstream.seek(startPosition)
 74                 fstream.readline()
 75             pos = fstream.tell()
 76 
 77             while pos < endPosition:
 78                 line = fstream.readline()
 79                 #處理line
 80                 TestUrl(line)
 81                 pos = fstream.tell()
 82             fstream.close()
 83 
 84 
 85 
 86 if __name__ == '__main__':
 87     starttime = time.clock()
 88     #線程數
 89     threadNum = 4
 90     #文件
 91     fileName = '/Users/gixiaochen/Documents/config.log'
 92     res = Resource(fileName)
 93     #線程池
 94     threads = []
 95     #初始化線程
 96     for i in range(threadNum):
 97         rdr = Reader(res)
 98         threads.append(rdr)
 99     #開始線程
100     for i in range(threadNum):
101         threads[i].start()
102     #線程結束
103     for i in range(threadNum):
104         threads[i].join()

找實習的一點感受:

1. 扎實的基礎知識+某一方面的特長才能有好的offer

2. 不管找不找得到,准備工作的同學都應該盡力去找,感覺找實習的時候自己提高的很多,多投幾個公司多筆試面試幾次,就會發現很多自己覺得不重要的東西還是很有必要牢牢掌握的,以前偷懶丟下的東西,以后都要一個個的撿起來。

3. 找實習的渠道很重要,我在微博上找了幾個公司發了郵件去問基本上都收到回復了,時效性比較強。大街網上一堆HR很感興趣的投遞都沒什么反饋,還是要轉變思路吧。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM