使用的教材:廖雪峰教材?
另外附一個廖雪峰筆記,感覺寫的比我簡練,可以用來查詢具體用法:廖雪峰筆記?
更多的可以查詢:官方文檔?
一、python基礎
(一)數據類型和變量
2.字符串:
如果字符串內部既包含'又包含"怎么辦?可以用轉義字符\來標識。
轉義字符\可以轉義很多字符,比如\n表示換行,\t表示制表符,字符\本身也要轉義,所以\\表示的字符就是\。
為了簡化,Python還允許用r''表示''內部的字符串默認不轉義。
如果字符串內部有很多換行,用\n寫在一行里不好閱讀,為了簡化,Python允許用'''...'''的格式表示多行內容,可以自己試試:
print('''line1
line2
line3''')
3.布林值:
and運算是與運算,只有所有都為True,and運算結果才是True。
or運算是或運算,只要其中有一個為True,or運算結果就是True
not運算是非運算,它是一個單目運算符,把True變成False,False變成True
4.空值
是Python里一個特殊的值,用None表示。None不能理解為0,因為0是有意義的,而None是一個特殊的空值。
5.變量
變量在程序中就是用一個變量名表示了,變量名必須是大小寫英文、數字和_的組合,且不能用數字開頭。python中是區分大小寫的。
6.常量
在Python中,通常用全部大寫的變量名表示常量。
整數和浮點數在計算機內部存儲的方式是不同的,整數運算永遠是精確的(除法難道也是精確的?是的!),而浮點數運算則可能會有四舍五入的誤差。
還有一種除法是//,稱為地板除,兩個整數的除法仍然是整數
用%取余數。
(二)字符串和編碼
1.編碼:
要注意區分'ABC'和b'ABC',前者是str,后者雖然內容顯示得和前者一樣,但bytes的每個字符都只占用一個字節。
以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,內容是一樣的,純英文既可以用ascii也可以用utf-8.
含有中文的str可以用UTF-8編碼為bytes。含有中文的str無法用ASCII編碼,因為中文編碼的范圍超過了ASCII編碼的范圍,Python會報錯。
反過來,如果我們從網絡或磁盤上讀取了字節流,那么讀到的數據就是bytes。要把bytes變為str,就需要用decode( )方法。
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
2.計數:
len()函數計算的是str的字符數,如果換成bytes,len()函數就計算字節數。
3.開始寫代碼的時候要輸入這兩行。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
在編輯器里面的encoding里面選中encoding in UTF-8 without BOM
4.格式化字符
我們經常會輸出類似'親愛的xxx你好!你xx月的話費是xx,余額是xx'之類的字符串,而xxx的內容都是根據變量變化的,所以,需要一種簡便的格式化字符串的方式。
%d整數
%f浮點數
%s字符串
%x十六進制整數
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
如果你不太確定應該用什么,%s永遠起作用,它會把任何數據類型轉換為字符串。
有些時候,字符串里面的%是一個普通字符怎么辦?這個時候就需要轉義,用%%來表示一個%
作業:
小明的成績從去年的72分提升到了今年的85分,請計算小明成績提升的百分點,并用字符串格式化顯示出'xx.x%',只保留小數點后1位:
# -*- coding: utf-8 -*-
s1 = 72
s2 = 85
print('%.1f %%'% r)
r = (s2 - s1)/s2*100
(1f代表保留小數點后面1位)
(三)使用list和tupe
(1)list
Python內置的一種數據類型是列表:list。list是一種有序的集合,可以隨時添加和刪除其中的元素。
比如,列出班里所有同學的名字,就可以用一個list表示:
>>>classmates = ['Michael','Bob','Tracy']
>>>classmates
['Michael','Bob','Tracy']
可以用len(classmates)
用索引來訪問list中每一個位置的元素,記得索引是從0開始的。
>>> classmates[0]
'Michael'
當索引超出了范圍時,Python會報一個IndexError錯誤,所以,要確保索引不要越界,記得最后一個元素的索引是len(classmates) - 1。
如果要取最后一個元素,除了計算索引位置外,還可以用-1做索引,直接獲取最后一個元素:
>>> classmates[-1]
'Tracy'
>>> classmates[-2]
'Bob'
ist是一個可變的有序表,所以,可以往list中追加元素到末尾:
>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
也可以把元素插入到指定的位置,比如索引號為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'
要把某個元素替換成別的元素,可以直接賦值給對應的索引位置
>>> classmates[1] = 'Sarah'
list里面的元素的數據類型也可以不同,list元素也可以是另一個list。
(二)tuple
tuple和list非常類似,但是tuple一旦初始化就不能修改。
不可變的tuple有什么意義?因為tuple不可變,所以代碼更安全。如果可能,能用tuple代替list就盡量用tuple。
如果要定義一個空的tuple,可以寫成():
>>>t = ()
要定義一個只有1個元素的tuple,如果你這么定義:
>>> t = (1)
>>> t
1
Python規定,這種情況下,按小括號進行計算,計算結果自然是1。
所以,只有1個元素的tuple定義時必須加一個逗號,,來消除歧義:
>>> t = (1,)
>>> t
(1,)
最后來看一個“可變的”tuple:
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
解釋:表面上看,tuple的元素確實變了,但其實變的不是tuple的元素,而是list的元素。
(四)條件判斷
if <條件判斷1>:
<執行1>
elif <條件判斷2>:
<執行2>
elif <條件判斷3>:
<執行3>
else:
<執行4>
elif=else if
很重要的是:
if語句執行有個特點,它是從上往下判斷,如果在某個判斷上是True,把該判斷對應的語句執行后,就忽略掉剩下的elif和else
if判斷條件還可以簡寫,比如寫
if x:
print('True')
只要x是非零數值、非空字符串、非空list等,就判斷為True,否則為False。
注:
【1】善用input函數,讀取用戶輸入的數字要把數字從str()變成int()
很多同學會用input()讀取用戶的輸入,這樣可以自己輸入,程序運行得更有意思
birth = input('birth: ')
if birth < 2000:
print('00前')
else:
print('00后')
但是輸入以后會報錯。這是因為input返回的是str(), str不能直接和整數比較,必須先把str轉換成整數。Python提供了int()函數來完成這件事情。因此代碼要改成:
s = input('birth: ')
birth = int(s)
if birth < 2000:
print('00前')
else:
print('00后'
很重要:print('%.1f %%'% r)
(五)循環
1.? 一種是for...in循環,依次把list或tuple中的每個元素迭代出來,看例子
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)
range(101)就可以生成0-100的整數序列
2.第二種循環是while循環,只要條件滿足,就不斷循環,條件不滿足時退出循環。比如我們要計算100以內所有奇數之和,可以用while循環實現。
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
(六)使用dict和set
1.dict
dict全稱dictionary,在其他語言中也稱為map,使用鍵-值(key-value)存儲,具有極快的查找速度。
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
>>> d['Adam'] = 67
>>> d['Adam']
67
由于一個key只能對應一個value,所以,多次對一個key放入value,后面的值會把前面的值沖掉。
如果key不存在,dict就會報錯。字母是key,數字是value.
要避免key不存在的錯誤,有兩種辦法,一是通過in判斷key是否存在:
>>> 'Thomas' in d
False
要刪除一個key,用pop(key)方法,對應的value也會從dict中刪除:
>>> d.pop('Bob')
75
dict是用空間來換取時間的一種方法。
很重要:
需要牢記的第一條就是dict的key必須是不可變對象。
這是因為dict根據key來計算value的存儲位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。這個通過key計算位置的算法稱為哈希算法(Hash)。(因此list是可變的,就不能作為key。)
2.set
set和dict類似,也是一組key的集合,但不存儲value。key不能重復。如果重復了就會被自動過濾掉。因此說明顯示的順序不表示set是有序的。
創建一個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}
兩個set可以做數學意義上的交集、并集等操作:
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}
set和dict的唯一區別僅在于沒有存儲對應的value,但是,set的原理和dict一樣,所以,同樣不可以放入可變對象,因為無法判斷兩個可變對象是否相等,也就無法保證set內部“不會有重復元素”。把list放入set,會報錯。
注:
str是不變對象,而list是可變對象
所以,對于不變對象來說,調用對象自身的任意方法,也不會改變該對象自身的內容。相反,這些方法會創建新的對象并返回,這樣,就保證了不可變對象本身永遠是不可變的。
二.函數
一、調用函數
max函數max()可以接收任意多個參數,并返回最大的那個:
>>> max(1, 2)
2
>>> max(2, 3, 1, -5)
3
二、定義函數
函數體內部的語句在執行時,一旦執行到return時,函數就執行完畢,并將結果返回。因此,函數內部通過條件判斷和循環可以實現非常復雜的邏輯。
def my_abs(x):
if x >= 0:
return x
else:
return -x
請注意,函數體內部的語句在執行時,一旦執行到return時,函數就執行完畢,并將結果返回。因此,函數內部通過條件判斷和循環可以實現非常復雜的邏輯。
如果沒有return語句,函數執行完畢后也會返回結果,只是結果為None。
return None可以簡寫為return。
如果想定義一個什么事也不做的空函數,可以用pass語句:
def nop():
pass
pass可以用來作為占位符,比如現在還沒想好怎么寫函數的代碼,就可以先放一個pass,讓代碼能運行起來。或者刻意略過,否則會有語法錯誤。
注意:
1.當傳入了不恰當的參數時,內置函數abs會檢查出參數錯誤,而我們定義的my_abs沒有參數檢查,會導致if語句出錯,出錯信息和abs不一樣。所以,這個函數定義不夠完善。
因此如果自己寫的函數要能夠檢查參數錯誤的話,就要用函數isinstance()實現:
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
返回多個值: