使用的教材:廖雪峰教材?
另外附一個(gè)廖雪峰筆記茬底,感覺寫的比我簡(jiǎn)練,可以用來查詢具體用法:廖雪峰筆記?
更多的可以查詢:官方文檔?
一、python基礎(chǔ)
(一)數(shù)據(jù)類型和變量
2.字符串:
如果字符串內(nèi)部既包含'又包含"怎么辦?可以用轉(zhuǎn)義字符\來標(biāo)識(shí)蓬戚。
轉(zhuǎn)義字符\可以轉(zhuǎn)義很多字符,比如\n表示換行宾抓,\t表示制表符子漩,字符\本身也要轉(zhuǎn)義,所以\\表示的字符就是\石洗。
為了簡(jiǎn)化幢泼,Python還允許用r''表示''內(nèi)部的字符串默認(rèn)不轉(zhuǎn)義。
如果字符串內(nèi)部有很多換行讲衫,用\n寫在一行里不好閱讀旭绒,為了簡(jiǎn)化,Python允許用'''...'''的格式表示多行內(nèi)容焦人,可以自己試試:
print('''line1
line2
line3''')
3.布林值:
and運(yùn)算是與運(yùn)算挥吵,只有所有都為True,and運(yùn)算結(jié)果才是True花椭。
or運(yùn)算是或運(yùn)算忽匈,只要其中有一個(gè)為True,or運(yùn)算結(jié)果就是True
not運(yùn)算是非運(yùn)算矿辽,它是一個(gè)單目運(yùn)算符丹允,把True變成False,F(xiàn)alse變成True
4.空值
是Python里一個(gè)特殊的值袋倔,用None表示雕蔽。None不能理解為0,因?yàn)?是有意義的宾娜,而None是一個(gè)特殊的空值批狐。
5.變量
變量在程序中就是用一個(gè)變量名表示了,變量名必須是大小寫英文、數(shù)字和_的組合嚣艇,且不能用數(shù)字開頭承冰。python中是區(qū)分大小寫的。
6.常量
在Python中食零,通常用全部大寫的變量名表示常量困乒。
整數(shù)和浮點(diǎn)數(shù)在計(jì)算機(jī)內(nèi)部存儲(chǔ)的方式是不同的,整數(shù)運(yùn)算永遠(yuǎn)是精確的(除法難道也是精確的贰谣?是的D嚷А),而浮點(diǎn)數(shù)運(yùn)算則可能會(huì)有四舍五入的誤差吱抚。
還有一種除法是//涌攻,稱為地板除,兩個(gè)整數(shù)的除法仍然是整數(shù)
用%取余數(shù)频伤。
(二)字符串和編碼
1.編碼:
要注意區(qū)分'ABC'和b'ABC',前者是str芝此,后者雖然內(nèi)容顯示得和前者一樣憋肖,但bytes的每個(gè)字符都只占用一個(gè)字節(jié)。
以Unicode表示的str通過encode()方法可以編碼為指定的bytes婚苹。
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File "", line 1, in
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
純英文的str可以用ASCII編碼為bytes岸更,內(nèi)容是一樣的,純英文既可以用ascii也可以用utf-8.
含有中文的str可以用UTF-8編碼為bytes膊升。含有中文的str無法用ASCII編碼怎炊,因?yàn)橹形木幋a的范圍超過了ASCII編碼的范圍,Python會(huì)報(bào)錯(cuò)廓译。
反過來评肆,如果我們從網(wǎng)絡(luò)或磁盤上讀取了字節(jié)流,那么讀到的數(shù)據(jù)就是bytes非区。要把bytes變?yōu)閟tr瓜挽,就需要用decode( )方法。
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
2.計(jì)數(shù):
len()函數(shù)計(jì)算的是str的字符數(shù)征绸,如果換成bytes久橙,len()函數(shù)就計(jì)算字節(jié)數(shù)。
3.開始寫代碼的時(shí)候要輸入這兩行管怠。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
在編輯器里面的encoding里面選中encoding in UTF-8 without BOM
4.格式化字符
我們經(jīng)常會(huì)輸出類似'親愛的xxx你好淆衷!你xx月的話費(fèi)是xx,余額是xx'之類的字符串渤弛,而xxx的內(nèi)容都是根據(jù)變量變化的祝拯,所以,需要一種簡(jiǎn)便的格式化字符串的方式她肯。
%d整數(shù)
%f浮點(diǎn)數(shù)
%s字符串
%x十六進(jìn)制整數(shù)
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
如果你不太確定應(yīng)該用什么鹿驼,%s永遠(yuǎn)起作用欲低,它會(huì)把任何數(shù)據(jù)類型轉(zhuǎn)換為字符串。
有些時(shí)候畜晰,字符串里面的%是一個(gè)普通字符怎么辦砾莱?這個(gè)時(shí)候就需要轉(zhuǎn)義,用%%來表示一個(gè)%
作業(yè):
小明的成績(jī)從去年的72分提升到了今年的85分凄鼻,請(qǐng)計(jì)算小明成績(jī)提升的百分點(diǎn)腊瑟,并用字符串格式化顯示出'xx.x%',只保留小數(shù)點(diǎn)后1位:
# -*- coding: utf-8 -*-
s1 = 72
s2 = 85
print('%.1f %%'% r)
r = (s2 - s1)/s2*100
(1f代表保留小數(shù)點(diǎn)后面1位)
(三)使用list和tupe
(1)list
Python內(nèi)置的一種數(shù)據(jù)類型是列表:list块蚌。list是一種有序的集合闰非,可以隨時(shí)添加和刪除其中的元素。
比如峭范,列出班里所有同學(xué)的名字财松,就可以用一個(gè)list表示:
>>>classmates = ['Michael','Bob','Tracy']
>>>classmates
['Michael','Bob','Tracy']
可以用len(classmates)
用索引來訪問list中每一個(gè)位置的元素,記得索引是從0開始的纱控。
>>> classmates[0]
'Michael'
當(dāng)索引超出了范圍時(shí)辆毡,Python會(huì)報(bào)一個(gè)IndexError錯(cuò)誤,所以甜害,要確保索引不要越界舶掖,記得最后一個(gè)元素的索引是len(classmates) - 1。
如果要取最后一個(gè)元素尔店,除了計(jì)算索引位置外眨攘,還可以用-1做索引,直接獲取最后一個(gè)元素:
>>> classmates[-1]
'Tracy'
>>> classmates[-2]
'Bob'
ist是一個(gè)可變的有序表嚣州,所以鲫售,可以往list中追加元素到末尾:
>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
也可以把元素插入到指定的位置,比如索引號(hào)為1的位置:
>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
要刪除list末尾的元素该肴,用pop()方法:
>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']
要刪除指定位置的元素龟虎,用pop(i)方法,其中i是索引位置沙庐。
>>> classmates.pop(1)
'Jack'
要把某個(gè)元素替換成別的元素鲤妥,可以直接賦值給對(duì)應(yīng)的索引位置
>>> classmates[1] = 'Sarah'
list里面的元素的數(shù)據(jù)類型也可以不同,list元素也可以是另一個(gè)list拱雏。
(二)tuple
tuple和list非常類似棉安,但是tuple一旦初始化就不能修改。
不可變的tuple有什么意義铸抑?因?yàn)閠uple不可變贡耽,所以代碼更安全。如果可能,能用tuple代替list就盡量用tuple蒲赂。
如果要定義一個(gè)空的tuple阱冶,可以寫成():
>>>t = ()
要定義一個(gè)只有1個(gè)元素的tuple,如果你這么定義:
>>> t = (1)
>>> t
1
Python規(guī)定滥嘴,這種情況下木蹬,按小括號(hào)進(jìn)行計(jì)算,計(jì)算結(jié)果自然是1若皱。
所以镊叁,只有1個(gè)元素的tuple定義時(shí)必須加一個(gè)逗號(hào),,來消除歧義:
>>> t = (1,)
>>> t
(1,)
最后來看一個(gè)“可變的”tuple:
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
解釋:表面上看走触,tuple的元素確實(shí)變了晦譬,但其實(shí)變的不是tuple的元素,而是list的元素互广。
(四)條件判斷
if <條件判斷1>:
<執(zhí)行1>
elif <條件判斷2>:
<執(zhí)行2>
elif <條件判斷3>:
<執(zhí)行3>
else:
<執(zhí)行4>
elif=else if
很重要的是:
if語句執(zhí)行有個(gè)特點(diǎn)敛腌,它是從上往下判斷,如果在某個(gè)判斷上是True惫皱,把該判斷對(duì)應(yīng)的語句執(zhí)行后像樊,就忽略掉剩下的elif和else
if判斷條件還可以簡(jiǎn)寫,比如寫
if x:
print('True')
只要x是非零數(shù)值逸吵、非空字符串、非空list等缝裁,就判斷為True扫皱,否則為False。
注:
【1】善用input函數(shù)捷绑,讀取用戶輸入的數(shù)字要把數(shù)字從str()變成int()
很多同學(xué)會(huì)用input()讀取用戶的輸入韩脑,這樣可以自己輸入,程序運(yùn)行得更有意思
birth = input('birth: ')
if birth < 2000:
print('00前')
else:
print('00后')
但是輸入以后會(huì)報(bào)錯(cuò)粹污。這是因?yàn)閕nput返回的是str(), str不能直接和整數(shù)比較段多,必須先把str轉(zhuǎn)換成整數(shù)。Python提供了int()函數(shù)來完成這件事情壮吩。因此代碼要改成:
s = input('birth: ')
birth = int(s)
if birth < 2000:
print('00前')
else:
print('00后'
很重要:print('%.1f %%'% r)
(五)循環(huán)
1.? 一種是for...in循環(huán)进苍,依次把list或tuple中的每個(gè)元素迭代出來,看例子
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)
range(101)就可以生成0-100的整數(shù)序列
2.第二種循環(huán)是while循環(huán)鸭叙,只要條件滿足觉啊,就不斷循環(huán),條件不滿足時(shí)退出循環(huán)沈贝。比如我們要計(jì)算100以內(nèi)所有奇數(shù)之和杠人,可以用while循環(huán)實(shí)現(xiàn)。
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
(六)使用dict和set
1.dict
dict全稱dictionary,在其他語言中也稱為map嗡善,使用鍵-值(key-value)存儲(chǔ)辑莫,具有極快的查找速度。
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
>>> d['Adam'] = 67
>>> d['Adam']
67
由于一個(gè)key只能對(duì)應(yīng)一個(gè)value罩引,所以各吨,多次對(duì)一個(gè)key放入value,后面的值會(huì)把前面的值沖掉蜒程。
如果key不存在绅你,dict就會(huì)報(bào)錯(cuò)。字母是key,數(shù)字是value.
要避免key不存在的錯(cuò)誤昭躺,有兩種辦法忌锯,一是通過in判斷key是否存在:
>>> 'Thomas' in d
False
要?jiǎng)h除一個(gè)key,用pop(key)方法领炫,對(duì)應(yīng)的value也會(huì)從dict中刪除:
>>> d.pop('Bob')
75
dict是用空間來換取時(shí)間的一種方法偶垮。
很重要:
需要牢記的第一條就是dict的key必須是不可變對(duì)象。
這是因?yàn)閐ict根據(jù)key來計(jì)算value的存儲(chǔ)位置帝洪,如果每次計(jì)算相同的key得出的結(jié)果不同似舵,那dict內(nèi)部就完全混亂了。這個(gè)通過key計(jì)算位置的算法稱為哈希算法(Hash)葱峡。(因此list是可變的砚哗,就不能作為key。)
2.set
set和dict類似砰奕,也是一組key的集合蛛芥,但不存儲(chǔ)value。key不能重復(fù)军援。如果重復(fù)了就會(huì)被自動(dòng)過濾掉仅淑。因此說明顯示的順序不表示set是有序的。
創(chuàng)建一個(gè)set:
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
通過add(key)方法可以添加元素到set中
>>> s.add(4)
>>> s
{1, 2, 3, 4}
通過remove(key)方法可以刪除元素:
>>> s.remove(4)
>>> s
{1, 2, 3}
兩個(gè)set可以做數(shù)學(xué)意義上的交集胸哥、并集等操作:
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}
set和dict的唯一區(qū)別僅在于沒有存儲(chǔ)對(duì)應(yīng)的value涯竟,但是汰聋,set的原理和dict一樣丹弱,所以,同樣不可以放入可變對(duì)象榄棵,因?yàn)闊o法判斷兩個(gè)可變對(duì)象是否相等嘲更,也就無法保證set內(nèi)部“不會(huì)有重復(fù)元素”醉鳖。把list放入set,會(huì)報(bào)錯(cuò)哮内。
注:
str是不變對(duì)象盗棵,而list是可變對(duì)象
所以壮韭,對(duì)于不變對(duì)象來說,調(diào)用對(duì)象自身的任意方法纹因,也不會(huì)改變?cè)搶?duì)象自身的內(nèi)容喷屋。相反,這些方法會(huì)創(chuàng)建新的對(duì)象并返回瞭恰,這樣屯曹,就保證了不可變對(duì)象本身永遠(yuǎn)是不可變的。
二.函數(shù)
一惊畏、調(diào)用函數(shù)
max函數(shù)max()可以接收任意多個(gè)參數(shù)恶耽,并返回最大的那個(gè):
>>> max(1, 2)
2
>>> max(2, 3, 1, -5)
3
二、定義函數(shù)
函數(shù)體內(nèi)部的語句在執(zhí)行時(shí)颜启,一旦執(zhí)行到return時(shí)偷俭,函數(shù)就執(zhí)行完畢,并將結(jié)果返回缰盏。因此涌萤,函數(shù)內(nèi)部通過條件判斷和循環(huán)可以實(shí)現(xiàn)非常復(fù)雜的邏輯。
def my_abs(x):
if x >= 0:
return x
else:
return -x
請(qǐng)注意口猜,函數(shù)體內(nèi)部的語句在執(zhí)行時(shí)负溪,一旦執(zhí)行到return時(shí),函數(shù)就執(zhí)行完畢济炎,并將結(jié)果返回川抡。因此,函數(shù)內(nèi)部通過條件判斷和循環(huán)可以實(shí)現(xiàn)非常復(fù)雜的邏輯须尚。
如果沒有return語句崖堤,函數(shù)執(zhí)行完畢后也會(huì)返回結(jié)果,只是結(jié)果為None恨闪。
return None可以簡(jiǎn)寫為return倘感。
如果想定義一個(gè)什么事也不做的空函數(shù)放坏,可以用pass語句:
def nop():
pass
pass可以用來作為占位符咙咽,比如現(xiàn)在還沒想好怎么寫函數(shù)的代碼,就可以先放一個(gè)pass淤年,讓代碼能運(yùn)行起來钧敞。或者刻意略過麸粮,否則會(huì)有語法錯(cuò)誤溉苛。
注意:
1.當(dāng)傳入了不恰當(dāng)?shù)膮?shù)時(shí),內(nèi)置函數(shù)abs會(huì)檢查出參數(shù)錯(cuò)誤弄诲,而我們定義的my_abs沒有參數(shù)檢查愚战,會(huì)導(dǎo)致if語句出錯(cuò)娇唯,出錯(cuò)信息和abs不一樣。所以寂玲,這個(gè)函數(shù)定義不夠完善塔插。
因此如果自己寫的函數(shù)要能夠檢查參數(shù)錯(cuò)誤的話,就要用函數(shù)isinstance()實(shí)現(xiàn):
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
返回多個(gè)值: