python题目练习

发布时间:2019-08-20 07:47:09编辑:auto阅读(1590)


    1、随机生成一个大文件(5G以上),查找里面内容最长的N(N>5)行,并打印出来
    [root@saltstack-ui ~]# cat gen_large_file.py
    import os
    with open("a.txt", "w") as f:
        f.write(os.urandom(1024*1024*1024*5)) # 产生一个5G大小的文件,里面都是随机内容,耗时长,有待改进
        
    [root@saltstack-ui ~]# cat find_large_line.py  # 利用list sort来排列,然后打印最长的5行
    log_path='a.txt'
    N=5
    
    with open(log_path) as f:
        a = [ line for line in f ]
        a.sort(key=lambda x:len(x),reverse=True)
        for i in range(N):
            print "%d %s" %(i+1,a[i])
            
    # 下面看种省内存的实现:
    try:
       with open(log_path) as f:
           for line in f:
              aList.append(line)
              aList.sort(key=lambda x:len(x),reverse=True)
              if len(aList) > N:
                 del aList[N:]
    
    except IOError:
        print "IO error"
        
        
    2、打印1000以内的最大斐波那契数列
    # 使用递归
    N=0
    def fib1(n):
       if n == 0:
         return 0
       elif n == 1:
         return 1
       else:
         return fib1(n-1) + fib1(n-2)
    
    while fib1(N) < 1000:
       print fib1(N)
       N +=1
    
    # 使用递归(优化:算完的不用再算)
    N=0
    mem = {0:0 , 1:1}
    def fib2(n):
       if n not in mem:
          mem[n] = fib2(n-1) + fib2(n-2)
       return mem[n]
    
    while fib2(N) < 1000:
       print fib2(N)
       N +=1
    
    # 使用了迭代器
    def fib3(n):
      a, b = 0,1
      while a < n:
         yield a
         a,b = b,a+b
    
    for i in fib3(1000):
       print i
       
    
    3、python实现linux tail -f
    [root@saltstack-ui PyTest]# cat tail_f.py
    import time
    def tail_f(file):
        interval = 1
        while True:
            line = file.readline()
            if not line:
                time.sleep(interval)
                where = file.tell()
                file.seek(where)
            else:
                yield line
                
    for line in tail_f(open('a.txt')):
        print line,
        
        
    4、python实现栈、队列(基于List实现)
    class Stack():
    	def __init__(self):
    		self.stack = []
    
    	def push(self,item):
    		self.stack.append(item)
    
    	def pop(self):
    		if self.stack != []:
    			return self.stack.pop(-1)
    
    	def top(self):
    		if self.stack != []:
    			return self.stack[-1]
    		else:
    			return None
    
    	def length(self):
    		return len(self.stack)
    
    
    class Queue():
    	def __init__(self):
    		self.queue = []
    
    	def enq(self,item):
    		self.queue.append(item)
    
    	def deq(self):
    		if self.queue != []:
    			return self.queue.pop(0)
    
    	def head(self):
    		if self.queue != []:
    			return self.queue[0]
    
    	def tail(self):
    		if self.queue != []:
    			return self.queue[-1]
    
    	def length(self):
    		return len(self.queue)				


    python collections模块提供了deque双向队列数据结构,双向都可以出队列

    wKioL1XrqKWTOeuZAAFkASS1R2Y661.jpg


    python实现环形队列,基于一个定长的list实现

    class RingQueue:
    	def __init__(self,capacity):
    		self.size = 0
    		self.front = 0
    		self.end = 0
    		self.capacity = capacity
    		self.queue = [0] * capacity
    
    	def enq(self,item):
    		if self.size < self.capacity:
    			self.size += 1
    			self.queue[self.end] = item
    			self.end = (self.end + 1) % self.capacity
    		else:
    			print "The queue is full!"
    
    	def dep(self):
    		if self.size > 0:
    			self.size -= 1
    		        self.queue[self.front] = 0
    			self.front = (self.front + 1) % self.capacity
    
    		else:
    			print "The queue is empty!"
    
    	def get_front(self):
    		return self.queue[self.front]
    
    
    if __name__ == '__main__':
    	ringqueue = RingQueue(3)
    	ringqueue.enq('1')
    	print ringqueue.queue
    	ringqueue.enq('2')
    	print ringqueue.queue
    	ringqueue.dep()
    	print ringqueue.queue
    	ringqueue.enq('3')
    	print ringqueue.queue
    	ringqueue.dep()
    	print ringqueue.queue
    	ringqueue.enq('4')
    	print ringqueue.queue
    	ringqueue.enq('5')
    	print ringqueue.queue




关键字