2024年【金三银四求职季】最新2024年Python基础题库与面试技巧(1),字节跳动研发面试流程

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • Django中csrf 的实现机制
第一步:django第一次响应来自某个客户端的请求时,后端随机产生一个token值,把这个token保存在SESSION
状态中;同时,后端把这个token放到cookie中交给前端页面
第二步:下次前端需要发起请求(比如发帖)的时候把这个token值加入到请求数据或者头信息中,一起传给后
端;Cookies:{csrftoken:xxxxx}
第三步:后端校验前端请求带过来的token和SESSION里的token是否一致

  • Django的缓存能使用redis吗?如果可以的话,如何配置?
CACHES = {
	"default": {
		"BACKEND": "django\_redis.cache.RedisCache",
		"LOCATION": "redis://127.0.0.1:6379",
		"OPTIONS": {
		"CLIENT\_CLASS": "django\_redis.client.DefaultClient",
		"CONNECTION\_POOL\_KWARGS": {"max\_connections": 100}
		# "PASSWORD": "密码",
		}
	}
}

  • Django路由系统中name的作用

主要是通过name的值,来查找url地址,可以理解为反射作用。在html模板中使用name来反射url优势就是后期url规则发生改变之后,只需调整urls.py即可,所有的模板文件都不需要修改

  • Django rest framework框架中都有那些组件
认证、权限(授权)、用户访问次数/频率限制、版本、解析器(parser)、序列化、分页、路由系统、视图、渲染器

  • 说说Django rest framework框架的认证流程
1. 当用户进行登录的时候,运行了登录类的as_view()方法,进入了APIView类的dispatch方法
2. 执行self.initialize_request这个方法,里面封装了request和认证对象列表等其他参数
3. 执行self.initial方法中的self.perform_authentication,里面运行了user方法
4. 再执行了user方法里面的self._authenticate()方法

4. Python基础知识

  • 文件操作

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

from mmap import mmap
	def get\_lines(fp):
		with open(fp,"r+") as f:
			m = mmap(f.fileno(), 0)
			tmp = 0
			for i, char in enumerate(m):
				if char==b"\n":
					yield m[tmp:i+1].decode()
					tmp = i+1
					
if name == "\_\_main\_\_":
	for i in get_lines("fp\_some\_huge\_file"):
		print(i)

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

  • 补充缺失的代码
def print\_directory\_contents(sPath):
"""
这个函数接收文件夹的名称作为输入参数
返回该文件夹中文件的路径
以及其包含文件夹中文件的路径
"""
import os
for s_child in os.listdir(s_path):
	s_child_path = os.path.join(s_path, s_child)
	if os.path.isdir(s_child_path):
		print_directory_contents(s_child_path)
	else:
		print(s_child_path)

  • 输入日期, 判断这一天是这一年的第几天?
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

  • 现有字典 d= {‘a’:24,‘g’:52,‘i’:12,‘k’:33}请按value值进行排序?
sorted(d.items(),key=lambda x:x[1])

  • 现有字典 d= {‘a’:24,‘g’:52,‘i’:12,‘k’:33}请按value值进行排序?
sorted(d.items(),key=lambda x:x[1])

  • 将字符串 “k:1 |k1:2|k2:3|k3:4”,处理成字典 {k:1,k1:2,…}
str1 = "k:1|k1:2|k2:3|k3:4"
def str2dict(str1):
dict1 = {}
for iterms in str1.split('|'):
key,value = iterms.split(':')
dict1[key] = value
return dict1
#字典推导式
d = {k:int(v) for t in str1.split("|") for k, v in (t.split(":"), )}

  • python中内置的数据结构有几种?

整型 int、 长整型 long、浮点型 float、 复数 complex、字符串 str、 列表 list、 元祖 tuple、字典 dict 、 集合 set、Python3 中没有 long,只有无限精度的 int

  • python如何实现单例模式?请写出两种实现方式?
#使用装饰器
def singleton(cls):
	instances = {}
	def wrapper(\*args,\*\*kwargs):
		if cls not in instances:
			instances[cls] = cls(\*args,\*\*kwargs)
		return instances[cls]
	return wrapper

@singleton
class Foo(object):
	pass
foo1 = Foo()
foo2 = Foo()
print(foo1 is foo2) # True

#使用基类
class Singleton(object):
	def new (cls, \*args, \*\*kwargs):
		if not hasattr(cls, '\_instance'):
			cls._instance = super(Singleton, cls). new (cls, \*args, \*\*kwargs)
		return cls._instance
		
class Foo(Singleton):
	pass

foo1 = Foo()
foo2 = Foo()

print(foo1 is foo2) # True

  • 请使用一行代码实现1-100之和
sum(range(0,101))

  • is和==有什么区别?

is: 比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象。是否指向同一个内存地址
== : 比较的两个对象的内容/值是否相等,默认会调用对象的eq()方法

  • 统计一个文本中单词频次最高的10个单词?
import re
# 方法一
def test(filepath):
	distone = {}
	with open(filepath) as f:
    for line in f:
        line = re.sub("\W+", " ", line)
        lineone = line.split()
        for keyone in lineone:
            if not distone.get(keyone):
                distone[keyone] = 1
            else:
                distone[keyone] += 1
    num_ten = sorted(distone.items(), key=lambda x:x[1], reverse=True)[:10]
    num_ten =[x[0] for x in num_ten]
    return num_ten


# 方法二
# 使用 built-in 的 Counter 里面的 most\_common
import re
from collections import Counter
def test2(filepath):
    with open(filepath) as f:
        return list(map(lambda c: c[0], Counter(re.sub("\W+"," ", f.read()).split()).most_common(10)))

  • 说说Python的内存管理机制及调优手段?

内存管理机制: 引用计数、垃圾回收、内存池
引用计数:引用计数是一种非常高效的内存管理手段,当一个Python对象被引用时其引用计数增加1,
当其不再被一个变量引用时则计数减1,当引用计数等于0时对象被删除。弱引用不会增加引用计数
调优手段:手动垃圾回收、调高垃圾回收阈值、避免循环引用

  • 什么是lambda函数? 有什么好处?

lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数!它比较轻便,即用即仍,很适合需要完成一项功能,但是此功能只在此一处使用,连名字都很随意的情况下!匿名函数,一般用来给filter,map这样的函数式编程服务、作为回调函数,传递给某些应用,比如消息处理

5. Python设计模式

  • 对设计模式的理解,简述你了解的设计模式?

设计模式是经过总结,优化的,对我们经常会碰到的一些编程问题的可重用解决方案。一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码,反之,设计模式更为高级,它是一种必须在特定情形下实现的一种方法模板!常见的比如工厂模式和单例模式

  • 那既然说到单例,那你说书说单例模式的应用场景?

单例模式应用的场景一般发现在资源共享的情况下,避免由于资源操作时导致的性能或损耗等,如日志文件,应用配置。控制资源的情况下,方便资源之间的互相通信。如线程池等

网站的计数器、应用配置、多线程池、数据库配置、数据库连接池、应用程序的日志应用…

  • 对装饰器的理解,并写出一个计时器记录方法执行性能的装饰器?

装饰器本质上是一个callable object ,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象

import time
from functools import wraps
def timeit(func):
	@wraps(func)
	def wrapper(\*args, \*\*kwargs):
		start = time.clock()
		ret = func(\*args, \*\*kwargs)
		end = time.clock()
		print('used:',end-start)
		return ret
	return wrapper
@timeit
def foo():
	print('in foo()'foo())

  • 解释以下什么是闭包?

在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包

  • 说说生成器,迭代器的区别?

迭代器是遵循迭代协议的对象。用户可以使用 iter() 以从任何序列得到迭代器(如 list, tuple,dictionary, set 等)。另一个方法则是创建一个另一种形式的迭代器 —— generator 。要获取下一个元
素,则使用成员函数 next()(Python 2)或函数 next() function(Python 3) 。当没有元素时,则引发 StopIteration 此例外。若要实现自己的迭代器,则只要实现 next()(Python 2)或 next ()
( Python 3)

生成器(Generator),只是在需要返回数据的时候使用yield语句。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)

区别: 生成器能做到迭代器能做的所有事,而且因为自动创建iter()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序 状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常

  • 请用一行代码 实现将1-N 的整数列表以3为单位分组
N =100
print ([[x for x in range(1,100)] [i:i+3] for i in range(0,100,3)])

  • Python中yield的用法?

yield就是保存当前程序执行状态。你用for循环的时候,每次取一个元素的时候就会计算一次。用yield的函数叫generator,和iterator一样,它的好处是不用一次计算所有元素,而是用一次算一次,可以节
省很多空间,generator每次计算需要上一次计算结果,所以用yield,否则一return,上次计算结果就没了

6. 系统编程

  • 谈谈你对多进程,多线程,以及协程的理解,项目是否用?

进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单
位,进程拥有自己独立的内存空间,所有进程间数据不共享,开销大

线程: cpu调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在,一个进程至少有一个线
程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率

协程: 是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和 栈,直接操中栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快

  • Python异步使用场景有那些?

(1)不涉及共享资源,获对共享资源只读,即非互斥操作
(2)没有时序上的严格关系
(3)不需要原子操作,或可以通过其他方式控制原子性
(4)常用于IO操作等耗时操作,因为比较影响客户体验和使用性能(5)不影响主线程逻辑

  • 什么是多线程竞争?

线程是非独立的,同一个进程里线程是数据共享的,当各个线程访问数据资源时会出现竞争状态即:数据几乎同步会被多个线程占用,造成数据混乱,即所谓的线程不安全!

那么怎么解决多线程竞争问题?-----------锁

锁的好处: 确保了某段关键代码(共享数据资源)只能由一个线程从头到尾完整地执行能解决多线程资源竞争下的原子操作问题

锁的坏处: 阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了

锁的致命问题: 死锁

  • 解释以下什么是锁,有哪几种锁?

锁(Lock)是python提供的对线程控制的对象。有互斥锁,可重入锁,死锁

  • 那么什么是死锁?

若干子线程在系统资源竞争时,都在等待对方对某部分资源解除占用状态,结果是谁也不愿先解锁,互相干等着,程序无法执行下去,这就是死锁

  • 说说同步,异步,阻塞,非阻塞?

同步: 多个任务之间有先后顺序执行,一个执行完下个才能执行

异步: 多个任务之间没有先后顺序,可以同时执行,有时候一个任务可能要在必要的时候获取另一个同时执行的任务的结果,这个就叫回调!

阻塞与非阻塞: 如果卡住了调用者,调用者不能继续往下执行,就是说调用者阻塞了。如果不会卡住,可以继续执行,就是说非阻塞的

  • python中进程与线程的使用场景?

多进程适合在CPU密集操作(cpu操作指令比较多,如位多的的浮点运算)。多线程适合在IO密性型操作(读写数据操作比多的的,比如爬虫)

  • python中asyncio的原理?

asyncio这个库就是使用python的yield这个可以打断保存当前函数的上下文的机制, 封装好了selector摆脱掉了复杂的回调关系

7. 数据结构

  • 无重复字符的最长子串-Python实现

可以利用滑动窗口、动态规划、双指针等方法解决该问题

class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
	res = 0
	mark = set() # 用集合标明是否有出现重复字母
	r = 0 # 右指针
	for i in range(len(s)):
		if i != 0:


文末有福利领取哦~
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

👉**一、Python所有方向的学习路线**

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。![img](https://img-blog.csdnimg.cn/c67c0f87cf9343879a1278dfb067f802.png)

👉**二、Python必备开发工具**

![img](https://img-blog.csdnimg.cn/757ca3f717df4825b7d90a11cad93bc7.png)  
👉**三、Python视频合集**

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。  
![img](https://img-blog.csdnimg.cn/31066dd7f1d245159f21623d9efafa68.png)

👉 **四、实战案例**

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。**(文末领读者福利)**  
![img](https://img-blog.csdnimg.cn/e78afb3dcb8e4da3bae5b6ffb9c07ec7.png)

👉**五、Python练习题**

检查学习结果。  
![img](https://img-blog.csdnimg.cn/280da06969e54cf180f4904270636b8e.png)

👉**六、面试资料**

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。  
![img](https://img-blog.csdnimg.cn/a9d7c35e6919437a988883d84dcc5e58.png)

![img](https://img-blog.csdnimg.cn/5db8141418d544d3a8e9da4805b1a3f9.png)

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值