举例介绍Python中的25个隐藏特性
注:这里忽略了生成器,装饰器,交换变量等熟知技巧
1.函数参数unpack
老生常谈的了:
deffoo(x,y): printx,y alist=[1,2] adict={'x':1,'y':2} foo(*alist)#1,2 foo(**adict)#1,2
2.链式比较操作符
>>>x=3 >>>1<x<5 True >>>4>x>=3 True
3.注意函数的默认参数
>>>deffoo(x=[]): ...x.append(1) ...printx ... >>>foo() [1] >>>foo() [1,1]
更安全的做法:
>>>deffoo(x=None): ...ifxisNone: ...x=[] ...x.append(1) ...printx ... >>>foo() [1] >>>foo() [1] >>>
4.字典有个get()方法
dct.get(key[,default_value]),当字典dct中找不到key时,get就会返回default_value
sum[value]=sum.get(value,0)+1
5.带关键字的格式化
>>>print"Hello%(name)s!"%{'name':'James'} HelloJames! >>>print"Iamyears%(age)iyearsold"%{'age':18} Iamyears18yearsold
更新些的格式化:
>>>print"Hello{name}!".format(name="James") HelloJames!
快有些模板引擎的味道了:)
6.for…else语法
>>>foriin(1,3,5): ...ifi%2==0: ...break ...else: ...print"variisalwaysanodd" ... variisalwaysanodd >>>
else语句块会在循环结束后执行,除非在循环块中执行break
7.dict的特殊方法__missing__
Python2.5之后引入的。当查找不到key的时候,会执行这个方法。
>>>classDict(dict): ...def__missing__(self,key): ...self[key]=[] ...returnself[key] ... >>>dct=Dict() >>>dct["foo"].append(1) >>>dct["foo"].append(2) >>>dct["foo"] [1,2]
这很像collections.defaultdict不是吗?
>>>fromcollectionsimportdefaultdict >>>dct=defaultdict(list) >>>dct["foo"] [] >>>dct["bar"].append("Hello") >>>dct defaultdict(<type'list'>,{'foo':[],'bar':['Hello']})
8.切片操作的步长参数
还能用步长-1来反转链表:
9.另一种字符串连接
>>>Name="Wang""Hong" >>>Name 'WangHong'
连接多行:
>>>Name="Wang"\ ..."Hong" >>>Name 'WangHong' 10.Python解释器中的”_” >>>range(4) [0,1,2,3] >>>_ [0,1,2,3]
_即Python解释器上一次返回的值
11.Python描述器
Python描述器是Python中很魔幻的东西,方法等都是描述器。不再举例
12.Zen
importthis
13.嵌套列表推导式
>>>[(i,j)foriinrange(3)forjinrange(i)] [(1,0),(2,0),(2,1)] 14.try/except/else try: put_4000000000_volts_through_it(parrot) exceptVoom: print"'E'spining!" else: print"Thisparrotisnomore!" finally: end_sketch()
15.print重定向输出到文件
>>>print>>open("somefile","w+"),"HelloWorld"
注意打开的模式:"w+"而不能"w",当然"a"是可以的
16.省略号
在Python3中你可以直接使用省略号这个文法:
Python3.2(r32:88445,Oct202012,14:09:50) [GCC4.5.2]onlinux2 Type"help","copyright","credits"or"license"formoreinformation. >>>... Ellipsis
Python2中呢?
>>>classC(object): ...def__getitem__(self,item): ...returnitem ... >>>C()[1:2,...,3] (slice(1,2,None),Ellipsis,3) >>>
17.Python3中的元组unpack
真的但愿Python2也这样:
>>>a,b,*rest=range(10) >>>a 0 >>>b 1 >>>rest [2,3,4,5,6,7,8,9] >>>
当然也可以取出最后一个:
>>>first,second,*rest,last=range(10) >>>first 0 >>>second 1 >>>last 9 >>>rest [2,3,4,5,6,7,8]
18.pow()还有第三个参数
我们都知道内置函数pow,pow(x,y)即x**y
但是它还可以有第三个参数:
>>>pow(4,2,2) 0 >>>pow(4,2,3) 1
其实第三个参数是来求模的:pow(x,y,z)?==?(x**y)?%z
注意,内置的pow和math.pow并不是一个函数,后者只接受2个参数
19.enumerate还有第二个参数
enumerate很赞,可以给我们索引和序列值的对,但是它还有第二个参数:
>>>lst=["a","b","c"] >>>list(enumerate(lst,1)) [(1,'a'),(2,'b'),(3,'c')]
这个参数用来:指明索引的起始值
20.显式的声明一个集合
新建一个集合,我们会:
>>>set([1,2,3])
在Python2.7之后可以这么写了:
>>>{1,2,3} set([1,2,3])
21.用切片来删除序列的某一段
>>>a=[1,2,3,4,5,6,7] >>>a[1:4]=[] >>>a [1,5,6,7]
当然用dela[1:4]也是可以的
去除偶数项(偶数索引的):
>>>a=[0,1,2,3,4,5,6,7] >>>dela[::2] >>>a [1,3,5,7]
22.isinstance可以接收一个元组
这个真的鲜为人知,我们可以用isinstance(x,(float,int))来判断x是不是数:
>>>isinstance(1,(float,int)) True >>>isinstance(1.3,(float,int)) True >>>isinstance("1.3",(float,int)) False
那么对于第三个测试,你把str加入元组就可以看到这是怎么回事了:
>>>isinstance("1.3",(float,int,str)) True
也就是那个元组里面是或的关系,只要是其中一个的实例就返回True
23.字典里的无限递归
>>>a,b={},{} >>>a['b']=b >>>b['a']=a >>>a {'b':{'a':{...}}}
当然你可以制作一个链表中的无限循环:
>>>a,b=[],[] >>>a.append(b) >>>b.append(a) >>>a [[[...]]]
真心不知道有什么用,不过蛮好玩的不是吗
24.Python可以认识Unicode中的数字
所以说,Python很赞:
>>>int(u'1234') 1234
不只是ASCII字符串的可以认出来,连Unicode的也可以。
25.不能访问到的属性
回答这个答案的人太坏了:)
>>>classO(object):pass ... >>>o=O() >>>setattr(o,"can'ttouchthis",123) >>>o.can'ttouchthis File"<stdin>",line1 o.can'ttouchthis ^ SyntaxError:EOLwhilescanningstringliteral >>> File"<stdin>",line1 o.can'ttouchthis ^ SyntaxError:EOLwhilescanningstringliteral
不过,能用setattr设置属性,就可以用getattr取出