CSDN 11-07
程序员必知的 20 个 Python 技巧!
index_new4.html
../../../zaker_core/zaker_tpl_static/wap/tpl_keji1.html

 

本文将向你展示 20 条非常实用的 Python 使用技巧。

作者 |   Duomly

译者 |   弯月,责编 | 郭芮

出品 | CSDN(ID:CSDNnews)

以下为译文:

Python 是一门流行且应用广泛的通用编程语言,其应用包括数据科学、机器学习、科学计算等领域,以及后端 Web 开发、移动和桌面应用程序等方面。许多知名的公司都使用 Python,如 Google、Dropbox、Facebook、Mozilla、IBM、Quora、Amazon、Spotify、NASA、Netflix、Reddit 等。

Python 是免费且开源的,与它有关的大多数产品也都是。此外,它拥有庞大、专注且友善的编程者和使用者社区。

它的语法设计目标就是简单、易读且优雅。

本文将向你展示 20 条非常实用的 Python 使用技巧。

Python 之禅

Python 之禅(又名 PEP20)是由 Tim Peters 编写的一小段文字,文中展示了设计和使用 Python 的指导原则。你可以在 Python 网站上找到这段文字,也可以在控制台或 Jupyter notebook 中通过一条语句来显示这段话。

>>>   import   this

The   Zen   of   Python,   by   Tim   Peters

Beautiful   is   better   than   ugly.

Explicit   is   better   than   implicit.

Simple   is   better   than   complex.

Complex   is   better   than   complicated.

Flat   is   better   than   nested.

Sparse   is   better   than   dense.

Readability   counts.

Special   cases   aren't   special   enough   to   break   the   rules.

Although   practicality   beats   purity.

Errors   should   never   pass   silently.

Unless   explicitly   silenced.

In   the   face   of   ambiguity,   refuse   the   temptation   to   guess.

There   should   be   one--   and   preferably   only   one   --obvious   way   to   do   it.

Although   that   way   may   not   be   obvious   at   first   unless   you're   Dutch.

Now   is   better   than   never.

Although   never   is   often   better   than   *right*   now.

If   the   implementation   is   hard   to   explain,   it's   a   bad   idea.

If   the   implementation   is   easy   to   explain,   it   may   be   a   good   idea.

Namespaces   are   one   honking   great   idea   --   let's   do   more   of   those!

链式赋值

如果需要让多个变量引用同一个对象,则可以使用链式赋值:

>>>   x   =   y   =   z   =   2

>>>   x,   y,   z

( 2,   2,   2 )

非常有逻辑且优雅,对吧?

链式比较

多个比较语句也可以合成一个 Python 表达式,只需将多个比较运算符连起来即可。下面的表达式只有在所有比较都成立时返回 True,否则返回 False:

>>>   x   =   5

>>>   2   <   x   ≤   8

True

>>>   6   <   x   ≤   8

False

这个表达式相当于 ( 2 < x ) 且 ( x ≤ 8 ) 且 ( x ≤ 8 ) ,但更为紧凑,而且只需执行一次 x 求值。

如下写法也是正确的:

>>>   2   <   x   >   4

True

甚至可以将多个比较连起来:

>>>   x   =   2

>>>   y   =   8

>>>   0   <   x   <   4   <   y   <   16

True

多重赋值

你可以使用元组解包,在一条语句中给多个变量赋值:

>>>   x,   y,   z   =   2,   4,   8

>>>   x

2

>>>   y

4

>>>   z

8

注意第一条语句中的 2, 4, 8 相当于一个元组 ( 2, 4, 8 ) 。

更高级的多重赋值

Python 的多重赋值远不止于普通赋值。赋值左右两侧的元素数量甚至可以不一样:

>>>   x,   *y,   z   =   2,   4,   8,   16

>>>   x

2

>>>   y

[ 4,   8 ]

>>>   z

在这段代码中,x 对应于第一个值 2,因为 2 是首先出现的。z 是最后一个,所以取最后一个值 8。y 以列表形式取中间的所有值,因为它带有星号(y*)。

交变量

利用多重赋值可以精确、优雅地交换任何两个变量,而且无需引入第三个变量:

>>>   x,   y   =   2,   8

>>>   x

2

>>>   y

8

>>>   x,   y   =   y,   x

>>>   x

8

>>>   y   2

合并字典

合并两个字典的方法之一就是将它们解包到一个新的字典中:

>>>   x   =   {'u':   1}

>>>   y   =   {'v':   2}

>>>   z   =   {**x,   **y,   'w':   4}

>>>   z

{'u':   1,   'v':   2,   'w':   4}

连接字符串

如果需要连接多个字符串,每个字符串之间使用同一个字符或同一组字符来连接,则可以使用 str.join ( ) 方法:

>>>   x   =   [ 'u',   'v',   'w' ]

>>>   y   =   '-*-'.join ( x )

>>>   y

'u-*-v-*-w'

高级遍历

如果需要遍历一个序列,同时还需要每个元素和相应的索引,则可以使用 enumerate:

>>>   for   i,   item   in   enumerate ( [ 'u',   'v',   'w' ] ) :

...   print ( 'index:',   i,   'element:',   item )

...

index:   0   element:   u

index:   1   element:   v

index:   2   element:   w

每次遍历你都会获得一个元组,其中包括索引值和对应的元素。

反向遍历

如果你需要反向遍历一个序列,则可以使用 reversed:

>>>   for   item   in   reversed ( [ 'u',   'v',   'w' ] ) :

...   print ( item )

...

w

v

u

元素结合

如果你需要将来自多个序列的元素结合起来,可以使用 zip:

>>>   x   =   [ 1,   2,   4 ]

>>>   y   =   ( 'u',   'v',   'w' )

>>>   z   =   zip ( x,   y )

>>>   z

>>>   list ( z )

[ ( 1,   'u' ) ,   ( 2,   'v' ) ,   ( 4,   'w' ) ]

你可以遍历返回的 zip 对象,或者将其变成一个列表或元祖。

矩阵转置

虽然在处理矩阵时人们通常会使用 numpy(或类似的库),但利用 zip 也可以实现矩阵转置:

>>>   x   =   [ ( 1,   2,   4 ) ,   ( 'u',   'v',   'w' ) ]

>>>   y   =   zip ( *x )

>>>   z   =   list ( y )

>>>   z

[ ( 1,   'u' ) ,   ( 2,   'v' ) ,   ( 4,   'w' ) ]

唯一值

如果元素的顺序不重要,那么从列表中去除重复值的方法是将其转换成一个集合,以获得唯一的值:

>>>   x   =   [ 1,   2,   1,   4,   8 ]

>>>   y   =   set ( x )

>>>   y

{8,   1,   2,   4}

>>>   z   =   list ( y )

>>>   z

[ 8,   1,   2,   4 ]

序列排序

默认情况下序列按照第一个元素的顺序排序:

>>>   x   =   ( 1,   'v' )

>>>   y   =   ( 4,   'u' )

>>>   z   =   ( 2,   'w' )

>>>   sorted ( [ x,   y,   z ] )

[ ( 1,   'v' ) ,   ( 2,   'w' ) ,   ( 4,   'u' ) ]

但是,如果你希望按照第二个元素(或其他元素)排序,则可以使用 key 参数和适当的 lambda 函数作为第二个参数:

>>>   sorted ( [ x,   y,   z ] ,   key=lambda   item:   item [ 1 ] )

[ ( 4,   'u' ) ,   ( 1,   'v' ) ,   ( 2,   'w' ) ]

反向排序时也使用类似的方法:

>>>   sorted ( [ x,   y,   z ] ,   key=lambda   item:   item [ 1 ] ,   reverse=True )

[ ( 2,   'w' ) ,   ( 1,   'v' ) ,   ( 4,   'u' ) ]

字典排序

可以用类似方法,对字典的 .items ( ) 方法返回的键值对进行排序:

>>>   x   =   {'u':   4,   'w':   2,   'v':   1}

>>>   sorted ( x.items ( ) )

[ ( 'u',   4 ) ,   ( 'v',   1 ) ,   ( 'w',   2 ) ]

它们按照键的顺序进行排序。如果你希望按照值排序,则应该指定相应的 key 参数。反向排序也类似:

>>>   sorted ( x.items ( ) ,   key=lambda   item:   item [ 1 ] )

[ ( 'v',   1 ) ,   ( 'w',   2 ) ,   ( 'u',   4 ) ]

>>>   sorted ( x.items ( ) ,   key=lambda   item:   item [ 1 ] ,   reverse=True )

[ ( 'u',   4 ) ,   ( 'w',   2 ) ,   ( 'v',   1 ) ]

格式化 raw 字符串

PEP498 和 Python 3.6 引入了 " 有格式字符串 " 的概念,或者称为 "f 字符串 "。这种字符串内部可以嵌入表达式。字符串可以同时作为 raw 字符串和有格式字符串使用,只需使用前缀 fr:

>>>   fr'u    n   v   w={2   +   8}'

'u   \   n   v   w=10'

获取当前日期和时间

Python 有一个内置的 datetime 模块,非常适合各种涉及到日期和时间的任务。方法之一 .now ( ) 能够返回当前日期和时间:

>>>   import   datetime

>>>   datetime.datetime.now ( )

datetime.datetime ( 2019,   5,   20,   1,   12,   31,   230217 )

获取最大(或最小)元素的索引

Python 没有提供直接获取最大(或最小)元素索引的函数。不过,至少有两种方法可以优雅地实现这一点:

>>>   x   =   [ 2,   1,   4,   16,   8 ]

>>>   max ( ( item,   i )   for   i,   item   in   enumerate ( x ) ) [ 1 ]

3

如果有两个或多个元素都是最大值,那么该方法返回最后一个的索引:

>>>   y   =   [ 2,   1,   4,   8,   8 ]

>>>   max ( ( item,   i )   for   i,   item   in   enumerate ( y ) ) [ 1 ]

4

如果想获取第一个,则可以对上面的语句稍作改动:

>>>   -max ( ( item,   -i )   for   i,   item   in   enumerate ( y ) ) [ 1 ]

3

另一种方法可能更优雅:

>>>   x   =   [ 2,   1,   4,   16,   8 ]

>>>   max ( range ( len ( x ) ) ,   key=lambda   i:   x [ i ] )

3

>>>   y   =   [ 2,   1,   4,   8,   8 ]

>>>   max ( range ( len ( y ) ) ,   key=lambda   i:   x [ i ] )

3

如果想获得最小元素的索引,则只需用 min 替换上面的 max。

获取笛卡尔积

内置的 itertools 模块提供了许多非常实用的类。其中之一就是 product 函数,你可以通过这个函数来获得笛卡尔积:

>>>   import   itertools

>>>   x,   y,   z   =   ( 2,   8 ) ,   [ 'u',   'v',   'w' ] ,   {True,   False}

>>>   list ( itertools.product ( x,   y,   z ) )

[ ( 2,   'u',   False ) ,   ( 2,   'u',   True ) ,   ( 2,   'v',   False ) ,   ( 2,   'v',   True ) ,

( 2,   'w',   False ) ,   ( 2,   'w',   True ) ,   ( 8,   'u',   False ) ,   ( 8,   'u',   True ) ,

( 8,   'v',   False ) ,   ( 8,   'v',   True ) ,   ( 8,   'w',   False ) ,   ( 8,   'w',   True ) ]

矩阵乘法操作符

PEP465 和 Python 3.5 引入了专用的矩阵乘法运算符 @。你可以在自己的类中实现 matmul、rmatmul 和 imatmul 来支持这个操作符。使用该操作符进行向量或矩阵乘法非常优雅:

>>>   import   numpy   as   np

>>>   x,   y   =   np.array ( [ 1,   3,   5 ] ) ,   np.array ( [ 2,   4,   6 ] )

>>>   z   =   x   @  y

>>>   z

总结

上面的 20 条 Python 技巧可以让代码变得很有趣、很优雅。Python 还有许多值得探索的特性。编程快乐!

原文:https://dev.to/duomly/20-useful-python-tips-and-tricks-you-should-know-3h8c

本文为 CSDN 翻译,转载请注明来源出处。

相关文章
评论
没有更多评论了
取消

登录后才可以发布评论哦

12 我来说两句…
打开 ZAKER 参与讨论