Python 实践建议和技巧

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Python 实践建议和技巧
  1. 使用 python 3

由于官方从2020年1月1日起就停止了对python2.7的更新支持,因此本教程的大部分例子都只能在python 3环境下运行。如果你仍然在使用2.7版本,请先升级到python 3。

  1. 检查并使用满足需求的最小python版本
    你可以在代码中检查Python 版本,以确保你的代码使用者没有使用不兼容的版本运行脚本。使用以下代码进行简单的检查:
    if not sys.version_info > (2, 7): # berate your user for running a 10 year # python versionelif not sys.version_info >= (3, 5): # Kindly tell your user (s)he needs to upgrade # because you're using 3.5 features
  2. 使用IPython
    IPython 基本上是一个增强的shell,仅仅是为了自动补全功能,IPython也是值得使用的,但其实它还有更多作用,包括内建的Magic命令,这里列举了一些:
    %cd:改变当前的工作目录;
    %edit:打开编辑器并在关闭编辑器后执行键入的代码;
    %env:显示当前的环境变量;
    %pip:install [pkgs] 在不离开交互式shell的情况下安装功能包;
    %time 和 %timeit:类似于python中的time模块,可以为代码运行计时。
    完整的命令列表参见:
    https://ipython.readthedocs.io/en/stable/interactive/magics.html
    IPython的另一个有用功能是可以使用之前任意一行代码的输出,代码的输入和输入实际上都是对象,例如可以通过 Out[3] 来使用第三次运行代码的输出对象。
    安装IPython的指令是:
    pip3 install ipython
  3. 列表解析式
    列表解析式可以用来替换通过loop来填充列表的丑陋方法,其基本语法是:
    [ expression for item in list if conditional ]
    一个非常基础的例子,用于生成包含连续数字的列表:
    mylist = [i for i in range(10)]print(mylist)# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    由于可以使用表达式,因此可以通过更复杂的数学方法来生成列表:
    squares = [x**2 for x in range(10)]print(squares)# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    甚至也可以调用外部函数:
    def some_function(a): return (a + 5) / 2my_formula = [some_function(i) for i in range(10)]print(my_formula)# [2, 3, 3, 4, 4, 5, 5, 6, 6, 7]
    最后,也可以用if作为生成条件来对列表进行过滤。在下面的例子中,只有偶数被保留:
    filtered = [i for i in range(20) if i%2==0]print(filtered)# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
  4. 检查对象的内存占用情况
    通过sys.getsizeof(object)命令可以查看任何对象的内存使用情况:
    import sysmylist = range(0, 10000)print(sys.getsizeof(mylist))# 48
    这是因为range函数返回的是一个类对象,这个类对象表现为一个列表。因此使用range函数比使用实际的包含一万个数字的列表要更加节省内存。
    可以通过上面第四条中提到的列表解析式创建一个同样大小的实际列表:import sysmyreallist = [x for x in range(0, 10000)]print(sys.getsizeof(myreallist))# 87632
    实际内存占用87632字节,远高于通过range函数生成的对象。
  5. 返回多个值
    Pyhon中的函数都可以返回多个变量,而不需要字典,列表或者类作为返回对象。方法如下:
    def get_user(id): # fetch user from database # .... return name, birthdatename, birthdate = get_user(4)
    对于有限数量的返回值,这是可以的。但是任何超过3个值的内容都应该放到一个(data)类中。
  6. 使用 data 类
    从3.7版本开始,python提供了 data 类。与常规类或其他替代方法(如返回多个值或字典)相比,有以下几个优点:
    数据类需要至少一定数量的代码;
    可以通过 eq 方法来比较不同的data类对象;
    可以 repr 通过很容易地打印一个数据类来进行调试;
    数据类需要类型提示,因此减少了 bug。
    一个data类的例子如下:
    from dataclasses import dataclass@dataclassclass Card: rank: str suit: strcard = Card("Q", "hearts")print(card == card)# Trueprint(card.rank)# 'Q'print(card)Card(rank='Q', suit='hearts')
    //代码效果参考:http://www.ezhiqi.com/zx/art_212.html

  7. 就地变量交换
    一个简洁的技巧,可以节省几行代码:
    a = 1b = 2a, b = b, aprint (a)# 2print (b)# 1

  8. 字典合并(Python 3.5+)
    从python 3.5开始,字典的合并变得更简单了:
    dict1 = { 'a': 1, 'b': 2 }dict2 = { 'b': 3, 'c': 4 }merged = { dict1, dict2 }print (merged)# {'a': 1, 'b': 3, 'c': 4}
  9. 将字符串转化为标题格式
    在标题格式中,非介词的首字母会大写。可以通过.title()方法实现:
    mystring = "10 awesome python tricks"print(mystring.title())'10 Awesome Python Tricks'
  10. 将字符串分离并存储到列表中
    可以按任意字符来分割字符串,并存储到列表中,例如按空格来分割字符串:
    mystring = "The quick brown fox"mylist = mystring.split(' ')print(mylist)# ['The', 'quick', 'brown', 'fox']
  11. 将列表中的字符串合并到一起
    与上一条的功能正好相反,从列表中创建字符串,并在两个单词间插入空格:
    mylist = ['The', 'quick', 'brown', 'fox']mystring = " ".join(mylist)print(mystring)# 'The quick brown fox'
    也许你会疑惑,为什么不使用mylist.join(" ")呢?归根结底,String.join()函数不仅可以连接列表,还可以连接任何可迭代的列表。将它放在String中会阻止在多个位置实现相同的功能。
  12. Emoji
    这些表情具有很强的表达能力,能给人留下深刻印象。更重要的是,这在分析社交媒体数据时尤其有用。
    首先通过以下命令安装emoji模块:
    pip3 install emoji
    可以按照以下方法使用表情:
    import emojiresult = emoji.emojize('Python is :thumbs_up:')print(result)# 'Python is '# You can also reverse this:result = emoji.demojize('Python is ')print(result)# 'Python is :thumbs_up:'
    更多复杂的例子以及文档,参见:
    https://pypi.org/project/emoji/
  13. 列表切片操作
    列表切片的基本语法是:
    a[start:stop:step]
    start,stop和step都是可选的(可填可不填),默认值是:
    start:0
    stop:列表的末尾
    step:1
    一些例子如下:

    We can easily create a new list from # the first two elements of a list:first_two = [1, 2, 3, 4, 5][0:2]print(first_two)# [1, 2]# And if we use a step value of 2, # we can skip over every second number# like this:steps = [1, 2, 3, 4, 5][0:5:2]print(steps)# [1, 3, 5]# This works on strings too. In Python,# you can treat a string like a list of# letters:mystring = "abcdefdn nimt"[::2]print(mystring)# 'aced it'

  14. 翻转字符串和列表
    可以用切片操作来翻转列表或字符串,将step设置为负值即可实现:
    revstring = "abcdefg"[::-1]print(revstring)# 'gfedcba'revarray = [1, 2, 3, 4, 5][::-1]print(revarray)# [5, 4, 3, 2, 1]
  15. 图片显示
    可以通过Pillow模块来显示图片,例如显示Kitty小猫,首先安装python图片库:
    pip3 install Pillow
    然后下载你要显示的图片,并重命名。然后可以通过以下命令来显示图片:
    from PIL import Imageim = Image.open("kittens.jpg")im.show()print(im.format, im.size, im.mode)# JPEG (1920, 1357) RGB
    或者也可以直接通过IPython来显示:
    Pillow的功能远不止显示图片。它可以对图片进行分析,调整大小,滤波,增强,变形等等。
    //代码效果参考:http://www.ezhiqi.com/zx/art_1180.html

  16. 使用map()函数
    Python的一个内建函数是 map()。map()的基本语法是:
    map(function, something_iterable)
    传入的参数是一个函数,和一个需要执行的对象,可以是任何可迭代对象。在下面的例子中使用的是list:
    def upper(s): return s.upper()mylist = list(map(upper, ['sentence', 'fragment']))print(mylist)# ['SENTENCE', 'FRAGMENT']# Convert a string representation of# a number into a list of ints.list_of_ints = list(map(int, "1234567")))print(list_of_ints)# [1, 2, 3, 4, 5, 6, 7]
    map()是一个代替循环的好方式,可以在你的代码中尝试使用map()函数。

  17. 从列表或字符串中获取唯一元素
    通过set()函数可以将列表或字符串转换为集合,集合中的不含重复元素:
    mylist = [1, 1, 2, 3, 4, 5, 5, 5, 6, 6]print (set(mylist))# {1, 2, 3, 4, 5, 6}# And since a string can be treated like a # list of letters, you can also get the # unique letters from a string this way:print (set("aaabbbcccdddeeefff"))# {'a', 'b', 'c', 'd', 'e', 'f'}
  18. 找出最常出现的值
    查找列表或字符串中最常出现的值:
    test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4]print(max(set(test), key = test.count))# 4
    你可以尝试自行理解上述代码。
    好吧,也许你并没有尝试。上述代码的工作原理如下:
    max()将返回列表中的最大值。key参数接受单个参数函数确定定制排序顺序,在本例中,它是test.count,该函数应用于iterable对象中的每个元素。
    .count()是列表的一个内建函数,该函数接收一个参数,并计算该参数的出现次数。因此在本例中,test.count(1)返回2,testcount(4)返回4。
    set(test)返回test列表中的所有唯一值,因此是{1,2,3,4}。
    因此在上面的这行语句中我们首先找出了test列表的所有独特值,即{1,2,3,4}。接着,将.count函数应用于set中的每个值,得到一个数量列表,然后通过max找出数量最大的值。
  19. 创建进度条
    可以自行创建进度条,但也可以通过progress模块来快速创建:
    pip3 install progress
    然后通过以下代码来创建进度条:
    from progress.bar import Barbar = Bar('Processing', max=20)for i in range(20): # Do some work bar.next()bar.finish()
    效果如下:
  20. 在交互式shell中使用用 来获取上一个表达式的运行结果
    可以使用下划线操作符来获取最后运行的表达式的输出,在IPython中操作如下:
    In [1]: 3 * 3Out[1]: 9In [2]:
    + 3Out[2]: 12
    这种方法在python shell中也是适用的,IPython还可以通过Out[n]来获取任意第n个表达式的输出结果。
  21. 快速创建web服务器
    您可以快速启动web服务器,来提供当前工作目录的内容:
    python3 -m http.server
    如果您想与同事共享一些内容,或者想测试一个简单的HTML站点,这是非常有用的。
  22. 多行字符串
    虽然可以使用三重引号在代码中包含多行字符串,但这并不理想。在三重引号之间的所有内容都变成字符串,包括格式。相比我更喜欢第二种方式,它将多行连接在一起,允许你很好地格式化代码。惟一的缺点是需要显式地放入新行:
    s1 = """Multi line strings can be put between triple quotes. It's not ideal when formatting your code though"""print (s1)# Multi line strings can be put# between triple quotes. It's not ideal# when formatting your code thoughs2 = ("You can also concatenate multiple\n" +"strings this way, but you'll have to\n""explicitly put in the newlines")print(s2)# You can also concatenate multiple# strings this way, but you'll have to# explicitly put in the newlines
  23. 用于条件赋值的三元运算符
    这是另一种使你代码变得简洁,同时保持可读性的方法:
    [on_true] if [expression] else [on_false]
    一个简单的例子如下:
    x = "Success!" if (y == 2) else "Failed!"
  24. 统计元素的出现次数
    可以使用Collections依赖包中的Counter方法来获得一个包含列表中所有惟一元素计数的字典:
    from collections import Countermylist = [1, 1, 2, 3, 4, 5, 5, 5, 6, 6]c = Counter(mylist)print(c)# Counter({1: 2, 2: 1, 3: 1, 4: 1, 5: 3, 6: 2})# And it works on strings too:print(Counter("aaaaabbbbbccccc"))# Counter({'a': 5, 'b': 5, 'c': 5})
  25. 比较运算符的连接
    可以在python中链接比较运算符,从而使代码更简洁,可读性更强:
    x = 10# Instead of:if x > 5 and x < 15:print("Yes")# yes# You can also write:if 5 < x < 15:print("Yes")# Yes
  26. 加入色彩
    通过 Colorama 依赖包,可以在终端中添加更多色彩:
    from colorama import Fore, Back, Styleprint(Fore.RED + 'some red text')print(Back.GREEN + 'and with a green background')print(Style.DIM + 'and in dim text')print(Style.RESET_ALL)print('back to normal now')
    //代码效果参考:http://www.ezhiqi.com/bx/art_2535.html

  27. 日期处理
    python-dateutil模块为标准的datetime模块提供了强大的扩展。首先安装该模块:
    pip3 install python-dateutil
    你可以用这个库做很多很酷的事情。我将把我认为特别有用的一个功能作为示例:日志文件中日期的模糊解析等。如下:
    from dateutil.parser import parselogline = 'INFO 2020-01-01T00:00:01 Happy new year, human.'timestamp = parse(log_line, fuzzy=True)print(timestamp)# 2020-01-01 00:00:01
    只要记住,如果datatime不具备某个功能,那datautil一定有该功能,datautil是datatime功能的延续。29. 整除
    在Python 2中,除法运算符(/)默认为整数除法,除非其中一个操作数是浮点数。如下:

    Python 25 / 2 = 25 / 2.0 = 2.5

    在python3中,除法运算符/默认为浮点除法,//运算符变成了整数除法。所以有:
    Python 35 / 2 = 2.55 // 2 = 2
    对于这种变化背后的完整动机,可以阅读PEP-0238:
    https://www.python.org/dev/peps/pep-0238/

  28. 通过chardet检测字符集合
    可以使用chardet模块来检测文件中的字符集合。这在分析大量随机文本时非常有用。安装chardet模块:
    pip install chardet
    现在你有了一个额外的命令行工具chardetect,它可以这样使用:
    chardetect somefile.txtsomefile.txt: ascii with confidence 1.0
    你也可以通过编程的方式来使用这个依赖包。
相关文章
|
13天前
|
Python
Python编程中的异常处理:理解与实践
【9月更文挑战第14天】在编码的世界里,错误是不可避免的。它们就像路上的绊脚石,让我们的程序跌跌撞撞。但是,如果我们能够预见并优雅地处理这些错误,我们的程序就能像芭蕾舞者一样,即使在跌倒的边缘,也能轻盈地起舞。本文将带你深入了解Python中的异常处理机制,让你的代码在面对意外时,依然能保持优雅和从容。
144 73
|
13天前
|
人工智能 数据挖掘 数据处理
揭秘Python编程之美:从基础到进阶的代码实践之旅
【9月更文挑战第14天】本文将带领读者深入探索Python编程语言的魅力所在。通过简明扼要的示例,我们将揭示Python如何简化复杂问题,提升编程效率。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往高效编码世界的大门。让我们开始这段充满智慧和乐趣的Python编程之旅吧!
|
2天前
|
存储 开发者 Python
从理论到实践:Python中Trie树与Suffix Tree的完美结合,开启编程新篇章!
在编程领域,高效的数据结构对于解决问题至关重要。本文通过一个案例分析,介绍如何在Python中结合使用Trie树(前缀树)和Suffix Tree(后缀树)。案例聚焦于开发具备高效拼写检查和文本相似度检测功能的文本编辑器。首先,通过构建Trie树快速检查单词是否存在;接着,利用Suffix Tree检测文本相似度。尽管Python标准库未直接提供Suffix Tree,但可通过第三方库或自定义实现。本文展示了高级数据结构在实际应用中的强大功能,并强调了理论与实践相结合的重要性。
11 1
|
2天前
|
设计模式 缓存 中间件
探索Python中的装饰器:从入门到实践
【9月更文挑战第25天】本文通过直观的语言和生动的比喻,深入浅出地介绍Python装饰器的概念、原理及应用。我们将一起走进装饰器的魔法世界,解锁其在代码编写中的强大功能,让你的代码更加优雅和高效。
|
3天前
|
API 开发者 Python
Python中的魔法方法:从原理到实践
【9月更文挑战第24天】本文将深入探讨Python的魔法方法,这些特殊的方法允许对象定制其行为。文章首先揭示魔法方法的本质和重要性,然后通过代码示例展示如何利用它们来增强类的功能性。最后,我们将讨论在实际应用中应注意的事项,以确保正确和高效地使用这些方法。
|
3天前
|
数据库 开发者 Python
Python编程基础:从入门到实践
【9月更文挑战第24天】本文将带你走进Python的世界,从最基础的语法开始,逐步深入到函数、类等高级特性。我们将通过实际代码示例,让你在阅读中不仅能理解Python的概念,还能动手实践,体验编程的乐趣。无论你是编程新手,还是想转行学习Python的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python的学习之旅吧!
|
11天前
|
开发框架 缓存 数据库
探索Python中的装饰器:从入门到实践
【8月更文挑战第48天】本文将引导你进入Python装饰器的奇妙世界。不同于传统的“摘要”格式,我们将通过一段代码的演变,直观展示装饰器的魅力。文章不仅介绍基础概念,还将通过实例演示如何自定义装饰器,并探讨其在实际应用中的强大用途。让我们开始吧,一起深入理解这个改变函数行为的强大工具!
|
11天前
|
存储 机器学习/深度学习 数据挖掘
深入浅出:Python编程入门与实践
【9月更文挑战第16天】本文以“深入浅出”的方式,引领读者步入Python编程的世界。从基础语法到实际应用,我们将一步步探索Python的魅力所在。无论你是编程新手,还是希望拓展技能的老手,这篇文章都将为你提供有价值的信息和指导。通过本文的学习,你将能够编写出简单而实用的Python程序,为进一步深入学习打下坚实的基础。让我们一起开始这段编程之旅吧!
|
11天前
|
机器学习/深度学习 数据挖掘 程序员
Python编程基础:从入门到实践
【9月更文挑战第16天】本文是一篇Python编程的入门教程,旨在帮助初学者理解Python的基本概念和语法。文章首先介绍了Python的历史和特点,然后详细讲解了Python的基本语法,包括变量、数据类型、运算符、控制结构等。接着,文章通过一些实例代码,展示了如何使用Python进行基本的编程操作,如输入输出、条件判断、循环等。最后,文章还提供了一些学习资源和建议,帮助读者进一步学习和掌握Python编程。
|
10天前
|
人工智能 数据挖掘 算法框架/工具
探索Python的神奇世界:从基础到实践
在本文中,我们将深入探讨Python编程语言的基本概念、核心技术以及实际应用。通过详细的步骤解析和实用的案例展示,希望帮助读者从零基础开始逐步掌握Python编程的要点,并能在实践中灵活应用。无论是编程新手还是有经验的开发者,都能从中获得启发和实用技巧。
17 3