目錄
最重要的工具PIP, 以及常用的網(wǎng)站,IDE推薦
基本概念
函數(shù)
進(jìn)階概念:裝飾器,迭代器,列表推導(dǎo)式,匿名函數(shù)
面向?qū)ο?/strong>
標(biāo)準(zhǔn)庫(kù)以及常用的庫(kù)
最重要的工具PIP, 以及常用的網(wǎng)站,IDE推薦
Python 能干什么
開發(fā)一些簡(jiǎn)單的腳本,自動(dòng)化完成一些繁復(fù)的工作
web (相關(guān)的框架 flask, django)
數(shù)據(jù)分析(相關(guān)的庫(kù): Numpy)
爬蟲
以及偶爾裝個(gè)逼—> 川普撞臉希拉里(基于 OpenCV 的面部特征交換)
Python3 的安裝
如果你正在使用Mac,系統(tǒng)是OS X 10.8~10.10,那么系統(tǒng)自帶的Python版本是2.7。要安裝最新的Python 3.5,有兩個(gè)方法:
方法一:從Python官網(wǎng)下載Python 3.5的安裝程序(網(wǎng)速慢的同學(xué)請(qǐng)移步國(guó)內(nèi)鏡像),雙擊運(yùn)行并安裝;
方法二:如果安裝了Homebrew,直接通過(guò)命令brew install python3
安裝即可。
Homebrew安裝及使用
Homebrew 官網(wǎng)
Ruby 安裝
pip is already installed if you're using Python 2 >=2.7.9 or Python 3 >=3.4 binaries downloaded from python.org, but you'll need to upgrade pip.
? 對(duì)于國(guó)內(nèi)用戶,因?yàn)橛袎Φ拇嬖?,用pip 安裝第三方包的時(shí)候,下載速率很慢。我們需要配置pip的config 文件,假如國(guó)內(nèi)的鏡像網(wǎng)站。
配置pip 鏡像文件
[global]
timeout = 6000
index-url = http://pypi.douban.com/simple/
[install]
use-mirrors = true
mirrors = http://pypi.douban.com/simple/
trusted-host = pypi.douban.com
IDE: PyCharm
Pycharm official website
Pycharm 使用教程
基本概念
數(shù)據(jù)類型
n = 123
f = 456.789
s1 = 'Hello, world'
s2 = 'Hello, 'Adam''
s3 = r'Hello, "Bart"'
s4 = r'''Hello,
... Lisa!'''
print(s1)
Hello, world
print(s2)
Hello, 'Adam'
print(s3)
Hello, "Bart"
print(s4)
Hello,
Lisa!
print()
len()
b'AbC'.decode()
'AbC'
'ANC'.encode('utf-8')
b'ANC'A = 'Allen'
'Hello %s' % A
'Hello Allen''%2d-%02d' % (3, 1)
' 3-01'
'%.2f' % 3.1415926
'3.14'
List 與 tuple
list 就是 NSMutableArray, tuple就是 NSArray
classmatess_L = ['Michael', 'Bob', 'Tracy']
classmates = ('Michael', 'Bob', 'Tracy')
?
classmates_L.append('Allen')
print(classmates_L)
['Michael', 'Bob', 'Tracy', 'Allen']
classmates.append('Allen')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
?
List:
append()
classmates_L.pop()
'Allen'
print(classmates_L)
['Michael', 'Bob', 'Tracy']
classmates_L.pop(2)
'Tracy'
print(classmates_L)
['Michael', 'Bob']len(classmates_L)
2
classmates_L[-1]
'Allen'
classmates_L.insert(1,'Allen')
print(classmates_L)
['Michael', 'Allen', 'Bob']
避免歧義,定義一個(gè)元素的tuple,在元素后面要加上,
?
name= ('Allen',)
print(name)
('Allen',)
print(s3)
Hello, "Bart"
>>> print(s4)
Hello,
Lisa!
>>>
字符串與編碼
print()
len()
>>> b'AbC'.decode()
'AbC'
>>> 'ANC'.encode('utf-8')
b'ANC'
>>>
>>> A = 'Allen'
>>> 'Hello %s' % A
'Hello Allen'
>>>
>>> '%2d-%02d' % (3, 1)
' 3-01'
>>> '%.2f' % 3.1415926
'3.14'
List 與 tuple
list 就是 NSMutableArray, tuple就是 NSArray
classmatess_L = ['Michael', 'Bob', 'Tracy']
classmates = ('Michael', 'Bob', 'Tracy')
?
>>> classmates_L.append('Allen')
>>> print(classmates_L)
['Michael', 'Bob', 'Tracy', 'Allen']
>>> classmates.append('Allen')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
>>>
?
List:
append()
>>> classmates_L.pop()
'Allen'
>>> print(classmates_L)
['Michael', 'Bob', 'Tracy']
>>> classmates_L.pop(2)
'Tracy'
>>> print(classmates_L)
['Michael', 'Bob']
>>>
>>>len(classmates_L)
2
>>> classmates_L[-1]
'Allen'
>>> classmates_L.insert(1,'Allen')
>>> print(classmates_L)
['Michael', 'Allen', 'Bob']
#避免歧義,定義一個(gè)元素的tuple,在元素后面要加上,
?
>>> name= ('Allen',)
>>> print(name)
('Allen',)
?
age = 20
if age >= 6:
print('teenager')
elif age >= 18:
print('adult')
else:
print('kid')
sum = 0
for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
sum = sum + x
print(sum)
sum = 0
list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for index in range(0,len(list)):
sum = sum + list[index]
print(sum)
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
d['Michael']
95
d['Jack'] = 90
d['Jack']
90
d['Jack'] = 88
d['Jack']
88
d.pop('Michael')
95
print(d)
{'Tracy': 85, 'Bob': 75}
set和dict類似,也是一組key的集合,但不存儲(chǔ)value。由于key不能重復(fù),所以,在set中,沒(méi)有重復(fù)的key。
?
要?jiǎng)?chuàng)建一個(gè)set,需要提供一個(gè)list作為輸入集合:
?
?
s = set([1, 2, 3])
s
{1, 2, 3}
s.add(4)
{1,2,3,4}
s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
s1 & s2
{2, 3}
s1 | s2
{1, 2, 3, 4}
函數(shù)
def my_abs(x):
if x >= 0:
return x
else:
return -x
my_abs(-4)
4
python中函數(shù)的參數(shù)
只有位置參數(shù): def func(a): pass
帶有默認(rèn)參數(shù) def func(a, b = 'default'): pass
帶有任意位置參數(shù) def func(a, b = 'default', *args):pass
帶有任意鍵值的參數(shù)(關(guān)鍵字參數(shù)) def func(a, b = 'default',*args, **kwds):pass
==note==
位置參數(shù)是最基本的參數(shù),它會(huì)跟所傳入的參數(shù)位置一一對(duì)應(yīng)。
默認(rèn)參數(shù)是為了簡(jiǎn)化函數(shù)調(diào)用的方法,我們可以在定義中定義一個(gè)默認(rèn)的值,以此對(duì)于某一類的參數(shù),我們只需要傳入不同的位置參數(shù).
def enroll(name, gender, age=6, city='Beijing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
?
enroll('Sarah', 'F')
name: Sarah
gender: F
age: 6
city: Beijing
默認(rèn)參數(shù)有幾個(gè)注意的地方:
有多個(gè)默認(rèn)參數(shù)時(shí),調(diào)用的時(shí)候,既可以按順序提供默認(rèn)參數(shù),比如調(diào)用enroll('Bob', 'M', 7)
,意思是,除了name
,gender
這兩個(gè)參數(shù)外,最后1個(gè)參數(shù)應(yīng)用在參數(shù)age
上,city
參數(shù)由于沒(méi)有提供,仍然使用默認(rèn)值。
也可以不按順序提供部分默認(rèn)參數(shù)。當(dāng)不按順序提供部分默認(rèn)參數(shù)時(shí),需要把參數(shù)名寫上。比如調(diào)用enroll('Adam', 'M', city='Tianjin')
,意思是,city
參數(shù)用傳進(jìn)去的值,其他默認(rèn)參數(shù)繼續(xù)使用默認(rèn)值。
默認(rèn)參數(shù)一定不能傳入可變?cè)亍?因?yàn)槟J(rèn)參數(shù)在定義時(shí)候就已經(jīng)確定了值,相當(dāng)于已經(jīng)給其分配了空間,當(dāng)我們每一次調(diào)用的時(shí)候都會(huì)給那個(gè)空間中存入。
可變參數(shù): 解決的問(wèn)題是當(dāng)你不確定要在函數(shù)中傳入多少個(gè)參數(shù)時(shí)候,你需要用到可變參數(shù)。
關(guān)鍵字參數(shù): 相當(dāng)于 userinfo
命名關(guān)鍵字參數(shù): 相當(dāng)于固定要傳進(jìn)來(lái)的userinfo
命名關(guān)鍵字參數(shù)必須傳入?yún)?shù)名,這和位置參數(shù)不同。如果沒(méi)有傳入?yún)?shù)名,調(diào)用將報(bào)錯(cuò)
如果要限制關(guān)鍵字參數(shù)的名字,就可以用命名關(guān)鍵字參數(shù),例如,只接收city和job作為關(guān)鍵字參數(shù)。這種方式定義的函數(shù)如下:
?
def person(name, age, *, city, job):
print(name, age, city, job)
?
如果函數(shù)定義中已經(jīng)有了一個(gè)可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個(gè)特殊分隔符*了:
?
def person(name, age, *args, city, job):
print(name, age, args, city, job)
在Python中定義函數(shù),可以用必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù),這5種參數(shù)都可以組合使用。但是請(qǐng)注意,參數(shù)定義的順序必須是:必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)。
進(jìn)階概念
切片
用來(lái)操作迭代對(duì)象,比如list,tuple,字符串等。有了切片操作,很多地方循環(huán)就不再需要了。Python的切片非常靈活,一行代碼就可以實(shí)現(xiàn)很多行循環(huán)才能完成的操作。
L = list(range(100))
print(L(:10))
print(L(10:20))
print(L(-10:))
print(L(0:10:2))
print(L(::5))
example:
冒泡
ListNumber = [4,2,51,212,34,99,110,122]
for x in ListNumber:
for y in ListNumber[ListNumber.index(x):]:
if x > y:
x, y = y, x
?
print(ListNumber)
?
[2, 4, 34, 51, 99, 110, 122, 212]
對(duì)于切片,我們需要參考 Python cookbook的建議,可以命名切片, 使得我們的程序中少點(diǎn)切片的硬編碼。
0123456789012345678901234567890123456789012345678901234567890'
record = '....................100 .......513.25 ..........'
糟糕的寫法
cost = int(record[20:23]) * float(record[31:37])
好的寫法
SHARES = slice(20, 23)
PRICE = slice(31, 37)
cost = int(record[SHARES]) * float(record[PRICE])
Note:
我們一旦命令了slice, 在任何地方都可以用到,包括列表的刪除,插入等
items = [0, 1, 2, 3, 4, 5, 6]
a = slice(2, 4)
items[2:4]
[2, 3]
items[a]
[2, 3]
items[a] = [10,11]
items
[0, 1, 10, 11, 4, 5, 6]
del items[a]
items
[0, 1, 4, 5, 6]
slice 有三個(gè)屬性, start,stop, step
slice 有一個(gè)方法indices(), 這個(gè)方法可以將所切片的范圍規(guī)定在給定字符串的范圍中,避免IndexError
?
列表生成器
列表生成式即List Comprehensions,是Python內(nèi)置的非常簡(jiǎn)單卻強(qiáng)大的可以用來(lái)創(chuàng)建list的生成式。
L = []
for x in range(1, 11):
... L.append(x * x)
...
L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
?
[x * x for x in L if x > 10]
[256, 625, 1296, 2401, 4096, 6561, 10000]
[x * x for x in L]
[1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000]
字典推導(dǎo)
字典推導(dǎo)式實(shí)際上跟 列表生成器是類似的, 代碼如下,實(shí)際上就是把 列表推導(dǎo)中的[]
換成{}
:
dic1 = {x: x * x for x in range(1,11)}
print dic1
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100}
生成器
==方法1==
實(shí)際上跟 列表生成器是類似的, 代碼如下,實(shí)際上就是把 列表推導(dǎo)中的[]
換成()
, 在使用中用for 跟 next()方法取值。
Q:
為什么要用生成器
A:
通過(guò)列表生成式,我們可以直接創(chuàng)建一個(gè)列表。但是,受到內(nèi)存限制,列表容量肯定是有限的。而且,創(chuàng)建一個(gè)包含100萬(wàn)個(gè)元素的列表,不僅占用很大的存儲(chǔ)空間,如果我們僅僅需要訪問(wèn)前面幾個(gè)元素,那后面絕大多數(shù)元素占用的空間都白白浪費(fèi)了。
所以,如果列表元素可以按照某種算法推算出來(lái),那我們是否可以在循環(huán)的過(guò)程中不斷推算出后續(xù)的元素呢?這樣就不必創(chuàng)建完整的list,從而節(jié)省大量的空間。在Python中,這種一邊循環(huán)一邊計(jì)算的機(jī)制,稱為生成器:generator。
G=(x+y for x in L for y in range(1,5) if x>y)
next(G)
12for x in G:
... print('Next:', x)
...
Next: 12
Next: 13
Next: 17
.
.
.
==方法2==
生成器的主要目的是構(gòu)成一個(gè)用戶自定義的循環(huán)對(duì)象。
生成器的編寫方法和函數(shù)定義類似,==只是在return的地方改為yield==。生成器中可以有多個(gè)yield。當(dāng)生成器遇到一個(gè)yield時(shí),會(huì)暫停運(yùn)行生成器,返回yield后面的值。當(dāng)再次調(diào)用生成器的時(shí)候,會(huì)從剛才暫停的地方繼續(xù)運(yùn)行,直到下一個(gè)yield。生成器自身又構(gòu)成一個(gè)迭代器,每次迭代時(shí)使用一個(gè)yield返回的值。
def generate(endNum):
for x in range(0,endNum):
yield x*2
?
L = generate(10)
print(L)
for x in L:
print(x)
<generator object generate at 0x102183830> #這句說(shuō)明通過(guò)generate函數(shù)之后是一個(gè)generator
0
2
4
6
8
10
12
14
16
18
迭代器
迭代器,廖學(xué)峰的教程中寫的很詳細(xì)
我們已經(jīng)知道,可以直接作用于for
循環(huán)的數(shù)據(jù)類型有以下幾種:
一類是集合數(shù)據(jù)類型,如list
、tuple
、dict
、set
、str
等;
一類是generator
,包括生成器和帶yield
的generator function。
這些可以直接作用于for
循環(huán)的對(duì)象統(tǒng)稱為可迭代對(duì)象:Iterable
。
可以使用isinstance()
判斷一個(gè)對(duì)象是否是Iterable
對(duì)象:
而生成器不但可以作用于for
循環(huán),還可以被next()
函數(shù)不斷調(diào)用并返回下一個(gè)值,直到最后拋出StopIteration
錯(cuò)誤表示無(wú)法繼續(xù)返回下一個(gè)值了。
可以被next()
函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterator
。
可以使用isinstance()
判斷一個(gè)對(duì)象是否是Iterator
對(duì)象:
高階函數(shù), Map, filter , sorted等, 匿名函數(shù)
高階函數(shù):
對(duì)于python, 函數(shù)本身也可以賦值給變量,即:變量可以指向函數(shù)。 既然變量可以指向函數(shù),函數(shù)的參數(shù)能接收變量,那么一個(gè)函數(shù)就可以接收另一個(gè)函數(shù)作為參數(shù),這種函數(shù)就稱之為==高階函數(shù)==。
example:
def higherFunc(x, y, f):
return f(x)+f(y)
?
print(higherFunc(1,-2,abs))
3
Map:
在stackover flow 上 有人這么總結(jié)Map
map(f, iterable)
?
基本上等于:
?
[f(x) for x in iterable]
example
?
L = map(TestMap,[88,11,33])
list(L)
[10088, 10011, 10033]
Sorted:
排序 :廖學(xué)峰
此外,sorted()
函數(shù)也是一個(gè)高階函數(shù),它還可以接收一個(gè)key
函數(shù)來(lái)實(shí)現(xiàn)自定義的排序,例如按絕對(duì)值大小排序:
?
from operator import itemgetter
rows = [
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
]
?
sorwRows1 = sorted(rows, key= itemgetter('uid')) # itemgetter: operator模塊提供的itemgetter函數(shù)用于獲取對(duì)象的哪些維的數(shù)據(jù),
print('sorted ROWS :%s' % sorwRows1)
?
?
?
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
sortL = sorted(L, key = itemgetter(0), reverse = True)
print(sortL)
匿名函數(shù)
關(guān)鍵字lambda
表示匿名函數(shù),冒號(hào)前面的x
表示函數(shù)參數(shù)。
匿名函數(shù)有個(gè)限制,就是只能有一個(gè)表達(dá)式,不用寫return
,返回值就是該表達(dá)式的結(jié)果。
def build(x, y):
return lambda: x * x + y * y
裝飾器(==語(yǔ)法糖:@==)
目前最清晰的入門博客
假設(shè)我們要增強(qiáng)now()
函數(shù)的功能,比如,在函數(shù)調(diào)用前后自動(dòng)打印日志,但又不希望修改now()
函數(shù)的定義,這種在代碼運(yùn)行期間動(dòng)態(tài)增加功能的方式,稱之為“裝飾器”(Decorator)。
==本質(zhì)上,decorator就是一個(gè)返回函數(shù)的高階函數(shù)。==
裝飾器其實(shí)也就是一個(gè)函數(shù),一個(gè)用來(lái)包裝函數(shù)的函數(shù),返回一個(gè)修改之后的函數(shù)對(duì)象,將其重新賦值原來(lái)的標(biāo)識(shí)符,并永久喪失對(duì)原始函數(shù)對(duì)象的訪問(wèn)
Note:
==語(yǔ)法糖:==
語(yǔ)法糖(Syntactic sugar),也譯為糖衣語(yǔ)法,是由英國(guó)計(jì)算機(jī)科學(xué)家彼得·約翰·蘭達(dá)(Peter J. Landin)發(fā)明的一個(gè)術(shù)語(yǔ),指計(jì)算機(jī)語(yǔ)言中添加的某種語(yǔ)法,這種語(yǔ)法對(duì)語(yǔ)言的功能并沒(méi)有影響,但是更方便程序員使用。通常來(lái)說(shuō)使用語(yǔ)法糖能夠增加程序的可讀性,從而減少程序代碼出錯(cuò)的機(jī)會(huì)。