學了很久的js,突然想學python來寫寫小爬蟲什么的,下面是看廖雪峰,廖大大的教程做的一些筆記,主要還是一些注意事項什么的。盡量用js參照學習,這樣快一點。發現python真的是超好用啊,超多語法糖的,簡直厲害的不行。
r''表示默認不轉義
大寫表示常量
用u'’表示Unicode的字符
使用encode(’utf-8’)可以把u‘xxx’轉為UTF-8編碼,decode則相反。
python文件需要加注釋
#!/usr/bin/env python
# -*- coding: utf-8 -*-
%s字符串代替,%d必須是個數字代替,%f浮點數,%x16進制整數
整數和浮點數還可以指定是否補0,或者小數點,將0123識別為8進制,只能在0-7之間,8,9報錯
將0x識別為16進制,0-9,a-f
%的轉義只能使用%
數組在python里面叫list
list.append(x)在末尾加
js中則是push()
list.pop(x)刪除末尾元素,刪除指定位置元素可以用pop(i),i是索引
js中刪除末尾元素是一樣的,但是無法根據索引刪除,還可以用shift()刪除頭部元素
tuple 元組
和list類似,但是初始化之后不能修改
定義一個元素的tuple
t = (1),這樣寫只能輸出t = 1,
t=(1,)
if的寫法
if :
elif:
else:
if判斷條件還可以簡寫,比如寫:
ifx:
print‘True'
只要x是非零數值、非空字符串、非空list等,就判斷為True,否則為False。
循環,只有兩種
for in和while
range(5),生成5個0-4的list
raw_input會默認返回字符串,如果需要數字需要使用int(raw_input)轉換一下
list占用空間小,浪費內存少
dict,字典相對于js中的對象,查找速度快,不會隨著key的增加而增加,占用內存多,
a = {'b':1,’c':2}
b in a
True
或者用get()
a.get(‘b’)
1
a.get(‘d’,3)
3
a.get(‘d’)
報錯
a.get(‘c’,3)還是return2
2
也可以使用pop(key)的形式刪除
python字典類似js對象,指向一個內存地址而已,淺復制改變一個,另一個也會改變
set只是一組不重復的key,重復的set會自動過濾
可以通過add(key)的方法增加key
remove(key)可以刪除
bool()轉換成布爾值
pass可以作為占位符
先將程序跑起來
isinstance(key,(int等))可以做數據檢查,類似js 的typeof
函數參數的調用,如果有默認值,一定要使用不變對象比如none,tuple等
,使用其它會導致可變,會出錯
可變參數,自動組裝成一個tuple
calc(*number):
sum = 0
for n in number:
sum = sum + n*n
return sum
寫成這樣就可以calc(1,2,3)
如果要調用list或者tuple怎么辦呢?
可以用calc(*list)
關鍵字參數
而關鍵字參數允許你傳入0個或任意個含參數名的參數,這些參數在函數內自動組裝成一個dict
關鍵字參數可傳可不傳,傳入就是自動組裝成dict,如
person(‘li’,30,city=‘BJ’)
簡單調用
kw = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **kw)
參數定義的順序必須是:必選參數、默認參數、可變參數和關鍵字參數。
采用尾遞歸解決棧溢出的問題
deffact(n):
returnfact_iter(n, 1)
deffact_iter(num, product):
ifnum == 1:
returnproduct
returnfact_iter(num - 1, num * product)
遺憾的是,大多數編程語言沒有針對尾遞歸做優化,Python解釋器也沒有做優化,所以,即使把上面的fact(n)函數改成尾遞歸方式,也會導致棧溢出。
切片 slice
L[0:3]從0號索引開始,直到取到3為止,但是不包括3
還支持倒數切片
L[-2:-1]從-2開始,但不包括-1
A = range(100)
A[::5]每5個數取一個
A[:]直接復制一個數組
字符串也可以看成一個list,也可以做切片
因為dict的存儲不是按照list的方式順序排列,所以,迭代出的結果順序很可能不一樣。
dict迭代的是key。如果要迭代value,可以用for value in d.itervalues(),如果要同時迭代key和value,可以用for k, v in d.iteritems()。
如何判斷一個對象是可迭代對象呢?方法是通過collections模塊的Iterable類型判斷:
fromcollectionsimportIterable
isinstance('abc', Iterable)
如果真要獲取下標怎么辦?
可以使用內置的enumerate
列表生成器(賊雞兒強大,)
[x*x for x in range(1,11)]就可以生成
[1,4,9,16,25,36,49,64,81,100]
后面還可以加篩選條件比如
[x*x for x in range(1,11) if x % 2 == 0]
篩選偶數
還可以兩層循環!!生成全排列
[m + n for m in ‘ABC’ for n in ‘XYZ’]
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ’]
三層或者三層以上的就很少用到了
for循環其實可以同時使用兩個甚至多個變量,比如dict的iteritems()可以同時迭代key和value:
d = {'x': 'A', 'y': 'B', 'z': 'C' }
[k + '=' + vfork, vind.iteritems()]
['y=B', 'x=A', 'z=C’]
可以使用lower()把所有字符串變成小寫
python 生成器
可以一邊循環一遍推算,減少占用空間,和list的區別就是小括號
g = (x * x for x in range(10))
打印里面的子元素可以使用next() 方法,每次調用都計算出下一個的值
當然,只使用next就太變態了,我們可以用for循環,用迭代的方法get
def fin(max):
n, a, b = 0, 1, 1
while n < max:
yield b
a, b = b, a+b
n = n +1
js
a(max) => {
let n = 0,a = 1, b = 1;
while (n < max) {
a = b
b = a + b
}
}
a,?b=b,?a+b
#?這種賦值,先計算等值?右邊?那么?b=1?a+b=1
#?再賦值給a和b,那么?a=1,?b=1
這就是定義generator的另一種方法。如果一個函數定義中包含yield關鍵字,
這里,最難理解的就是generator和函數的執行流程不一樣。函數是順序執行,遇到return語句或者最后一行函數語句就返回。而變成generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
sorted()完成排序
高階函數,可以接受函數作為參數的函數
首字母大寫,其余全部小寫
capitalize()
title() 標題首字大寫
lower() 全轉換成小寫
upper() 全轉換成大寫
未完待續