一、概述
簡史
- 1989:Guido van Rossum
- 2008:python3.0 誕生
- 2014:宣布2.7支持到2020
- 2017:AI元年,Python崛起
環(huán)境
anaconda + pycharm
Python3.6
二、變量類型
- 數(shù)字類型 Number
- 字符串類型 str
- 列表 list
- 元組 tuple
- 字典 Dictionary
- 集合 set
- 數(shù)字類型 Number
- 數(shù)字類型沒有大小限制
- 整數(shù)
- 浮點(diǎn)數(shù)
- 復(fù)數(shù) complex
- 布爾值(布爾值可以跟數(shù)字直接操作)
字符串類型 str
表示方法:
- 單引號(hào)
- 雙引號(hào)
- 三引號(hào)(三個(gè)單引號(hào)或者三個(gè)雙引號(hào))
- 單雙引號(hào)交錯(cuò)使用
- 格式化(利用百分號(hào)(%)) %d: 整數(shù) %s: 字符串
print("%s新手"%"Python")
利用format函數(shù)
s = "{}新手".format("Python")
None
表示什么都沒有
如果函數(shù)沒有返回值,可以返回 None
用來占位
三、內(nèi)置數(shù)據(jù)結(jié)構(gòu)
1.list(列表)
# 1, 創(chuàng)建空列表
l1 = []
# 2. 創(chuàng)建帶值的列表
l2 = [100]
# 3. 創(chuàng)建列表,帶多個(gè)值
l3 = [2,3,1,4,6,4,6]
# 4. 使用list()
l4 = list()
l1 = []
# 2. 創(chuàng)建帶值的列表
l2 = [100]
# 3. 創(chuàng)建列表,帶多個(gè)值
l3 = [2,3,1,4,6,4,6]
# 4. 使用list()
l4 = list()
列表常用操作
訪問
使用下標(biāo)操作(索引)
列表的位置是從0開始
分片操作
對(duì)列表進(jìn)行任意一段的截取
l[:]
注意截取的范圍,包含左邊的下標(biāo)值,不包含右邊的下標(biāo)值
標(biāo)值可以為空,如果不寫,左邊下標(biāo)值默認(rèn)為0, 右邊下標(biāo)值為最大數(shù)加一,即表示截取到最后一個(gè)數(shù)據(jù)
分片可以控制增長幅度,默認(rèn)增長幅度為1
# 打印從下標(biāo)1開始的數(shù)字,每次隔一個(gè)
print(l[1:6:2])
print(l[1:6:2])
下標(biāo)可以超出范圍,超出后不在考慮多余下標(biāo)內(nèi)容
下標(biāo)值,增長幅度可以為負(fù)數(shù),為負(fù)數(shù),表明順序是從右往左,規(guī)定: 數(shù)組最后一個(gè)數(shù)字的下標(biāo)是-1
分片操作是生成一個(gè)新的list
- del: 刪除命令
- 使用加號(hào)鏈接兩個(gè)列表
- 使用乘號(hào)操作列表(相當(dāng)于把n個(gè)列表接在一起)
- 成員資格運(yùn)算
- 鏈表的遍歷# for in list
a = [1,2,3,4,5]
# 挨個(gè)打印a里邊的元素
for i in a:
print(i)
# range
# in 后面的變量要求是可以可迭代的內(nèi)容
for i in range(1,10):
print(i)
# 雙層列表循環(huán)
# a 為嵌套列表,或者叫雙層列表
a = [["one", 1], ["two", 2], ["three", 3] ]
for k,v in a:
print(k, "--", v)
# 雙層列表循環(huán)變異
# a 為嵌套列表,或者叫雙層列表
a = [["one", 1, "eins"], ["two", 2,"zwei"], ["three", 3,"drei"] ]
# 這個(gè)例子說明,k,v,w的個(gè)數(shù)應(yīng)該跟解包出來的變量個(gè)數(shù)一致
for k,v,w in a:
print(k, "--", v, "--",w) - 列表內(nèi)涵: list content# for 創(chuàng)建
a = ['a', 'b', 'c']
# 用list a創(chuàng)建一個(gè)list b
# 下面代碼的含義是,對(duì)于所有a中的元素,逐個(gè)放入新列表b中
b = [i for i in a]
# 對(duì)a中所有元素乘以10,生成一個(gè)新list
a = [1,2,3,4,5]
# 用list a創(chuàng)建一個(gè)list b
# 下面代碼的含義是,對(duì)于所有a中的元素,逐個(gè)放入新列表b中
b = [i*10 for i in a]
# 還可以過濾原來list中的內(nèi)容病放入新列表
# 比如原有列表a, 需要把所有a中的偶數(shù)生成新的列表b
a = [x for x in range(1,35)] #生成從1到34的一個(gè)列表
# 把a(bǔ)中所有偶數(shù)生成一個(gè)新的列表 b
b = [m for m in a if m % 2 == 0]
# 列表生成式可以嵌套
# 由兩個(gè)列表a,b
a = [i for i in range(1,4)] # 生成list a
b = [i for i in range(100,400) if i % 100 == 0]
# 列表生成是可以嵌套,此時(shí)等于兩個(gè)for循環(huán)嵌套
c = [ m+n for m in a for n in b]
# 上面代碼跟下面代碼等價(jià)
for m in a:
for n in b:
print(m+n, end=" ")
# 嵌套的列表生城市也可以用條件表達(dá)式
c = [ m+n for m in a for n in b if m+n < 250] - 關(guān)于列表的常用函數(shù)
len:求列表長度a = [x for x in range(1,100)]max:求列表中的最大值
print(len(a))b = ['man', 'film', 'python']min
print(max(b))
list:將其他格式的數(shù)據(jù)轉(zhuǎn)換成list# 把range產(chǎn)生的內(nèi)容轉(zhuǎn)換成listappend 插入一個(gè)內(nèi)容, 在末尾追加
print(list(range(12, 19)))a = [ i for i in range(1,5)]insert: 制定位置插入
a.append(100)# insert(index, data), 插入位置是index前面del 刪除
a.insert(3, 666)
pop,從對(duì)位拿出一個(gè)元素,即把最后一個(gè)元素取出來last_ele = a.pop()remove:在列表中刪除指定的值的元素(如果被刪除的值沒在list中,則報(bào)錯(cuò))
clear:清空
reverse:翻轉(zhuǎn)列表內(nèi)容,原地翻轉(zhuǎn)a = [ 1,2,3,4,5]extend:擴(kuò)展列表,兩個(gè)列表,把一個(gè)直接拼接到后一個(gè)上
a.reverse()a = [ 1,2,3,4,5]count:查找列表中指定值或元素的個(gè)數(shù)
b = [6,7,8,9,10]
a.extend(b)a_len = a.count(8)copy: 拷貝,此函數(shù)是淺拷貝b = a.copy()
2.tuple(元組)
# 創(chuàng)建空元組
t = ()
# 創(chuàng)建一個(gè)只有一個(gè)值的元組
t = (1,)
t = 1,
# 創(chuàng)建多個(gè)值的元組
t = (1,2,3,4,5)
t = 1,2,3,4,5
# 使用其他結(jié)構(gòu)創(chuàng)建
l = [1,2,3,4,5]
t = tuple(l)
t = ()
# 創(chuàng)建一個(gè)只有一個(gè)值的元組
t = (1,)
t = 1,
# 創(chuàng)建多個(gè)值的元組
t = (1,2,3,4,5)
t = 1,2,3,4,5
# 使用其他結(jié)構(gòu)創(chuàng)建
l = [1,2,3,4,5]
t = tuple(l)
元組的特性
- 是序列表,有序
- 元組數(shù)據(jù)值可以訪問,不能修改
- 元組數(shù)據(jù)可以是任意類型
- list所有特性,除了可修改外,元組都具有
- 元組的函數(shù)
len: 獲取元組的長度
max, min:最大最小值
count: 計(jì)算制定數(shù)據(jù)出現(xiàn)的次數(shù)
index:求制定元素在元組中的索引位置
3.set(集合)
# 集合的定義
s = set()
# 此時(shí),大括號(hào)內(nèi)一定要有值,否則定義出的是一個(gè)dict
s = {1,2,3,4,5,6,7}
# 如果只是用大括號(hào)定義,則定義的是一個(gè)dict類型
d = {}
s = set()
# 此時(shí),大括號(hào)內(nèi)一定要有值,否則定義出的是一個(gè)dict
s = {1,2,3,4,5,6,7}
# 如果只是用大括號(hào)定義,則定義的是一個(gè)dict類型
d = {}
集合的特征
- 集合內(nèi)數(shù)據(jù)無序,即無法使用索引和分片
- 集合內(nèi)部數(shù)據(jù)元素具有唯一性,可以用來排除重復(fù)數(shù)據(jù)
- 集合內(nèi)的數(shù)據(jù),str, int, float, tuple,冰凍集合等,即內(nèi)部只能放置可哈希數(shù)據(jù)
- 集合序列操作
- 成員檢測(in,not in)
- 遍歷# for 循環(huán)
s = {4,5,"i"}
for i in s:
print(i, end=" ")
# 帶有元組的集合遍歷
s = {(1,2,3), ("just", "for", "fun"), (4,5,6)}
for k,m,n in s:
print(k, "--", m, "--", n)
for k in s:
print(k) - 集合的內(nèi)涵# 普通集合內(nèi)涵
# 以下集合在初始化后自動(dòng)過濾掉重復(fù)元素
s = {23,223,545,3,1,2,3,4,3,2,3,1,2,4,3}
# 普通集合內(nèi)涵
ss = {i for i in s}
# 帶條件的集合內(nèi)涵
sss = {i for i in s if i % 2 == 0}
# 多循環(huán)的集合內(nèi)涵
s1 = {1,2,3,4}
s2 = {"just", "for", "fun"}
s = {m*n for m in s2 for n in s1}
s = {m*n for m in s2 for n in s1 if n ==2} - 集合函數(shù)
len, max, min
set:生成一個(gè)集合
add:向集合內(nèi)添加元素
clear
copy
remove:移除制定的值,直接改變原有值,如果要?jiǎng)h除的值不存在,報(bào)錯(cuò)
discard:移除集合中指定的值,跟 remove 一樣,但是入股要?jiǎng)h除的話,不報(bào)錯(cuò)
pop 隨機(jī)移除一個(gè)元素
函數(shù)
- intersection: 交集
- difference:差集
- union: 并集
- issubset: 檢查一個(gè)集合是否為另一個(gè)子集
- issuperset: 檢查一個(gè)集合是否為另一個(gè)超集
數(shù)學(xué)操作
s1 = {1,2,3,4,5,6}
s2 = {5,6,7,8,9}
s_1 = s1 - s2
s_2 = s1 + s2
s2 = {5,6,7,8,9}
s_1 = s1 - s2
s_2 = s1 + s2
frozen set:冰凍集合
不可以進(jìn)行任何修改的集合
# 創(chuàng)建
s = frozenset()
s = frozenset()
4.dict(字典)
沒有順序的組合數(shù)據(jù),數(shù)據(jù)以鍵值對(duì)形式出現(xiàn)
# 字典的創(chuàng)建
# 創(chuàng)建空字典1
d = {}
# 創(chuàng)建空字典2
d = dict()
# 創(chuàng)建有值的字典, 每一組數(shù)據(jù)用冒號(hào)隔開, 每一對(duì)鍵值對(duì)用逗號(hào)隔開
d = {"one":1, "two":2, "three":3}
# 用dict創(chuàng)建有內(nèi)容字典1
d = dict({"one":1, "two":2, "three":3})
# 用dict創(chuàng)建有內(nèi)容字典2
# 利用關(guān)鍵字參數(shù)
d = dict(one=1, two=2, three=3)
#
d = dict( [("one",1), ("two",2), ("three",3)])
# 創(chuàng)建空字典1
d = {}
# 創(chuàng)建空字典2
d = dict()
# 創(chuàng)建有值的字典, 每一組數(shù)據(jù)用冒號(hào)隔開, 每一對(duì)鍵值對(duì)用逗號(hào)隔開
d = {"one":1, "two":2, "three":3}
# 用dict創(chuàng)建有內(nèi)容字典1
d = dict({"one":1, "two":2, "three":3})
# 用dict創(chuàng)建有內(nèi)容字典2
# 利用關(guān)鍵字參數(shù)
d = dict(one=1, two=2, three=3)
#
d = dict( [("one",1), ("two",2), ("three",3)])
字典的特征
- 字典是序列類型,但是是無序序列,所以沒有分片和索引
- 字典中的數(shù)據(jù)每個(gè)都有鍵值對(duì)組成,即kv對(duì)
- key: 必須是可哈希的值,比如int,string,float,tuple, 但是,list,set,dict 不行
- value: 任何值
字典常見操作
# 訪問數(shù)據(jù)
d = {"one":1, "two":2, "three":3}
# 注意訪問格式
# 中括號(hào)內(nèi)是鍵值
print(d["one"])
d["one"] = "eins"
# 刪除某個(gè)操作
# 使用del操作
del d["one"]
# 成員檢測, in, not in
# 成員檢測檢測的是key內(nèi)容
d = {"one":1, "two":2, "three":3}
if 2 in d:
print("value")
if "two" in d:
print("key")
if ("two",2) in d:
print("kv")
# 按key來使用for循環(huán)
d = {"one":1, "two":2, "three":3}
# 使用for循環(huán),直接按key值訪問
for k in d:
print(k, d[k])
# 上述代碼可以改寫成如下
for k in d.keys():
print(k, d[k])
# 只訪問字典的值
for v in d.values():
print(v)
# 注意以下特殊用法
for k,v in d.items():
print(k,'--',v)
d = {"one":1, "two":2, "three":3}
# 注意訪問格式
# 中括號(hào)內(nèi)是鍵值
print(d["one"])
d["one"] = "eins"
# 刪除某個(gè)操作
# 使用del操作
del d["one"]
# 成員檢測, in, not in
# 成員檢測檢測的是key內(nèi)容
d = {"one":1, "two":2, "three":3}
if 2 in d:
print("value")
if "two" in d:
print("key")
if ("two",2) in d:
print("kv")
# 按key來使用for循環(huán)
d = {"one":1, "two":2, "three":3}
# 使用for循環(huán),直接按key值訪問
for k in d:
print(k, d[k])
# 上述代碼可以改寫成如下
for k in d.keys():
print(k, d[k])
# 只訪問字典的值
for v in d.values():
print(v)
# 注意以下特殊用法
for k,v in d.items():
print(k,'--',v)
字典生成式
d = {"one":1, "two":2, "three":3}
# 常規(guī)字典生成式
dd = {k:v for k,v in d.items()}
# 加限制條件的字典生成式
dd = {k:v for k,v in d.items() if v % 2 == 0}
# 常規(guī)字典生成式
dd = {k:v for k,v in d.items()}
# 加限制條件的字典生成式
dd = {k:v for k,v in d.items() if v % 2 == 0}
字典相關(guān)函數(shù)
len, max, min, dict
str(字典): 返回字典的字符串格式
clear: 清空字典
items: 返回字典的鍵值對(duì)組成的元組格式
keys:返回字典的鍵組成的一個(gè)結(jié)構(gòu)
values: 同理,一個(gè)可迭代的結(jié)構(gòu)
get: 根據(jù)制定鍵返回相應(yīng)的值
d = {"one":1, "two":2, "three":3}
print(d.get("on333"))
# get默認(rèn)值是None,可以設(shè)置
print(d.get("one", 100))
print(d.get("on333"))
# get默認(rèn)值是None,可以設(shè)置
print(d.get("one", 100))
: 使用指定的序列作為鍵,使用一個(gè)值作為字典的所有的鍵的值
l = ["eins", "zwei", "drei"]
# 注意fromkeys兩個(gè)參數(shù)的類型
# 注意fromkeys的調(diào)用主體
d = dict.fromkeys(l, "oops")
# 注意fromkeys兩個(gè)參數(shù)的類型
# 注意fromkeys的調(diào)用主體
d = dict.fromkeys(l, "oops")
四、表達(dá)式
運(yùn)算符
- 算數(shù)運(yùn)算符
- 比較或者關(guān)系運(yùn)算符
- 賦值運(yùn)算符
- 邏輯運(yùn)算符
- 位運(yùn)算
- 成員運(yùn)算
- 身份運(yùn)算符
- 算數(shù)運(yùn)算符
- 加 +
- 減 -
- 乘 *
- 除 /
- 取余 %
- 取商(地板除) //
- 冪運(yùn)算 **
??Python 沒有自增自減運(yùn)算符
比較運(yùn)算符
- ==
- !=
- >
- <
- >=
- <=
比較的結(jié)果是布爾值(True/False)
賦值運(yùn)算符
- =
- += (-=, ×=, /=, //=, %=, **=)
邏輯運(yùn)算符
- and 邏輯與
- or 邏輯或
- not 邏輯非
結(jié)果如果是0則為False, 否則為True
短路
Python 中沒有異或運(yùn)算
成員運(yùn)算符
用來檢測某一個(gè)變量是否是另一個(gè)變量的成員
- in
- not in
身份運(yùn)算符
- is: 用來檢測兩個(gè)變量是否是同一個(gè)變量
- is not: 兩個(gè)變量不是同一個(gè)變量
運(yùn)算符的優(yōu)先級(jí)
括號(hào)具有最高優(yōu)先級(jí)
** 指數(shù) (最高優(yōu)先級(jí))
~ + - 按位翻轉(zhuǎn), 一元加號(hào)和減號(hào) (最后兩個(gè)的方法名為 +@ 和 -@)
* / % // 乘,除,取模和取整除
+ - 加法減法
\>> << 右移,左移運(yùn)算符
& 位 'AND'
^ | 位運(yùn)算符
<= < > >= 比較運(yùn)算符
<> == != 等于運(yùn)算符
= %= /= //= -= += *= **= 賦值運(yùn)算符
is is not 身份運(yùn)算符
in not in 成員運(yùn)算符
not or and 邏輯運(yùn)算符
五、程序結(jié)構(gòu)
順序
分支
基本語法
# 表達(dá)式后面的冒號(hào)不能少
# 用縮進(jìn)來表示同一個(gè)代碼塊
if 條件表達(dá)式:
語句1
語句2
語句3
..
# 用縮進(jìn)來表示同一個(gè)代碼塊
if 條件表達(dá)式:
語句1
語句2
語句3

雙向分支
# if 和 else 一個(gè)層級(jí),其余語句一個(gè)層級(jí)
if 條件表達(dá)式:
語句1
語句2

else:
語句1
語句2

if 條件表達(dá)式:
語句1
語句2

else:
語句1
語句2

多路分支
if 條件表達(dá)式:
語句1
.
elif 條件表達(dá)式:
語句1

elif 條件表達(dá)式:
語句1

..
else:
語句1
.
語句1

elif 條件表達(dá)式:
語句1

elif 條件表達(dá)式:
語句1


else:
語句1

Python 沒有 switch-case 語句
循環(huán)
for 循環(huán)
for 變量 in 序列:
語句1
語句2

for 變量 in 序列:
語句1
語句2

range
生成一個(gè)數(shù)字序列
范圍:[m,n)
# 打印 1~10
for i in range(1,11):
print(i)
for i in range(1,11):
print(i)
for-else
當(dāng)for循環(huán)結(jié)束的時(shí)候,會(huì)執(zhí)行else語句
else語句可選
while 循環(huán)
while 條件表達(dá)式:
語句塊
#另外一種表達(dá)方法
while 條件表達(dá)式:
語句塊1
else:
語句塊2
語句塊
#另外一種表達(dá)方法
while 條件表達(dá)式:
語句塊1
else:
語句塊2
循環(huán)之break,continue,pass
break: 無條件結(jié)束整個(gè)循環(huán),簡稱循環(huán)猝死
continue:無條件結(jié)束本次循環(huán),從新進(jìn)入下一輪循環(huán)
pass:表示略過,通常用于站位,沒有跳過功能
六、函數(shù)
def關(guān)鍵字
代碼縮進(jìn)
# 定義
def func():
print("這是一個(gè)函數(shù)")
# 調(diào)用
func()
def func():
print("這是一個(gè)函數(shù)")
# 調(diào)用
func()
函數(shù)的參數(shù)和返回值
參數(shù): 負(fù)責(zé)給函數(shù)傳遞一些必要的數(shù)據(jù)或者信息
- 形參(形式參數(shù)): 在函數(shù)定義的時(shí)候用到的參數(shù)沒有具體值,只是一個(gè)占位的符號(hào),成為形參
- 實(shí)參(實(shí)際參數(shù)): 在調(diào)用函數(shù)的時(shí)候輸入的值
返回值: 函數(shù)的執(zhí)行結(jié)果
- 使用 return 關(guān)鍵字
- 如果沒有 return ,默認(rèn)返回一個(gè) None
- 函數(shù)一旦執(zhí)行 return 語句,則無條件返回,即結(jié)束函數(shù)的執(zhí)行
# return語句的基本使用
# 函數(shù)打完招呼后返回一句話
def hello(person):
print("{0}, 你腫么咧".format(person))
print("Sir, 你不理額額就走咧")
return "我已經(jīng)跟{0}打招呼了,{1}不理我".format(person, person)
p = "明月"
rst = hello(p)
print(rst)
# 定義一個(gè)函數(shù),打印一行九九乘法表
def printLine(row):
for col in range(1, row+1):
# print函數(shù)默認(rèn)任務(wù)打印完畢后換行
print( row * col, end=" ")
print("")
# 函數(shù)打完招呼后返回一句話
def hello(person):
print("{0}, 你腫么咧".format(person))
print("Sir, 你不理額額就走咧")
return "我已經(jīng)跟{0}打招呼了,{1}不理我".format(person, person)
p = "明月"
rst = hello(p)
print(rst)
# 定義一個(gè)函數(shù),打印一行九九乘法表
def printLine(row):
for col in range(1, row+1):
# print函數(shù)默認(rèn)任務(wù)打印完畢后換行
print( row * col, end=" ")
print("")
# 九九乘法表
# version 2.0
for row in range(1,10):
printLine(row)
# version 2.0
for row in range(1,10):
printLine(row)
參數(shù)詳解
- 參數(shù)分類
- 普通參數(shù)
- 默認(rèn)參數(shù)
- 關(guān)鍵字參數(shù)
- 收集參數(shù)
- 普通參數(shù)
參見上例
定義的時(shí)候直接定義變量名
調(diào)用的時(shí)候直接把變量或者值放入指定位置
def 函數(shù)名(參數(shù)1, 參數(shù)2,
.):
函數(shù)體
# 調(diào)用
函數(shù)名(value1, value2,
.)

函數(shù)體
# 調(diào)用
函數(shù)名(value1, value2,


默認(rèn)參數(shù)
形參帶有默認(rèn)值
調(diào)用的時(shí)候,如果沒有對(duì)相應(yīng)形參賦值,則使用默認(rèn)值
def func_name(p1=v1, p2=v2

.):
func_block
#調(diào)用1
func_name()
# 調(diào)用2
value1 = 100
value2 = 200
func_name(value1,value2)



func_block
#調(diào)用1
func_name()
# 調(diào)用2
value1 = 100
value2 = 200
func_name(value1,value2)
關(guān)鍵字參數(shù)
def func(p1=v1, p2=v2
..):
func_body
# 調(diào)用函數(shù):
func(p1=value1, p2=value2
.)

func_body
# 調(diào)用函數(shù):
func(p1=value1, p2=value2


收集參數(shù)
把沒有位置,不能和定義時(shí)的參數(shù)位置相對(duì)應(yīng)的參數(shù),放入一個(gè)特定的數(shù)據(jù)結(jié)構(gòu)中
def func(*args):
func_body
# 按照list使用方式訪問args得到傳入的參數(shù)
# 調(diào)用:
func(p1, p2, p3,
..)
func_body
# 按照list使用方式訪問args得到傳入的參數(shù)
# 調(diào)用:
func(p1, p2, p3,

收集參數(shù)混合調(diào)用的順序問題
收集參數(shù),關(guān)鍵字參數(shù),普通參數(shù)可以混合使用
使用規(guī)則就是,普通參數(shù)和關(guān)鍵字參數(shù)優(yōu)先
定義的時(shí)候一般找普通參數(shù),關(guān)鍵字參數(shù),收集參數(shù) tuple,收集參數(shù) dict
返回值
函數(shù)和過程的區(qū)別
- 有無返回值
- 需要用return顯示返回內(nèi)容,
- 如果沒有返回,則默認(rèn)返回None
遞歸函數(shù)
python對(duì)遞歸深度有限制,超過限制報(bào)錯(cuò)
# 斐波那契額數(shù)列
# 一列數(shù)字,第一個(gè)值是1, 第二個(gè)也是1, 從第三個(gè)開始,每一個(gè)數(shù)字的值等于前兩個(gè)數(shù)字出現(xiàn)的值的和
# 數(shù)學(xué)公式為: f(1) = 1, f(2) = 1, f(n) = f(n-1) + f(n-2)
# 例如: 1,1,2,3,5,8,13.。。。。。。。。
# n表示求第n個(gè)數(shù)子的斐波那契數(shù)列的值
def fib(n):
if n == 1:
return 1
if n == 2:
return 1
return fib(n-1) + fib(n-2)
print(fib(3))
print(fib(10))
# 一列數(shù)字,第一個(gè)值是1, 第二個(gè)也是1, 從第三個(gè)開始,每一個(gè)數(shù)字的值等于前兩個(gè)數(shù)字出現(xiàn)的值的和
# 數(shù)學(xué)公式為: f(1) = 1, f(2) = 1, f(n) = f(n-1) + f(n-2)
# 例如: 1,1,2,3,5,8,13.。。。。。。。。
# n表示求第n個(gè)數(shù)子的斐波那契數(shù)列的值
def fib(n):
if n == 1:
return 1
if n == 2:
return 1
return fib(n-1) + fib(n-2)
print(fib(3))
print(fib(10))
漢諾塔問題
規(guī)則:
每次移動(dòng)一個(gè)盤子
任何時(shí)候大盤子在下面,小盤子在上面
方法:
n=1: 直接把A上的一個(gè)盤子移動(dòng)到C上, A->C
n=2:
把小盤子從A放到B上, A->B
把大盤子從A放到C上, A->C
把小盤子從B放到C上, B->C
n=3:
把A上的兩個(gè)盤子,通過C移動(dòng)到B上去, 調(diào)用遞歸實(shí)現(xiàn)
把A上剩下的一個(gè)最大盤子移動(dòng)到C上, A->C
把B上兩個(gè)盤子,借助于A,挪到C上去, 調(diào)用遞歸
n = n:
把A上的n-1個(gè)盤子,借助于C,移動(dòng)到B上去,調(diào)用遞歸
把A上的最大盤子,也是唯一一個(gè),移動(dòng)到C上,A->C
把B上n-1個(gè)盤子,借助于A,移動(dòng)到C上, 調(diào)用遞歸
def hano(n, a, b, c):
'''
漢諾塔的遞歸實(shí)現(xiàn)
n:代表幾個(gè)盤子
a:代表第一個(gè)塔,開始的塔
b:代表第二個(gè)塔,中間過渡的塔
c:代表第三個(gè)塔, 目標(biāo)塔
'''
if n == 1:
print(a, "-->", c)
return None
'''
if n == 2:
print(a, "-->", b)
print(a, "-->", c)
print(b, "-->", c)
return None
'''
# 把n-1個(gè)盤子,從a塔借助于c塔,挪到b塔上去
hano(n-1, a, c, b)
print(a, "-->", c)
# 把n-1個(gè)盤子,從b塔,借助于a塔,挪到c塔上去
hano(n-1,b, a, c)
a = "A"
b = "B"
c = "C"
n = 1
hano(n, a, b, c)
n = 2
hano(n, a, b, c)
n = 3
hano(n, a, b, c)
'''
漢諾塔的遞歸實(shí)現(xiàn)
n:代表幾個(gè)盤子
a:代表第一個(gè)塔,開始的塔
b:代表第二個(gè)塔,中間過渡的塔
c:代表第三個(gè)塔, 目標(biāo)塔
'''
if n == 1:
print(a, "-->", c)
return None
'''
if n == 2:
print(a, "-->", b)
print(a, "-->", c)
print(b, "-->", c)
return None
'''
# 把n-1個(gè)盤子,從a塔借助于c塔,挪到b塔上去
hano(n-1, a, c, b)
print(a, "-->", c)
# 把n-1個(gè)盤子,從b塔,借助于a塔,挪到c塔上去
hano(n-1,b, a, c)
a = "A"
b = "B"
c = "C"
n = 1
hano(n, a, b, c)
n = 2
hano(n, a, b, c)
n = 3
hano(n, a, b, c)
查找函數(shù)幫助文檔
用 help 函數(shù)
help(print)
使用__doc__
def stu(name, age):
'''
這是文檔的文字內(nèi)容
:param name: 表示學(xué)生的姓名
:param age: 表示學(xué)生的年齡
:return: 此函數(shù)沒有返回值
'''
pass
print(help(stu))
print("*" * 20)
print(stu.__doc__)
'''
這是文檔的文字內(nèi)容
:param name: 表示學(xué)生的姓名
:param age: 表示學(xué)生的年齡
:return: 此函數(shù)沒有返回值
'''
pass
print(help(stu))
print("*" * 20)
print(stu.__doc__)
七、變量作用域
分類:按照作用域分類
- 全局(global): 在函數(shù)外部定義
- 局部(local):在函數(shù)內(nèi)部定義
LEGB原則
- L(Local)局部作用域
- E(Enclosing function locale)外部嵌套函數(shù)作用域
- G(Global module)函數(shù)定義所在模塊作用域
- B(Buildin): python內(nèi)置魔抗的作用域
提升局部變量為全局變量(使用global)
def fun():
global b1
b1 = 100
print(b1)
print("I am in fun")
# b2的作用范圍是fun
b2 = 99
print(b2)
fun()
print(b1)
global b1
b1 = 100
print(b1)
print("I am in fun")
# b2的作用范圍是fun
b2 = 99
print(b2)
fun()
print(b1)
globals, locals函數(shù)
可以通過globals和locals顯示出局部變量和全局變量
# globals 和 locals
# globals 和 locals 叫做內(nèi)建函數(shù)
a = 1
b = 2
def fun(c,d):
e = 111
print("Locals={0}".format(locals()))
print("Globals={0}".format(globals()))
fun(100, 200)
# globals 和 locals 叫做內(nèi)建函數(shù)
a = 1
b = 2
def fun(c,d):
e = 111
print("Locals={0}".format(locals()))
print("Globals={0}".format(globals()))
fun(100, 200)
eval()函數(shù)
把一個(gè)字符串當(dāng)成一個(gè)表達(dá)式來執(zhí)行, 返回表達(dá)式執(zhí)行后的結(jié)果
eval(string_code, globals=None, locals=None)
exec()函數(shù)
跟eval功能類似, 但是,不返回結(jié)果
exec(string_code, globals=None, locals=None)