1. 程式人生 > >python筆記day2

python筆記day2

python

作用域

只要內存中存在就可以使用,在有函數棧的情況下,還需要加一個條件。

name = {‘name1‘:‘Carrick‘,‘name2‘,‘Tina‘}

for item in name:

print item -->僅僅是打印,沒有將變量指向item內存空間

print item -->無法打印,沒有變量指向item的內存空間,print不知道該打印哪個內存空間


name = {‘name1‘:‘Carrick‘,‘name2‘,‘Tina‘}

for item in name:

a = item

print a -->可以打印,因為有變量a指向item的內存空間

這個僅僅可以打印name字典的最後一個變量

註意事項:這種for循環中賦值,僅僅可以在python中使用,在其他語言中,for循環的字典會被壓入棧中,當for循環執行完畢,棧會被清空,即使a = item,因為item的內存空間被清空,a找不到內存中的位置,print a也不會成功。因此不要在python的for循環中使用賦值。


三目運算

三目運算是if...else結構的簡寫

if a > b:

name = ‘Carrick‘

else

name = ‘Tina‘

寫為三目運算:

name = ‘Carrick‘ if a > b else ‘Tina‘


PyCharm

PyCharm用專業版,社區版不支持Django

PyCharm使用步驟:

第一步:指定Python解釋器

PyCharm本身沒有自帶解釋器,必須指定Python解釋器,才能正常運行Python程序

第二步:

New Project --> Pure Python --> New --> Python File

第三步:

打斷點,dubug模式運行

run正常模式運行


Python中一切皆對象,對象是由類創建的,對象可以調用相關類的屬性和方法

查找類提供哪些方法:

>>> li = [11,22,33]

>>> type(li) -->查看li所屬類型

<type ‘list‘>

>>> dir(list) -->查看類型提供哪些方法

[‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__delitem__‘, ‘__delsli

ce__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getit

em__‘, ‘__getslice__‘, ‘__gt__‘, ‘__hash__‘, ‘__iadd__‘, ‘__imul__‘, ‘__init__‘,

‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__mul__‘, ‘__ne__‘, ‘__new__‘, ‘__r

educe__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__reversed__‘, ‘__rmul__‘, ‘__setattr__‘

, ‘__setitem__‘, ‘__setslice__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘a

ppend‘, ‘count‘, ‘extend‘, ‘index‘, ‘insert‘, ‘pop‘, ‘remove‘, ‘reverse‘, ‘sort‘

]

__X__是內置方法,有至少一種執行方法,沒有下劃線的方法是非內置方法,只有一種執行方式

>>> help(list.append) -->查看具體函數的使用方法

Help on method_descriptor:


append(...)

L.append(object) -- append object to end


PyCharm查看python方法的源碼:

敲list,按ctrl點擊list,即可看到python的list的源碼


int類型常用內置方法

int類型賦值

方法一: i = 10

方法二: i = int(10)

方法三:

>>>i = int("F",base=16) --> 16進制賦值

>>> print i

15

加法

>>> n1 = 1

>>> n2 = 2

>>> n1.__add__(n2) ==>等價於n1 + n2

3

另外:

1. 減法,乘法,除法,冪和取模等運算,只要記住n1-n2,n1*n2,n1/n2,n1**n2和n1%n2,不用記具體的函數

2. int還有radd,add相當於n1+n2,radd相當於n2+n1,int類型還有很多r開頭的函數,都是將兩個數字掉個


絕對值

>>> n1 = -9

>>> n1.__abs__() ==>等價於abs(n1)

9

大小比較

>>> n1 = 9

>>> n2 = 8

>>> n1.__cmp__(n2) ==>等價於cmp(n1,n2)

1

返回值為1,說明n1大於n2,返回值為0,說明n1等於n2,返回值為-1,說明n1小於n2

生成商和余數的元組 -->用於網站分頁顯示

>>> n1 = 10

>>> n2 = 3

>>> n1.__divmod__(n2) ==>等價於divmod(n1,n2)

(3, 1)

除法


>>> n1 = 10

>>> n1.__div__(3)

3

int類型轉換為float類型

>>> n1 = 10

>>> type(n1)

<type ‘int‘>

>>> new_n1 = n1.__float__() ==>等價於float(n1)

>>> type(new_n1)

<type ‘float‘>

獲得屬性

只有類中寫有__getatrribute__屬性,敲“.”才能顯示出類中可用的屬性


獲得哈希

x.__hash__() ==>等價於hash(x)

爬蟲中URL很長,一般將URL做hash或者md5,形成一個較短的字符串,便於存放在數據庫中。

在字典中,如果key很長,哈希值用於快速比較key的值


獲得n進制數字

>>> n = 18

>>> n.__hex__() ==>等價於hex(n),獲得十六進制數字

‘0x12‘

>>> n.__oct__() ==>等價於oct(n),獲得八進制數字

‘022‘

整數部分截取 -->對整數無意義

>>> n = 5.2

>>> n.__trunc__()

5


long型和float型的方法和int型方法幾乎一樣


str類型

str定義

str1 = "Carrick" 或者

str1 = str("Carrick")


字符串首字母大寫

>>> name = ‘Carrick‘

>>> name.capitalize()

‘Carrick‘

字符串居中

>>> name = ‘Carrick‘

>>> name.center(20,"*")

‘******Carrick*******‘

查找子串的個數

>>> name = "djkajs;kfljdaksjkds"

>>> name.count("s")

3

>>> name.count("s",8,20) -->指定起始位置和結束位置

2

字符串結尾判斷

>>> name = ‘Carrick‘

>>> name.endswith(‘ck‘)

True

>>> name.endswith(‘ck‘,2,) -->第二個字符到最後一個字符,以ck結尾

True

**將tab轉換為空格

默認情況下一個tab轉換為8個空格

將tab轉換為空格,然後用strip()函數將所有空格去掉,就可以取到配置文件中的參數

>>> name = ‘Carri ck‘ -->中間有tab鍵

>>> name.expandtabs()

‘Carri ck‘

>>> name.expandtabs(1) -->轉換成一個空格

‘Carri ck‘

查找子串的位置:find和index

>>> name = ‘Carrick‘

>>> name.find(‘ri‘)

3

>>> name.find(‘Fairy‘)

-1

>>> name = ‘Carrick‘

>>> name.index(‘ri‘)

3

>>> name.index(‘Fairy‘)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: substring not found

>>>

find找到返回子串第一個字符的位置,找不到返回-1;如果有相同的子串,會返回第一個子串的位置

index找到返回子串第一個字符的位置,找不到報錯

判斷字符串是否為數字或者字母

>>> name = ‘Carrick‘

>>> name.isalnum()

True

>>> name = ‘老畢‘

>>> name.isalnum()

False

是數字或者字符返回True,是其它值返回False

判斷字符串是否為字母

>>> name = ‘Carrick‘

>>> name.isalpha()

True


>>> name = 123

>>> name.isalpha()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AttributeError: ‘int‘ object has no attribute ‘isalpha‘

>>>

是字母返回True,是其它值報錯

判斷字符串是否為數字

>>> name = 123

>>> name.isdigit()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AttributeError: ‘int‘ object has no attribute ‘isdigit‘

>>> name = ‘123‘

>>> name.isdigit()

True

是數字返回True,是其它值報錯

判斷字符串是否全是小寫

>>> name = ‘carrick‘

>>> name.islower()

True

>>> name = ‘Carrick‘

>>> name.islower()

False


isupper() 判斷字符串是否全為大寫

isspace() 判斷字符串是否全為空格

轉換為標題

>>> name = ‘hello carrick‘

>>> name.istitle()

False

>>> name.title()

‘Hello Carrick‘

>>> name = ‘Hello Carrick‘

>>> name.istitle()

True

istitle() 判斷字符串是否標題

>>> name = ‘hello carrick‘

>>> name.istitle()

False

>>> name = ‘Hello Carrick‘

>>> name.istitle()

True

標題就是每個單詞首字母大寫

**字符串連接

>>> L = [‘s1‘,‘s2‘]

>>> "_".join(L)

‘s1_s2‘

左對齊ljust()

>>> name = ‘Carrick‘

>>> name.ljust(20,"+")

‘Carrick+++++++++++++‘

右對齊:rjust()

大寫變小寫lower();小寫變大寫upper()

>>> name = ‘Carrick‘

>>> name.lower()

‘carrick‘

>>> name.upper()

‘CARRICK‘

大寫變小寫,小寫變大寫swapcase()

>>> name = ‘Carrick‘

>>> name.swapcase()

‘cARRICK‘

字符串分割paritition()

>>> name = ‘Carrick‘

>>> name.partition(‘rr‘)

(‘Ca‘, ‘rr‘, ‘ick‘)

**字符替換replace()

>>> name = ‘Carrick‘

>>> name.replace(‘Ca‘,‘ca‘)

‘carrick‘

>>> name = ‘Carrick‘

>>> name.replace(‘r‘,‘hhhh‘)

‘Cahhhhhhhhick‘

replace()會替換所有的字符,不僅僅替換第一個字符
字符轉相乘(python特有的)

>>> name = ‘Carrick‘

>>> name*6

‘CarrickCarrickCarrickCarrickCarrickCarrick‘


字符串格式化

方法一:

>>> name = "I am {0}, I am {1} years old."

>>> name.format(‘Carrick‘,‘34‘)

‘I am Carrick, I am 34 years old.‘

方法二:

>>> name = "I am {ss}, I am {dd} years old."

>>> name.format(dd="34", ss="Carrick")

‘I am Carrick, I am 34 years old.‘


方法三:元組,列表傳參,需要加“*”

>>> L = [‘Carrick‘,34]

>>> name = "I am {0},aged {1}"

>>> name.format(*L)

‘I am Carrick,aged 34‘

方法四:字典傳參,需要加“**”

>>> D = {‘ss‘:‘Carrick‘,‘dd‘:34}

>>> name = "I am {ss},aged {dd}"

>>> name.format(**D)

‘I am Carrick,aged 34‘


解碼和編碼

技術分享

utf-8和GBK可以通過unicode來相互轉換,不可以直接轉換

>>> ‘無‘

‘\xce\xde‘

>>> str1 = ‘\xce\xde‘

>>> print str1

>>> print str1.decode(‘gbk‘) -->指定從哪個編碼解碼

>>> print str1.decode(‘gbk‘).encode(‘utf-8‘)


列表的方法(二)

列表元素出現的次數

>>> L = [66,77,88]

>>> L.count(88)

1

>>> L.count(22)

0

列表擴展

>>> L = [66,77,88]

>>> L.extend([‘Carrick‘,‘Tina‘])

>>> L

[66, 77, 88, ‘Carrick‘, ‘Tina‘]

>>> L.extend(L)

>>> L

[66, 77, 88, ‘Carrick‘, ‘Tina‘, 66, 77, 88, ‘Carrick‘, ‘Tina‘]

列表可以自己擴展自己

列表元素查找

>>> L = [66,77,88]

>>> L.index(66)

0

>>> L.index(22)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

ValueError: 22 is not in list

列表指定位置插入

>>> L = [66,77,88]

>>> L.insert(0,88)

>>> L

[88, 66, 77, 88]

刪除並返回指定下標的值,不指定下標就彈出最後一個元素

>>> L

[88, 66, 77, 88]

>>> L.pop()

88

>>> L

[88, 66, 77]

>>> L.pop(1)

66

>>> L

[88, 77]

刪除列表第一個值

>>> L = [66,77,88,66]

>>> L.remove(66)

>>> L

[77, 88, 66]

列表翻轉

>>> L = [66,77,88]

>>> L.reverse()

>>> L

[88, 77, 66]

列表元素排序

字母比較ASCII,中文比較Unicode,數字比較大小

>>> ‘無‘

‘\xce\xde‘

>>> str1 = ‘\xce\xde‘

>>> str1.decode(‘gbk‘)

u‘\u65e0‘

>>> str2 = u‘\u65e2‘

>>> print str2

>>> li = [‘無‘,‘既‘]

>>> li.sort()

>>> li

[‘\xbc\xc8‘, ‘\xce\xde‘]

unicode的編碼,‘\xce\xde‘是u‘\u65e0‘,‘\xbc\xc8‘是u‘\u65e2‘,因此sort()將大的排在前面

>>> for i in li:

... print i

...

列表元素刪除

del name[1]是調用__delitem__()方法來執行的


元組和列表的唯一區別,就是列表可以被修改,而元組不能被修改

列表和元組的元素都可以是重復的

元組的元素不能被修改,但是元組的元素的元素可以被修改

字典的key不能重復,value可以重復

元組方法:index(),count()



字典

修改字典,不會在內存中重新開辟一塊空間,只有字符串會

字符串,數字可以作為字典的key,列表不能作為字典的key,元組可以作為字典的key,但是不要這麽做

字符串,數字和類的實例當做字典的key沒有問題

字典根據key獲得value

方法一:字典中沒有值會報錯

>>> d = {‘k1‘:1234}

>>> d[‘k1‘]

1234

>>> d[‘k2‘]

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

KeyError: ‘k2‘

***方法二:字典中沒有值不會報錯

>>> d = {‘k1‘:1234}

>>> d.get(‘k1‘)

1234

>>> d.get(‘k2‘)

>>> print d.get(‘k2‘) -->默認返回值

None

>>> print d.get(‘k2‘,‘OK‘) -->指定返回值

OK

判斷是否為字典

>>> d = {‘k1‘:1234}

>>> type(d) is dict

True

清空字典

>>> D = {1:‘a‘}

>>> D.clear()

>>> D

{}

第一個列表作為字典的key,生成字典

>>> D = {}

>>> D.fromkeys([1,2,3],[4,5,6])

{1: [4, 5, 6], 2: [4, 5, 6], 3: [4, 5, 6]}

有時有個列表,想以列表為key生成字典,就可以

>>> D.fromkeys([1,2,3],[])

{1: [], 2: [], 3: []}

生成一個value為空的字典,然後往裏面插入value即可

判斷key是否在字典中

方法一

>>> D = {1:‘a‘}

>>> D.has_key(1)

True

方法二

>>> 1 in D

True

循環字典

方法一:數據量小的時候可以用,幾萬條數據之內可以用

>>> D = {1:‘a‘,2:‘b‘,3:‘c‘}

>>> for k,v in D.items():

... print k,v

...

1 a

2 b

3 c

方法二:數據量大時用

>>> for k in D:

... print k,D[k]

...

1 a

2 b

3 c

根據key刪除字典元素

方法一:

>>> D = {1:‘a‘,2:‘b‘,3:‘c‘}

>>> D.pop(2)

‘b‘

>>> D

{1: ‘a‘, 3: ‘c‘}

方法二:

>>> D

{1: ‘a‘, 3: ‘c‘}

>>> del D[3]

>>> D

{1: ‘a‘}

隨機刪除字典元素:popitems(),不要使用

根據key查找元素,如果沒有就生成一個None

>>> D = {1:‘a‘,2:‘b‘,3:‘c‘}

>>> D.setdefault(2)

‘b‘

>>> D

{1: ‘a‘, 2: ‘b‘, 3: ‘c‘}

>>> D.setdefault(4)

>>> D

{1: ‘a‘, 2: ‘b‘, 3: ‘c‘, 4: None}

將另一個字典的元素加入到當前字典,如果有相同的key,取另一個字典的key和value(偶爾用)

>>> C = {1:‘a‘,2:‘b‘,3:‘c‘}

>>> D = {4:‘d‘,5:‘e‘,3:‘f‘}

>>> C.update(D)

>>> C

{1: ‘a‘, 2: ‘b‘, 3: ‘f‘, 4: ‘d‘, 5: ‘e‘}

字典淺copy

>>> D = {}

>>> for i in range(5):

... D[i] = []

...

>>> D

{0: [], 1: [], 2: [], 3: [], 4: []}

>>> D[1].append({"b":1})

>>> D

{0: [], 1: [{‘b‘: 1}], 2: [], 3: [], 4: []}

>>> C = D

>>> C

{0: [], 1: [{‘b‘: 1}], 2: [], 3: [], 4: []}

>>> D

{0: [], 1: [{‘b‘: 1}], 2: [], 3: [], 4: []}

>>> D[‘Rain‘] = ‘test‘

>>> D

{0: [], 1: [{‘b‘: 1}], 2: [], 3: [], 4: [], ‘Rain‘: ‘test‘}

>>> C

{0: [], 1: [{‘b‘: 1}], 2: [], 3: [], 4: [], ‘Rain‘: ‘test‘}

D修改了,C也跟這個修改;如果是字符串,D修改了,C不會隨著修改

>>> E = D.copy()

>>> D.pop(‘Rain‘)

‘test‘

>>> D

{0: [], 1: [{‘b‘: 1}], 2: [], 3: [], 4: []}

>>> E

{0: [], 1: [{‘b‘: 1}], 2: [], 3: [], 4: [], ‘Rain‘: ‘test‘}

>>> C

{0: [], 1: [{‘b‘: 1}], 2: [], 3: [], 4: []}

如果使用copy(),E會是另外一個字典,D刪除一個元素,E不會隨著刪除

>>> D[1][0][‘b‘] = ‘Carrick‘

>>> D

{0: [], 1: [{‘b‘: ‘Carrick‘}], 2: [], 3: [], 4: []}

>>> C

{0: [], 1: [{‘b‘: ‘Carrick‘}], 2: [], 3: [], 4: []}

>>> E

{0: [], 1: [{‘b‘: ‘Carrick‘}], 2: [], 3: [], 4: [], ‘Rain‘: ‘test‘}

註意:淺copy只復制字典的第一層

深copy:要借助第三方模塊

>>> import copy

>>> F = copy.deepcopy(D)

>>> F

{0: [], 1: [{‘b‘: ‘Carrick‘}], 2: [], 3: [], 4: []}

>>> D[1][0][‘b‘] = ‘Fairy‘

>>> D

{0: [], 1: [{‘b‘: ‘Fairy‘}], 2: [], 3: [], 4: []}

>>> E

{0: [], 1: [{‘b‘: ‘Fairy‘}], 2: [], 3: [], 4: [], ‘Rain‘: ‘test‘}

>>> C

{0: [], 1: [{‘b‘: ‘Fairy‘}], 2: [], 3: [], 4: []}

>>> F

{0: [], 1: [{‘b‘: ‘Carrick‘}], 2: [], 3: [], 4: []}



集合:去重,交集,差集,並集等的運算

集合/字典是無序的,列表/元組是有序的

列表/字典/集合可以修改,元組不能修改


>>> a = range(5,10)

>>> b = range(7,12)

>>> a

[5, 6, 7, 8, 9]

>>> b

[7, 8, 9, 10, 11]

>>> c = set(a)

>>> c

set([8, 9, 5, 6, 7])

>>> a.append(6)

>>> a

[5, 6, 7, 8, 9, 6]

>>> c

set([8, 9, 5, 6, 7])


>>> d = set(b)

>>> d

set([8, 9, 10, 11, 7])

>>> c

set([8, 9, 5, 6, 7])

>>> c & d -->交集

set([8, 9, 7])

>>> c | d -->並集

set([5, 6, 7, 8, 9, 10, 11])

>>> c ^ d -->交集取反

set([5, 6, 10, 11])

>>> c - d -->c有d沒有的元素

set([5, 6])

>>> d - c -->d有c沒有的元素

set([10, 11])


intersection --> &

union --> |

symmetric_difference --> ^


子集和父集

>>> e = set([8,10])

>>> e

set([8, 10])

>>> d

set([8, 9, 10, 11, 7])

>>> e.issubset(d)

True

>>> d.issuperset(e)

True


彈出集合第一個元素

>>> c

set([8, 9, 5, 6, 7])

>>> c.pop()

8

>>> c.pop()

9

刪除集合指定元素

set([5, 6, 7])

>>> c.remove(6)

>>> c

set([5, 7])

加入另外一個集合的元素

>>> c = set([5, 7, 8, 10])

>>> f = set([10,11])

>>> c.update(f)

>>> c

set([5, 7, 8, 10, 11])

集合不能有重復元素


集合使用場景:資產管理統計硬盤數量

硬盤使用S/N號來識別,這裏用1,2簡單說明一下

diskset = set([1,2])

壞掉一塊硬盤後

diskset1 = set([1])

可以發現硬盤2是壞掉的,寫入到數據庫中

>>> diskset - diskset1

set([2])

增加了硬盤後:

diskset2 = set([1,3,4,5])

可以發現硬盤3,4,5是新增加的硬盤,寫入到數據庫中

>>> diskset2 - diskset1

set([3, 4, 5])



















































python筆記day2