python 基礎(chǔ)

目錄
最重要的工具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 安裝

Pip一些命令的簡(jiǎn)介

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')

循環(huán)

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)

Dict 與 set

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)
12

for 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ì)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Python 是一種相當(dāng)高級(jí)的語(yǔ)言,通過(guò) Python 解釋器把符合語(yǔ)法的程序代碼轉(zhuǎn)換成 CPU 能夠執(zhí)行的機(jī)器碼...
    Python程序媛閱讀 2,037評(píng)論 0 3
  • 1.定義函數(shù): 沒(méi)有return,默認(rèn)返回None 2.定義空函數(shù) 相當(dāng)于什么也不做,可以用來(lái)做函數(shù)體占位符,沒(méi)有...
    maskwang520閱讀 372評(píng)論 0 0
  • @貳拾貳畫生 感謝簡(jiǎn)明Python教程 輸入輸出 輸入:raw_input string = raw_input(...
    貳拾貳畫生閱讀 2,704評(píng)論 4 21
  • python轉(zhuǎn)義字符:\ python用r' '表示' '默認(rèn)不轉(zhuǎn)義示例:print(r'\\\t\\')結(jié)果:\...
    bjchenli閱讀 697評(píng)論 0 0
  • 2013-1-22 一、雪花謎 漫天飄灑飛舞斜。 白皚晶瑩凈潔。 落地稍停歇, 行蹤泯滅、 潤(rùn)物蘗。 何也? 雪。...
    鄧文偉閱讀 529評(píng)論 1 1

友情鏈接更多精彩內(nèi)容