5个实用的Python编程小技巧

Python的基本技巧:5个必备技能。

长按关注《Python学研大本营》,加入读者群,分享更多精彩

简介

Python是一门很棒的编程语言,具有简洁和抽象为特点。Python编程涉及许多技巧,能用尽量少的代码、更易理解的代码编写程序。本文介绍五个实用的Python编程技巧。

1. 列表生成式

通过使用列表生成式,可以用一行简洁的代码生成列表、字典、集合,不需要编写多行代码。

列表生成式最常用于列表,但其结构与其他数据结构是相同的。

例如,下面这段代码是用于获取数字的平方:

output = []
for i in range(10):
  output.append(i**2)
print(output)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

可以使用列表生成式缩短代码:

output = [i**2 for i in range(10)]
print(output)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

列表生成式的语法非常简单,可以通过以下方式解释:

使用两个方括号表示列表[在此放置逻辑]。方括号内的部分与常规的for循环几乎相同。

右侧是常规“for循环”的语法。在左侧,可以访问“for循环”的元素,并在那里进行计算。

# [<Left hand side: calculations of i> for i in range(10)]
CompressedList = [i+2*i for i in range(10)]

列表生成式也适用于字典、集合和生成器,可点击如下链接查看示例。

【字典、集合和生成器】:https://book.pythontips.com/en/latest/comprehensions.html

2. Lambda函数

Lambda函数是Python中的单行代码函数。它们的功能与普通函数相同,但更简短、更易于使用。然而,与普通函数不同的是,它们是匿名的。这意味着该函数没有与之关联的标识符。

这意味着如果不将lambda函数存储到变量中,就永远无法再次访问它。这非常适合一次性使用。

例如,下面的这段代码是根据第二个元素而不是第一个元素,对包含2个元素组成的元组列表进行排序:

l = [(12), (80), (21)]
def secondElement(x):
   return x[1]
l.sort(key=secondElement)
print(l)
# [(8, 0), (2, 1), (1, 2)]

可以使用匿名函数,将代码缩短为如下格式:

l = [(12), (80), (21)]
l.sort(key=lambda x : x[1])
print(l)
# [(8, 0), (2, 1), (1, 2)]

用户很可能永远都不需要再次使用函数secondElement,这就是lambda函数为什么如此强大的一个很好的例子。

Lambda函数的语法很简单。在左侧使用lambda,然后在空格后写出所有需要的参数,参数之间用逗号分隔。之后,使用:分隔参数和计算值。计算得到的值从lambda函数中返回。以下是另一个示例:

# lambdaFunction = lambda <arguments here> : <operation here>
add = lambda x,y : x+y
print(add(2,3))
# 5

3. 集合collections

集合是Python中的内置数据结构模块。与Python的默认数据类型相比,这些集合提供了更多的可扩展性和便利性。创建的类型有很多种,下面列出了最重要的几种。

# 如何导入collections
from collections import defaultdict
from collections import OrderedDict
from collections import Counter
from collections import deque
from collections import namedtuple

3.1 默认字典(Default Dictionary)

当不存在键时,会返回一个默认值而不是引发KeyError的字典。可以通过将函数或常量值传递给defaultdict构造函数来创建它。

3.2 有序字典(Ordered Dictionary)

可记录其项的插入顺序并允许基于该顺序进行迭代、删除和重新排序的字典。可以通过将键值对的可迭代对象或关键字参数传递给OrderedDict构造函数来创建它。

3.3 计数器(Counter)

用于计算序列或可迭代对象中每个元素出现次数的字典。可以通过将可迭代对象、映射或关键字参数传递给Counter构造函数来创建它。它具有对计数器执行常见操作的方法,如加法、减法、交集、并集等。

3.4 双端队列(Deque)

支持在两端添加和删除元素,时间复杂度为O(1)的双端队列。可以通过将可迭代对象传递给deque构造函数来创建它。它具有用于旋转、扩展和一次弹出多个元素的方法。

3.5 具名元组(Named Tuples)

每个元素都有名称,并且可以通过点符号或索引进行访问的元组。可以通过使用namedtuple函数定义一个命名元组类,并将类名和字段名作为参数来创建它。它具有用于创建、替换、转换和操作命名元组的方法。

4. 装饰器

装饰器是一种设计模式,它支持扩展函数的属性而无需编辑函数本身。这可能听起来很复杂,但在实际操作中非常简单。想象一下,你想测量函数的执行时间,可以编写类似下面的代码:

import time
start_time = time.time()
main()
print("--- %s seconds ---" % (time.time() - start_time))
# --- 0.764891862869 seconds ---

但是,如果想要测试其他函数的时间,就必须创建重复的代码。为了解决这个问题,可以向想要计时的函数添加一个装饰器:

from time import time 
  
def timer_func(func): # 接受函数作为参数
    def wrap_func(*args, **kwargs): 
        t1 = time() # 初始时间
        result = func(*args, **kwargs) 
        t2 = time() # 结束时间
        print(t2 - t1) # 时间差(以秒为单位)
        return result 
    return wrap_func 
  
  
@timer_func # 我们编写的装饰器
def long_time(n): 
    # 这个函数会花一些时间
    for i in range(n): 
        for j in range(n): 
            i*j 
  
  
long_time(10_000)
# 3.2696526050567627 

现在,该装饰器也可以在其他函数中重复使用!

Python还内置了装饰器,例如functools模块中的装饰器。可以在如下文章中找到其他有用的内置装饰器。

《代码减半,5个绝佳的Python装饰器》

5. 压缩和解压缩

zip是一个可以将列表合并为元组的函数。以下是一个简单的示例,可以轻松地遍历两个不同的列表:

firstNames = ["John""Adam""Steve""Alan""Extra"]
lastNames = ["Lennon""Smith""Jobs""Turing"]

for first, last in zip(firstNames,lastNames):
 print(first, last)

'''
John Lennon
Adam Smith
Steve Jobs
Alan Turing
'''

注意额外的名字是如何被省略的。zip的长度与最短列表的长度相同。

如果想要获取一个元组列表中的所有首元素,zip也很有用。例如,如果你有一个(包含Name, Age, Gender)列表,但只想获得Name的列表,可以按以下方式编写代码:

names = [('Joe'12"male"),
         ('Earnst'43"male"),
         ('Anna'65"female"),
         ('Martin'39"male"),
         ('Katie'26"female")]
name, age, gender = zip(*names)
print(name)
# ('Joe', 'Earnst', 'Anna', 'Martin', 'Katie')

综上所述,这些是Python中的五个基本技巧。如果想了解更多技巧,可以阅读本文最后的精彩回顾

推荐书单

《Python从入门到精通(第3版)》

《Python从入门到精通(第3版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Python进行程序开发应该掌握的各方面技术。全书共分27章,包括初识Python、Python语言基础、运算符与表达式、流程控制语句、列表和元组、字典和集合、字符串、Python中使用正则表达式、函数、面向对象程序设计、模块、文件及目录操作、操作数据库、使用进程和线程、网络编程、异常处理及程序调试、Pygame游戏编程、推箱子游戏、网络爬虫开发、火车票分析助手、数据可视化、京东电商销售数据分析与预测、Web编程、Flask框架、e起去旅行网站、Python自动化办公、AI图像识别工具等内容。书中所有知识都结合具体实例进行介绍,涉及的程序代码都给出了详细的注释,读者可轻松领会Python程序开发的精髓,快速提升开发技能。

【半价促销中】购买链接:https://item.jd.com/14055900.html

精彩回顾

《一文掌握在PyCharm中正确设置Python项目》

《10个必知必会的VSCode实用快捷键》

《10个提高VS Code工作效率的技巧》

《5个不能错过的PyCharm插件》

《解放双手,10个解决重复任务的Python自动化脚本》

《10个优化Python代码的小技巧,使代码运行速度提升5倍!》

长按关注《Python学研大本营》,加入读者群,分享更多精彩长按访问【IT今日热榜】,发现每日技术热点

相关推荐

  • React 弹窗组件用的 createPortal 是怎么实现的?
  • 美国变卦,RTX 4090 囤早了...
  • 国内具有影响力的三个3D视觉公众号
  • 语雀 P0 事故复盘,这 9 个字亮了!
  • AI 智能体能否取代工程经理?
  • 自研代码超 14 万行、沉淀 11 年,deepin-IDE:正在改写“为什么没有好的国产 IDE”答案!
  • Uber 将 4000 多个微服务迁移到新的多云平台 Up
  • Vue.js 组件的复用性:真正可复用还是伪装的可复用?
  • 阳光保险张晗:在未来的保险行业,百亿级专用模型将成为主流趋势
  • 头发丝 1/60 的精度,中国每 10 辆新能源汽车就有 6 辆用这家齿轮
  • PPT 下载|因果推断峰会
  • 内推 | 【百度aigc团队CV实习/社招大量hc&NLP大模型多模态社招】
  • 数仓架构师的核心能力
  • AI基础软件:如何自主构建大+小模型?
  • 从零开始学VLAN划分,让你的网络性能翻倍!
  • LLM一句话瞬间生成3D世界,未公布代码已获141星!或将引发3D建模行业革命
  • 目前最优的非蒸馏、可商用的开源大模型!MIT-IBM 提出鲑鱼模型!
  • 只需这个下毒小工具,让Stable Diffusion彻底崩溃!狗变猫,车变牛,AI侵权打响反击战
  • 能挣钱的,开源SpringBoot和Vue的企业级项目,代码很规范!
  • 公司 9 个人了。