分享30个Python小技巧,还不收藏起来?

实用教程:10个提高Python编程效率的技巧 由于文章篇幅有限,文档资料内容较多,需要这些文档的朋友,可以加小助手微信免费获取,【保证100%免费】,中国人骗中国人。 阅读详情

在这里插入图片描述

前言

  • 今天我们带来另一些基本的 Python 贴士与技巧,所有的这些技巧都能帮助你压缩代码并且优化运行。此外,你可以在日常工作中很容易地在真实项目中使用他们。

1.原地交换两个数字

  • Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例:
x, y = 10, 20
print(x, y)

x, y = y, x
print(x, y)

#1 (10, 20)
#2 (20, 10)

赋值的右侧形成了一个新的元组,左侧立即解析(unpack)那个(未被引用的)元组到变量 <a><b>
一旦赋值完成,新的元组变成了未被引用状态并且被标记为可被垃圾回收,最终也完成了变量的交换。


2.链状比较操作符

  • 比较操作符的聚合是另一个有时很方便的技巧:
n = 10
result = 1 < n < 20
print(result)

# True

result = 1 > n <= 9
print(result)

# False


3.使用三元操作符来进行条件赋值

  • 三元操作符是 if-else 语句也就是条件操作符的一个快捷方式:
[表达式为真的返回值] if [表达式] else [表达式为假的返回值]

这里给出几个你可以用来使代码紧凑简洁的例子。下面的语句是说“如果 y 是 9,给 x 赋值 10,不然赋值为 20”。如果需要的话我们也可以延长这条操作链。

x = 10 if (y == 9) else 20

同样地,我们可以对类做这种操作:

x = (classA if y == 1 else classB)(param1, param2)

在上面的例子里 classA 与 classB 是两个类,其中一个类的构造函数会被调用。

下面是另一个多个条件表达式链接起来用以计算最小值的例子:

def small(a, b, c):
    return a if a <= b and a <= c else (b if b <= a and b <= c else c)

print(small(1, 0, 1))
print(small(1, 2, 2))
print(small(2, 2, 3))
print(small(5, 4, 3))

#Output
#0 #1 #2 #3

我们甚至可以在列表推导中使用三元运算符:

[m**2 if m > 10 else m**4 for m in range(50)]

#=> [0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401]


4. 多行字符串

  • 基本的方式是使用源于 C 语言的反斜杠:
multiStr = "select * from multi_row 
where row_id < 5"
print(multiStr)

# select * from multi_row where row_id < 5

另一个技巧是使用三引号:

multiStr = """select * from multi_row 
where row_id < 5"""
print(multiStr)

#select * from multi_row 
#where row_id < 5

上面方法共有的问题是缺少合适的缩进,如果我们尝试缩进会在字符串中插入空格。所以最后的解决方案是将字符串分为多行并且将整个字符串包含在括号中:

multiStr= ("select * from multi_row "
"where row_id < 5 "
"order by age") 
print(multiStr)

#select * from multi_row where row_id < 5 order by age


5.存储列表元素到新的变量中

  • 我们可以使用列表来初始化多个变量,在解析列表时,变量的数目不应该超过列表中的元素个数:【译者注:元素个数与列表长度应该严格相同,不然会报错】
testList = [1,2,3]
x, y, z = testList

print(x, y, z)

#-> 1 2 3


6.打印引入模块的文件路径

  • 如果你想知道引用到代码中模块的绝对路径,可以使用下面的技巧:
import threading 
import socket

print(threading)
print(socket)

#1- <module 'threading' from '/usr/lib/python2.7/threading.py'>
#2- <module 'socket' from '/usr/lib/python2.7/socket.py'>


7. 交互环境下的 “_” 操作符

  • 这是一个我们大多数人不知道的有用特性,在 Python 控制台,不论何时我们测试一个表达式或者调用一个方法,结果都会分配给一个临时变量: _(一个下划线)。
>>> 2 + 1
3
>>> _
3
>>> print _
3

“_” 是上一个执行的表达式的输出。


8. 字典/集合推导

  • 与我们使用的列表推导相似,我们也可以使用字典/集合推导,它们使用起来简单且有效,下面是一个例子:
testDict = {i: i * i for i in xrange(10)} 
testSet = {i * 2 for i in xrange(10)}

print(testSet)
print(testDict)

#set([0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
#{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

注:两个语句中只有一个 <:> 的不同,另,在 Python3 中运行上述代码时,将 <xrange> 改为 <range>


9. 调试脚本

  • 我们可以在 <pdb> 模块的帮助下在 Python 脚本中设置断点,下面是一个例子:
import pdb
pdb.set_trace()

我们可以在脚本中任何位置指定 <pdb.set_trace()> 并且在那里设置一个断点,相当简便。


10. 开启文件分享

  • Python 允许运行一个 HTTP 服务器来从根路径共享文件,下面是开启服务器的命令:
  • Python 2
python -m SimpleHTTPServer

  • Python 3
python3 -m http.server

上面的命令会在默认端口也就是 8000 开启一个服务器,你可以将一个自定义的端口号以最后一个参数的方式传递到上面的命令中。


11. 检查 Python 中的对象

  • 我们可以通过调用 dir() 方法来检查 Python 中的对象,下面是一个简单的例子:
test = [1, 3, 5, 7]
print( dir(test) )

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']


12. 简化 if 语句

  • 我们可以使用下面的方式来验证多个值:
if m in [1,3,5,7]:

  • 而不是:
if m==1 or m==3 or m==5 or m==7:

或者,对于 in 操作符我们也可以使用 '{1,3,5,7}' 而不是 '[1,3,5,7]',因为 set 中取元素是 O(1) 操作。


13. 运行时检测 Python 版本

  • 当正在运行的 Python 低于支持的版本时,有时我们也许不想运行我们的程序。为达到这个目标,你可以使用下面的代码片段,它也以可读的方式输出当前 Python 版本:
import sys

#Detect the Python version currently in use.
if not hasattr(sys, "hexversion") or sys.hexversion != 50660080:
    print("Sorry, you aren't running on Python 3.5n")
    print("Please upgrade to 3.5.n")
    sys.exit(1)

#Print Python version in a readable format.
print("Current Python version: ", sys.version)

或者你可以使用 sys.version_info >= (3, 5) 来替换上面代码中的 sys.hexversion != 50660080,这是一个读者的建议。

  • 在 Python 2.7 上运行的结果:
Python```
Python 2.7.10 (default, Jul 14 2015, 19:46:27)
[GCC 4.8.2] on linux

Sorry, you aren't running on Python 3.5

Please upgrade to 3.5.

  • 在 Python 3.5 上运行的结果:
Python```
Python 3.5.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux

Current Python version:  3.5.2 (default, Aug 22 2016, 21:11:05) 
[GCC 5.3.0]


14. 组合多个字符串

  • 如果你想拼接列表中的所有记号,比如下面的例子:
>>> test = ['I', 'Like', 'Python', 'automation']

  • 现在,让我们从上面给出的列表元素新建一个字符串:
>>> print ''.join(test)


15. 四种翻转字符串/列表的方式

  • 翻转列表本身
testList = [1, 3, 5]
testList.reverse()
print(testList)

#-> [5, 3, 1]

  • 在一个循环中翻转并迭代输出
for element in reversed([1,3,5]):
    print(element)

#1-> 5
#2-> 3
#3-> 1

  • 一行代码翻转字符串
"Test Python"[::-1]

输出为 “nohtyP tseT”

  • 使用切片翻转列表
[1, 3, 5][::-1]

上面的命令将会给出输出 [5,3,1]。


16. 玩转枚举

  • 使用枚举可以在循环中方便地找到(当前的)索引:
testlist = [10, 20, 30]
for i, value in enumerate(testlist):
    print(i, ': ', value)

#1-> 0 : 10
#2-> 1 : 20
#3-> 2 : 30


17. 在 Python 中使用枚举量

  • 我们可以使用下面的方式来定义枚举量:
class Shapes:
    Circle, Square, Triangle, Quadrangle = range(4)

print(Shapes.Circle)
print(Shapes.Square)
print(Shapes.Triangle)
print(Shapes.Quadrangle)

#1-> 0
#2-> 1
#3-> 2
#4-> 3


18. 从方法中返回多个值

  • 并没有太多编程语言支持这个特性,然而 Python 中的方法确实(可以)返回多个值,请参见下面的例子来看看这是如何工作的:
# function returning multiple values.
def x():
    return 1, 2, 3, 4

# Calling the above function.
a, b, c, d = x()

print(a, b, c, d)

#-> 1 2 3 4


19. 使用 * 运算符(splat operator)来 unpack 函数参数

  • 运算符(splat operator)提供了一个艺术化的方法来 unpack 参数列表,为清楚起见请参见下面的例子:
def test(x, y, z):
    print(x, y, z)

testDict = {'x': 1, 'y': 2, 'z': 3} 
testList = [10, 20, 30]

test(*testDict)
test(**testDict)
test(*testList)

#1-> x y z
#2-> 1 2 3
#3-> 10 20 30


20. 使用字典来存储选择操作

  • 我们能构造一个字典来存储表达式:
stdcalc = {
    'sum': lambda x, y: x + y,
    'subtract': lambda x, y: x - y
}

print(stdcalc['sum'](9,3))
print(stdcalc['subtract'](9,3))

#1-> 12
#2-> 6


21. 一行代码计算任何数的阶乘

  • Python 2.x.
result = (lambda k: reduce(int.__mul__, range(1,k+1),1))(3)
print(result)

#-> 6

  • Python 3.x.
import functools
result = (lambda k: functools.reduce(int.__mul__, range(1,k+1),1))(3)
print(result)

#-> 6


22. 找到列表中出现最频繁的数

test = [1,2,3,4,2,2,3,1,4,4,4]
print(max(set(test), key=test.count))

#-> 4


23. 重置递归限制

  • Python 限制递归次数到 1000,我们可以重置这个值:
import sys

x=1001
print(sys.getrecursionlimit())

sys.setrecursionlimit(x)
print(sys.getrecursionlimit())

#1-> 1000
#2-> 1001

请只在必要的时候采用上面的技巧。


24. 检查一个对象的内存使用

  • 在 Python 2.7 中,一个 32 比特的整数占用 24 字节,在 Python 3.5 中利用 28 字节。为确定内存使用,我们可以调用 getsizeof 方法:
  • 在 Python 2.7 中
import sys
x=1
print(sys.getsizeof(x))

#-> 24

  • 在 Python 3.5 中
import sys
x=1
print(sys.getsizeof(x))

#-> 28


25. 使用 __slots__ 来减少内存开支

  • 你是否注意到你的 Python 应用占用许多资源特别是内存?有一个技巧是使用 __slots__ 类变量来在一定程度上减少内存开支。
import sys
class FileSystem(object):

    def __init__(self, files, folders, devices):
        self.files = files
        self.folders = folders
        self.devices = devices
print(sys.getsizeof( FileSystem ))

class FileSystem1(object):

    __slots__ = ['files', 'folders', 'devices']
    def __init__(self, files, folders, devices):
        self.files = files
        self.folders = folders
        self.devices = devices

print(sys.getsizeof( FileSystem1 ))
#In Python 3.5
#1-> 1016
#2-> 888

很明显,你可以从结果中看到确实有内存使用上的节省,但是你只应该在一个类的内存开销不必要得大时才使用 __slots__。只在对应用进行性能分析后才使用它,不然地话,你只是使得代码难以改变而没有真正的益处。


26. 使用 lambda 来模仿输出方法

import sys
lprint=lambda *args:sys.stdout.write(" ".join(map(str,args)))
lprint("python", "tips",1000,1001)

#-> python tips 1000 1001


27. 从两个相关的序列构建一个字典

t1 = (1, 2, 3)
t2 = (10, 20, 30)

print(dict (zip(t1,t2)))

#-> {1: 10, 2: 20, 3: 30}


28. 一行代码搜索字符串的多个前后缀

print("http://www.google.com".startswith(("http://", "https://")))
print("http://www.google.co.uk".endswith((".com", ".co.uk")))

#1-> True
#2-> True


#29. 不使用循环构造一个列表

import itertools
test = [[-1, -2], [30, 40], [25, 35]]
print(list(itertools.chain.from_iterable(test)))

#-> [-1, -2, 30, 40, 25, 35]


30. 在 Python 中实现一个真正的 switch-case 语句

  • 下面的代码使用一个字典来模拟构造一个 switch-case。
def xswitch(x): 
    return xswitch._system_dict.get(x, None)

xswitch._system_dict = {'files': 10, 'folders': 5, 'devices': 2}

print(xswitch('default'))
print(xswitch('devices'))

#1-> None
#2-> 2


最后

**学习资源已打包,需要的小伙伴可以戳这里【学习资源】

【视线追踪】视线追踪的性能评估框架 及 基础知识 文章目录一、 前言二、 眼球追踪基础1. 眼动类型研究2. 基本设备3. 校准 calibration4. 眼球视线和头部姿态的关系5. 视线追踪精确度的评估三、 视线估计算法1. 基于2维回归2. 基于3D模型1) 单摄像头2) 多摄像头3. 基于交叉比4. 基于外观5. 基于眼睛形状的方法四、 实现估计的应用1. 电脑2. 电视3. 头戴设备4. 汽车5. 手持设备6. 设备配置五、 视线追踪的性能指标和错误原因1. 同平台之间差异性很大2. 影响视线追踪可用性的因素六、 视线追踪系统的性能评估框架1 阅读详情

相关推荐

20年老码农分享20条编程经验,你pick哪些?

Alex 发自 凹非寺量子位 | 公众号 QbitAI一位20年老程序员分享的编程经验突然火了,在Hacker News上,一天之内就收获了467热度。这位老哥从1999年就开始编程,从早期的Basic、Pascal、Delphi,到后来的C,C++ ,Javasript等主流语言都用过。职业生涯上从研究员、架构师一直干到过CTO,另外也当过技术产品经理,技术指导,老师等...

编程与实战的博客 2370

Python程序员都做些什么?

Python程序员都做些什么?

xiangxue888的博客 1507

1、动作捕捉技术:概述与历史

本博文全面介绍了动作捕捉技术的概念、历史演变、类型分类以及完整的工作流程。从早期的连续摄影技术到现代数字动作捕捉系统,文章深入探讨了光学、磁性和机械动作捕捉系统的优缺点及适用场景,并详细解析了动作捕捉数据的生成原理与数学基础。此外,还涵盖了特殊部位如手部、面部和木偶的动作捕捉方法,并讨论了动作捕捉在动画制作、虚拟现实、医疗康复等领域的广泛应用与发展前景。

apple5的专栏 189

Python 程序员需要知道的 30 个技巧(转载)

Python 程序员需要知道的 30 个技巧 原创 2017-04-14 伯乐专栏/阿喵 Python开发Python开发Python开发者 微信号 PythonCoder 功能介绍 人生苦短,我用 Python。伯乐在线旗下账号「Python开发者」分享 Python 相关的技术文章、工具资源、精选课程、热点资讯等。 (点击

Allan_shore_ma的博客 2139

十个程序员编程时的简单方法与技巧

你要记住,你写的代码是给人看的作为一名程序员,希望在你某天离开公司后回想起的若干个开心时刻中,有一个会是因为你面对自己刚刚出炉了一份让自己心动的代码的那份感动,而要成为上面提到的那个“离开后,公司才知道他有多么重要”的家伙。现在开始,刻意练习所以最好的学习方式就是亲身经历,然后写下来分享给大家,这样才能让你真正懂得那些你原来认为懂得了其实未必懂得的道理。

kangbin825的专栏 1277

python实用30小技巧

1.原地交换两个数字 Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例: In [1]: x,y = 10 ,20 In [2]: print(x,y) 10 20 In [3]: x, y = y, x In [4]: print(x,y) 20 10 赋值的右侧形成了一个新的元组,左侧立即解析(unpack)那个(未被引用的)元组到变量...

java276582434的博客 9383

赶快收藏,好用到起飞的 30Python 小技巧

Python 是最流行的语言之一,许多人将其用于数据科学和机器学习、Web 开发、脚本编写、自动化等领域。这种流行的部分原因是它的简单性和易于学习。在本文中,我将向大家介绍 30 个简短、实用的 Python 技巧。 内容较多,建议收藏学习,喜欢点赞支持,文末提供技术交流群。下面的方法检查给定的列表是否有重复的元素,它使用 set() 的属性从列表中删除重复的元素。 此方法可用于检查两个字符串是否为字谜。 字谜是通过重新排列同单词或短语的字母而形成的单词或短语,通常只使用一次所有原始字母。 3. 内存 此

Trb601012的博客 1285

分享30个有趣的 Python小游戏,我能玩一天

大家好,今天给大家带来30Python 小游戏,喜欢记得点赞、一定要收藏,完整版代码,文末获取源码分享: 2、打乒乓 源码分享: 3、滑雪 源码分享: 4、并夕夕版飞机大战 源码分享: 5、打地鼠 源码分享: 简简单单 6、小恐龙 玩法:上下控制起跳躲避源码分享: 7、消消乐 玩法:三个相连就能消除源码分享: 8、俄罗斯方块 玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速的。源码分享: 9、贪吃蛇 玩法:童年经典,普通魔术也没啥意思,小时候玩的也是加速的。源码分享: 普普通通 10、24点小游戏

m0_59596937的博客 1万+

python30小技巧

转载:https://www.pythontab.com/html/2018/pythonjichu_0917/1351.html 编程中用到可以简化代码的30小技巧,当然python的技巧远止这些,让我们在学习的途中去发现宝藏吧。 推荐一个python网站取了一定有惊喜python中文开发者社区门户。 原地交换两个数字 x, y =10, 20 print(x, y) y, x = x, y print(x,y) 10 20 20 10 链状比较操作符 n = 10 print(1 &l

奔跑的蜗牛的博客 412

30段极简Python代码:这些小技巧你都Get了么

Python 怎样才最快,当然是实战各种小项目,只有自己去想与写,才记得住规则。本文是 30 个极简任务,初学者可以尝试着自己实现;本文同样也是 30 段代码,Python 开发者也可以看看是是有没想到的用法。 Python 是机器学习最广泛采用的编程语言,它最重要的优势在于编程的易用性。如果读者对基本的 Python 语法已经有一些了解,那么这篇文章可能会给你一些启发。作者简单概览了 30...

python学习者的博客 1992

【建议收藏30个较难Python脚本,纯干货分享

本篇较难,;接上篇文章,对于Pyhon的学习,上篇学习的结束相信大家对于Pyhon有了一定的理解和经验,学习完上篇文章之后再研究研究剩下的30个脚本你将会有所成就!加油!

m0_61249789的博客 6775

pythonencoding etf-8_etf iopv python 代码30Python常用小技巧

1、原地交换两个数字x,y=10,20print(x,y)y,x=x,yprint(x,y)10 2020 102、链状比较操作符n=10print(1print(1>n<=9)TrueFalse3、使用三元操作符来实现条件赋值[表达式为真的返回值] if [表达式] else [表达式为假的返回值]y=20x=9if(y==10)el...

weixin_39720807的博客 804

初学python非常实用的10个小技巧,先收藏再说~

最近双十一是是都在买买买呢?但是学习这件事情可能懈怠鸭!今天就来讲讲python实用小技巧~

m0_67575344的博客 2952

程序员为什么要学会技术分享?如何实现技术分享

关于【程序员技术分享】 一、程序员学会技术分享的重要性 二、程序员进行技术分享的方法 三、程序员技术分享的内容

zhaoylzy的博客 2113

mul python_python – int .__ mul__,比operator.mul慢2倍

如果你看下面的时间:C:\Users\Henry>python -m timeit -s "mul = int.__mul__" "reduce(mul,range(10000))"1000 loops, best of 3: 908 usec per loopC:\Users\Henry>python -m timeit -s "from operator import mul" "...

weixin_39614834的博客 370

python成员运算符包括_Python成员运算符

Python成员运算符除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。高佣联盟 www.cgewang.com运算符描述实例in如果在指定的序列中找到值返回 True,否则返回 False。x 在 y 序列中 , 如果 x 在 y 序列中返回 True。not in如果在指定的序列中没有找到值返回 True,否则返回 False。x ...

weixin_39867559的博客 229

Python 10个入门小知识(小白必备)

Python是目前最受欢迎的语言之一。它的简洁性和高可读性使其在编程语言中比较流行。下面我给大家分享10个入门小知识。 1.交换两个数字。 x, y = 10, 20 print(x, y) x, y = y, x print(x, y) 输出: 10 20 20 10 2.颠倒字符串 a = "我最帅" print("颠倒后 ", a[::-1]) 输出: 颠倒后 帅最我 3.从列表中的所有元素创建一个字符串 a = ["Geeks", "For", "Geeks"] print

chenchen5152的博客 607

从零学习Python:函数基础知识

python基础

Yuanan_a的博客 392

Python入门05——基本运算符补充,流程控制之if...else

Python入门05——基本运算符补充,流程控制之if…else 文章目录基本运算符1、赋值运算符2、逻辑运算符布尔值流程控制之if...else 基本运算符 1、赋值运算符 age = 18 (1) 增量赋值 age += 1 # age = age +1 #print(age) age -= 10 # age = age - 10 (2) 交叉赋值 x = 111 y = 222 # temp = x # x = y # y = temp x,y = y,x print(x) print(y)

chongaiyatou的博客 955

2024河北省行政区划矢量图层-省市县乡镇四级行政区划数据下载

2024最新河北省行政区划矢量图层数据,包含省、市、县、乡镇四级行政区划数据下载,WGS84坐标系矢量shp数据下载

上一篇: Python for循环的12种巧妙运用,如果你正在学习Python,那一定要趁早收藏!
下一篇: 如何让PyCharm使用Docker配置Python解释器?
HUHU爱学习
博客等级 码龄3年 1123粉丝 75原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值