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個陣列的最大值,儲存到...