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