由於本人python學得太水,且最近心態浮躁,於是打算從0開始學習python,希望可以堅持。
01篇
答案
【測試題】
0.腳本語言Scripting language。與C語言/C++/JAVA語言不一樣,腳本語言直接寫出能讓電腦聽懂的程序,不需要編譯,直接運行。
Why Python的優點是什么?①python是跨平台的 ②相同的程序,用python寫代碼量更少 ③應用范圍廣,如WEB/OS/3D動畫/雲計算/企業服務等。
1.IDLE是以鍵入文本的方式對python程序進行編程的SHELL編程命令行"工具",就像cmd命令行窗口一樣,可以直接對操作系統下達命令。其中,ALT+N是回到上一行,ALT+P是回到下一行,CTRL+C強制停止,CTRL+N是新建一個窗口[編寫后保存后run],F5是run module(python是模塊化編程)
2.顯示輸出內容
3.*
4.*5,既可以對字符串/字符進行運算[連續],也可以對數值類型進行運算。但是+5,由於+要求對相同類型進行運算,5是數值類型,只能對數值類型進行。
5.用轉義字符\",或者print(' " ')-單引號和雙引號混合使用
6.python升級后,很多地方進行了修改,對python 2許多地方並不兼容。
【動動手】
0.“i love xhj”是類型和內容,print("i love xhj")只有內容
1.首先判斷年是閏年還是平年,然后計算。
2.配置python環境變量[我的anaconda自動加進去了],並驗證[如下]。
新建txt文件 -> 第一行寫 #!usr/bin/python【表示該文件是可執行python腳本】-> 然后換行寫python程序 -> 保存退出,並將文件后綴改為py -> 打開cmd,輸入 ”python“ + [空格] + [該文件目錄]
02篇
答案
【測試題】
0.built in function內置函數,可以直接調用。
1.進入IDLE,輸入dir(__builtins__),可得到python3提供的BIF。再輸入help(某個內置函數名),可以得到解讀。
2.不一樣,python命名規范和C一樣。
3.縮進(我的答案既然是忠誠哈哈哈哈)
4.C語言中如果寫if(a=1),會直接往下運行。而再python 的if語句中,如果寫成了 if a=1,會自動報錯,幫助我們找bug哈。
5.字符串拼接。
【動動手】
0.首先input內置函數返回值是字符串類型的,不用轉換類型可以直接輸出。然后運行的地方,選擇run module 或者按F5運行 py該文件。
1.input返回值首先要轉換為int類型,其次if判斷中"或者"是用“or”表示,而不是“||”表示。
03篇
答案
【測試題】
0.C,python的變量命名規范和C一樣。
1.小甲魚,PS:python的變量沒有類型可言。
2.小甲魚,沒有賦地址。
3.520,但它是個字符串。如果單獨>>>first ,就會輸出'520'
4.str = r"Let's go" ,r代表原始字符串。或者用三重引號字符串,str = """Let's go"""。或者使用單雙引號混用str = "Let's go"。他們都是可以保存原始格式的。
5.str = r'C:\Program Files\FishC\Good''\\' 這里'\\'就是'\'的轉義字符表示。
04篇
答案
0.無數次。 CTRC+C強制結束。
1.10次
2.(10 < cost) and (cost<50)
3.python中一行可以輸多行語句,只要中間用分號隔開就好。如,print("i love") ;print("xhj")
4.python中一條語句也可以分成多行寫。
5.C的and和Python的and不一樣!
C的and要求兩邊都為True,結果才是True,如1 and 0 ->0,1 and 3 ->1。Python的and,詞不達意,如1 and 0 ->0,1 and 3 ->3
5.短路邏輯:即不需要運算的時候就不運算。舉個例子,x and y 當x為False時就不再繼續看y,直接返回False。
05篇
答案
【測試題】
0.python中int類型代表整數,而且不限長度。同樣float也是,他代表小數(有小數點的數),bool是布爾類型,str是字符串類型。
轉換:float->int是直接截斷小數點后面的數,int->float是直接加小數點,str->int要求只能str內容是整數,同理str->float,int/float->str 可以直接轉。轉換方式:類型(轉換內容)
1.因為01二進制,計算機就不用再轉換浪費力氣了。
2.截斷處理
3.如何對小數進行四舍五入呢?既然是+0.5,如int(3.4+05)->3,int(3.5+0.5)->4。
4.type返回類型,isinstance返回True/False。
5.python3允許中文作為變量名,因為源碼文件是用utf-8編寫的(支持中文)。如,我的豬 = “徐浩軍”。
【動動手】
我們知道temp = input("輸入內容")中type是字符串類型,但這個字符串類型轉換時如何去避免類型錯誤呢?
s.isalnum() 所有字符都是數字或者字母,為真返回 True,否則返回 False。
s.isalpha() 所有字符都是字母,為真返回 True,否則返回 False。
s.isdigit() 所有字符都是數字,為真返回 True,否則返回 False。
s.islower() 所有字符都是小寫,為真返回 True,否則返回 False。
s.isupper() 所有字符都是大寫,為真返回 True,否則返回 False。
s.istitle() 所有單詞都是首字母大寫,為真返回 True,否則返回 False。
s.isspace() 所有字符都是空白字符,為真返回 True,否則返回 False。
06篇
答案
0.python運算符中,/是精確除法,無論是否整除,返回值都是小數。//是地板(Floor)除法,返回值是截斷余數后的整數,但運算數中如果有小數,就直接得出精確結果。
1.True或者是False
2.那得用計算器了,0.04。需要注意的是 -1**2 -> -1,1**-2 ->0.5
3.x%2 == 0余數
4.第一點,not or and 的優先級是不同的:not > and > or ,所以括號很重要。第二點,“短路邏輯”,4and3 為4,4or3 為3。
07、08篇
答案
0.if money>=100
1.斷言,當這個關鍵字后邊的條件為假的時候,程序自動崩潰並拋出AssertionError的異常。如,assert(a>10),如果不滿足條件就會排除assertError的錯誤。用來測試。
2.不是使用中間變量,而是x, y, z = z, y, x
3.母雞
4.成員資格運算符也就是in , not in
09篇
答案
0.5次
1.報錯。 in 是“成員資格運算符”,python中的for更像foreach,這里應該改成for i in range(5)
2.continue是跳出本輪循環進行下一輪循環,break是終止當前循環,跳出循環體。
3.列表list元素可以是各種各樣的類型,列表的追加extend,apend,insert,列表的刪除remove,pop,列表的查找索引或者內容,列表的排序sort
4.0-9
5.打印2 3 ,因為 break 只能跳出一層循環。
10篇【列表】
答案
0.各種類型,如int,float,bool,str,list都可以。
1.append追加,extend追加,insert插入。區別在於append只能通過加入追加單個元素,extend可以加入多個元素,insert可以插入特定位置。
2.append() 方法是將參數作為一個元素增加到列表的末尾。extend() 方法則是將參數作為一個列表去擴展列表的末尾。如a1 = [99,'love',['xhj',66]] a2 = [99,'love',['xhj',66]] b =[1,2,3] c=a1.append(b) d = a2.extend(b) ----> c:[99,'love',['xhj',66],[1,2,3]] d:[99,'love',['xhj',66],1,2,3]
3.不一樣
4.insert
11篇【列表】
答案
3.列表切片返回還是列表,qiepian = list[起始位置:終止位置:步長],默認起始位置0,默認終止位置-1,python也是支持負數索引的。
4.步長也可以是負數,代表倒着走
5.a = list[:] 與a = list是完全不一樣的。切片是拷貝,那么對原list的改變將不會影響到切片。=是指向同一個list,共進退。
12篇【列表】
答案
0.吃驚的是new並沒有和old共進退
1.索引的索引 list[1][2][0]=‘小魷魚’
2.sort
3.先sort后reverse或者sort(reverse=True)
4.copy和切片全拷貝一樣的,clear是清空列表,但列表仍然存在只是是空list,[]而已。
5.列表推導式(List comprehensions)也叫列表解析,靈感取自函數式編程語言 Haskell。Ta 是一個非常有用和靈活的工具,可以用來動態的創建列表,語法如:[有關A的表達式 for A in B]
> list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0]
>
- list1 = []
- for x in range(10):
- for y in range(10):
- if x%2 == 0:
- if y%2 != 0:
- list1.append((x, y))
6.list3 = [name + ':' + slogan[2:] for slogan in list1 for name in list2 if slogan[0] == name[0]] 【先寫出來普通寫法再轉換吧】
13篇【元組】 答案
0.列表list以方括號為標志,內容可修改,元素可多樣的集裝箱。元組tuple以逗號為標志,內容不可修改,元素可多樣的靜態元素。
1.a = ('xhj','love','tyj',1314) 我不希望他會改變。
2.列表哈哈,因為他更豐富。(我的答案?兩個都不要了,我不會游泳)
3.如圖,元組只能使用count和index方法。
4.元組只有一個元素的時候。如a=(1,)這個時候a是元組,否則如a=(1)這個a就是int類型的了。
5.不是,這個是分別賦值,等同於x=1,y=2,z=3。但h = x,y,z的話,h是元組。
6.1)列表,2)列表(因為我想改名),3)列表,4)元組,5)元組(人命關天),6)列表
7.沒有,python有列表推到式就夠用了。
14篇【字符串:內置函數】
答案
1.在不賦值的情況下,通常用於跨越多行的注釋
2.因為其中\t,\r都是轉義字符,要么\\要么/,或者用r“...\....”,r代表不轉義。
3.索引切片
15篇【字符串:格式化】
答案
1.打印{1},這里{1}已經解釋為1了。正確的寫法是‘{0}’.format('不打印'),或者‘{1}’.format('打印'),或者‘{0},{1}’.format('不打印','打印')。
2.關鍵字參數
3.位置參數
4. '{0}{1:.2f}'.format('Pi = ', 3.1415) 輸出'Pi = 3.14'。其中0代表第一個元素,1代表第二個元素,.2f代表小數點后兩位。
16篇【序列】
答案
格式化輸出,可以用位置參數也可以用關鍵字參數,如果想要混用,那需要位置參數在關鍵字參數前。
17篇【函數】
答案
0.DRY 是程序員們公認的指導原則:Don't Repeat Yourself. 拿起函數,不要再去重復拷貝一段代碼了!
1.函數優點:
- 可以降低代碼量(調用函數只需要一行,而拷貝黏貼需要N倍代碼)
- 可以降低維護成本(函數只需修改def部分內容,而拷貝黏貼則需要每一處出現的地方都作修改)
- 使序更容易閱讀
2.0個或任意多個
3.def,要注意函數名后邊要加上小括號 “()”,然后小括號后邊是冒號 “:”,然后縮進部分均屬於函數體的內容
4.如果你回答兩個,那么恭喜你錯啦,答案是 0,因為類似於這樣的寫法是錯誤的!分析下,函數的參數需要的是變量,而這里你試圖用“元祖”的形式來傳遞是不可行的。
5.Hello World! 因為當 Python 執行到 return 語句的時候,Python 認為函數到此結束,需要返回了(盡管沒有任何返回值,也要返回)。
18篇【函數】
答案
0.x是形參,y是實參
1.函數文檔和#都可以為函數寫注釋,但不同的是,函數文檔是作為函數的一部分被存儲起來的,可以被打印出來。如,
可以用 MyFirstFunction.__doc__ 或者 help(MyFirstFunction) 輸出函數文檔。
2.關鍵字參數可以避免位置安排不當造成的誤會和錯誤。
3.sep是各個輸出元素之間的分隔方式,end是輸出內容以什么樣的字符串結尾,file是文件類型對象,flush是是否強制刷新流,它們都有默認值。
4.默認參數為了避免忘記賦值,關鍵字參數為了避免位置誤會。
19篇【函數】
答案
0.我在next()函數里...
我在pre()函數里...
1.有,python任一函數都有返回值,如果沒有寫,那就返回N。
2.python函數可以用元組或者列表的方式返回多個類型不同的返回值。
3.1314520 因為函數內部並沒有使用全局var,python的保護機制重新創建了一個局部相同名字的var變量。
4.Baby I love you
20篇【函數:內嵌函數和閉包】
答案
21篇【函數:lambda】
答案
0.g = lambda x,y=3 :x*y g(2)
1.def wc(x):
if x % 2 == 1:
return x
2.語句變短了,可以不用想用什么函數名了,但是我覺得lambda更難。
3.語法含義: lambdax:y 中x是參數,y是規則。filter(x,y)中x是規則,y是參數。list(filter(lambda x : x%3==0,range(100)))
4.? [ i for i in range(1, 100) if not(i%3)]
5. ? list(map(lambda x, y : [x, y], [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]))
6.16 和 FishCFishC
22、23、24篇【函數:遞歸】
答案
25篇 【字典】
答案
0.字典,因為都是一個概念(why?)
1.MyDict = dict((('F', 70), ('i',105), ('s',115), ('h',104), ('C',67)))
MyDict_2 = {'F':70, 'i':105, 's':115, 'h':104, 'C':67}
3.沒有的元素,字典可以賦默認值。另外字典對於對應關系的處理更方便。
4.沒區別
5字符串的分割方法 data.split(',')
26篇 【字典】
答案
0.不支持,會覆蓋上一次的值。
1.會自動創建對應的鍵(Key)並添加相應的值(Value)進去
2.在字典中檢查鍵(Key)是否存在比在序列中檢查指定元素是否存在更高效。因為字典的原理是使用哈希算法存儲,一步到位,不需要使用查找算法進行匹配,因此時間復雜度是O(1),效率非常高。
3.Python字典種,對鍵的要求相對要嚴格一些,要求它們必須是可哈希(Hash)的對象,不能是可變類型(包括變量、列表、字典本身等)。但是Python對值是沒有任何限制的,它們可以是任意的Python對象。
4.執行完成后,字典dict1的內容是:{1: '數字', 3: '數字'},fromkeys用來創建新的字典,注意對原有字典修改時會完全覆蓋。
5.copy是值復制,=是拷貝引用。dic1 = dic.copy() dic2 = dic這其中dic改變不會引起dic1的改變,會引起dic2的改變。
27篇【集合】
答案
0.保證元素的唯一性
1.frozenset凍結
2.調用__len__()內置函數,或者len(集合名)
3.set集合是無序的,所以無法從下標獲取數據
4.set1 = set([1, 2]) 會生成一個集合{1, 2},但set1 = {[1, 2]}卻會報錯。列表不是可哈希類型,是可變的,因此不能作為集合元素。集合和字典一樣都是無序的,都要求元素是可哈希的(字典是要求key)。
5.使用add()方法可以為集合添加元素,使用remove()方法可以刪除集合中已知的元素。
28篇【文件】
答案
0.B,因為沒轉義
1.open()函數默認的打開模式是'rt',即可讀、文本的模式打開。t 代表文本。
2.b二進制方法,x可寫入。要注意的是'x'和'w'均是以“可寫入”的模式打開文件,但以'x'模式打開的時候,如果路徑下已經存在相同的文件名,會拋出異常,而'w'模式的話會直接覆蓋同名文件。
3.否則操作結果就還在緩沖中,如果斷電沒有保存在硬盤上就慘了。
4.list(f)
5.readline方式讀取數據,或者 for each_line in f: print(each_line) 以迭代方式讀取。
6.返回從文件指針開始(注意這里並不是文件頭哦)的連續10個字符,而不是從文件頭開始。
7.f.tell()文件當前指針的位置
8.f.seek()定位的文件指針是按字節為單位進行計算的,演示文件(record.txt)是以GBK進行編碼的,按照規則,一個漢字需要占用兩個字節。f.seek(45)的位置位於字符“小”的開始位置,而f.seek(46)的位置剛好位於字符“小”的中間位置。
------------------29,30,31
32篇【異常處理】
Python標准異常總結【見博客】
33篇【異常處理】
答案
0.
try:
檢測范圍
except Exception[as reason]:
出現異常(Exception)后的處理代碼
1.可以,用來捕捉多種異常錯誤
try:.......
except OSError as reason:
print('文件出錯啦T_T\n錯誤原因是:' + str(reason))
except TypeError as reason:
print('類型出錯啦T_T\n錯誤原因是:' + str(reason))
2.except (OSError ,TypeError ) as reason: 或 except:
3.不知道還有哪些錯誤
4.finally或者用with
34篇【ELSE語句】
答案
0.else可以和if,for,while,try搭配。和for,while搭配時,“干完了就能else”。和try搭配時,“不出錯就能else”。
1.如果沒有執行break,就能else
2.ABC - GHI - JKL
3.with
4.會自動關閉
35篇【圖形化界面】------ 答案
36篇【類與對象】
答案
初始化參數的方法
37篇【類與對象】
答案
0.
2.self是綁定方法,據說有了這個參數,Python 再也不會傻傻分不清是哪個對象在調用方法了,你可以認為方法中的 self 其實就是實例對象的唯一標志。
5.首先要明白類、類對象、實例對象是三個不同的名詞。
我們常說的類指的是類定義,由於“Python無處不對象”,所以當類定義完之后,自然就是類對象。在這個時候,你可以對類的屬性(變量)進行直接訪問(MyClass.name)。f一個類可以實例化出無數的對象(實例對象),Python 為了區分是哪個實例對象調用了方法,於是要求方法必須綁定(通過 self 參數)才能調用。而未實例化的類對象直接調用方法,因為缺少 self 參數,所以就會報錯。
38篇【類和對象】
答案
1.報錯,__init__返回值是None
3,覆蓋父類方法,例如將函數體內容寫 pass,這樣調用 fly 方法就沒有任何反應了
4.super 函數超級之處在於你不需要明確給出任何基類的名字,它會自動幫您找出所有基類以及對應的方法。由於你不用給出基類的名字,這就意味着你如果需要改變了類繼承關系,你只要改變 class 語句里的父類即可,而不必在大量代碼中去修改所有被繼承的方法。
39篇【類與對象】
答案
0.繼承多個可能會把代碼復雜化,所以有時候用組合代替繼承。python中,直接在類定義中把需要的類放進去實例化就可以了。
1.組合用於“有一個”的場景中,繼承用於“是一個”的場景中
2.當你這個類定義完的時候,類定義就變成類對象,可以直接通過“類名.屬性”或者“類名.方法名()”引用或使用相關的屬性或方法。
3.如果對象的屬性跟方法名相同,屬性會覆蓋方法。
4.num 和 count 是類屬性(靜態變量),x 和 y 是實例屬性。大多數情況下,你應該考慮使用實例屬性,而不是類屬性(類屬性通常僅用來跟蹤與類相關的值)。
5python的綁定概念,要在函數方法的參數中加self
40篇【類和對象】
issubclass(class,classinfo)判斷是否是子類
isinstance(object,class)判斷是否是實例對象
hasattr(object,name)判斷是否有某個屬性
getattr(object,name[,default])返回某個屬性的值,若沒有該屬性這返回default
setattr(object,name,value)設置屬性
delattr(object,name)刪除屬性
property允許編程人員輕松、有效地管理屬性訪問
41篇【魔法方法】
答案
0.魔法方法總是被雙下划線包圍,例如 __init__
1.__new__ 是在一個對象實例化的時候所調用的第一個方法。它跟其他魔法方法不同,它的第一個參數不是 self 而是這個類(cls),而其他的參數會直接傳遞給 __init__ 方法的。
2.當我們的實例對象需要有明確的初始化步驟的時候,你可以在 __init__ 方法中部署初始化的代碼。
3.編程中需要主要到 __init__ 方法的返回值一定是None
4.__new__ 方法主要任務時返回一個實例對象,通常是參數 cls 這個類的實例化對象,當然你也可以返回其他對象。R
5.如果說 __init__ 和 __new__ 方法是對象的構造器的話,那么 Python 也提供了一個析構器,叫做 __del__ 方法。當對象將要被銷毀的時候,這個方法就會被調用。但一定要注意的是,並非 del x 就相當於自動調用 x.__del__(),__del__ 方法是當垃圾回收機制回收這個對象的時候調用的。
0.
42、43篇【魔法方法】
答案
0.不會
1.例如 a + b,如果 a 對象的 __add__ 方法沒有實現或者不支持相應的操作,那么 Python 就會自動調用 b 的 __radd__ 方法
2.使用 super() 這個 BIF 函數。
3.可以先為基類定義一個別名,在類定義的時候,使用別名代替你要繼承的基類。如此,當你想要改變基類的時候,只需要修改給別名賦值的那個語句即可。
4.類的靜態屬性很簡單,在類中直接定義的變量(沒有 self.)就是靜態屬性。引用類的靜態屬性使用”類名.屬性名”的形式。
5.靜態方法是類的特殊方法,靜態方法只需要在普通方法的前邊加上 @staticmethod 修飾符即可。靜態方法最大的優點是:不會綁定到實例對象上,換而言之就是節省開銷。使用的時候需要注意的地方:靜態方法並不需要 self 參數,因此即使是使用對象去訪問,self 參數也不會傳進去。4
0.
44、45篇【魔法方法】
答案
這段代碼試圖在對象的屬性發生賦值操作的時候,將實際的值 +1賦值給相應的屬性。但這么寫法是錯誤的,因為每當屬性被賦值的時候, __setattr__() 會被調用,而里邊的 self.name = value + 1 語句又會再次觸發 __setattr__() 調用,導致無限遞歸。
46篇【魔法方法】
47篇【魔法方法】
答案
0.無疑是列表(List),元組(Tuple)和字符串(String)
1.如果你想要定制一個不可變的容器(像 String),你就不能定義像 __setitem__() 和 __delitem__() 這些會修改容器中的數據的方法 。
2.應該定義 __reversed__() 方法,提供對內置函數 reversed() 的支持。
3.在 Python 中,我們通過 len() 內置函數來查詢容器的“容量”,所以容器應該定義 __len__() 方法。
4.讀 —— __getitem__(),寫 —— __setitem__(),刪除 —— __delitem__()
5.在 Python 中,協議更像是一種指南。
48篇【魔法方法-迭代器】
答案
0.迭代器就是一個一個往下取。每一次對過程的重復被稱為一次“迭代”,而每一次迭代得到的結果會被用來作為下一次迭代的初始值。
1.迭代器不是容器,是對象。例如將list,string等變成迭代對象。
2.迭代器只能向前,不能回退取值。
3.容器具有迭代功能則能用__iter__和__next__魔法方法
4.try except 如果迭代器到尾了會拋出StopIteration 異常
5.set集合,對於原生支持隨機訪問的數據結構(如tuple、list),可以使用迭代器或者下標索引的形式訪問,但對於無法隨機訪問的數據結構 set 而言,迭代器是唯一的訪問元素的方式。
2.
49篇【生成器】
答案
0.普通函數通常在第一行開始,在執行完/return/異常處結束。一旦函數將控制權交還給調用者,就意味着全部結束。函數中做的所有工作以及保存在局部變量中的數據都將丟失。如果再次調用這個函數時,一切都將重新開始。?]{Vne
1.所謂的協同程序就是可以運行的獨立函數調用,函數可以暫停或者掛起,並在需要的時候從程序離開的地方繼續或者重新開始。Python 是通過生成器來實現類似於協同程序的概念:生成器可以暫時掛起函數,並保留函數的局部變量等數據,然后在再次調用它的時候,從上次暫停的位置繼續執行下去。
2.是的,因為生成器事實上就是基於迭代器來實現的,生成器只需要一個 yield 語句即可,但它內部會自動創建 __iter__() 和 __next__() 方法
3.return改為yield,這樣下次直接從yield繼續執行
4.保存現場,當下一次執行該函數是從上一次結束的地方開始,而不是重頭再來。
5. while True 循環是用來確保生成器函數永遠也不會執行到函數末尾的