5道Python筆試面試題

2021-10-21 06:08:02 字數 4355 閱讀 9124

1.字串處理

將字串中的數字替換成其兩倍的值,例如:

個人思路:先用正規表示式將其中的數字匹配出來進行乘2操作,然後將字串根據其中的數字進行切割,得到乙個字元列表,最終將乘以2後的數字和原有的字元進行拼接得到最後的結果。

import re

text =

"as7g123m (d)f77k"

nums = re.findall(r'(\d+)'

, text)

# 取出字串中數字

double_nums =[2

*int

(i)for i in nums]

# 乘以2

the_str =

# 字元列表

for i in nums:1)

[0])

text = text.split(i,1)

[1]result =

""# 結果

for i in

range

(len

(double_nums)):

result += the_str[i]

+str

(double_nums[i]

)result += text

print

(result)

2.python傳參是值傳遞還是引用傳遞?

'''

'''def

f(x)

:print(id

(x))

a =1print(id

(a))

f(a)

# 140716760159264

# 140716760159264

這裡分別列印了兩個位址,乙個是物件a的位址,乙個是傳入的引數x的位址,可以看到兩個位址是一樣的,這也就說明python中的傳參使用的引用傳遞!需要注意的是:對於不可變型別,在函式中對其操作並不會對原物件產生影響,但對於可變型別,在函式中對其操作則可能會改變其值,如下:

1)傳入的引數是不可變型別:

'''

'''def

f(x)

: x +=

"666"

# 這裡會建立乙個新的物件

print

(x)s =

"777"

# 字串不可變

print

(s)f(s)

print

(s)# 777

# 777666

# 777

2)傳入的引數是可變型別:

def

f(x):4

)# 修改原物件的值

print

(x)s =[1

,2,3

]# 列表可變

print

(s)f(s)

print

(s)# [1, 2, 3]

# [1, 2, 3, 4]

# [1, 2, 3, 4]

3.淺拷貝與深拷貝的那些事

在python中,淺拷貝與深拷貝是一定要分清楚的!對於淺拷貝和深拷貝,可以這麼理解:

1)淺拷貝:建立乙個物件,但其中包含的是原物件中所包含項的引用,如果用引用的方式修改了其中的物件,就會對原物件進行改變。

2)深拷貝:建立乙個物件,並且遞迴複製原物件中所包含的物件,此時修改資料不會對原物件產生影響。

在下面的**中包含了賦值、淺拷貝和深拷貝,在python中賦值即引用物件,所以對c操作也就是對原物件a進行操作,對於淺拷貝物件b和d,對其中的引用進行操作會改變對a中的物件,而對深拷貝物件e進行操作就與原物件a無關了。

import copy

a =[1,

[2],

3]b = a[:]

# 使用切片操作,淺拷貝

c = a # 賦值操作,即引用

d = a.copy(

)# 淺拷貝

e = copy.deepcopy(a)

# 深拷貝4)

5)6)

d[1]2

)7)e[

1]3)

print

(a)# [1, [2, 2], 3, 5]

print

(b)# [1, [2, 2], 3, 4]

print

(c)# [1, [2, 2], 3, 5]

print

(d)# [1, [2, 2], 3, 6]

print

(e)# [1, [2, 3], 3, 7]

4.python一行式能幹嘛?

下面是一些python一行式的示例,從中可以看出python是非常簡潔和強大的!

1)一行**輸出一百以內的奇數:

print

([x for x in

range

(100

)if x %2]

)

2)一行**求水仙花數:

print

([x for x in

range

(100

,1000)if

int(

str(x)[0

])**3

+int

(str

(x)[1]

)**3+

int(

str(x)[2

])**3

== x]

)

3)一行**列印九九乘法表:

print(""

.join(

["{} * {} = {}\t"

.format

(x, y, x * y)

if x != y else

"{} * {} = {}\n"

.format

(x, y, x * y)

for x in

range(1

,10)for y in

range(1

, x +1)

]))

print

("0b"

+" "

.join(

("00000000"

+bin

(int

(i))

.replace(

"0b",""

))[-

8:]for i in ip.split(

".")

))

5)一行**求1到10的和:

from functools import

reduce

;print

(reduce

(lambda x, y: x + y,

[i for i in

range(1

,11)]

))

5.下面這段**的結果是什麼?

'''

'''def

mul():

return

[lambda x: x * i for i in

range(4

)]print

([m(2)

for m in mul()]

)

以上這段**輸出的結果是[6, 6, 6, 6],而不是[0, 2, 4, 6]!

產生這個問題的原因在於python閉包的延遲繫結。這意味著內部函式被呼叫時,引數的值在閉包內進行查詢。所以當mul()返回的函式被呼叫時,i的值會在返回的函式裡查詢,而for迴圈完成後i的值為3,也就是i最終賦值為3。因此,每次返回的函式乘以傳入的值就是最後的結果,得到的結果就是[6, 6, 6, 6]。

1)使用python生成器。

def

mul():

for i in

range(4

):yield

lambda x: x * i

print

([m(2)

for m in mul()]

)

2)創造乙個閉包,利用預設函式進行繫結。

def

mul():

return

[lambda x, i=i: x * i for i in

range(4

)]print

([m(2)

for m in mul()]

)

筆試面試題

1 昨天參加一公司筆試,給幾道演算法題整懵了,其實也不難,但好久沒有碰演算法,只是有思路,要讓我在這麼短的時間內寫出程式來還是不行。2 這裡將其中一道稍微複雜一點的演算法題寫下來,以此小結。3 4 題目描述 5 將n個雞蛋放入到m個籃子中去 n m 保證每個籃子中至少乙個雞蛋,然後指定乙個數x,要求...

面試題 筆試

題1 有如下資料庫表tab 請用乙個 delete 語句,刪除 value 重複的行,每個 value 只保留 id 最小的一行。delete from tab where id notin select from select min id from tab groupby value a 好像有...

筆試面試題

1.書架上有編號為1 19的19本書,從中拿5本,問5本編號都不相鄰的拿法有多少種?使用隔板法,拿掉5本後剩下14塊板,即有15個空,使用組合15份插5份 c15 5 3003 2.1億個資料取前1萬大的整數 演算法思路 a.把1億個資料分成10000個陣列,b.求出10000個陣列的最大值,儲存到...