Python 刷題筆記


Python 刷題筆記

本文記錄了我在使用python刷題的時候遇到的知識點。

選擇、填空題

  1. Python3 中,布爾型只有 True 和 False 兩個值,但它們的值本質上是 1 和 0,因此它們可以和數字進行數學運算。 正確 e.g. True+1 == 2

  2. 在Python 3.X版本中,整除運算符產生的結果的數據類型可能為浮點型 正確 e.g. 33.2 // 3 == 11.2

  3. 要將3.1415926變成00003.14,如何進行格式化輸出 "%08.2f"% 3.1415926

  4. 如果一句Python代碼過長,可在行末寫下符號"/",然后換行繼續寫 錯誤 分行是\或者()

  5. 字典的鍵可以是字符串常量也可以是整型常量,甚至還可以是列表 錯誤 列表不能作為字典的鍵

  6. 對於數字n,如果表達式 0 not in [n%d for d in range(2, n)]的值為True,則說明n是素數 正確
    列出了所有的 n% 2~n的數字值 如果0不在就說明是素數

  7. for循環結束后,循環變量i不存在,導致程序錯誤 錯誤
    i變量會是最后的值

  8. 表達式(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 ...
  1. 正則表達式'\d{5}'可用來檢查字符串是否為5個數字字符組成的字符串 錯誤
    可匹配5個數字的模式 但是一串可能有多個這樣的子串?

  2. 下面不能嚴格匹配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]
  1. 如果遞歸函數沒有遞歸結束的語句,將會導致無窮遞歸,從而執行時出現“死循環” 錯誤
    解釋:遞歸是不斷有函數進入棧,就像翻不完的書,不是死循環。

  2. write方法用於把字符串寫入文本文件並在最后添加換行符。 錯誤

  3. 如果首先以讀模式打開一個文件,然后用seek方法把文件指針定位到文件的最后,再通過tell方法就可以得到一個文件的長度。 ** 正確**

  4. 異常 a undefined

def main():
    a,b=eval(input())
    try:
        s=a/b
        print(s)
    except: 
        print("Divide 0!")main()

基本輸入輸出

待消化sys.stdout

sys.stdininput

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語言基礎

  1. Python的浮點數常量也有十進制、二進制、八進制和十六進制等表示方式 X 十進制, 科學計數法

  2. pow(x,y,z) -> x**y%z

  3. 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)
  • 字典中的“鍵”必須是可哈希對象,不能是列表,可以是元組,字符串,數值

集合

  • 集合中的元素必須是不可變類型,即列表不可以是集合內的元素

選擇與循環

  1. a = range(100) 哪些操作合法:a[-3],a[2:13], a[::3]
    • a[a🅱️c] range(a, b, c)
  2. s

字符串與正則表達式

字符串

  1. 要一次去掉字符串中的 , . 等符號,可以使用maketranstranslate方法

  2. 'GUN's Not %s %%' % 'UNIX' >> "GUN's Not UNIX %"

  3. 表達式'a' + 1 的值為 'b' 錯誤
    chr(ord('a') + 1)

  4. 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不變的時候會影響到外部的
  1. 輸出結果 F f C ls是全局變量
ls = ["F", "f"]
def fun(a):
    ls.append(a)
    return
fun("C")
print(ls)
  1. 輸出結果10 None ss比函數遲聲明 函數內的ss為局部變量
def hub(ss, x=2.0, y=2.0):
    ss += x*y
ss = 10
print(ss, hub(ss, 3))
  1. 對於組合數據類型的全局變量,如果在函數內部沒有被真實創建的同名變量,則函數內部不可以直接使用並修改全局變量的值 錯誤 類似上述1 的情況

  2. Python函數支持可變數量的參數,實參用“ *參數名 ”表示 錯誤 形參用*參數名表示

面向對象

文件

參數encoding是指明對文件編碼,僅適用於文本文件。如果不明編碼方式,默認是使用locale.getpreferredencoding()函數返回的編碼方式。

seek(offset, from)方法
offset 文件指針偏移量, from: 0 文件開頭 1當前位置 2文件末尾 默認為0 可以通過seek(0,2)定位到文件末尾

  • 用python刪除文件和用linux命令刪除文件
    os.remove(path) rm file_path

異常

  1. Python中,對於代碼中的每個try,必須至少有一個except與它匹配 錯誤可以只有try finally

未分類

常見數學

3.5題目※

  1. 因數 i%n ==0 且n!=i n!=1 n是i的因數
  2. 素數 大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。
  3. 完全數
  4. 真因子
  5. 完全平方數: 2 * 2 = 4 8 * 8 =64
  6. 互質:互質是公約數只有1的兩個整數,叫做互質整數。公約數只有1的兩個自然數,叫做互質自然數,后者是前者的特殊情形。
  7. 完數
  8. 水仙花數

歐幾里得(輾轉相除法)求兩個正整數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各元素構成的列表

  1. is 和 ==的區別 前者比較對象的id 后者比較 對象的value

  2. 列舉幾個你用過的第三方庫 簡單介紹一下用途

  3. 函數的可變長度參數 有什么形式(*arg, *kwarg)

    • 前者接收任意個實參並放到一個元組
    • 后者類似 關鍵參數 一樣顯示賦值多個實參 並放入字典
  4. 列表對象的復制 非拷貝方法(直接賦值) 拷貝方法(淺拷貝 深拷貝)
    https://www.cnblogs.com/Black-rainbow/p/9577029.html

  5. 能否舉出幾個 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只有前者
  6. python的垃圾回收機制 https://www.cnblogs.com/ajianbeyourself/p/11151498.html

    • 引用計數 每個對象含一個ob_ref字段 計算被引用次數 清0立刻回收
    • 標記清除 解決對象的循環引用問題 e.g. AB 相互引用 但是AB都del了 ; 階段1給活動對象打標記 階段2 回收非活動對象
    • 分代回收 將內存根據對象的存活時間划分為不同的集合,每個集合稱為一個代;垃圾收集頻率與對象的存活時間的增大而減小
  7. 函數和方法有什么區別 如何判斷一個對象是函數還是方法 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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM