一浓冒、前言
學(xué)習(xí)就是一個不斷的自下而上栽渴,自上而下的過程。
前段時間稳懒,學(xué)著用python實現(xiàn)網(wǎng)站的數(shù)據(jù)爬取闲擦,隱約get到python的一些語法和用法,感覺就是語法不難场梆,關(guān)鍵在于解決問題的思維墅冷。
這是需求驅(qū)動后的學(xué)習(xí)。接下來或油,就需要對python進(jìn)行系統(tǒng)地了解寞忿。
很早之前搜知乎的時候,就搜到MOOC上的一門《python語言程序設(shè)計》課程顶岸,講得很好腔彰,而且,我還下載了課件蜕琴,溜了一遍萍桌,感覺就挺有趣的。
趁著有了實戰(zhàn)經(jīng)驗凌简,就把這門入門課刷了一遍上炎。果然是門好課!很適合小白入門雏搂,并系統(tǒng)學(xué)習(xí)藕施,整個教學(xué)過程循序漸進(jìn),深入淺出凸郑,提綱挈領(lǐng)裳食,很有意思!
課程是北京理工大學(xué)嵩天老師的《python語言程序設(shè)計》課程芙沥,現(xiàn)在已經(jīng)開了11次課了诲祸。課程每個小視頻短則幾分鐘浊吏,最長也不超過20分鐘,不容易勸退救氯。每章講解有復(fù)習(xí)回顧及小結(jié)找田,在平臺python123上有每章的練習(xí)和測試,直接反饋結(jié)果着憨,激發(fā)繼續(xù)學(xué)下去的興趣墩衙。
個人感覺,老師說話速度慢了些甲抖,調(diào)成了2倍速播放漆改,然后,花了大約3天的時間准谚,把所有的視頻挫剑,課件,練習(xí)和測試都刷了一遍氛魁,感覺對python的了解更系統(tǒng)了暮顺!
趁熱打鐵,把每章的知識點和練習(xí)秀存、測試再進(jìn)行整理回顧一下。
以下內(nèi)容均來自課程:《python語言程序設(shè)計》 及平臺python123羽氮,感興趣的看課程視頻或链,親自練習(xí),效果更好~
二档押、知識點
1.函數(shù)的定義與使用
-
函數(shù)的理解與定義
①一段具有特定功能的澳盐,可重用的語句組
②一種功能的抽象,一般函數(shù)表達(dá)特定功能
③兩個作用:降低編程難度和代碼復(fù)用
def <函數(shù)名>(<參數(shù)(0個或多個>): <函數(shù)體> return <返回值>
④函數(shù)定義時令宿,所指定的參數(shù)是一種占位符叼耙;如果不經(jīng)過調(diào)用,不會被執(zhí)行粒没;參數(shù)是輸入筛婉,函數(shù)體是處理,結(jié)果是輸出(IPO)
-
函數(shù)的使用及調(diào)用過程
①調(diào)用是運行函數(shù)代碼的方式
②調(diào)用時要給出實際參數(shù)癞松;實際參數(shù)替換定義中的參數(shù)爽撒;函數(shù)調(diào)用后得到返回值;
-
函數(shù)的參數(shù)傳遞
①函數(shù)可以有參數(shù)响蓉,也可以沒有硕勿,但必須保留括號;
②函數(shù)定義時可以為某些參數(shù)指定默認(rèn)值枫甲,構(gòu)成可選參數(shù)源武;
③函數(shù)定義時可以設(shè)計可變數(shù)量參數(shù)扼褪,即不確定參數(shù)總數(shù)量
def <函數(shù)名>(<參數(shù)>,*b): <函數(shù)體> return <返回值>
④函數(shù)調(diào)用時,參數(shù)可以按照位置或名稱方式傳遞粱栖;
#默認(rèn)參數(shù)m為1
def fact(n,m=1):
s=1
for i in range(1,n+1):
s*=i
return s//m
#位置傳遞
fact(10,5)
#名稱傳遞
fact(m=5,n=10)
-
函數(shù)的返回值
①函數(shù)可以返回0個或多個結(jié)果
②可以有
return
话浇,也可以沒有③多個返回結(jié)果以元組類型呈現(xiàn)
-
局部變量和全局變量
①局部變量和全局變量是不同變量:局部變量是函數(shù)內(nèi)部的占位符,與全局變量可能重名但不同查排;函數(shù)運算結(jié)束后凳枝,局部變量被釋放;可以使用
global
保留字在函數(shù)內(nèi)部使用全局變量跋核;
②局部變量為組合數(shù)據(jù)類型且未創(chuàng)建岖瑰,等同于全局變量
-
lambda函數(shù)
①lambda函數(shù)返回函數(shù)名作為結(jié)果
②lambda函數(shù)是一種匿名函數(shù),即沒有名字的函數(shù)
③使用
lambda
保留字定義砂代,函數(shù)名是返回結(jié)果④lambda函數(shù)用于定義簡單的蹋订、能夠在一行內(nèi)表示的函數(shù)
⑤謹(jǐn)慎使用lambda函數(shù):該函數(shù)主要用作一些特定函數(shù)或方法的參數(shù);該函數(shù)有一些固定使用方式刻伊,建議逐步掌握露戒;一般情況,建議使用
def
定義的普通函數(shù)<函數(shù)名>=lambda<參數(shù)>:<表達(dá)式>
2.實例7:七段數(shù)碼管繪制
繪制效果:
import turtle,time
# 繪制數(shù)碼管間隔
def drawGap():
turtle.penup()
turtle.fd(5)
# 繪制單段數(shù)碼管
def drawLine(draw):
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawGap()
turtle.right(90)
# 根據(jù)數(shù)字繪制七段數(shù)碼管
def drawDigit(digit):
drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
# 繪制時間
def drawDate(date):
turtle.pencolor('red')
for i in date:
if i=='-':
turtle.write('年',font=('Arial',18,'Normal'))
turtle.pencolor('green')
turtle.fd(40)
elif i=='=':
turtle.write('月',font=('Arial',18,'Normal'))
turtle.pencolor('blue')
turtle.fd(40)
elif i=='+':
turtle.write('日',font=('Arial',18,'Normal'))
else:
drawDigit(eval(i))
def main():
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
turtle.hideturtle()
turtle.done()
main()
3.代碼復(fù)用與函數(shù)遞歸
-
代碼復(fù)用與模塊化設(shè)計
①代碼復(fù)用:把代碼當(dāng)成資源進(jìn)行抽象:代碼資源化(程序代碼是一種用來表達(dá)計算的“資源”)捶箱;代碼抽象化(使用函數(shù)等方法對代碼賦予更高級別的定義)智什;代碼復(fù)用(同一份代碼在需要時可以被重復(fù)使用)
②函數(shù)和對象(屬性和方法)是代碼復(fù)用的兩種主要形式;
③模塊化設(shè)計:通過函數(shù)或?qū)ο蠓庋b將程序劃分為模塊及模塊間的表達(dá)丁屎;分而治之荠锭;
④緊耦合和松耦合:前者表示兩個部分之間交流很多,無法獨立存在晨川;后者表示兩個部分之間交流較少证九,可以獨立存在;模塊內(nèi)部緊耦合共虑,模塊之間松耦合愧怜;
-
函數(shù)遞歸的理解
①遞歸:函數(shù)定義中調(diào)用函數(shù)自身的方式;
②兩個關(guān)鍵特征:(1)鏈條:計算過程存在遞歸鏈條妈拌;(2)基例:存在一個或多個不需要再次遞歸的基例拥坛;
-
函數(shù)遞歸的調(diào)用過程
①遞歸本身是一個函數(shù),需要函數(shù)定義方式描述供炎;
②函數(shù)內(nèi)部渴逻,采用分支語句對輸入?yún)?shù)進(jìn)行判斷;
③基例和鏈條音诫,分別編寫對應(yīng)代碼惨奕;
-
函數(shù)遞歸實例解析
①字符串反轉(zhuǎn)
#將字符串s反轉(zhuǎn)后輸出 #第一種 s[::-1] #第二種 def rvs(s): if s=='': return s else: return rvs(s[1:])+s[0]
②斐波那契數(shù)列
def f(n): if n==1 or n==2: return 1 else: return f(n-1)+f(n-2)
4.模塊4:Pyinstaller庫的使用
-
Pyinstaller庫基本介紹
①將.py源代碼轉(zhuǎn)換成無需源代碼的可執(zhí)行文件;
②第三方庫竭钝,使用
pip install pyinstaller
安裝梨撞; -
Pyinstaller庫使用說明
①簡單使用:(cmd命令行)
pyinstaller -F <文件名.py>
②常用參數(shù):
參數(shù) 描述 -h
查看幫助 --clean
清理打包過程中的臨時文件 -D
,--onedir
默認(rèn)值雹洗,生成dist文件夾 -F
,--onefile
在dist文件夾中只生成獨立的打包文件 -i <圖標(biāo)文件名.ico>
指定打包程序使用的圖標(biāo)(icon)文件 舉例:
pyinstaller -i curve.ico -F SevenDigitsDrawV2.py
5.實例8:科赫雪花小包裹
描述:科赫曲線,也叫雪花曲線卧波。繪制科赫曲線时肿。獲得用戶輸入的整數(shù)N,作為階港粱,繪制N階科赫曲線螃成。
下圖為3階科赫曲線。
import turtle
def koch(size, n):
if n==0:
turtle.fd(size)
else:
for angel in [0,60,-120,60]:
turtle.left(angel)
koch(size/3,n-1)
def main(level):
turtle.setup(800,800)
turtle.penup()
turtle.goto(-200, 100)
turtle.pendown()
turtle.pensize(2)
turtle.hideturtle()
koch(300,level)
turtle.right(120)
koch(300,level)
turtle.right(120)
koch(300,level)
turtle.done()
try:
level = eval(input("請輸入科赫曲線的階: "))
main(level)
except:
print("輸入錯誤")
三查坪、練習(xí)
1. 實例7:七段數(shù)碼管繪制
同上
2. 實例8:科赫雪花小包裹
同上
3. 任意累積
描述:請根據(jù)編程模板補充代碼寸宏,計算任意個輸入數(shù)字的乘積。
注意偿曙,僅需要在標(biāo)注...的地方補充一行或多行代碼氮凝。
def cmul(*b):
m=1
for i in b:
m*=i
return m
print(eval("cmul({})".format(input())))
4. 斐波那契數(shù)列計算
描述:根據(jù)編程模板補充代碼,計算斐波那契數(shù)列的值望忆,具體功能如下:
獲取用戶輸入整數(shù)N罩阵,其中,N為正整數(shù)
計算斐波那契數(shù)列的值
如果將斐波那契數(shù)列表示為fbi(N)启摄,對于整數(shù)N稿壁,值如下:
fbi(1)和fbi(2)的值是1,當(dāng)N>2時歉备,fbi(N) = fbi(N-1) + fbi(N-2)
請采用遞歸方式編寫常摧。
def fbi(n):
if (n==1) or (n==2):
f=1
else:
f=fbi(n-1)+fbi(n-2)
return f
n = eval(input())
print(fbi(n))
5.漢諾塔實踐
描述:漢諾塔問題大家都清楚,這里不再贅述威创。
請補充編程模板中代碼,完成如下功能:
有三個圓柱A谎懦、B肚豺、C,初始時A上有N個圓盤界拦,N由用戶輸入給出吸申,最終移動到圓柱C上。
每次移動步驟的表達(dá)方式示例如下:[STEP 10] A->C享甸。其中截碴,STEP是步驟序號,寬度為4個字符蛉威,右對齊日丹。
請編寫代碼,獲得輸入N后蚯嫌,輸出漢諾塔移動的步驟哲虾。
輸入格式
一個整數(shù)
輸出格式
每個步驟一行丙躏,每行參考格式如下:[STEP 10] A->C
steps = 0
def hanoi(src, des, mid, n):
global steps
if n == 1:
steps+=1
print("[STEP{:>4}] {}->{}".format(steps, src, des))
else:
hanoi(src,mid,des,n-1)
steps+=1
print("[STEP{:>4}] {}->{}".format(steps, src, des))
hanoi(mid,des,src,n-1)
N = eval(input())
hanoi("A", "C", "B", N)
四、測試
1.選擇題
-
以下選項不是函數(shù)作用的是:
A 復(fù)用代碼
B 提高代碼執(zhí)行速度
C 降低編程復(fù)雜度
D 增強代碼可讀性
函數(shù)不能直接提高代碼執(zhí)行速度束凑。
- 下列程序的輸出結(jié)果為:
def f(a,b):
a=4
return a+b
def main():
a=5
b=6
print(f(a,b),a+b)
main()
A 10 11
B 11 10
C 11 11
D 10 10
這里沒有全局變量晒旅,都是函數(shù)局部變量的運算。
- 以下關(guān)于Python函數(shù)說法錯誤的是:
def func(a,b):
c=a**2+b
b=a
return c
a=10
b=100
c=func(a,b)+a
A 該函數(shù)名稱為func
B 執(zhí)行該函數(shù)后汪诉,變量a的值為10
C 執(zhí)行該函數(shù)后废恋,變量c的值為200
D 執(zhí)行該函數(shù)后,變量b的值為100
這里沒有全局變量扒寄,請在IDLE中執(zhí)行代碼觀察結(jié)果鱼鼓。
-
以下關(guān)于函數(shù)調(diào)用描述正確的是:
A 函數(shù)和調(diào)用只能發(fā)生在同一個文件中
B 自定義函數(shù)調(diào)用前必須定義
C Python內(nèi)置函數(shù)調(diào)用前需要引用相應(yīng)的庫
D 函數(shù)在調(diào)用前不需要定義,拿來即用就好
函數(shù)調(diào)用前必須已經(jīng)存在函數(shù)定義旗们,否則無法執(zhí)行蚓哩。
Python內(nèi)置函數(shù)直接使用,不需要引用任何模塊上渴。
-
以下關(guān)于模塊化設(shè)計描述錯誤的是:
A 應(yīng)盡可能合理劃分功能塊岸梨,功能塊內(nèi)部耦合度低
B 應(yīng)盡可能合理劃分功能塊,功能塊內(nèi)部耦合度高
C 高耦合度的特點是復(fù)用較為困難
D 模塊間關(guān)系盡可能簡單稠氮,模塊之間耦合度低
模塊內(nèi)高耦合曹阔、模塊間低耦合。
-
以下對遞歸描述錯誤的是:
A 遞歸程序都可以有非遞歸編寫方法
B 書寫簡單
C 一定要有基例
D 執(zhí)行效率高
遞歸不提高程序執(zhí)行效率隔披。
任何遞歸程序都可以通過堆椩叻荩或隊列變成非遞歸程序(這是程序的高級應(yīng)用)。
-
以下關(guān)于函數(shù)說法錯誤的是:
A 函數(shù)可以看做是一段具有名字的子程序
B 對函數(shù)的使用必須了解其內(nèi)部實現(xiàn)原理
C 函數(shù)通過函數(shù)名來調(diào)用
D 函數(shù)是一段具有特定功能的奢米、可重用的語句組
調(diào)用函數(shù)不需要知道函數(shù)內(nèi)部實現(xiàn)原理抓韩,只需要知道調(diào)用方法(即接口)即可。
-
哪個選項對于函數(shù)的定義是錯誤的鬓长?
A def vfunc(*a,b):
B def vfunc(a,b):
C def vfunc(a,*b):
D def vfunc(a,b=2):
def vfunc(a, b) 是錯誤的定義:a表示可變參數(shù)谒拴,可變參數(shù)只能放在函數(shù)參數(shù)的最后。
-
關(guān)于return語句涉波,以下選項描述正確的是:
A 函數(shù)中最多只有一個return語句
B return只能返回一個值
C 函數(shù)可以沒有return語句
D 函數(shù)必須有一個return語句
函數(shù)可以包含0個或多個return語句
-
以下關(guān)于遞歸函數(shù)基例的說法錯誤的是:
A 遞歸函數(shù)必須有基例
B 遞歸函數(shù)的基例決定遞歸的深度
C 遞歸函數(shù)的基例不再進(jìn)行遞歸
D 每個遞歸函數(shù)都只能有一個基例
每個遞歸函數(shù)至少存在一個基例英上,但可能存在多個基例。
2.程序設(shè)計題
- 隨機(jī)密碼生成
描述:補充編程模板中代碼啤覆,完成如下功能:
以整數(shù)17為隨機(jī)數(shù)種子苍日,獲取用戶輸入整數(shù)N為長度,產(chǎn)生3個長度為N位的密碼窗声,密碼的每位是一個數(shù)字相恃。每個密碼單獨一行輸出。
產(chǎn)生密碼采用random.randint()函數(shù)
import random
def genpwd(length):
a=10**(length-1)
b=10**length-1
return '{}'.format(random.randint(a,b))
length = eval(input())
random.seed(17)
for i in range(3):
print(genpwd(length))
- 連續(xù)質(zhì)數(shù)計算
描述:補充編程模板中代碼嫌佑,完成如下功能:
獲得用戶輸入數(shù)字N豆茫,計算并輸出從N開始的5個質(zhì)數(shù)侨歉,單行輸出,質(zhì)數(shù)間用逗號,分割揩魂。
注意:需要考慮用戶輸入的數(shù)字N可能是浮點數(shù)幽邓,應(yīng)對輸入取整數(shù);最后一個輸出后不用逗號火脉。
def prime(m):
for i in range(2,m):
if m % i == 0:
return False
return True
n = eval(input())
n_ = int(n)
n_ = n_+1 if n_ < n else n_
count = 5
while count > 0:
if prime(n_):
if count > 1:
print(n_, end=",")
else:
print(n_, end="")
count -= 1
n_ += 1
這個代碼注意:
(1) 需要對輸入小數(shù)情況進(jìn)行判斷牵舵,獲取超過該輸入的最小整數(shù)(這里沒用floor()函數(shù));
(2) 對輸出格式進(jìn)行判斷倦挂,最后一個輸出后不增加逗號(這里沒用.join()方法)畸颅。
【筆記】《python語言程序設(shè)計》—Python基本語法元素
【筆記】《python語言程序設(shè)計》—Python基本圖形繪制
【筆記】《python語言程序設(shè)計》——基本數(shù)據(jù)類型
【筆記】《python語言程序設(shè)計》——程序的控制結(jié)構(gòu)
【筆記】《python語言程序設(shè)計》——函數(shù)和代碼復(fù)用
【筆記】《python語言程序設(shè)計》——組合數(shù)據(jù)類型
【筆記】《python語言程序設(shè)計》——文件和數(shù)據(jù)格式化