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