专栏名称: Python学习交流
每天更新,更新python相关的知识。希望诸君有所收获!
目录
相关文章推荐
Python爱好者社区  ·  英伟达憾失DeepSeek关键人才?美国放走 ... ·  昨天  
Python爱好者社区  ·  DeepSeek创始人梁文锋个人履历 ·  3 天前  
Python爱好者社区  ·  离谱!下载DeepSeek最高判刑20年? ·  2 天前  
Python爱好者社区  ·  1885页的Python完全版电子书 ·  3 天前  
Python开发者  ·  o3-mini 碾压 DeepSeek ... ·  5 天前  
51好读  ›  专栏  ›  Python学习交流

7 种简洁 Python 语法,教你码出一手好代码 !

Python学习交流  · 公众号  · Python  · 2019-01-18 14:06

正文

Python 是一门用途广泛、易读、而且容易入门的编程语言。但同时 python 语法也允许我们做一些很奇怪的事情。



1、 使用 lambda 表达式重写多行函数

众所周知 python 的 lambda 表达式不支持多行代码。但是可以模拟出多行代码的效果。



def f () :

x = 'string'

if x . endswith ( 'g' ) :

x = x [ :- 1 ]

r = ''

for i in xrange ( len ( x )) :

if x [ i ] != 'i' :

r += x [ i ]

return r

f ()

-> 'strn'


虽然看起来很奇怪,但是上面的函数可以使用下面的 lambda 表达式函数代替:


( lambda : ([x for x in [ 'string' ]], x . endswith ( 'g' ) and [x for x in [ x [ :- 1 ]]], [r for r in [ '' ]], [ x [ i ] != 'i' and [r for r in [ r + x [ i ]]] for i in xrange ( len ( x ))], r )[ - 1 ])()

-> 'strn'


永远不要在生产环境写这样的代码 :)

2、 三元运算符

现代的 python 提供了更简便的语法:

b if a else c


也可以通过下面的方式重写:


(a and [ b ] or [ c ])[ 0 ]

( b , c )[ not a ]


顺便说一下,下面的变体是错误的:


a and b or c

True and [] or [ 1 ] -> [ 1 ], but : [] if True else [ 1 ] -> []


3、 通过列表推导式移除重复的元素

让我们来把字符串 x = 'tteesstt' 转换成 'test' 吧。

1.在原字符串中和上一个字符比较:

''.join(['' if i and j == x[i-1] else j for i,j in enumerate(x)]


2.把前一个字符保存到临时变量中:


'' . join ([( '' if i == a else i , [a for a in [ i ]])[ 0 ] for a in [ '' ] for i in x ])

'' . join ([( '' if i == a . pop () else i , a . append ( i ))[ 0 ] for a in [[ '' ]] for i in x ])


3.在新字符串中和上一个字符比较:


[(not r.endswith(i) and [r for r in [r+i]], r)[-1] for r in [''] for i in x][-1]


4.通过 reduce 函数和 lambda 表达式:


reduce(lambda a, b: a if a.endswith(b) else a + b, x)


4、 通过列表推导式获得斐波拉契数列

1.把中间值保存在列表中


[( lambda : ( l [ - 1 ], l . append ( l [ - 1 ] + l [ - 2 ]))[ 0 ])() for l in [[ 1 , 1 ]] for x in xrange ( 19 )]

[( l [ - 1 ], l . append ( l [ - 1 ] + l [ - 2 ]))[ 0 ] for l in [[ 1 , 1 ]] for x in xrange ( 19 )]


2.把中间值保存到字典中:


[i for x in [( lambda : ( l [ 'a' ], l . update ({ 'a' : l [ 'a' ] + l [ 'b' ]}), l [ 'b' ], l . update ({ 'b' : l [ 'a' ] + l [ 'b' ]}))[ :: 2 ])() for l in [{ 'a' : 1 , 'b' : 1 }] for x in xrange ( 10 )] for i in x ]

[i for x in [( l [ 'a' ], l . update ({ 'a' : l [ 'a' ] + l [ 'b' ]}), l [ 'b' ], l . update ({ 'b' : l [ 'a' ] + l [ 'b' ]}))[ :: 2 ] for l in [{ 'a' : 1 , 'b' : 1 }] for x in xrange ( 10 )] for i in x ]


3.通过 reduce 函数和 lambda 表达式:


reduce (lambda a , b : a + [ a [ - 1 ] + a [ - 2 ]], xrange ( 10 ), [ 1 , 1 ])

reduce (lambda a , b : a . append ( a [ - 1 ] + a [ - 2 ]) or a , xrange ( 10 ), [ 1 , 1 ])


4.速度最快的变体:


[l.append(l[-1] + l[-2]) or l for l in [[1, 1]] for x in xrange(10)][0]


5、 使用列表推导式产生死循环

[a.append(b) for a in [[None]] for b in a]

列表切片技巧

1.复制列表:


l = [ 1 , 2 , 3 ]

m = l [ : ]

m

-> [ 1 , 2 , 3 ]


2.移除/替换 列表中的任意元素:


l = [ 1 , 2 , 3 ]

l [ 1 :- 1 ] = [ 4 , 5 , 6 , 7 ]

l

-> [ 1 , 4 , 5 , 6 , 7 , 3 ]


3.在列表的开头添加元素:


l = [ 1 , 2 , 3 ]

l [ : 0 ] = [ 4 , 5 , 6 ]

l

-> [ 4 , 5 , 6 , 1 , 2 , 3 ]


4.在列表的尾部添加元素:


l = [ 1 , 2 , 3 ]

l [ - 1 : ] = [ l [ - 1 ], 4 , 5 , 6 ]

l

-> [ 1 , 2 , 3 , 4 , 5 , 6 ]


5.反转列表:


l = [ 1 , 2 , 3 ]

l [ : ] = l [ ::- 1 ]


6、 替换方法字节码

Python 阻止替换类实例中的方法,因为 python 给类实例中的方法赋予了只读属性:

class A ( object ) :

def x ( self ) :

print "hello"

a = A ()

def y ( self ) :

print "world"







请到「今天看啥」查看全文