参考:http://python.jobbole.com/82294/

   https://www.jianshu.com/p/aed6067eeac9

1. 操作系统基础题

1)在32位操作系统下,系统会为每个进程预留4GB内存空间,而某机器的物理内存可能只有2GB。请解释OS是如何处理这种”矛盾”的。
  答:操作系统采用虚拟内存的方法以达到医用外存扩大内存的作用。
2)请解释进程和线程的区别 。
  答:进程:操作系统进行资源分配的基本单位。一个进程可以包含多个线程,所有线程共享进程资源。
    线程:CPU调度的基本单位。线程是轻量级的进程。它的创建和销毁比进程小的很多。
2.语法基础题:
1)请解释Python的变量作用域查找规则:
  答:局部作用域  -->函数范围作用域)-->全局作用域--->内建对象作用域
 
2)请解释Python中generator的语法行为,并说明generator的适用场合。 
  答:简单的生成器:把一个列表生成式[ ]变为( ) ,就变成一个generator。generator也是可迭代对象。
              我们可以一次性打印generator的内容,如果要一个一个打印,可以通过generator的next()方法:g.next()。这样太麻烦,一般直接通过for循环打印。
    generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
 
    带yield语句的生成器:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。
              一般函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,                                                    再次执行时从上次返回的yield语句处继续执行。
3)请解释shallow-copy和deep-copy的区别,并用代码说明如何实现deep copy。
  答:
对象赋值:
Python中,对象的赋值都是进行对象引用(内存地址)传递

 will = ["Will", , ["Python", "C#", "JavaScript"]]
wilber = will
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber] will[] = "Wilber"
will[].append("CSS")
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]

这里需要注意的一点是,str是不可变类型,所以当修改的时候会替换旧的对象,产生一个新的地址39758496

浅拷贝:

 import copy

 will = ["Will", , ["Python", "C#", "JavaScript"]]
wilber = copy.copy(will) print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber] will[] = "Wilber"
will[].append("CSS")
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]

浅拷贝会创建一个新的对象,这个例子中”wilber is not will”
但是,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址),也就是说”wilber[i] is will[i]”

由于list的第一个元素是不可变类型所以will对应的list的第一个元素会使用一个新的对象39758496
但是list的第三个元素是一个可变类型,修改操作不会产生新的对象,所以will的修改结果会相应的反应到wilber上

总结一下,当我们使用下面的操作的时候,会产生浅拷贝的效果:

  • 使用切片[:]操作
  • 使用工厂函数(如list/dir/set)
  • 使用copy模块中的copy()函数
深拷贝
 import copy

 will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = copy.deepcopy(will) print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber] will[0] = "Wilber"
will[2].append("CSS")
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber

跟浅拷贝类似,深拷贝也会创建一个新的对象,这个例子中”wilber is not will”
但是,对于对象中的元素,深拷贝都会重新生成一份(有特殊情况,下面会说明),而不是简单的使用原始元素的引用(内存地址)
例子中will的第三个元素指向39737304,而wilber的第三个元素是一个全新的对象39773088,也就是说,”wilber[2] is not will[2]”
 
  • 当对will进行修改的时候

由于list的第一个元素是不可变类型,所以will对应的list的第一个元素会使用一个新的对象39758496
但是list的第三个元素是一个可不类型,修改操作不会产生新的对象,但是由于”wilber[2] is not will[2]”,所以will的修改不会影响wilber

 
 
拷贝的特殊情况:

其实,对于拷贝有一些特殊情况:

  • 对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有拷贝这一说

也就是说,对于这些类型,”obj is copy.copy(obj)” 、”obj is copy.deepcopy(obj)”

  • 如果元祖变量只包含原子类型对象,则不能深拷贝,看下面的例子

 
 

总结

本文介绍了对象的赋值和拷贝,以及它们之间的差异:

  • Python中对象的赋值都是进行对象引用(内存地址)传递
  • 使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用.
  • 如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝
  • 对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有被拷贝一说
  • 如果元祖变量只包含原子类型对象,则不能深拷贝。

3. 数据结构&算法基础题(3选1)
1)请实现一个双向列表的数据结构。并实现插入。

 #双向链表
'节点类'
class Node(object):
def __init__(self,data = None):
self.data = data
self.pre = None
self.next = None class Linklist(object):
def __init__(self):
self.head = None def is_Empty(self):
return self.head==None def length(self):
cur = self.head
count = 0
while cur != None:
count += 1
cur = cur.next
return count
#前面插节点
def add(self,item):
node = Node(item)
if self.is_Empty():
self.head = node else:
node.next = self.head
self.head.pre = node
self.head = node
#后面插节点
def append(self,item):
node = Node(item)
if self.is_Empty():
self.head = node else:
cur = self.head
while cur.next != None:
cur = cur.next
cur.next = node
node.pre = cur
#查找
def search(self,item):
node = Node(item) cur = self.head
while cur!= None:
if cur.data == item:
return True
cur = cur.next
return False def insert(self,pos,item):
"""在指定位置添加节点"""
if pos <= 0:
self.add(item)
elif pos > (self.length()-1):
self.append(item)
else:
node = Node(item)
cur = self.head
count = 0
while count < (pos-1) :
count += 1
cur = cur.next
node.pre = cur
node.next = cur.next
cur.next.pre = node
cur.next = node
#移除某个元素
def remove(self,item): if self.is_Empty():
return
else:
cur = self.head
if cur.item == item: #第一个就是要找的
if cur.next == None: #只有一个头结点
self.head = None
else:
cur.next.pre = None
self.head = cur.next
return
while cur != None:
if cur.item == item:
cur.pre.next = cur.next
cur.next.pre = cur.pre
break cur = cur.next
 4)请解释同步/异步、阻塞/非阻塞这几个网络编程中的常用概念 
答:
  参考:https://www.jianshu.com/p/aed6067eeac9
 
  有人也许会把阻塞调用和同步调用等同起来,实际上它们是不同的。
  1.对于同步调用来说,很多时候当前线程可能还是激活的,只是从逻辑上当前函数没有返回而已,此时,这个线程可能也会处理其他的消息。
    (a) 如果这个线程在等待当前函数返回时,仍在执行其他消息处理,那这种情况就叫做同步非阻塞;
    b) 如果这个线程在等待当前函数返回时,没有执行其他消息处理,而是处于挂起等待状态,那这种情况就叫做同步阻塞;

2.对于阻塞调用来说,则当前线程就会被挂起等待当前函数返回;

5. 编程应用题
 
现有1份用户访问日志,文件名为access.log,每行记录包含3列数据('\t'分割):IP地址(点分格式的字符串)、URL(用户访问的URL链接)、时间戳(Unix Timestamp格式)。请实现如下数据处理需求。
备注:尽量写出可直接运行的源码,Java/C/Python均可。
1)统计该日志中所有URL的热度,并按热度降序输出TOP 5
2)统计今天凌晨3点至凌晨5点30分期间内,用户访问最频繁的5个URL(假设那段时间内的用户访问记录包含在access.log中)
3)把点分格式字符串表示的IP地址转换成其整数表示
4)如果文件太大导致单机无法直接处理,有哪些解决思路?

答:

1.

2.

3.

 ip2num = lambda x:sum([**j*int(i) for j,i in enumerate(x.split('.')[::-])])
ip2num('192.168.0.1')
3232235521

4. 将文件分为若干个小文件

通过一个hash函数,将URL散列到不同的文件之中,字符串映射到整型数

通过哈希,根据余数将url分配到小文件中

  统计每一个txt文件中的URL出现的频次,存入数组中

最后统计数组。

     
    
 
 
 
 
 
 
 
 
 
 

hx计算机基础的更多相关文章

  1. 计算机基础--Java中int char byte的关系

    计算机基础--Java中int char byte的关系 重要:一个汉字占用2byte,Java中用char(0-65535 Unicode16)型字符来存字(直接打印输出的话是字而非数字),当然要用 ...

  2. Java学习之计算机基础(一)

    阅读本文大概需要 4 分钟 想要开始学习Java开发,需要掌握一些必要的计算机基础.如果你是计算机专业的人或者已经学过类似的课程,可以跳过这篇文章的阅读.计算机基础课程有很多,小编在大学里学过的课程就 ...

  3. 计算机基础-Day1

    计算机基础-Day1 一.计算机基础 首先Python是一门编程语言 语言: 那什么是语言?语言就是一种事物与另一种事物沟通的介质. 所以说编程语言是程序员跟计算机沟通的介质,那么为什么要跟计算机沟通 ...

  4. python计算机基础-Day1

    计算机基础-Day1 一.计算机基础 首先Python是一门编程语言 语言: 那什么是语言?语言就是一种事物与另一种事物沟通的介质. 所以说编程语言是程序员跟计算机沟通的介质,那么为什么要跟计算机沟通 ...

  5. Python之旅_计算机基础入门

    一.计算机基础 1.Python是编程语言 语言:一种事物与另一种事物沟通的介质. 编程语言:程序员与计算机沟通的介质. 什么是编程:程序员用编程语言把自己的逻辑思想下来,编程的结果就是一堆文件. 为 ...

  6. 计算机基础,Python基础--变量以及简单的循环

    一.计算机基础 1.CPU 相当于人体的大脑,用于计算处理数据. 2.内存  用于存储数据,CPU从内存调用数据处理计算,运算速度很快. PS:问:既然在内存里的数据CPU运算速度快,为什么计算机不全 ...

  7. day01计算机基础

    今日内容 1.计算机初步认识 1.计算机认识 1. 计算机基础 1.1硬件:cpu/内存/硬盘/主板/网卡 1.2操作系统 linux:免费开源 windows mac 1.3解释器/编译器 补充:编 ...

  8. Java面试题 Web+EJB & Spring+数据结构& 算法&计算机基础

    六.Web 部分:(共题:基础40 道,基础37 道,中等难度3 道) 122.说出Servlet 的生命周期,并说出Servlet 和CGI 的区别? [基础] 答:Web 容器加载Servlet ...

  9. python note 01 计算机基础与变量

    1.计算机基础. 2.python历史. 宏观上:python2 与 python3 区别: python2 源码不标准,混乱,重复代码太多, python3 统一 标准,去除重复代码. 3.pyth ...

随机推荐

  1. VIM使用说明

    [vim 命令-移动光标]:h 的鍵位于左邊,每次按下就會向左移動.l 的鍵位于右邊,每次按下就會向右移動.j 鍵看起來很象一支尖端方向朝下的箭頭.k朝上移动. [vim 命令-启动和退出]:1. 請 ...

  2. Spring-Boot整合freemarker引入静态资源css、js等(转)

    一.概述 springboot 默认静态资源访问的路径为:/static 或 /public 或 /resources 或 /META-INF/resources 这样的地址都必须定义在src/mai ...

  3. iOS8新特性

    1. App Extension Programming Guide 2.LocalAuthentication.framework - Touch ID Authentication 3.Local ...

  4. 修改SVN中文件的可执行属性

    博文来自下面路径,转载请注明原出处: http://bigwhite.blogbus.com/logs/74568031.html 修改SVN中文件的可执行属性 - [开源世界] Tag:开源世界 S ...

  5. 学习jquery.pagewalkthroung.js插件记录点

    1.53行:options = $.extend(true, {}, $.fn.pagewalkthrough.defaults, options); $.extend的作用是把第二个对象合并到第一个 ...

  6. 简要分析unity3d中剪不断理还乱的yield

    在学习unity3d的时候非常easy看到以下这个样例: void Start () { StartCoroutine(Destroy()); } IEnumerator Destroy(){ yie ...

  7. 【JAVA编码专题】UNICODE,GBK,UTF-8区别 分类: B1_JAVA 2015-02-10 21:07 153人阅读 评论(0) 收藏

    简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与g ...

  8. openstack中虚拟机怎么与物理机通信

    How-to-connection-ns-outside 环境配置 网络接口 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE ...

  9. 【t070】二进制

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 求所有可以只用1和00拼成的长度为N的二进制数的个数除以15746的余数. 比如当N=4的时候,有5个 ...

  10. tomcat 启动项目时出现 ZipException: error in opening zip file

    错误情况 项目用 maven 打好 war 包后放到 tomcat 下,启动 tomcat,出现以下错误 3-Nov-2017 12:21:44.346 严重 [localhost-startStop ...