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 None longest_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