前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >春招苦短,我用百道Python面试题备战

春招苦短,我用百道Python面试题备战

作者头像
IT派
发布于 2019-06-10 07:18:52
发布于 2019-06-10 07:18:52
95800
代码可运行
举报
文章被收录于专栏:IT派IT派
运行总次数:0
代码可运行

对于机器学习算法工程师而言,Python是不可或缺的语言,它的优美与简洁令人无法自拔。那么你了解过Python编程面试题吗?从Python基础到网页爬虫你是否能全方位Hold住?今天,机器之心为读者们推荐一个Github项目。

在这个项目中,作者 kenwoodjw 准备了近 300 道 Python 面试题,同时还包含解决方案与代码。作者主要从 Python 基础、高级语句、网页应用、数据库和测试等角度提问,读者可只关注自己需要的领域。目前该项目已经完成了很多基础和高级面试题,本文主要摘取一些 Python 面试题供大家参考。

项目地址:https://github.com/kenwoodjw/python_interview_question

总体而言,项目有近300道面试题。虽然该项目刚开始创建,但很多Python面试题都已经提供了解决方案。如下所示为面试题示例:

本文截取了一些面试题及解决方案:

  • Python 基础
  • 文件操作
  • 模块与包
  • 数据类型
  • 企业面试题
  • Python 高级
  • 设计模式
  • 系统编程

如果希望了解机器学习面试题,可阅读:春招已近,这份GitHub万星的ML算法面试大全请收下

Python 基础

什么是 Python?根据Python 创建者 Guido van Rossum 所言,Python是一种高级编程语言,其设计的核心理念是代码的易读性,以及允许编程者通过若干行代码轻松表达想法创意。实际上,很多开发者选择学习 Python 的首要原因是其编程的优美性,用它编码和表达想法非常自然。

文件操作

1.若有一个jsonline格式的文件file.txt,大小约为10K,我们的处理方式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_lines():
        l = []
 with open('file.txt', 'rb') as f:
 for eachline in f:
                l.append(eachline)
 return l

if __name__ == '__main__':
 for e in get_lines():
        process(e) #处理每一行数据

现在要处理一个大小为10G的file.txt文件,但是内存只有4G。如果在只修改get_lines 函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有那些?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_lines():
        l = []
 with open('file.txt','rb') as f:
            data = f.readlines(60000)
        l.append(data)
 yield l

要考虑的问题有:内存只有4G,无法一次性读入10G文件。而分批读入数据要记录每次读入数据的位置,且分批每次读取得太小会在读取操作上花费过多时间。

模块与包

2.如何输入日期, 判断这一天是这一年的第几天?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import datetime

def dayofyear():
    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"?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print("aStr"[::-1])

4.下面代码的输出结果将是什么?会报错吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list = ['a','b','c','d','e']
print(list[10:])

代码将输出[],并不会产生IndexError 错误。如果尝试用超出成员的个数的index来获取某个列表的成员,那就会报错。例如,尝试获取 list[10] 和之后的成员,会导致IndexError。然而当我们尝试获取列表的切片时,开始的index超过成员个数并不会产生IndexError,而是仅仅返回一个空列表。因为并不会报错,所以这种Bug很难追踪到。

5.请写出一段Python代码,实现删除list里面的重复元素?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
l1 = ['b','c','d','c','a','a']
l2 = list(set(l1))
print(l2)

用list类的sort方法可以保证顺序不变:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
l1 = ['b', 'c', 'd', 'c', 'a', 'a']
l2 = list(set(l1))
l2.sort(key=l1.index)
print(l2)

也可以这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
l1 = ['b', 'c', 'd', 'c', 'a', 'a']
l2 = sorted(set(l1), key=l1.index)
print(l2)

也可以用遍历:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
l1 = ['b', 'c', 'd', 'c', 'a', 'a']
l2 = []
for i in l1:
 if not i in l2:
        l2.append(i)
print(l2)

企业面试题

6.设计实现遍历目录与子目录,抓取.pyc文件

第一种方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os


def getFiles(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')

第二种方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os


def pick(obj):
 try:
 if obj.[-4:] == ".pyc":
            print(obj)
 except:
 return None


def scan_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?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution(object):
 def reverse(self, x):
 if -10 < x < 10:
 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 = -x
 return x if -2147483648 < x < 2147483647 else 0


if __name__ == '__main__':
    s = Solution()
    reverse_int = s.reverse(-120)
    print(reverse_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函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time
 def timeit(func):
 def wrapper():
            start = time.clock()
            func()
            end = time.clock()
            print('used:',end-start)
 return wrapper
    @timeit
 def foo():
        print('in foo()'foo())

系统编程

11.介绍一下你了解的进程。

程序运行在操作系统上的一个实例,就称之为进程。进程需要相应的系统资源:内存、时间片、pid。创建进程: 首先要导入multiprocessing中的Process;创建一个Process对象;创建Process对象时,可以传递参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p = Process(target=XXX, args=(tuple,), kwargs={key: value})
target = XXX # 指定的任务函数,不用加()
args = (tuple,)
kwargs = {key: value} # 给任务函数传递的参数

使用start()启动进程 结束进程 给子进程指定函数传递参数Demo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
from mulitprocessing import Process
import time
defpro_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调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在,一个进程至少有一个线程,叫主线程,而多个线程共享内存可以极大地提高了程序的运行效率。协程: 是一种用户态的轻量级线程,协程的调度完全由用户控制,协程拥有自己的寄存器上下文和栈。协程调度时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操中栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

关于系统编程还有很多问题,例如:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
JAVA集合类汇总
数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用。 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用。
哲洛不闹
2018/09/14
8520
JAVA集合类汇总
java集合详解和集合面试题目
数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用。
全栈程序员站长
2022/09/05
6790
巩固基础从Java集合类开始,最系统全面的集合类笔记
来源:https://blog.csdn.net/weizhengzhou520/article/details/81806539
挨踢小子部落阁
2019/07/16
4170
Java集合类操作优化经验总结
本文首先针对 Java 集合接口进行了一些介绍,并对这些接口的实现类进行详细描述,包括 LinkedList、ArrayList、Vector、Stack、Hashtable、HashMap、WeakHashMap 等,然后对一些实现类的实现方式和使用经验进行讲解,同时重点介绍 WeakHashMap。希望通过本文介绍,可以让读者对集合的操作方式、注意事项等有一些了解。 在实际的项目开发中会有很多的对象,如何高效、方便地管理对象,成为影响程序性能与可维护性的重要环节。Java 提供了集合框架来解决此类问题,
用户1667431
2018/04/18
1.3K0
Java集合类详解
Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap
全栈程序员站长
2022/08/10
9930
java集合详解完整版(超详细)「建议收藏」
联合整理 https://blog.csdn.net/feiyanaffection/article/details/81394745 https://www.cnblogs.com/linliquan/p/11323172.html
全栈程序员站长
2022/08/19
1.1K0
java集合详解完整版(超详细)「建议收藏」
Java集合 Map 集合 与 操作集合的工具类: Collections 的详细说明
如下是 Set 中的 Key 存储自定义类 Person5 ,其中并没有重写Object 中的 equals() 方法和 hashCode()方法。会出现 Key 存储到重复的数据。
RainbowSea
2023/02/03
1K0
Java集合框架详述之Map集合
前言 Map接口的层次结构图: Map集合概述 Map与Collection无继承关系。 Map集合以Key和Value的方式存储数据。(键值对) Key和Value是引用数据类型。 Key和Value存储对象的内存地址。 所有Map集合的key特点:无序不可重复的。 Map集合的key和Set集合存储元素特点相同。 Map接口常用的方法: void clear() 清空集合中的元素 boolean containsKey(Object key) 判断Map中是否包含某个Key bo
百思不得小赵
2022/12/01
3100
Java集合框架详述之Map集合
Java集合
通常,我们的Java程序需要根据程序运行时才知道创建了多少个对象。但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。为了满足这些常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,而这些对象用什么来容纳呢?我们首先想到了数组,但是!数组只能存放同一类型的数据,而且其长度是固定的,那怎么办了?集合便应运而生了。
用户10358987
2024/04/23
1100
Java集合框架示意图
本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/210
joshua317
2021/12/13
6110
Java集合框架示意图
JAVA中的集合小结
Collection是最基本的集合接口,声明了适用于JAVA(List和Set)集合的通用方法
帅的一麻皮
2020/02/21
1.6K1
Java集合框架
早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。
朝雨忆轻尘
2019/06/18
1.1K0
Java——集合篇
<1>无序的(插入的顺序和读取的顺序有可能不一致,LinkedHashSet特例)
用户11453640
2025/01/18
580
Java集合详解(超详细)
(2)ArrayList(int initialCapacity)构造一个具有指定初始容量的空列表。
全栈程序员站长
2022/09/01
9410
Java集合详解(超详细)
40个Java集合类面试题和答案
1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类。 (2)随着使用经过严格测试的集合框架类,代码质量会得到提高。 (3)通过使用JDK附带的集合类,可以降低代码维护成本。 (4)复用性和可操作性。 2.集合框架中的泛型有什么优点? Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。泛型也使得代码整洁,我们不需要使用显式转换和instanceOf操作符。它也给运行时带来好处,因为不会产生类型检查的字节码指令。 3.Java集合框架的基础接口有哪些? Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。 Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。 List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。 Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。 一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。 4.为何Collection不从Cloneable和Serializable接口继承? Collection接口指定一组对象,对象即为它的元素。如何维护这些元素由Collection的具体实现决定。例如,一些如List的Collection实现允许重复的元素,而其它的如Set就不允许。很多Collection实现有一个公有的clone方法。然而,把它放到集合的所有实现中也是没有意义的。这是因为Collection是一个抽象表现。重要的是实现。 当与具体实现打交道的时候,克隆或序列化的语义和含义才发挥作用。所以,具体实现应该决定如何对它进行克隆或序列化,或它是否可以被克隆或序列化。 在所有的实现中授权克隆和序列化,最终导致更少的灵活性和更多的限制。特定的实现应该决定它是否可以被克隆和序列化。 5.为何Map接口不继承Collection接口? 尽管Map接口和它的实现也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map继承Collection毫无意义,反之亦然。 如果Map继承Collection接口,那么元素去哪儿?Map包含key-value对,它提供抽取key或value列表集合的方法,但是它不适合“一组对象”规范。 6.Iterator是什么? Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获取迭代器实例。迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者在迭代过程中移除元素。 7.Enumeration和Iterator接口的区别? Enumeration的速度是Iterator的两倍,也使用更少的内存。Enumeration是非常基础的,也满足了基础的需要。但是,与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其它线程去修改集合。 迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者从集合中移除元素,而Enumeration不能做到。为了使它的功能更加清晰,迭代器方法名已经经过改善。 8.为何没有像Iterator.add()这样的方法,向集合中添加元素? 语义不明,已知的是,Iterator的协议不能确保迭代的次序。然而要注意,ListIterator没有提供一个add操作,它要确保迭代的顺序。 9.为何迭代器没有一个方法可以直接获取下一个元素,而不需要移动游标? 它可以在当前Iterator的顶层实现,但是它用得很少,如果将它加到接口中,每个继承都要去实现它,这没有意义。 10.Iterater和ListIterator之间有什么区别? (1)我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List。 (2)Iterator只可以向前遍历,
全栈程序员站长
2022/09/08
6970
Java 集合
Java 集合是一个常用的技术 ,无论是在: 开发使用,还是面试总是高频的提及到~
Java_慈祥
2024/08/06
1170
Java 集合
Java集合框架-Collection03-Map集合
目录 1. Map 用一个题目给大家说一下吧! Map集合3层嵌套使用(2Map+1List)  1.2 遍历(代码如下)         1.2.1 先取出保存所有键的Set,再遍历Set即可(2种)         1.2.2 先取出保存所有Entry的Set,再遍历此Set即可 2.HashMap与Hashtable之间的区别(重点) 3. 其它(地狱回调)  ---- 1. Map  1.1 特点:无序、以键值对的形式添加元素,键不能重复,(如果多次往同一个索引存储元素,以最后一个存储为准,后
天蝎座的程序媛
2022/11/18
2270
Java集合框架-Collection03-Map集合
Java集合学习总结
Java集合学习总结 ----------------------------------------------------------------------------- 1:集合 Collection(单列集合的根接口) List接口(有序,元素可重复) ArrayList 底层数据结构是数组,查询快,增删慢。 线程不安全,效率高。 Vector
黑泽君
2018/10/11
5850
Java集合类的使用心得
常用结构:SortedSet是个接口,TreeSet是它的唯一实现类,其中的元素是有序的。
matt
2022/10/25
4560
Java集合类原理实现
在java中所有的数据结构都可以使用数组和指针即引用来实现。而Hash也成散列,就是一个链表加数组实现。
石的三次方
2021/01/05
9060
相关推荐
JAVA集合类汇总
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档