Python 刷題筆記
本文記錄了我在使用python刷題的時候遇到的知識點。
選擇、填空題
-
Python3 中,布爾型只有 True 和 False 兩個值,但它們的值本質上是 1 和 0,因此它們可以和數字進行數學運算。 正確 e.g.
True+1 == 2 -
在Python 3.X版本中,整除運算符產生的結果的數據類型可能為浮點型 正確 e.g.
33.2 // 3 == 11.2 -
要將3.1415926變成00003.14,如何進行格式化輸出 "%08.2f"% 3.1415926
-
如果一句Python代碼過長,可在行末寫下符號"/",然后換行繼續寫 錯誤 分行是\或者()
-
字典的鍵可以是字符串常量也可以是整型常量,甚至還可以是列表 錯誤 列表不能作為字典的鍵
-
對於數字n,如果表達式 0 not in [n%d for d in range(2, n)]的值為True,則說明n是素數 正確
列出了所有的 n% 2~n的數字值 如果0不在就說明是素數 -
for循環結束后,循環變量i不存在,導致程序錯誤 錯誤!
i變量會是最后的值 -
表達式(i**2 for i in range(100))的結果是個元組 錯誤! 這是一個生成器 e.g.
(i**2 for i in range(10))
> for i in a:
... print(i)
0 1 4 9 16 25 ...
-
正則表達式'\d{5}'可用來檢查字符串是否為5個數字字符組成的字符串 錯誤
可匹配5個數字的模式 但是一串可能有多個這樣的子串? -
下面不能嚴格匹配YYYY-MM-DD這樣日期格式的正則表達式是
A.\d{4}-\d{2}-\d{2}
B.[0-9]-[0-9]-[0-9]
C.[0-9]{4}-[0-9]{2}-[0-9]{2}
D.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]
-
如果遞歸函數沒有遞歸結束的語句,將會導致無窮遞歸,從而執行時出現“死循環” 錯誤
解釋:遞歸是不斷有函數進入棧,就像翻不完的書,不是死循環。 -
write方法用於把字符串寫入文本文件並在最后添加換行符。 錯誤
-
如果首先以讀模式打開一個文件,然后用seek方法把文件指針定位到文件的最后,再通過tell方法就可以得到一個文件的長度。 ** 正確**
-
異常 a undefined
def main():
a,b=eval(input())
try:
s=a/b
print(s)
except:
print("Divide 0!")main()
基本輸入輸出
待消化sys.stdout
sys.stdin 與input
sys.stdin.readlines() or readline
前者一次讀入多行,返回一個行列表,每個元素為輸入的每行內容。
結束輸入Linux: ctrl+d+enter, Windows: ctrl+z+enter
import sys
#實現和input一樣的功能
print("please input something\n")
s = sys.stdin.readline()
print(s, end='') #會讀入\n, input不會
#文件作為整體的輸入
for line in sys.stdin.readlines():
if not line:
break
else:
print (line)
C:\> python test.py < 123.txt
對輸入結束的判斷
sys.stdin
for lin in sys.stdin:
input()
try:
...
except EOFError:
pass
運行腳本時傳入參數
sys.argv
argv[0] 是被調用的腳本的文件全名或全路徑,argv[1]和一會的就是傳入的數據
python filename.py 1,2,3 10
import sys
arg1 = sys.argv[1]
arg2 = sys.argv[2]
print(arg1, type(arg1), type(arg2))
1,2,3 str str
argparse
import argparse
parser = argparse.ArgumentParser(description='manual to this script')
parser.add_argument('--gpus', type=str, default = None)
parser.add_argument('--batch-size', type=int, default=32)
args = parser.parse_args()
print(args.gpus, type(args.gpus))
print(args.batch_size, type(args.batch_size))
D:\>python argv_test.py --gpus=0,1,2 --batch-size=20
0,1,2 <class 'str'>
20 <class 'int'>
Python語言基礎
-
Python的浮點數常量也有十進制、二進制、八進制和十六進制等表示方式 X 十進制, 科學計數法
-
pow(x,y,z) -> x**y%z
-
type(1+8.0//4) == float 整除的結果取決於被除數和除數的類型
序列
列表
-
只能通過切片訪問列表中的元素,不能使用切片修改列表中的元素 錯誤
-
兩個列表相加
newlist = [x+y, for x,y in zip(list1, list2)] -
現有列表 k = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0],那么Python3解釋器執行 k.insert(-2, 'b')后執行k[-2]的結果是 9 b插入在9的位置 9 0 向后移動
元組
-
創建只包含一個元素的元組時,必須在元素后面加一個逗號,例如 a = (3,)正確
如果是a = (3) 或者a = ('a') 類型分別為int和str,只有一個元素的元組一定要加上, -
列表可以是元組內的元素,可以改變元組內列表的值
字典
- 合並兩個字典
a={'a':1,'b':2}
b={'a':3,'c':4}
a.update(b)
c = dict(a,**b)
- 字典中的“鍵”必須是可哈希對象,不能是列表,可以是元組,字符串,數值
集合
- 集合中的元素必須是不可變類型,即列表不可以是集合內的元素
選擇與循環
a = range(100)哪些操作合法:a[-3],a[2:13], a[::3]- a[a🅱️c] range(a, b, c)
- s
字符串與正則表達式
字符串
-
要一次去掉字符串中的 , . 等符號,可以使用
maketrans和translate方法 -
'GUN's Not %s %%' % 'UNIX' >> "GUN's Not UNIX %"
-
表達式
'a' + 1的值為 'b' 錯誤
chr(ord('a') + 1) -
s
正則
-
假設re模塊已成功導入,並且有
pattern = re.compile('^'+'\.'.join([r'\d{1,3}' for i in range(4)]) + '$'),那么表達式pattern.match('192.168.1.103')的值為None -
'back'match 'backup'√ match 'text.back' X
函數
在函數中修改傳入參數的值
- 整數,浮點數等不會因函數內變化而變
- 列表對象在id不變的時候會影響到外部的
- 輸出結果 F f C ls是全局變量
ls = ["F", "f"]
def fun(a):
ls.append(a)
return
fun("C")
print(ls)
- 輸出結果10 None ss比函數遲聲明 函數內的ss為局部變量
def hub(ss, x=2.0, y=2.0):
ss += x*y
ss = 10
print(ss, hub(ss, 3))
-
對於組合數據類型的全局變量,如果在函數內部沒有被真實創建的同名變量,則函數內部不可以直接使用並修改全局變量的值 錯誤 類似上述1 的情況
-
Python函數支持可變數量的參數,實參用“ *參數名 ”表示 錯誤 形參用
*參數名表示
面向對象
文件
參數encoding是指明對文件編碼,僅適用於文本文件。如果不明編碼方式,默認是使用locale.getpreferredencoding()函數返回的編碼方式。
seek(offset, from)方法
offset 文件指針偏移量, from: 0 文件開頭 1當前位置 2文件末尾 默認為0 可以通過seek(0,2)定位到文件末尾
- 用python刪除文件和用linux命令刪除文件
os.remove(path)rm file_path
異常
- Python中,對於代碼中的每個try,必須至少有一個except與它匹配 錯誤可以只有try finally
- 是
未分類
常見數學
3.5題目※
- 因數 i%n ==0 且n!=i n!=1 n是i的因數
- 素數 大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。
- 完全數
- 真因子
- 完全平方數: 2 * 2 = 4 8 * 8 =64
- 互質:互質是公約數只有1的兩個整數,叫做互質整數。公約數只有1的兩個自然數,叫做互質自然數,后者是前者的特殊情形。
- 完數
- 水仙花數
歐幾里得(輾轉相除法)求兩個正整數a, b的最大公約數
1)如果a<b,交換a,b的值2)r=a mod b(即r是a÷b的余數),若 r = 0,算法結束,b即為答案3)否則,互換:a ← b,b←r,並返回第一步。
快速判斷是否是素數
原理:所有自然數可以用集合A = { 6n, 6n+1, 6n+2, 6n+3, 6n+4, 6n+5 }表示,其中 n >= 0,顯然,子集B = {6n, 6n+2, 6n+3, 6n+4}內的元素都不是素數,所以只有6n+1和6n+5可能是素數,素數一定可以用6n+1和6n+5其中的一個形式表示,即大於等於5的素數與6的倍數相鄰
判斷一個數num是否是素數時,需要判斷num是否有除1和自身之外的因子。這時只需要判斷x是否是num的因子,其中1 < x <= int(sqrt(num)),而x的范圍又可以用集合{ 6i, 6i+1, 6i+2, 6i+3, 6i+4, 6i+5 }表示。當num與6的倍數相鄰時,num才可能是素數,因為num(奇數)和{6i, 6i+2, 6i+3, 6i+4}(偶數)互素,也就是{6i, 6i+2, 6i+3, 6i+4}不可能是num的因子,此時只需判斷x = 6i+1和x = 6i+5是否是num的因子即可,如果都不是,則num是素數。
————————————————
原文鏈接:https://blog.csdn.net/qq_36963214/article/details/90490364
def is_prime_fast(num):
if num <= 1:
return False
elif num == 2 or num == 3:
return True
elif num % 6 in (0, 2, 3, 4):
return False
else:
half = int(sqrt(num)) + 1
for i in range(5, half, 6):
# 只需判斷6i+1 和6i+5是不是num的因子即可
if num % i == 0 or num % (i+2) == 0:
return False
else:
return True
性能評估
from time import perf_counter
start = perf_counter()
print(perf_counter()-start)
numpy
import numpy as np
a = np.repeat(np.arange(5).reshape([1,-1]),10,axis = 0)+10.0 b = np.random.randint(5, size= a.shape)
c = np.argmin(a*b, axis=1)
b = np.zeros(a.shape)
b[np.arange(b.shape[0]), c] = 1
print b
random
random()不需要參數 返回0~1隨機小數
random.sample(pop, k) 從pop類型中隨機宣區k各元素構成的列表
-
is 和 ==的區別 前者比較對象的id 后者比較 對象的value
-
列舉幾個你用過的第三方庫 簡單介紹一下用途
-
函數的可變長度參數 有什么形式(*arg, *kwarg)
- 前者接收任意個實參並放到一個元組中
- 后者類似 關鍵參數 一樣顯示賦值多個實參 並放入字典中
-
列表對象的復制 非拷貝方法(直接賦值) 拷貝方法(淺拷貝 深拷貝)
https://www.cnblogs.com/Black-rainbow/p/9577029.html -
能否舉出幾個 Python2 和 3不同的地方
- print語法 print "xxx" -> print("xxx")
- 2的字符串是ascii類型 unicode是單獨的 3中有字符串類(unicode)以及字節類byte和bytearrays 且源碼默認utf-8
- 除法運算 3中的
/是真除法 (整數之間的相除,結果也會是浮點數)//是整除 2的/是整除 - 2中有xrange()和range() 前者像生成器 惰性求值 后者返回整個列表 3中只有range類似2的xrange
- 3 bin() 整數轉二進制
- x進制數寫法 0?111 e.g. 二0b111 八0o777
- 不等運算符 2有 != 和 <> 3只有前者
-
python的垃圾回收機制 https://www.cnblogs.com/ajianbeyourself/p/11151498.html
- 引用計數 每個對象含一個ob_ref字段 計算被引用次數 清0立刻回收
- 標記清除 解決對象的循環引用問題 e.g. AB 相互引用 但是AB都del了 ; 階段1給活動對象打標記 階段2 回收非活動對象
- 分代回收 將內存根據對象的存活時間划分為不同的集合,每個集合稱為一個代;垃圾收集頻率與對象的存活時間的增大而減小
-
函數和方法有什么區別 如何判斷一個對象是函數還是方法 https://www.cnblogs.com/xcsg/p/10551114.html
- 函數:FunctionType 直接def的是函數 類中的函數 通過類的方式調用 也是函數
<function Work.show at 0x000001CC55BC5268> - 方法:MethodType 類中的函數 通過實例化對象調用 為方法
<bound method Work.show of <__main__.Work object at 0x000001CC55C2F240>> - 判別方式 1.直接print會得到上面的描述 2.
isinstance(對象, FunctionType)isinstance(對象, MethodType)
- 函數:FunctionType 直接def的是函數 類中的函數 通過類的方式調用 也是函數
