网络编程的面试题
Ⅰ 设整形变量x=10,则表达式2<x<8的值
编辑
:kenwoodjw
对于机器学习算法工程师而言,python是不可或缺的语言,它的优美与简洁令人无法自拔。那么你过Python编程面试题吗?从Python基础到网页爬虫你是否能全方位Hold住?今天,为读者们推荐一个Github项目。
在这个项目中, kenwoodjw 准备了近 300 道 Python 面试题,同时还包含解决方案与代码。主要从 Python 基础、高级语句、网页应用、数据库和测试等角度提问,读者可只自己需要的领域。目前该项目已经完成了很多基础和高级面试题,本文主要摘取一些 Python 面试题供大家参考。
项目地址:https://github.com/kenwoodjw/python_interiew_question
总体而言,项目有近300道面试题。虽然该项目刚开始创建,但很多Python面试题都已经提供决方案。如下所示为面试题示例:
本文截取了一些面试题及解决方案:
Python 基础文件操作模块与包数据类型企业面试题Python 高级设计模式系统编程如果希望机器学习面试题,可阅读:春招已近,这份GitHub万星的ML算法面试大全请收下
Python 基础
什么是 Python?根据Python 创建者 Guido an Rossum 所言,Python是一种高级编程语言,其设计的核心理念是代码的易读性,以及允许编程者通过若干行代码轻松表达想法创意。实际上,很多开发者选择学习 Python 的首要原因是其编程的优美性,用它编码和表达想法非常自然。
文件操作
1.若有一个jsonline格式的文件file.txt,大小约为10K,我们的处理方式为:
defget_lines(): l = []with open('file.txt', 'rb') as f:for eachline in f: l.append(eachline)return lif __name__ == '__main__':for e in get_lines(): process(e) #处理每一行数据
现在要处理一个大小为10G的file.txt文件,但是内存只有4G。如果在只修改get_lines 函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有那些?
defget_lines(): l = []with open('file.txt','rb') as f: data = f.readlines(60000) l.append(data)yield l
要考虑的问题有:内存只有4G,无法一次性读入10G文件。而分批读入数据要记录每次读入数据的位置,且分批每次读取得太小会在读取操作上花费过多时间。
模块与包
2.如何输入日期, 判断这一天是这一年的第几天?
import datetimedefdayofyear(): year = input("请输入年份: ") month = input("请输入月份: ") day = input("请输入天: ") date1 = datetime.date(year=int(year),month=int(month),day=int(day)) date2 = datetime.date(year=int(year),month=1,day=1)return (date1-date2).days+1数据类型
3.如何反转字符串"aStr"?
print("aStr"[::-1])4.下面代码的输出结果将是什么?会报错吗?
list = ['a','b','c','d','e']print(list[10:])
代码将输出[],并不会产生IndexError 错误。如果尝试用超出成员的个数的index来获取某个列表的成员,那就会报错。例如,尝试获取 list[10] 和之后的成员,会导致IndexError。然而当我们尝试获取列表的切片时,开始的index超过成员个数并不会产生IndexError,而是仅仅返回一个空列表。因为并不会报错,所以这种Bug很难追踪到。
5.请写出一段Python代码,实现删除list里面的重复元素?
l1 = ['b','c','d','c','a','a']l2 = list(set(l1))print(l2)用list类的sort方法可以保证顺序不变:
l1 = ['b', 'c', 'd', 'c', 'a', 'a']l2 = list(set(l1))l2.sort(key=l1.index)print(l2)也可以这样写:
l1 = ['b', 'c', 'd', 'c', 'a', 'a']l2 = sorted(set(l1), key=l1.index)print(l2)
也可以用遍历:
l1 = ['b', 'c', 'd', 'c', 'a', 'a']l2 = []for i in l1:ifnot i in l2: l2.append(i)print(l2)企业面试题
6.设计实现遍历目录与子目录,抓取.pyc文件
第一种方法:
import osdefgetFiles(dir, suffix): res = []for root, dirs, files in os.walk(dir):for filename in files: name, suf = os.path.splitext(filename)if suf == suffix: res.append(os.path.join(root, filename)) print(res)getFiles("./", '.pyc')
第二种方法:
import osdefpick(obj):try:if obj.[-4:] == ".pyc": print(obj)except:returnNonedefscan_path(ph): file_list = os.listdir(ph)for obj in file_list:if os.path.isfile(obj): pick(obj)elif os.path.isdir(obj): scan_path(obj)if __name__ == '__main__': path = input('输入目录') scan_path(path)
7.如何反转一个整数,例如-123--> -321?
classSolution(object):defreerse(self, x):if-10 < x=""><>return x str_x = str(x)if str_x[0] != "-": str_x = str_x[::-1] x = int(str_x)else: str_x = str_x[1:][::-1] x = int(str_x) x = -xreturn x if-2147483648 < x=""><>if __name__ == '__main__': s = Solution() reerse_int = s.reerse(-120) print(reerse_int)
Python高级
Python高级包含很多重要的模块,例如函数、类和实例、系统编程、正则表达式、网络编程等等。根据这些高级属性,Python可用于数据科学、网页开发、机器学习等等。
设计模式
8.对设计模式的理解,简述你的设计模式?
设计模式是为我们经常会碰到的一些编程问题构建的可重用解决方案,它是总结性和经优化的。一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码,反之,设计模式更为高级,它是一种在特定情形下实现的方法模板。常见的是工厂模式和单例模式。
单例模式应用的场景一般发现在以下条件下: 资源共享的情况下,避免由于资源操作时导致的性能或损耗等,如日志文件,应用配置。控制资源的情况下,方便资源之间的互相通信。
9.生成器和迭代器的区别?
迭代器是一个更抽象的概念,任何对象,如果它的类有 next 方法和 iter 方法返回自己本身,它就是可迭代的。对于 string、list、dict、tuple 等这类容器对象,使用for循环遍历是很方便的,for 语句实际上会对容器对象调用 iter() 函数。iter() 会返回一个定义了 next() 方法的迭代器对象,它在容器中逐个访问容器内元素,在没有后续元素时,next()会抛出一个StopIteration异常。
生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用yield语句。生成器能做到迭代器能做的所有事,而且因为自动创建iter()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常。
10.对装饰器的理解,你能写出一个计时器装饰器,它能记录函数的执行时间吗?
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
import timedeftimeit(func):defwrapper(): start = time.clock() func() end = time.clock() print('used:',end-start)return wrapper @timeitdeffoo(): print('in foo()'foo())
系统编程
11.介绍一下你的进程。
程序运行在操作系统上的一个实例,就称之为进程。进程需要相应的系统资源:内存、时间片、pid。创建进程: 首先要导入multiprocessing中的Process;创建一个Process对象;创建Process对象时,可以传递参数。
p = Process(target=XXX, args=(tuple,), kwargs={key: alue})target = XXX # 指定的任务函数,不用加()args = (tuple,)kwargs = {key: alue} # 给任务函数传递的参数使用start()启动进程 结束进程 给子进程指定函数传递参数Demo
import osfrom mulitprocessing import Processimport timedefpro_func(name, age, **kwargs):for i in range(5): print("子进程正在运行中,name=%s,age=%d,pid=%d" % (name, age, os.getpid())) print(kwargs) time.sleep(0.2)if __name__ == "__main__":# 创建Process对象 p = Process(target=pro_func, args=('小明', 18), kwargs={'m': 20})# 启动进程 p.start() time.sleep(1)# 1秒钟之后,立刻结束子进程 p.terminate() p.join()12.谈谈你对多进程、多线程、以及协程的理解,项目是否用?
进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所有进程间数据不共享,开销大。线程: cpu调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在,一个进程至少有一个线程,叫主线程,而多个线程共享内存可以极大地提高了程序的运行效率。协程: 是一种用户态的轻量级线程,协程的调度完全由用户控制,协程拥有自己的寄存器上下文和栈。协程调度时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操中栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
关于系统编程还有很多问题,例如:
本文为编辑,请联系本获得授权。
Ⅱ java基础面试题有哪些
下面是10道java基础面试题,后附答案
1.什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”?
Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。
Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
2.“static”关键字是什么意思?Java 中是否可以覆盖(override)一个 private 或者是static 的方法?
“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java 中 static 方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而 static 方法是编译时静态绑定的。static 方法跟类的任何实例都不相关,所以概念上不适用。
3.JDK 和 JRE 的区别是什么?
Java 运行时环境(JRE)是将要执行 Java 程序的 Java 虚拟机。它同时也包含了执行 applet 需要的浏览器插件。Java 开发工具包 (JDK)是完整的 Java 软件开发包,包含了 JRE,编译器和其他的工具(比如:JavaDoc,Java 调试器),可以让开发者开发、编译、执行 Java 应用程序。
4.是否可以在 static 环境中访问非 static 变量?
static 变量在 Java 中是属于类的,它在所有的实例中的值是一样的。当类被 Java 虚拟机载入的时候,会对 static 变量进行初始化。如果你的代码尝试不用实例来访问非 static 的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
5.Java 支持的数据类型有哪些?什么是自动拆装箱?
Java 语言支持的 8 中基本数据类型是:
byte
short
int
long
float
double
boolean
char
自动装箱是 Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把 int 转化成 Integer,double 转化成 double,等等。反之就是自动拆箱。
6.Java 支持多继承么?
不支持,Java 不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。
7.Java 中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?
当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java 编译器会为这个类创建一个默认的构造函数。
Java 中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。
Java 不支持像 C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java 不会创建默认的复制构造函数。
8.Java 中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
Java 中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。
9.接口和抽象类的区别是什么?
Java 提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
类可以实现很多个接口,但是只能继承一个抽象类
类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接口方法实现的情况下实现接口。
Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。
Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private, protected 或者是 public。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。
10.什么是值传递和引用传递?
对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。
对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。
最后祝你面试顺利!