有關(guān)Python語法介紹說明
本文主要講述Python語法的相關(guān)文章,怎樣編寫Python語法的一些做法,這些內(nèi)容都是一些門戶網(wǎng)站和技術(shù)論壇找到的,中間可能有不少錯(cuò)誤是我沒有挑出的,歡迎大家指正。
接下來說下我遇到的問題,本來想學(xué)下lambda用法(現(xiàn)在還沒搞明白),就在網(wǎng)上找了個(gè)例子,如下(print語法我已經(jīng)改了。
- class People:
- age=0
- gender='male'
- def __init__(self, age, gender):
- self.age = age
- self.gender = gender
- def toString(self):
- return 'Age:'+str(self.age)+'\tGender:'+self.gender
- List=[People(21,'male'),People(20,'famale'),People(34,'male'),People(19,'famale')]
- print('Befor sort:')
- for p in List:
- print(p.toString())
- List.sort(lambda p1,p2:cmp(p1.age,p2.age))
- print('\nAfter ascending sort:')
- for p in List:
- print(p.toString())
- List.sort(lambda p1,p2:-cmp(p1.age,p2.age))
- print('\nAfter descending sort:')
- for p in List:
- print(p.toString())
重點(diǎn):Python語法指定含有一個(gè)參數(shù)的函數(shù),這個(gè)函數(shù)被用來提取各個(gè)元素之間比較用的關(guān)鍵字(現(xiàn)在看來,這個(gè)用法比用lambda更明了些)根據(jù)這個(gè)提示,終于明白了,我要比較List中每個(gè)元素大小,每個(gè)元素都是People類,用age成員作為比較關(guān)鍵字,所以很簡單聯(lián)想到要給key賦一個(gè)方法,這個(gè)方法返回People中的age,所以修改后代碼如下:
- class People:
- age=0
- gender='male'
- def __init__(self, age, gender):
- self.age = age
- self.gender = gender
- def toString(self):
- return 'Age:'+str(self.age)+'\tGender:'+self.gender
- List=[People(21,'male'),People(20,'famale'),People(34,'male'),People(19,'famale')]
- print('Befor sort:')
- for p in List:
- print(p.toString())
- List.sort(lambda p1,p2:cmp(p1.age,p2.age))
- print('\nAfter ascending sort:')
- for p in List:
- print(p.toString())
- List.sort(lambda p1,p2:-cmp(p1.age,p2.age))
- print('\nAfter descending sort:')
- for p in List:
- print(p.toString())
前兩天把《A Byte of Python》大致看了一遍,算是基本可能入門了。動(dòng)手寫了些很簡單的小例子,對(duì)Python語法有個(gè)基本的了解。但是還有一些細(xì)節(jié)不是很清楚,有些地方可能知其然不知所以然,還有待更深入的學(xué)習(xí)。今天再翻《Dive into python》,發(fā)現(xiàn)寫出書上那么簡潔但是功能強(qiáng)大的程序還是需要一段時(shí)間的。
關(guān)于函數(shù)定義:函數(shù)定義不需要定義返回的數(shù)據(jù)類型,不需要指定參數(shù)的類型。在Python 中, 永遠(yuǎn)也不需要明確指定任何東西的數(shù)據(jù)類型。舉個(gè)例子:char *ret = (x!=0) ? "True" : "False"這行代碼對(duì)應(yīng)的python形式就是ret = (x and "True") or "False"(很簡單吧,事實(shí)上括號(hào)可以去掉)。
運(yùn)行時(shí),python虛擬機(jī)會(huì)對(duì)賦值符右邊的布爾表達(dá)式(注意這里并非三元表達(dá)式)求值,返回值是***一個(gè)被分析到的值。為什么是“***一個(gè)被分析到的”而不是表達(dá)式中“***一個(gè)”呢?因?yàn)椴紶柋磉_(dá)式有一個(gè)短路效應(yīng),比如a or b,如果a為真那么就不會(huì)分析b了。#t#
嗯,估計(jì)現(xiàn)在大家差不多明白了這行python代碼的原理了。如果x為真,由于字符串“True”也為真,于是返回"True",反之,x為假,那么就沒必要看字符串"True"了(短路效應(yīng)),直接返回"False"。不難看出,三元運(yùn)算在Python語法中事實(shí)上可以通過借用布爾求值表達(dá)。然后,有時(shí)會(huì)有點(diǎn)小問題。舉個(gè)例子,char *ret = x ? "" or "VAL"。
根據(jù)前面的例子,我們很自然想到在python里應(yīng)該這樣寫,ret = x and "" or "VAL"。錯(cuò)了!不管x的布爾求值是真還是假,ret得到的總是"VAL"。奇怪么?不奇怪,因?yàn)樵?FONT>python中對(duì)空字符串的布爾求值為false,這樣x and ""永遠(yuǎn)都是false,所以ret得到的自然總是"VAL"了。
解決這個(gè)問題有兩種辦法,***種,也是我喜歡的一種,就是寫成ret = not x and "VAL" or ""。第二種,麻煩一點(diǎn)ret=x and [""] or ["VAL"],然后每次取ret[0]作為返回值,這是因?yàn)閇""]在布爾求值時(shí)值為true。