1小時學會Python ( Learning Python in an hour )
Python是一個動態(tài)類型的高級語言申窘,所謂“動態(tài)類型”是指Python能自動從變量值推斷其類型端辱。可以用Python內(nèi)置函數(shù)type()查詢一個值的類型柿赊。如
type(2)
int
type(3.14)
float
Python的print()函數(shù)可以輸出一系列用逗號','隔開的對象,如:
print(2,3.14,"http://hwdong.net",True)
print(type(2),type(3.14),type("http://hwdong.net"),type(False))
2 3.14 http://hwdong.net True
<class 'int'> <class 'float'> <class 'str'> <class 'bool'>
Python的bool類型只有2個邏輯值:True、False,分別表示真和假捺萌。Python的str類型表示字符串,字符串是多個字符構(gòu)成的一個字符序列膘茎。Python用雙引號或單引號包圍一個字符序列表示一個字符串桃纯。如果一個字符串中內(nèi)容占據(jù)多行,則用三引號'''包圍來表示披坏。如:
print('''http://hwdong.net is
a blog teaching computer programming''')
http://hwdong.net is
a blog teaching computer programming
Python的所有值都以對象形式表示态坦,一個對象包含了值的:內(nèi)容、類型棒拂、id(相當于地址)驮配。如值10的內(nèi)容是10,它的類型是int着茸,可以用內(nèi)置函數(shù)id()得到其id壮锻。
id(10)
140731301598304
變量
給一個對象其一個名字,叫做變量涮阔,一個對象可能被多次使用猜绣,通過變量名去訪問這個對象可避免多次創(chuàng)建同樣值得對象,另外還增加了代碼得可讀性敬特。如:
blog = "hwdong-net.github.io"
print(blog)
blog = "http://"+blog
print(blog)
hwdong-net.github.io
http://hwdong-net.github.io
Python的變量僅僅是對象的名字而不是對象本身掰邢,可以隨時將同一個變量指向不同的對象牺陶。Python的變量僅僅是引用對象。而其他語言如C語言中辣之,變量就是對象本身掰伸。
a = 3.14 #a是對象3.14的引用
b = a #b和a引用同一個對象3.14
a = "hwdong-net.github.io" #a引用了新的字符串對象"hwdong.net"
print(a)
print(b)
hwdong-net.github.io
3.14
可以用內(nèi)置函數(shù),將一種類型值轉(zhuǎn)化為另外一種類型的值怀估,如:
a = int(3.14)
print(a)
print(type(a))
b= float("3.14")
print(b)
print(type(b))
3
<class 'int'>
3.14
<class 'float'>
Python內(nèi)置函數(shù)input("提示串")可以用于從鍵盤輸入一個字符串狮鸭,可以給該函數(shù)傳遞一個提示串,在接受輸入字符串多搀,該函數(shù)先輸出這個提示串歧蕉。可以將輸入的字符串用上述類型轉(zhuǎn)換函數(shù)轉(zhuǎn)換為某種類型的數(shù)據(jù)康铭,如:
score = input("請輸入一個學生的分數(shù):")
print(score)
請輸入一個學生的分數(shù):78.9
78.9
運算符
可以用運算符直接對(對象)值進行運算惯退。不同類型的值支持的運算是不盡相同的。例如對數(shù)值類型(int从藤、float)可以進行算術(shù)運算如+催跪、-、*
夷野、/懊蒸、%、//扫责、**
榛鼎。其中%、//鳖孤、**
分別表示求余數(shù)者娱、整數(shù)除、平方運算苏揣。如:
x = 15
y = 2
print('x + y =',x+y)
print('x - y =',x-y)
print('x * y =',x*y)
print('x / y =',x/y)
print('x // y =',x//y)
print('x ** y =',x**y)
print('x % y =',x%y)
x + y = 17
x - y = 13
x * y = 30
x / y = 7.5
x // y = 7
x ** y = 225
x % y = 1
Python的2個字符串可以用加法運算符+黄鳍,產(chǎn)生的是一個拼接的新字符串,只能對用一個整數(shù)和一個字符串用乘法運算符平匈,如:
print("http:"+"http://"+"hwdong.net")
print("hello "*3)
http://hwdong.net
hello hello hello
不能對2個字符串用乘法運算符或其他運算符如減法運算符框沟。下列語句將出錯。
print("hello "*"world")
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-19-f3e4123ae63f> in <module>
----> 1 print("hello "*"world")
TypeError: can't multiply sequence by non-int of type 'str'
對2個值進行比較的比較運算符==增炭、!=忍燥、>、<隙姿、>=梅垄、<=分別表示等于、不等于输玷、大于队丝、小于靡馁、大于等于、小于等于机久。如:
x = 15
y = 2
print('x > y is',x>y)
print('x < y is',x<y)
print('x == y is',x==y)
print('x != y is',x!=y)
print('x >= y is',x>=y)
print('x <= y is',x<=y)
x > y is True
x < y is False
x == y is False
x != y is True
x >= y is True
x <= y is False
邏輯運算符and臭墨、or、not分別表示邏輯與膘盖、邏輯或胧弛、邏輯非。在邏輯運算中衔憨,True或非0或非空對象就是真(True)叶圃,而False或0或空對象就是假(Fasle)袄膏。運算運算符的運算規(guī)則是:
- 對一個對象x践图,當x是真 (True或非0值或非空值)時,not x就是False沉馆,當x是假(False或0或空值)時码党,not x就是True(真)。
print(not 0)
print(not "")
print(not False)
print(not 2)
print(not "hwdong")
True
True
True
False
False
- 對于2個對象x斥黑、y揖盘,當x是真時,x or y的結(jié)果就是x锌奴,當x是假時兽狭,x or y的結(jié)果就是y。
print(3 or 2) #因為3是真鹿蜀,3 or 2的結(jié)果就是3
print(0 or 2) #因為0是假箕慧,0 or 2的結(jié)果就是2
print(False or True)
print(False or "")
print("" or 2) #因為空字符串""是假,"" or 2的結(jié)果就是2
3
2
True
2
- 對于2個對象x茴恰、y颠焦,當x是真時,x and y的結(jié)果就是y往枣,當x是假時伐庭,x and y的結(jié)果就是x。
print(3 and 2) #因為3是真分冈,3 and 2的結(jié)果就是2
print(0 and 2) #因為0是假圾另,0 and 2的結(jié)果就是0
print(False and True)
print(True and "")
print("" and 2) #因為空字符串""是假,"" and 2的結(jié)果就是{}
2
0
False
Python還有移位運算符(如位與&雕沉、位或|集乔、異或^、取反~蘑秽、左移<<饺著、右移>>)等其他運算符箫攀。有興趣讀者可以去搜索相關(guān)信息。
和C語言等編程語言不同幼衰,運算符=主要用于給一個變量起一個名字而不是修改一個變量的值靴跛。如:
x=2 # 給對象2起了一個變量名x
x+=3 # 等價于 x= x+2,即變量名x指向了原來x引用的2和3相加的結(jié)果對象。
其中“x=2”給對象2起了一個變量名x渡嚣,而“x+=3”是“x = x+3”的簡寫形式梢睛,即將變量名x指向了原來x引用的2和3相加的結(jié)果對象∈兑可以看到運算符=和其他運算符結(jié)合如“x+=b”相當于“x = x+b”绝葡。運算符=可以和算術(shù)運算符和位運算符結(jié)合使用。如:
+= -+ *= /= %= **= &= |= ^= ~= <<= >>=
x=3
x**=2
print(x)
x%=2
print(x)
9
1
注意:python沒有其他語言的自增運算符++和自減運算符--腹鹉。
Python的成員運算符用于判斷一個值(對象)是否在一個容器對象中藏畅。如:
print("h"in"hwdong")
print("h"not in"hwdong")
True
False
身份運算符is和is not用于判斷兩個變量(標識符)是不是引用的同一個對象。
a = 3.14
b = 3.15
c = a
print(id(a))
print(id(b))
print(a is b)
print(a is not b)
print(a is c)
1727166941440
1727166941776
False
True
True
對字符串進行操作
除前面的加法運算符+功咒、*
外愉阎,通常用一些處理字符串的內(nèi)置函數(shù)或字符串類型str的方法對一個字符串進行處理。如:
s = "http://Hwdong.Net"
print(s) # 用print輸出s引用的字符串內(nèi)容
print(len(s)) # 用len()函數(shù)得到s引用的字符串的長度力奋,即字符個數(shù)
print(s.capitalize()) #首字母大寫
print(s.upper()) #所有字母大寫
print(s.lower()) #所有字母小寫
print(s.rjust(20)) #右對齊
print(s.center(20)) #中心對齊
print(s.replace('//', '//www.')) #替換
print(' hwdong '.strip()+".net") #裁剪
print(s)
http://Hwdong.Net
17
Http://hwdong.net
HTTP://HWDONG.NET
http://hwdong.net
http://Hwdong.Net
http://Hwdong.Net
http://www.Hwdong.Net
hwdong.net
http://Hwdong.Net
注意榜旦,字符串對象是“不可以被修改的”,所有修改性操作實際返回的是一個新字符串景殷,而原來的字符串并沒有被修改溅呢!
還有可以在字符串里用格式符%來將一些數(shù)據(jù)格式化到字符串中,創(chuàng)建一個新字符串猿挚。如:
s2 = '%s %s %f' % ("The score", "of LiPing is: ", 78.5)
print(s2)
The score of LiPing is: 78.500000
也可以用字符串str的format()方法對一個字符串格式化咐旧,即將字符串中的占位符{}依次替換為format()方法中的數(shù)據(jù)。如:
print ("{} {} {}".format("The score", "of LiPing is: ", 78.5))
The score of LiPing is: 78.5
可以通過指定一個下標訪問字符串的某個字符亭饵,下標從0開始休偶,長度為n的字符串的下標為,下標甚至可以是負整數(shù)辜羊,其中-1指的是最后一個字符踏兜,-n指的是第1個字符。
s = "hwdong"
print(s[0], s[1], s[2], s[3], s[4], s[5])
print(s[-1],s[-5],s[-4],s[-3],s[-2],s[-1])
h w d o n g
g w d o n g
對于一個字符串s八秃,s[start:end:step]
表示創(chuàng)建一個從起始位置start開始碱妆,直到結(jié)束位置end,間隔步長為step的所有字符(不包括end位置的字符)構(gòu)成的一個新字符串昔驱。如果沒有指定step疹尾,則默認為1。如:
s = "hwdong.net"
print(s[1:6:2])
print(s[-1:-6:-2])
print(s[1:6])
wog
tng
wdong
if語句
if關(guān)鍵字后面跟一個表示某種條件的表達式,當該表達式為True或非空值時纳本,就執(zhí)行if語句中的程序塊窍蓝。其格式如下:
if 表達式:
程序塊
如:
score = 65.5
if score>=60:
print("恭喜你!")
print("通過了考試。")
恭喜你!
通過了考試繁成。
注意:
- if 表達式后面要有冒號:
- Python中通過對齊方法表示一組語句屬于同一個程序塊吓笙,而其他語言如C、Java通常需要用一對{}包為統(tǒng)一程序塊的語句巾腕。
Python中屬于同一個程序塊的代碼如果正確的縮進面睛,Python解釋器會報錯的。如:
score = 65.5
if score>=60:
print("恭喜你!")
print("通過了考試尊搬。")
File "<tokenize>", line 4
print("通過了考試叁鉴。")
^
IndentationError: unindent does not match any outer indentation level
if和else可以結(jié)合使用,表示“如果...否則...”的意思佛寿。即當if中的條件表達式為True幌墓,則執(zhí)行if子句中的程序塊,否則執(zhí)行else子句中的程序塊狗准。else后面不需要條件表達式克锣。 其格式是:
if 表達式:
程序塊
else
程序塊2
如:
score= int(input("請輸入學生成績:"));
if score>=60:
print("恭喜你!")
print("通過了考試茵肃。")
else:
print("你未通過考試腔长。")
print("繼續(xù)努力,加油验残!")
請輸入學生成績:45
你未通過考試捞附。
繼續(xù)努力,加油您没!
對于多個條件可以用if的另一種形式“if...elif...else”鸟召,即“如果...否則如果...否則”的意思。
if 表達式1:
程序塊1
elif 表達式2:
程序塊2
elif 表達式3:
程序塊3.
else:
程序塊k
如:
score= int(input("請輸入學生成績:"));
if score<60:
print("不及格")
elif score<70:
print("及格")
elif score<80:
print("中等")
elif score<90:
print("良好")
else:
print("優(yōu)秀");
請輸入學生成績:79
中等
while語句
while語句的格式如下
while 表達式:
程序塊
即氨鹏,當關(guān)鍵字while里的“表達式”為True欧募,就重復執(zhí)行其中的程序塊。如:
i = 1
s = 0
while i<=100:
s = s+i; #等價于 s += i
i+=1
print(s)
5050
再如仆抵,統(tǒng)計鍵盤輸入的一組學生分數(shù)的平均分跟继,可以用下列代碼是實現(xiàn):
total_score=0
i= 0
score = float(input("請輸入學生成績:"))
while True:
total_score += score
i += 1
score = float(input("請輸入學生成績:"))
if score<0:
break #關(guān)鍵字break用于跳出循環(huán)
print('平均成績?yōu)椋?, total_score/i)
請輸入學生成績:45
請輸入學生成績:78
請輸入學生成績:93
請輸入學生成績:-1
平均成績?yōu)椋?72.0
在循環(huán)的程序塊里嵌套了一個if條件語句,其中又有一個break關(guān)鍵表示的語句镣丑,表示跳出整個循環(huán)舔糖。
for語句
for關(guān)鍵表示的也是一個循環(huán)語句,表示迭代訪問一個容器對象中的每個元素莺匠。格式為:
for e in container:
程序塊
表示循環(huán)訪問容器對象container中的每個元素e金吗,執(zhí)行其中程序塊的語句。如:
for ch in "hwdong":
print(ch,end=" ")
h w d o n g
print()函數(shù)的參數(shù)end表示print()函數(shù)輸出內(nèi)容后的結(jié)束字符,默認是"\n"表示換行符摇庙,這里用空格符" "代替了"\n"旱物。因此,輸出ch后卫袒,print并沒有換行异袄,而是輸出一個空格。
Python常用容器類型
如同一個字符串是一些字符的容器一樣玛臂,Python提供了list烤蜕、tuple、set迹冤、dict等容器類型讽营。
list(列表)
列表list是一組數(shù)據(jù)元素(對象)的有序序列,定義列表對象是用一對左右方括號[ ]
包圍泡徙、數(shù)據(jù)元素之間用逗號隔開橱鹏。如:
[1,2,3]
type([1,2,3])
list中的數(shù)據(jù)元素可以是不同的類型,甚至是包含其他對象的list對象堪藐,如:
[2, 3.14, 'python']
[2, 3.14,True,[3,6,9],'python']
和字符串一樣莉兰,可以用一個下標訪問(修改)其中的一個元素,也可以用[start:end:step]
訪問(修改)其中的多個元素礁竞。
my_list =[2, 3.14,True,[3,6,9],'python']
print(type(my_list)) #打印my_list的類型糖荒,即list類型
print(my_list)
print("my_list[0]:",my_list[0])
print("my_list[3]:",my_list[3])
print("my_list[-2]:",my_list[-1])
print("my_list[:]:",my_list[:]) #所有元素
my_list[2:4] = [13, 9]
print(my_list)
<class 'list'>
[2, 3.14, True, [3, 6, 9], 'python']
my_list[0]: 2
my_list[3]: [3, 6, 9]
my_list[-2]: python
my_list[:]: [2, 3.14, True, [3, 6, 9], 'python']
[2, 3.14, 13, 9, 'python']
當然可以用for循環(huán)等訪問一個list對象中的元素。如:
for e in my_list:
print(e,end=" ")
2 3.14 13 9 python
甚至可以用for循環(huán)遍歷一個容器或可迭代對象的方式來創(chuàng)建一個新的list對象模捂。如:
alist = [e**2 for e in [0,1,2,3,4,5]]
print(alist)
[0, 1, 4, 9, 16, 25]
表示對[1,2,3,4,5]
的每個元素e計算e**2
捶朵,用這些值創(chuàng)建了一個list對象。python的一個內(nèi)置函數(shù)range(n)是一個產(chǎn)生0到n之間整數(shù)(不包括n)的迭代器對象狂男。下列代碼可產(chǎn)生同樣的結(jié)果:
alist = [e**2 for e in range(6)]
print(alist)
[0, 1, 4, 9, 16, 25]
上述這種通過在[]中迭代計算產(chǎn)生值創(chuàng)建一個新list對象的式子综看,叫做“列表解析式”。其中還可以包括更加復雜的計算式子岖食,如包含條件語句:
alist = [0, 1, 2, 3, 4,5]
alist = [x ** 2 for x in alist if x % 2 == 0]
print(alist)
[0, 4, 16]
tuple(元組)
和list一樣红碑,tuple(元組)也是一組數(shù)據(jù)元素(對象)的有序序列,也就是每個元素也有唯一的下標泡垃。定義tuple是用圓括號而不是方括號析珊。如:
t = ('python',[2,5],37,3.14,"https://hwdong.net")
print(type(t))
print(t[1:4])
print(t[-1:-4:-1])
<class 'tuple'>
([2, 5], 37, 3.14)
('https://hwdong.net', 3.14, 37)
list中的元素是可以修改的。
print(alist)
alist[1] = 22
print(alist)
[0, 4, 16]
[0, 22, 16]
tuple中的元素是不可以被修改的兔毙,如同字符串中的元素是不可以被修改的唾琼。
t[1]=22
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-142-70d00e4ef536> in <module>
----> 1 t[1]=22
TypeError: 'tuple' object does not support item assignment
可以用()的解析式創(chuàng)建一個可迭代對象而不是tuple對象,如:
nums = (x**2 for x in range(6))
print(nums)
for e in nums:
print(e,end= " ")
<generator object <genexpr> at 0x00000192233DB8B8>
0 1 4 9 16 25
set(集合)
set是不包含重復元素的無序集合澎剥。set是用左右花括號{}包圍的以逗號隔開的一組元素锡溯。元素的類型可以是不同的赶舆。如:
s = {5,5,3.14,2,'python',8}
print(type(s))
print(s)
<class 'set'>
{2, 3.14, 5, 8, 'python'}
可以用add()和remove()函數(shù)向一個集合中添加和刪除一個元素,而list對象可以用append()或insert()函數(shù)追加或插入元素祭饭,pop() 用于刪除最后一個元素芜茵,remove()則是刪除第一個指定值的元素。
s.add("hwdong")
print(s)
s.remove("hwdong")
print(s)
alist.append("hwdong")
print(alist)
alist.insert(2,"net")
print(alist)
alist.pop()
print(alist)
alist.remove("net")
print(alist)
{2, 3.14, 5, 'hwdong', 8, 'python'}
{2, 3.14, 5, 8, 'python'}
[0, 22, 16, 'hwdong']
[0, 22, 'net', 16, 'hwdong']
[0, 22, 'net', 16]
[0, 22, 16]
但不可修改對象如tuple則沒有append()或insert()之類的函數(shù)用于添加元素倡蝙。下列代碼是錯誤的:
t.append("hwdong")
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-133-34fd50c7f43a> in <module>
----> 1 t.append("hwdong")
AttributeError: 'tuple' object has no attribute 'append'
可以用{}的解析式創(chuàng)建一個set對象九串,如:
nums = {x**2 for x in range(6)}
print(nums)
{0, 1, 4, 9, 16, 25}
dict(字典)
dict是一個 (key-value pairs) “鍵-值”對的無序集合。每個元素都以“鍵:值(key:value)”的形式存儲的寺鸥。如:
d = {1:'value', 'key':2, 'hello': [4,7]}
print(type(d))
print(d)
<class 'dict'>
{1: 'value', 'key': 2, 'hello': [4, 7]}
需要通過key(鍵猪钮,也稱為關(guān)鍵字)才能訪問dict中這個key對應元素的值value。如:
d['hello']
[4, 7]
如果一個key對應的元素不存在胆建,通過這個key訪問元素是非法的烤低,如:
d[3]
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-156-0acadf17a380> in <module>
----> 1 d[3]
KeyError: 3
但可以給一個不存在的key賦一個值(value),將在這個set中添加一個“鍵-值”對的元素笆载。如:
d[3] = "python"
print(d)
print(d[3])
{1: 'value', 'key': 2, 'hello': [4, 7], 3: 'python'}
python
可以定義一個表示學生信息并以名字作為關(guān)鍵字的dict對象:
students={"LiPing":[21,"計科01",15370203152],"ZhangWei":[20,"計科02",17331203312]
,"ZhaoSi":[22,"機械03",16908092516]}
print(students)
print(students["ZhangWei"])
{'LiPing': [21, '計科01', 15370203152], 'ZhangWei': [20, '計科02', 17331203312], 'ZhaoSi': [22, '機械03', 16908092516]}
[20, '計科02', 17331203312]
可以通過for...in循環(huán)語句訪問字典中的元素扑馁,如:
for name in students:
info = students[name]
print('{}\'s info: {} '.format(name, info))
LiPing's info: [21, '計科01', 15370203152]
ZhangWei's info: [20, '計科02', 17331203312]
ZhaoSi's info: [22, '機械03', 16908092516]
注意:單引號'的字符串中不能直接包含單引號'需要用反斜杠字符\和單引號'構(gòu)成的轉(zhuǎn)義字符表示單引號字符'。在雙引號字符"的字符串中包含雙引號字符凉驻,則也需要用轉(zhuǎn)移字符"腻要。
上述for循環(huán)中的name表示的是字典對象的key(鍵),如果向同時獲得鍵(key)和值(value)涝登,則可以用dict類的item()方法獲得一個字典對象的所有鍵-值:
for key,value in students.items():
value = students[key]
print('{}\'s info: {} '.format(key,value))
LiPing's info: [21, '計科01', 15370203152]
ZhangWei's info: [20, '計科02', 17331203312]
ZhaoSi's info: [22, '機械03', 16908092516]
當然雄家,也可以用一個{}解析式創(chuàng)建一個字典對象瘩燥,如:
points = {x:x**2 for x in range(6)}
print(points)
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
函數(shù)
Python通過關(guān)鍵字def定義函數(shù),給一個程序塊起一個名字见秤,然后就可以通過函數(shù)名去調(diào)用執(zhí)行這個函數(shù)塊中的代碼鉴象。
下面的代碼首先用關(guān)鍵字import導入了數(shù)學函數(shù)庫math,其中有一個表示PI的常量math.pi句狼,然后定義了一個函數(shù)名是circle_area的函數(shù),此后,可以通過函數(shù)名circle_area調(diào)用上面的circle_area()函數(shù)褐荷。
#定義一個函數(shù)名是circle_area的函數(shù)
import math #導入數(shù)學函數(shù)庫math,其中有一個表示PI的常量math.pi
def circle_area():
area = math.pi*2.5**2
print("半徑是2.5的圓面積是:%f"%area)
circle_area() #通過函數(shù)名circle_area調(diào)用上面的circle_area()函數(shù)
半徑是2.5的圓面積是:19.634954
函數(shù)名后面的()里是函數(shù)的參數(shù)嘹悼,調(diào)用該函數(shù)的代碼可以將相應的數(shù)值傳給對應的函數(shù)參數(shù)叛甫。如給上面函數(shù)添加一個表示半徑的參數(shù)r。在調(diào)用時杨伙,也必須提供實際數(shù)值給這個參數(shù)r其监。
import math
def circle_area(r):
area = math.pi*r**2
print("半徑是%5.2f的圓面積是:%5.2f"%(r,area)) #格式符%5.2f表示輸出的是float類型的數(shù),占據(jù)5位寬限匣,小數(shù)點后是2位
circle_area(2.5) #通計算半徑是2.5的圓面積
circle_area(3.5) #通計算半徑是3.5的圓面積
半徑是 2.50的圓面積是:19.63
半徑是 3.50的圓面積是:38.48
函數(shù)內(nèi)部可以通過return返回抖苦,即結(jié)束函數(shù)的執(zhí)行,return還可以返回一些數(shù)值。如:
import math
def circle(r):
area = math.pi*r**2
perimeter = 2*math.pi*r
return area,perimeter
area,p = circle(2.5)
print("半徑是2.5的圓面積和周長是:%5.2f,%5.2f"%(area,p))
area,p =circle(3.5)
print("半徑是3.5的圓面積和周長是:%5.2f,%5.2f"%(area,p))
半徑是2.5的圓面積和周長是:19.63,15.71
半徑是3.5的圓面積和周長是:38.48,21.99
函數(shù)的參數(shù)可以有默認值锌历,如果調(diào)用函數(shù)時贮庞,沒有提供相應的參數(shù)。
def pow(x,n=2):
ret = 1
for i in range(n):
ret *=x
return ret
print(pow(3.5))
print(pow(3.5,3))
12.25
42.875
定義函數(shù)時究西,默認參數(shù)必須排在非默認參數(shù)的后面窗慎。下面函數(shù)定義是錯誤的。
def pow(a,b=2,c):
return a+b+c
一個函數(shù)內(nèi)部可以存在調(diào)用其他函數(shù)的語句卤材,函數(shù)也可以作為另外函數(shù)的參數(shù)遮斥。
下面的函數(shù)solve_iterative()用于求f(x)=y的方程的根,參數(shù)lower扇丛、 upper是求解區(qū)間的左右端點伏伐,參數(shù)f可以接受一個函數(shù),參數(shù)y是一個數(shù)值晕拆。假設(shè)f表示的是一個單挑遞增的函數(shù)藐翎,函數(shù)solve_iterative()采用二分法去計算區(qū)間中點middle的值f(middle)是否和y足夠接近。如果沒有实幕,則在左半?yún)^(qū)間或右半?yún)^(qū)間重復這個過程吝镣。
函數(shù)area()計算半徑r的圓面積,最后調(diào)用solve_iterative()去求半徑0.5和0.6之間圓面積為1的那個圓的半徑是什么昆庇?
import math
def solve_iterative(f, y, lower=0, upper=1):
middle = (lower + upper) / 2
while math.fabs(f(middle) - y) >= 1e-6:
print("lower:", lower, "upper:", upper)
if f(middle) < y:
lower = middle
else:
upper = middle
middle = (lower + upper) / 2
return middle
def area(r):
return (r ** 2) * math.pi
print("0.5和0.6之間圓面積為1的那個圓的半徑是:", solve_iterative(area, 1, 0.5, 0.6))
lower: 0.5 upper: 0.6
lower: 0.55 upper: 0.6
lower: 0.55 upper: 0.575
lower: 0.5625 upper: 0.575
lower: 0.5625 upper: 0.56875
lower: 0.5625 upper: 0.565625
lower: 0.5640625 upper: 0.565625
lower: 0.5640625 upper: 0.5648437500000001
lower: 0.5640625 upper: 0.564453125
lower: 0.5640625 upper: 0.5642578125
lower: 0.56416015625 upper: 0.5642578125
lower: 0.56416015625 upper: 0.564208984375
lower: 0.5641845703125 upper: 0.564208984375
lower: 0.5641845703125 upper: 0.56419677734375
lower: 0.5641845703125 upper: 0.564190673828125
lower: 0.5641876220703126 upper: 0.564190673828125
lower: 0.5641891479492188 upper: 0.564190673828125
0.5和0.6之間圓面積為1的那個圓的半徑是: 0.5641895294189454
當然末贾,一個函數(shù)可以在其內(nèi)部調(diào)用自身,這種函數(shù)稱為遞歸函數(shù)整吆。下面求一個正整數(shù)n的階乘的函數(shù)拱撵,當n=1時,直接返回1表蝙,否則將 n!轉(zhuǎn)化為n*(n-1)!的問題拴测。
def fact(n):
if n==1: #如果n等于1,就直接返回值1
return 1
return n * fact(n - 1) #如果n大于1府蛇,就是n和fact(n-1)的乘積
fact(4) # 輸出: 24
24
作為練習集索,讀者可以嘗試將上面的求方程f(x)=y根的函數(shù)寫成遞歸函數(shù)的形式。
類
類(class)是對一個抽象概念的描述汇跨,它描述了屬于同一個概念的所有對象的共同屬性务荆,這些屬性有:數(shù)據(jù)屬性和方法屬性。數(shù)據(jù)屬性描述了該類對象的狀態(tài)穷遂,而方法屬性描述了該類對象具有哪些功能函匕。一個類就是一個數(shù)據(jù)類型,它刻畫了這種類型的所有可能值的的共同屬性蚪黑,如int類型刻畫了所有整數(shù)的特性盅惜。
前面的str中剩、list等都是類。一般的酷窥,可以通過類名創(chuàng)建一個類對象咽安,類對象是一個具體的對象。如:
s = str("http://hwdong.net")
location = s.find("hwdong") #通過str的find()方法查詢是否存在一個子串蓬推,返回子串的位置
print(location)
alist = list(range(6))
blist = alist.copy()
blist[2] = 20
print(alist)
print(blist)
7
[0, 1, 2, 3, 4, 5]
[0, 1, 20, 3, 4, 5]
可以看到妆棒,可以通過一個類對象用“成員訪問運算符.”訪問類的方法,對這個對象執(zhí)行某種操作(訪問某些信息或修改該對象或創(chuàng)建新對象)沸伏。例如糕珊,s.find()在s中查詢是否存在一個子串,返回子串的位置毅糟。而alist.copy()復制創(chuàng)建了一個和alist一樣內(nèi)容的list對象并使blist引用這個新創(chuàng)建的list對象红选。
Python中用關(guān)鍵字class定義一個類。為了刻畫所有學生的共同屬性姆另,可以定義一個Student類喇肋。
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
def print(self):
print(self.name,",",self.score)
類中的函數(shù)稱為方法,通過一個類對象調(diào)用一個類的方法迹辐,就可以對這個類對象進行各種操作蝶防,因為一個類的對象可以右很多個,類的方法一般只對一個具體對象進行操作明吩,因此间学,一般的方法的第一個參數(shù)都是self,表示調(diào)用這個類方法的是哪個對象印荔。
下面代碼定義了Student類的2個對象s1和s2:并通過它們調(diào)用了類Student的print()方法低葫。Student的print()方法又調(diào)用了內(nèi)置的函數(shù)print()輸出self指向?qū)ο蟮男彰头謹?shù)。
s1 = Student("LiPing",67)
s2 = Student("WangQiang",83)
s1.print()
s2.print()
LiPing , 67
WangQiang , 83
類的中init()是一個特殊方法仍律,稱為構(gòu)造函數(shù)嘿悬,在定義類的對象時,會自動調(diào)用這個構(gòu)造函數(shù)染苛,對self指向的類對象進行初始化鹊漠。如定義了2個類對象屬性name和score并用構(gòu)造函數(shù)的參數(shù)對它們進行初始化。
每個對象都有自己單獨的實例屬性茶行,改變一個對象的實例屬性不會影響其他對象的實例屬性。除了實例屬性外登钥,還可以給一個類定義類屬性畔师,類屬性是類的所有對象都共享的屬性。類屬性是定義在類的方法外面的屬性牧牢。
如修改的Student類添加了一個類屬性count看锉,表示從這個類創(chuàng)建了多少具體的類對象姿锭,其初始值為0,每當創(chuàng)建一個類對象時伯铣,就增加其計數(shù)呻此。
class Student:
count=0
def __init__(self, name, score):
self.name = name
self.score = score
Student.count +=1
def print(self):
print(self.name,",",self.score)
一般的都是通過“類名.類屬性”來查詢或修改類屬性,如“Student.count”腔寡,也可通過“實例名.類屬性”(包括self.類屬性)來查詢實例屬性焚鲜。如下面的s1.count。
print(Student.count)
s1 = Student("LiPing",67)
print(s1.count)
s2 = Student("WangQiang",83)
print(Student.count)
0
1
2
Matplotlib
Matplotlib是一個Python語言的2D繪圖庫放前,windows系統(tǒng)下以管理員權(quán)限打開命令行窗口忿磅,然后執(zhí)行下列命令安裝它。
pip install matplotlib
Linux或Mac可以需要管理員權(quán)限凭语,即執(zhí)行:
sudo pip install matplotlib
matplotlib的pyplot模塊提供了簡單的繪圖函數(shù)葱她,可以用下面的代碼導入matplotlib.pyplot模塊并命名為plt,可避免在代碼中寫一長串的matplotlib.pyplot似扔。
import matplotlib.pyplot as plt
pyplot模塊的plot()函數(shù)可以直接繪制2D數(shù)據(jù)吨些,如:
y = [i for i in range(10)]
print(y)
plt.plot(y) # 繪制y作為縱軸坐標點構(gòu)成的圖形
plt.show() # 調(diào)用plt.show()顯示圖形
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
盡管只給了縱軸坐標的數(shù)組y,plot()函數(shù)默認會自動生成從0開始的橫軸坐標炒辉。當然豪墅,可以分別傳遞2個數(shù)組表示x和y坐標,如:
x = [i*0.1 for i in range(10)]
y = [xi**2 for xi in x]
print(["{0:0.2f}".format(i) for i in x])
print(["{0:0.2f}".format(i) for i in y])
plt.plot(x, y) # 繪制(x,y)坐標點構(gòu)成的圖形
plt.show() # 調(diào)用plt.show()顯示圖形
['0.00', '0.10', '0.20', '0.30', '0.40', '0.50', '0.60', '0.70', '0.80', '0.90']
['0.00', '0.01', '0.04', '0.09', '0.16', '0.25', '0.36', '0.49', '0.64', '0.81']
可以同時繪制幾個曲線辆脸。
x = [i*0.2 for i in range(10)]
y = [xi**2 for xi in x]
y2 = [3*xi-1 for xi in x]
plt.plot(x, y) # 繪制(x,y)坐標點構(gòu)成的圖形
plt.plot(x, y2)
plt.ylim(0,5)
plt.xlabel('x axis label')
plt.ylabel('y axis label')
plt.title('y=x^2 and y=3x-1')
plt.legend(['y=x^2', 'y=3x-1'])
plt.show() # 調(diào)用plt.show()顯示圖形
其中pyplot模塊的函數(shù)title()用于給圖起一個標題但校,而legend()則給每個繪制的曲線一個名字,xlim()和ylim()用于限定x和y坐標的范圍啡氢,xlabel()和ylabel()用于給x軸和y軸一個標簽状囱。可以看到不同的圖形將自動用不同的顏色顯示倘是。
plot()函數(shù)還可以接受一些參數(shù)亭枷,用于定制繪制的圖形的樣式,如:
import math
x = [i*0.2 for i in range(50)]
y = [math.sin(xi) for xi in x]
y2 = [math.cos(xi) for xi in x]
y3 = [0.2*xi for xi in x]
plt.plot(x, y,'r-')
plt.plot(x, y2,'bo')
plt.plot(x, y3,'g:')
plt.legend(['sin(x)', 'cos(x)','0.2x'])
plt.show()
其中'r-'的r表示紅色(red)搀崭、-表示短線叨粘,'bo'的b表示藍色(blue)、o表示以圓點瘤睹,'g:'的g表示綠色(green)升敲、:表示虛線。
pyplot模塊除了plot()函數(shù)可以繪圖外轰传,還有其他的一些函數(shù)用于繪制其他類型的圖驴党,如 scatter()用于繪制散亂點圖。如:
import math
x = [i*0.2 for i in range(50)]
y = [math.sin(xi) for xi in x]
y2 = [math.cos(xi) for xi in x]
y3 = [0.2*xi for xi in x]
plt.scatter(x, y, c='r', s=6, alpha=0.2)
plt.scatter(x, y2,c='g', s=18, alpha=0.9)
plt.scatter(x, y3,c='b', s=30, alpha=0.4)
plt.legend(['sin(x)', 'cos(x)','0.2x'])
plt.show()
其中參數(shù)c表示顏色获茬,其值'r'港庄、'g'倔既、'b'分別表示紅、綠鹏氧、藍渤涌,s參數(shù)表示點的大小,alpha表示圖的透明性把还。
bar()函數(shù)用來繪制條形圖实蓬。條形圖常常用來描述一組數(shù)據(jù)的對比情況。如下面代碼用bar()函數(shù)計科6個班級的平均分數(shù):
classes=['CS1901','CS1902','CS1903','CS1904','CS1905','CS1906']
scores = [76.5, 60.5, 85.0,45.5,79.3,91]
plt.bar(classes, scores, color='green') #color參數(shù)表示顏色笨篷,'green'表示綠色
plt.xlabel('班級名')
plt.ylabel('平均分')
plt.show()
[圖片上傳失敗...(image-1f6502-1587442101283)]
pie()函數(shù)用來繪制餅狀圖瞳秽。餅狀圖通常用來表達集合中各個部分的百分比。下面代碼將上述的scores以百分比的餅狀圖形式顯示率翅,其中的labels是這些百分比對應的標簽练俐。legend()函數(shù)用參數(shù)loc指定在右上角'upper right'顯示這些標簽。
classes=['CS1901','CS1902','CS1903','CS1904','CS1905','CS1906']
scores = [76.5, 60.5, 85.0,45.5,79.3,91]
plt.pie(scores,labels = classes, autopct='%1.1f%%')
plt.legend(loc='upper right')
plt.show()
hist()函數(shù)用來繪制直方圖冕臭。直方圖看起來是條形圖有些類似腺晾。但它們的含義是不一樣的,直方圖描述了數(shù)據(jù)中某個范圍內(nèi)數(shù)據(jù)出現(xiàn)的頻度辜贵。
import random
data=[random.normalvariate(2, 3) for i in range(500)]
bins = [-8, -6, -4,-2,0,2,4,6,8,10]
plt.hist(data, bins=bins)
plt.show()
可以看到在bins數(shù)組表示的不同范圍里的數(shù)據(jù)點個數(shù)是不一樣的悯蝉,[-8,-6]
個數(shù)很少,而[0,2]
和[2,4]
范圍的數(shù)據(jù)點個數(shù)很多托慨。直方圖以條形圖形式直觀顯示了每個區(qū)間的數(shù)據(jù)點個數(shù)鼻由。
顯示圖形的窗口figure對象除了可以顯示多個圖形外,
還可以用多個子區(qū)域來顯示不同的圖形厚棵〗妒溃可以用subplot()函數(shù)指定子圖繪制在那個子圖窗口中。
subplot(numRows, numCols, plotNum)
其參數(shù)numRows, numCols, plotNum分別指定行數(shù)婆硬、列數(shù)和子圖的序號狠轻。在繪制子圖中的圖形前,先調(diào)用subplot()指明在那個位置的子圖上繪制圖形彬犯,并可以用title()函數(shù)設(shè)置子圖的標題向楼。如:
import math
x = [i*0.2 for i in range(50)]
y = [math.sin(xi) for xi in x]
y2 = [math.cos(xi) for xi in x]
y3 = [0.2*xi for xi in x]
fig = plt.gcf()
fig.set_size_inches(12, 4, forward=True)
plt.subplot(1, 2, 1)
plt.plot(x, y,'r-')
plt.plot(x, y2,'bo')
plt.title('sin(x) and cos(x)')
plt.legend(['sin(x)', 'cos(x)'])
plt.subplot(1, 2, 2)
plt.plot(x, y3,'g:')
plt.title('0.2x')
plt.show()
上述代碼,先通過fig = plt.gcf()
得到當前繪圖窗口的figure對象并賦值給遍歷fig谐区,然后通過調(diào)用figure的set_size_inches()函數(shù)修改默認的figure對象的寬高湖蜕,forward=True表示立即更新當前窗口的figure對象大小。
可以用imshow()顯示一幅圖像宋列,在這之前可以用skimage庫的io模型的imread()函數(shù)讀取圖像重荠。讀取的圖像放在一個多維數(shù)組庫numpy的多維數(shù)組ndarray對象中。numpy模型可以有很多方便的函數(shù)處理多維數(shù)組虚茶,如uint8()函數(shù)可以將其他數(shù)據(jù)元素類型的numpy數(shù)組轉(zhuǎn)化為uint8類型即無符號整數(shù)類型(取值范圍是[0,255]
)戈鲁,也可用運算符*
進行逐元素的乘積。
import numpy as np
import skimage
import matplotlib.pyplot as plt
img = skimage.io.imread('imgs/lenna.png') #原圖
img_tinted = img * [1, 0.95, 0.9] #3個顏色通道值乘以不同的系數(shù)
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.subplot(1, 2, 2)
plt.imshow(np.uint8(img_tinted)) #將實數(shù)值的img_tinted圖像轉(zhuǎn)換為unit8無符號整型
plt.show()
關(guān)注:
B站:hw-dong
[youtube頻道hwdong](https://www.youtube.com/channel/UCIJLimsCMSfc3wHmevgj8Ng