python入門有很多教程,習(xí)慣上比較講究快速學(xué)習(xí)的同學(xué),可以選擇廖雪峰的網(wǎng)站和python簡(jiǎn)明教程,小小白上半年偶爾看過一遍廖雪峰的教程,然而……沒有記住,因?yàn)楫?dāng)時(shí)完全沒有實(shí)戰(zhàn),所以說學(xué)習(xí)編程還是要不斷的練習(xí)和分享,以及做筆記啊。因此本次我選擇python簡(jiǎn)明教程并且結(jié)合廖雪峰的網(wǎng)站。
推薦安裝pycharm編輯器,用過都說好。
官網(wǎng)直接下載。解壓,打開bin文件夾,終端運(yùn)行 sh pycharm.sh,出現(xiàn)安裝界面,選擇激活碼。
激活碼參考:blog.csdn.net/lhw413/article/details/72357062 。
裝在了window電腦的ubuntu虛擬機(jī)卡的喲,簡(jiǎn)直人生無望,果斷重裝window版。
安裝配置有很多教程,不再贅述,參考:wenku.baidu.com/view/81038a877cd184254b35359b.html?
1.基本概念:
python中4種類型的數(shù),整數(shù),長(zhǎng)整數(shù),浮點(diǎn)數(shù)(相當(dāng)于小數(shù)),復(fù)數(shù)(-5+4j)
字符串使用,單引號(hào)雙引號(hào)的一樣,三引號(hào)可以只是多行的字符串,并且可以在其中使用單雙引號(hào)。
想要在字符串中包含單引號(hào)除了三引號(hào)還有\(zhòng),\' 轉(zhuǎn)義符。但\在行尾表示字符串接下一行。
自然字符串:給字符串的前綴加R或者r,特殊字符串失去意義,例如正則表達(dá)式可以使用中這種形式,否則轉(zhuǎn)義符太多。
Unicode字符串:字符串前加上前綴u或者U,簡(jiǎn)單說就是給字符一個(gè)唯一的存儲(chǔ)數(shù)字,跨平臺(tái),跨語言通用。
字符串按照字面意義相鄰放著,自動(dòng)被Python相連。
變量:y=x+1 中的x,y
標(biāo)識(shí)符:字母,下劃線,數(shù)字,注意大小寫。
對(duì)象:在python中任何東西都可以稱為對(duì)象。
縮進(jìn):同一層次的語句必須有相同的縮進(jìn)。每一組稱之為塊。
list 有序的集合可以隨時(shí)添加刪除值【】:
classmates = ['Michael','Bob','Tracy'] ,len()獲得list元素的長(zhǎng)度
.append 在末尾添加元素;.insert (1.值) 在1位插入值;.pop(i)刪除list值
tuple : 元組,一旦初始化不能修改。注:只有一個(gè)字符的元組,在后面加,以免歧義。(1,)
dict: 快速查找存儲(chǔ),但是空間消耗大。{} 通過key直接拿到value. In可以判斷key知否存在,.pop刪除key
set:無序無意義的集合,提供一個(gè)list作為輸入集合 顯示不證明有序,.remove刪除key
不變對(duì)象:調(diào)用自身的任何對(duì)象方法,都不會(huì)改變對(duì)象自身 的內(nèi)容,相反這些對(duì)象會(huì)創(chuàng)建新的對(duì)象并返回,這也就保證了不可變對(duì)象是不可變。
2.控制流(語法)
共三種if,for,while
if
if - else
if (條件判斷):
? ? print1
elif (條件判斷):
? ? print2
else:
? ? print2
從上到下依次執(zhí)行。第一個(gè)判斷條件為true,余下忽略。
循環(huán)語句
for - in循環(huán)
for x in…… 就是把每個(gè)元素代入變量x,然后執(zhí)行縮進(jìn)的塊的語句。
生出整數(shù)序列:range(5)從0開始小于5的整數(shù),提供第三個(gè)數(shù)為步長(zhǎng),比如(1,5,2)再用list()轉(zhuǎn)換為list,輸出為1,3
例如:
sum =0
for x in range(101):
????sum = sum + x
print (sum)
while
條件滿足,不斷循環(huán),條件不滿足,退出循環(huán)。
sum =0
n =99
while n >0:
????sum = sum + n
????n = n-2
print (sum)
break
用來終止循環(huán)語句。無論結(jié)果是否為true,或者序列有沒有完全被遞歸。也就是說從for過著while循環(huán)中終止,任何對(duì)應(yīng)的循環(huán)的else塊將不執(zhí)行。
while True:
????s = raw_input ('Enter something:') ### raw_input 將輸入的都表示為字符串。
????if s == 'quit':
????????break ? ? ### 程序終止 ,輸出done
????print 'length of the string is',len(s) ###否則輸出s的字符串長(zhǎng)度。
print 'Done'
continue
跳過當(dāng)前的循環(huán)塊的剩余語句,繼續(xù)進(jìn)行下一步循環(huán)。
while True:
????s = raw_input ('Enter something:')
????if s == 'quit':
????????break
????if len(s) < 3:
????????continue
????print 'Input is of sufficient length'
print 'Done'
盡量避免continue 和 break ,容易進(jìn)入死循環(huán)。
3.函數(shù)
調(diào)用函數(shù)
定義函數(shù)
def 函數(shù)名(參數(shù)):
? ? 函數(shù)內(nèi)容
如:def hello ():
? ? ? ? ? ? ?? print 'hello world'????????
函數(shù)形參?
函數(shù)中的參數(shù)稱之為形參,提供的賦值稱之為實(shí)參。
函數(shù)返還值:從被調(diào)函數(shù)返還到主函數(shù),并且返回一個(gè)計(jì)算的值,也就是說主函數(shù)調(diào)用這個(gè)函數(shù)的時(shí)候得到這個(gè)返還值。
當(dāng)你在函數(shù)定義變量的是后,它與函數(shù)外具有相同名稱的變量沒有關(guān)系,函數(shù)的變量名對(duì)于函數(shù)來說是局部的,這就是變量的作用域、
global 語句
定義在函數(shù)外的變量賦值。使用該語句可以清楚的表明變量是在外面的塊定義。也就是他代表賦值是全局的。
默認(rèn)參數(shù)值
函數(shù)定義的形參后面跟上= 賦值,函數(shù)的形參就有了默認(rèn)的參數(shù)值,不可變。
只有形參表末尾的函數(shù)可以有默認(rèn)參數(shù)值,也就是說聲明函數(shù)的形參的時(shí)候,不能先聲明有默認(rèn)值的形參再聲明沒有默認(rèn)值的形參、也就是必選參數(shù)在前,默認(rèn)參數(shù)在后,當(dāng)函數(shù)有多個(gè)參數(shù)的時(shí)候,變化大的在前,變化小的在后,降低難度。
有多個(gè)默認(rèn)參數(shù)的時(shí)候,可以按照順序提供默認(rèn)參數(shù),也可以不按照順序直接寫參數(shù)值,表示這個(gè)參數(shù)用傳進(jìn)去的值。
可變參數(shù):參數(shù)加*,表示參數(shù)作為可變參數(shù),允許添加0到多個(gè)參數(shù),函數(shù)調(diào)用時(shí)自動(dòng)組成tuple.
也可以在list前加,表示list中的元素作為可變?cè)靥砑印?/p>
def calc(*numbers):
關(guān)鍵參數(shù)
允許傳入0到多個(gè)含有參數(shù)名的參數(shù),自動(dòng)組成dict。通過命名給參數(shù)賦值,稱之為關(guān)鍵函數(shù)。不在乎位置。
**kw kw作為關(guān)鍵參數(shù)
>>> extra = {'city': 'Beijing', 'job': 'Engineer'} ###先組建一個(gè)dict
>>> person('Jack', 24, **extra)###作為關(guān)鍵參數(shù)填進(jìn)去
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
命名關(guān)鍵參數(shù):
如果要限制關(guān)鍵字參數(shù)的名字,就可以用命名關(guān)鍵字參數(shù),例如,只接收city和job作為關(guān)鍵字參數(shù)。這種方式定義的函數(shù)如下:
def person(name, age, *, city, job):
print(name, age, city, job)
命名關(guān)鍵字參數(shù)需要一個(gè)特殊分隔符*,*后面的參數(shù)被視為命名關(guān)鍵字參數(shù)。
調(diào)用方式如下:
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
如果函數(shù)定義中已經(jīng)有了一個(gè)可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個(gè)特殊分隔符*了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
參數(shù)組合
參數(shù)定義的順序必須是:必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)。
遞歸函數(shù)
如果一個(gè)函數(shù)在內(nèi)部調(diào)用自身本身,這個(gè)函數(shù)就是遞歸函數(shù)。
函數(shù)調(diào)用是通過棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,每當(dāng)進(jìn)入一個(gè)函數(shù)調(diào)用,棧就會(huì)加一層棧幀,每當(dāng)函數(shù)返回,棧就會(huì)減一層棧幀。由于棧的大小不是無限的,所以,遞歸調(diào)用的次數(shù)過多,會(huì)導(dǎo)致棧溢出。解決方法尾遞歸。
4.高級(jí)特性
切片
L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個(gè)元素,也可以倒數(shù)切片,倒數(shù)第一個(gè)元素的索引是-1??梢杂糜谧址?/p>
前10個(gè)數(shù),每?jī)蓚€(gè)取一個(gè),
>>> L[:10:2]
[0, 2, 4, 6, 8]
所有數(shù),每5個(gè)取一個(gè):
>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
迭代
在Python中,迭代是通過for ... in來完成,不僅可以用在list或tuple上,還可以作用在其他可迭代對(duì)象上。
默認(rèn)情況下,dict迭代的是key。如果要迭代value,for value in d.values(),如果要同時(shí)迭代key和value,可以用for k, v in d.items()。也可以迭代字符串。
如何判斷一個(gè)對(duì)象是可迭代對(duì)象呢?方法是通過collections模塊的Iterable類型判斷:
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整數(shù)是否可迭代
False
在for循環(huán)中同時(shí)迭代索引和元素本身:
for i, value in enumerate(['A', 'B', 'C']):
...? ? print(i, value)
列表生成式
創(chuàng)建list
[1x1, 2x2, 3x3, ..., 10x10]:
>>> [x * x for x in range(1, 11)];>>> [x * x for x in range(1, 11) if x % 2 == 0]###偶數(shù)平方
寫列表生成式時(shí),把要生成的元素x * x放到前面,后面跟for循環(huán),就可以把list創(chuàng)建出來。
兩層循環(huán),可以生成全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
列表生成式也可以使用兩個(gè)變量來生成list:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']
一個(gè)list中所有的字符串變成小寫:
>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']
生成器 generator
為了節(jié)省空間,一遍循環(huán)一邊計(jì)算。
只要把一個(gè)列表生成式的[]改成(),就創(chuàng)建了一個(gè)generator;如果一個(gè)函數(shù)定義中包含yield關(guān)鍵字,是一個(gè)generator
for循環(huán)可迭代。
變成generator的函數(shù),遇到y(tǒng)ield語句返回,再次執(zhí)行時(shí)從上次返回的yield語句處繼續(xù)執(zhí)行。
迭代器:
可以直接作用于for循環(huán)的對(duì)象統(tǒng)稱為可迭代對(duì)象:Iterable
可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterator。
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
生成器都是Iterator對(duì)象,但list、dict、str雖然是Iterable,卻不是Iterator。
把list、dict、str等Iterable變成Iterator可以使用iter()函數(shù),
>>> isinstance(iter([ ]), Iterator):
True
5.函數(shù)式編程、
高階函數(shù)
函數(shù)本身可以賦值給變量,調(diào)用變量可以調(diào)用函數(shù)。所以一個(gè)函數(shù)可以接受另一個(gè)函數(shù)作為參數(shù),這就是高階函數(shù)。
map函數(shù)
接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是迭代對(duì)象。例如:
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
reduce函數(shù)
與map函數(shù)的區(qū)別:
①從參數(shù)方面來講:
map()函數(shù):
map()包含兩個(gè)參數(shù),第一個(gè)是參數(shù)是一個(gè)函數(shù),第二個(gè)是序列(列表或元組)。其中,函數(shù)(即map的第一個(gè)參數(shù)位置的函數(shù))可以接收一個(gè)或多個(gè)參數(shù)。
reduce()函數(shù):
reduce() 第一個(gè)參數(shù)是函數(shù),第二個(gè)是 序列(列表或元組)。但是,其函數(shù)必須接收兩個(gè)參數(shù)。
②從對(duì)傳進(jìn)去的數(shù)值作用來講:
map()是將傳入的函數(shù)依次作到序列的每個(gè)元素,每個(gè)元素都是獨(dú)自被函數(shù)“作用”一次;(請(qǐng)看下面的栗子)
reduce()是將傳人的函數(shù)作用在序列的第一個(gè)元素得到結(jié)果后,把這個(gè)結(jié)果繼續(xù)與下一個(gè)元素作用(累積計(jì)算),
最終結(jié)果是所有的元素相互作用的結(jié)果。
filter函數(shù)
用于過濾序列,和map()類似,filter()也接收一個(gè)函數(shù)和一個(gè)序列。和map()不同的是,filter()把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素。
sorted函數(shù)
排序算法
可以進(jìn)行數(shù)字與list排序,關(guān)鍵在于建立映射。
返還函數(shù)
把函數(shù)作為結(jié)果值返還。
6.模塊
模塊是包含了所有你定義的函數(shù)和變量的文件,為了在其他程序中重用模塊,py為擴(kuò)展名。
7.面向?qū)ο蟮木幊?/h4>
而面向?qū)ο蟮某绦蛟O(shè)計(jì)把計(jì)算機(jī)程序視為一組對(duì)象的集合,而每個(gè)對(duì)象都可以接收其他對(duì)象發(fā)過來的消息,并處理這些消息。