中国航天科工二院Python实习面经
Python开发实习生(西安)面经
10.14面试(25min)
1.自我介绍
2.python的浅拷贝和深拷贝你是怎么理解的?
浅拷贝只复制对象的引用,新对象和原对象共享数据,深拷贝复制整个对象及其所有嵌套对象,新对象和原对象独立。用copy模块的copy()函数进行浅拷贝,使用copy模块的deepcopy()函数进行深拷贝。
3.有一个列表,里面的数分别是[1,2,3,[4,5,6]],如果我把[4,5,6]改成[7,8,9],那浅拷贝和深拷贝都有哪些变化?
如果使用浅拷贝,原列表和新列表中的嵌套列表仍然是同一个对象,因此将新列表中的嵌套列表修改为[7,8,9],原列表中的嵌套列表也会被修改为[7,8,9]。
如果使用深拷贝,原列表和新列表中的嵌套列表是不同的对象,因此将新列表中的嵌套列表修改为[7,8,9],原列表中的嵌套列表不会受到影响,仍然是[4,5,6]。
4.面试官:一个服务器有4GB的内存,怎么去读取5GB的数据?首先是可以肯定的是如果你一次把它全部读出来,他服务器肯定就卡死了。
可以将5GB的数据进行分块读取,每次只读取一部分数据并进行处理,处理完成后释放该部分数据的内存,再读取下一部分数据进行处理,以此类推,直到处理完所有数据。这样可以有效避免一次性读取过多数据导致服务器内存溢出的问题。
面试官:对,对于分批你是有什么样的想法?
对于数据分块,可以采用以下方法:
- 固定块大小:将数据分成固定大小的块进行处理,例如每块1MB或者2MB。
- 动态块大小:根据数据特性来动态调整块大小,例如按行读取文本数据,每个块包含多少行可以动态调整。
- 缓存块数据:将数据分成块后,可以将当前块及其前后若干块的数据缓存到内存中,以加快数据访问速度。
- 多线程或多进程处理:可以将数据分成多个块,用多线程或多进程同时处理不同的块,以提高处理效率。
5.python有一种节省空间的东西叫什么?
迭代器
6.迭代器这个概念有接触过吗?
Python迭代器是一种访问集合元素的方式,可以逐个返回元素,而无需将整个集合加载到内存中。它通过
__iter__()
和__next__()
方法实现,可以在for
循环中使用。
7.python的字典是有序的还是无序的?
Python 3.7之前的字典是无序的,3.7及以后版本会保持插入顺序,但不是严格意义的有序,可以通过OrderedDict实现严格有序的字典。
8.有一个字典{a: 1,b: 3,c: 2},我怎么通过字典的值去给字典的键值对排一下序呢?
使用字典的
items()
方法将其转化为元组列表,然后使用sorted()
函数并指定key
参数为值即可。例如:sorted(d.items(), key=lambda item: item[1])
,其中d
为原字典。
9.有一个列表,列表里面的元素是字典,[{a: 2}, {b: 1}],每个字典只有一个键值对,如何对这个列表里面的字典进行一个排序?
使用
sorted()
函数并指定key
参数为字典的键即可排序。例如:sorted(lst, key=lambda d: list(d.keys())[0])
,其中lst
为原列表。
10.有一个列表,列表里面的元素都是数值,我怎么能对这个列表的数值进行排序?
使用
sort()
方法或sorted()
函数对列表进行排序,例如:lst.sort()
或sorted(lst)
,默认为升序,可以通过reverse
参数设置为降序。
11.如何对列表里面的元素去重?
使用
set()
函数将列表转换为集合,集合会自动去重,然后再将其转换为列表即可。例如:lst = list(set(lst))
,其中lst
为原列表。
12.如果列表里面的元素是字典呢?怎么对列表里面的元素进行去重?还能用set吗?
不能直接使用
set()
函数对列表元素是字典的列表进行去重。可以使用unique_ever_seen
生成器和json.dumps()
函数对字典进行序列化后再去重。例如:new_lst = list({json.dumps(d, sort_keys=True): d for d in lst}.values())
,其中lst
为原列表。
13.python的匿名函数有接触过吗?或者lambda函数有接触过吗?
Python的lambda函数是一种匿名函数,可以在一行代码中定义简单的函数。使用
lambda
关键字定义,可以接受任意数量的参数,但只能返回一个表达式的值。常用于函数式编程和高阶函数中。例如:lambda x, y: x + y
定义一个接受两个参数的函数,返回两个参数的和。
14.正则有接触过吗?
Python的正则表达式(Regular Expression)是一种字符串处理工具,用于匹配、搜索和替换文本。通过
re
模块使用,支持元字符、字符集、重复和分组等特性。常用于文本处理和数据清洗等场景。例如:re.findall(pattern, string)
在字符串中查找符合某种模式的所有子串并以列表形式返回。
15.正则的贪婪匹配和非贪婪匹配你是怎么理解的?区别是什么?
正则表达式的贪婪匹配是尽可能匹配更长的子串,而非贪婪匹配是尽可能匹配更短的子串。贪婪匹配使用
*
、+
、{m,n}
等元字符,非贪婪匹配在元字符后加上?
,如*?
、+?
、{m,n}?
等。区别是贪婪匹配匹配尽可能多的字符,非贪婪匹配匹配尽可能少的字符。
16.能说一下Django框架的生命周期吗?
Django框架的生命周期包括:1. 请求阶段:中间件和URL路由处理请求;2. 视图阶段:视图函数处理请求并返回响应;3. 响应阶段:中间件处理响应并返回给客户端。每个阶段都有相应的钩子函数、中间件和信号,用于扩展框架的功能和控制请求和响应的处理过程。
17.Django的这个models主键有使用过吗?
18.Django的orm有使用过吗?
19.Django操作数据库是怎么操作的?
Django通过ORM(对象关系映射)操作数据库,将数据库表映射为Python类,通过操作Python类的属性和方法来操作数据库。使用
models
模块定义数据模型和字段,使用QuerySet
对象查询和过滤数据,使用migrations
模块管理数据库迁移。支持多种数据库后端和事务管理。
20.在代码里面给一个数据库里面添加一条记录,是怎么添加的?
使用数据模型对应的类创建一个实例,给实例的属性赋值,然后调用
save()
方法保存到数据库中即可。例如:obj = MyModel(field1=value1, field2=value2); obj.save()
,其中MyModel
是数据模型对应的类,field1
和field2
是该模型的字段名,value1
和value2
是要添加的记录的值。
21.我有一个班级表,新来一个人员我肯定是要在班级表里面去加上这个人的信息,怎么去写这个操作
使用数据模型对应的类创建一个实例,给实例的属性赋值,然后调用
save()
方法保存到数据库中即可。例如:obj = Student(name='Tom', age=18); obj.save()
,其中Student
是数据模型对应的类,name
和age
是该模型的字段名,Tom
和18
是要添加的学生的姓名和年龄
22.采用了多线程threading开发,具体是这个多线程是怎么写的?这几行语句
23.我如果要给这个传一个参数呢,这个怎么去写?
#中国航天科工二院##实习面经##Python#