1小時學會Python-深度學習原理與實現(xiàn)的1.4節(jié)

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的字符串的下標為0,1,2\cdots,n-1,下標甚至可以是負整數(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]    
aaa1.png

盡管只給了縱軸坐標的數(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']
aaa2.png

可以同時繪制幾個曲線辆脸。

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()顯示圖形
aaa3.png

其中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()           
aaa4.png

其中'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() 
aaa5.png

其中參數(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() 
aaa6.png

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()
aaa7.png

可以看到在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()    
aaa8.png

上述代碼,先通過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()
aaa9.png

關(guān)注:

B站:hw-dong

[youtube頻道hwdong](https://www.youtube.com/channel/UCIJLimsCMSfc3wHmevgj8Ng

[原文鏈接](https://hwdong.net/2019/08/11/1%E5%B0%8F%E6%97%B6%E5%AD%A6%E4%BC%9APython-%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E7%8E%B0%E7%9A%841.4%E8%8A%82/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘹叫,一起剝皮案震驚了整個濱河市婆殿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌罩扇,老刑警劉巖婆芦,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喂饥,居然都是意外死亡消约,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門员帮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來或粮,“玉大人,你說我怎么就攤上這事捞高÷炔模” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵硝岗,是天一觀的道長氢哮。 經(jīng)常有香客問我,道長型檀,這世上最難降的妖魔是什么冗尤? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮胀溺,結(jié)果婚禮上裂七,老公的妹妹穿的比我還像新娘。我一直安慰自己月幌,他們只是感情好碍讯,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扯躺,像睡著了一般捉兴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上录语,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天倍啥,我揣著相機與錄音,去河邊找鬼澎埠。 笑死虽缕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蒲稳。 我是一名探鬼主播氮趋,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼伍派,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剩胁?” 一聲冷哼從身側(cè)響起诉植,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昵观,沒想到半個月后晾腔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡啊犬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年灼擂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片觉至。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡剔应,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出康谆,到底是詐尸還是另有隱情领斥,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布沃暗,位于F島的核電站月洛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏孽锥。R本人自食惡果不足惜嚼黔,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惜辑。 院中可真熱鬧唬涧,春花似錦、人聲如沸盛撑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抵卫。三九已至狮荔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間介粘,已是汗流浹背殖氏。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留姻采,地道東北人雅采。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親婚瓜。 傳聞我的和親對象是個殘疾皇子宝鼓,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容