1.Python 的深拷贝和浅拷贝有什么区别?
浅拷贝【ls.copy()】:
将列表的不可变对象【值】复制一份,同时引用其中的可变对象【列表】,共用一个内存地址
深拷贝【ls=copy.deepcopy(list)】:
完全的复制原可变对象,生成新的可变对象,两个对象互相独立
2.列表和元组的区别是什么?
1. 列表
概念:有序序列,使用[ ]定义,元素之间用,隔开有序序列
增删改操作:可以增删改列表的任意元素不可变元素;2. 元组
概念:使用( )定义,元素之间用,隔开
增删改操作:- 元素项不可更改;- 元组中可变有序序列可以更改;- 不能删除元素项,只能删除整个元组
3.什么是迭代器,什么是生成器?在一个生成器用 yield 返回的中途把 yield 换成 return 是否可行?
迭代器:符合迭代器协议的对象,实现__iter__和__next__两个方法,前者表示迭代器本身,后者表示迭代器的下一个元素【例:斐波那契数列】,是用来访问的
生成器:是一个特殊的迭代器,按需动态生成值【惰性求值】,避免一次性生成大量数据占用大量内存,只有使用yield关键字时才会返回一个值,并且程序暂停执行,直至下一次迭代【状态保持】
生成器本身就是一个迭代器,调用使用yield关键字的函数,返回的是一个生成器对象,此时函数还没有执行,通过一个for循环,调用__next__方法时才会返回函数的值。在此过程中,yield会分段生成值。
而普通函数中使用return,返回的是该函数的结果,并且return用于终止函数,中途将yield改为return会导致生成器提前终止
4.lambda 的作用和适用场景是什么?
lambda函数就是没有名字的,只能使用一次的临时函数,一个函数体只有一条语句和一个返回值,用于实现简单功能。
lambda 返回值:表达式
适用场景:
- 简单计算
。搭配高阶函数map() reduce() filter()
- 拓展常用高阶函数:
。map应用到一个序列的每个元素,返回迭代器
ret=list(map(lambda x:x+2,ls))
。reduce对序列进行累计
ret=reduce(lambda x,y:x*y,ls)
。filter遍历序列中的元素,根据条件筛选,返回迭代器
ret=list(filter(lambda x:x%2==0,ls))
5.Python 和 Java 的多线程有什么区别?
Python线程执行受GIL限制,是单核执行;而Java可以多核并行执行
Python线程的创建方式是依赖threading模块;而Java是依赖Runnable接口或Thread类
Python的线程同步是使用Lock、Semaphore等同步原语;而Java是使用synchronized等关键字
Python线程池的创建通过concurrent.futures.ThreadPoolExecutor或multiprocessing.pool.ThreadPool实现;而Java通过ExecutorService接口及Executors工厂类创建线程池
Python线程适用场景是I/O密集型任务;而Java则适用于I/O密集型任务和CPU密集型任务
6.Python 的装饰器是什么?请举例说明其作用。
- 装饰器本质上是一种特殊的嵌套函数【在一个函数内部又定义了另一个函数】
它接收一个函数【被装饰的函数】作为参数,返回一个新的函数【装饰后的函数】
装饰器最大的作用就是可以让我们在不改变被装饰函数的情况下,给被装饰函数添加新的功能。
def disc(func):def inner():print('我是生活在一个小树苗下的小草')func()print('我是小树苗庞的石头')return inner
def func():print('我是一棵小树苗')func=disc(func)
func()
7.如何加载一个文本文件并获取其中最长的英文单词?
编程思路:
- 打开文件获取数据【with open('path','r',encoding='utf-8') as file:】
- 清洗数据【去除非英文字符,分割为单词】
- 比较单词长度【直接用max(单词列表,key=len)或使用len()函数遍历比较】
import redef find_longest_english_word(file_path):with open(file_path, 'r', encoding='utf-8') as file:content = file.read()cleaned_content = re.sub(r'[^a-zA-Z]', ' ', content).lower()words = cleaned_content.split()english_words = [word for word in words if word.isalpha()]if not english_words:return Nonelongest_word = max(english_words, key=len)return longest_word
if __name__ == "__main__":file_path = "example.txt" longest_word = find_longest_english_word(file_path)if longest_word:print(f"最长的英文单词是: {longest_word},长度为 {len(longest_word)}")else:print("文件中未找到英文单词。")
8.is 和 == 的区别是什么?
is:判断两个对象是否指向同一内存地址
一般判断对象是否是:None、True、False
==:判断两个值是否相等
9.range 是什么?
- Python的一个内置函数,用于生成不可变的整数序列
- 参数:range(start,stop,step)
.开始【包含】
.结束【不包含】
.步长【可以为负值,此时start必须大于stop才是有效的】
10.给你一个数字序列,怎么求其中的质数?
质数:大于1且只能被1和本身整除
ls=[1,3,5,7,9]
判断思路:
- n<=1 小于等于1不是质数
- n==2 2是质数,其他偶数都不是质数
- n>2 奇数,检查从3到n的算数平方根能否整除
- 遍历列表执行上面三步操作
【注意】:
- 如果序列很长,可以使用迭代器获取列表内的值,节省内存
- 对于超大规模序列,可以考虑使用多进程/多线程加速判断
11.怎么改变 list 的类型,比如如何把一个列表变成一个集合或者一个元组?
在python中直接使用内置函数转换就可以
list_set=set(list)【会自动去重】
list_tuple=tuple(list)
12.知道 reduce 函数吗?其作用是什么?
reduce函数是一种高阶函数
作用:对序列进行累计,这里的累计可以是加减乘除
ls=[1,2,3,4,5]
reduce(lambda x,y:x*y,ls)=1*2*3*4*5=120