Python是世界上最流行、最受欢迎的编程语言之一。这有很多原因:
作为一名数据科学家,我每天都使用 Python 作为我工作中不可或缺的一部分。在此过程中,我学到了一些有用的技巧和窍门。
在这里,我尝试以 A-Z 格式分享其中的一些。大多数这些“技巧”是我在日常工作中使用或偶然发现的。有些是我在浏览Python 标准库文档时发现的。其他一些是我通过PyPi搜索发现的。
然而值得称赞的是——我在awesome-python.com上发现了四五个。它是包含数百个有趣的 Python 工具和模块的精选列表,值得浏览以获取灵感!
Python如此受欢迎的语言的众多原因之一是因为它是可读的和可表达的。
人们经常开玩笑说Python是“可执行的伪代码”。但是当您可以编写这样的代码时,就很难反驳了:
x = [True, True, False] if any(x): print("At least one True") if all(x): print("Not one False") if any(x) and not all(x): print("At least one True and one False")
您想在控制台中绘制图形吗?
$ pip install bashplotlib
您可以在控制台中显示图表。
Python有一些很棒的默认数据类型,但有时它们的行为并不完全符合您的期望。
幸运的是,Python标准库提供了collections模块。这个方便的附加组件为您提供了更多的数据类型。
from collections import OrderedDict, Counter # Remembers the order the keys are added! x = OrderedDict(a=1, b=2, c=3) # Counts the frequency of each character y = Counter("Hello World!")
有没有想过如何查看 Python 对象内部并查看它具有哪些属性?你当然有。从命令行:
>>> dir() >>> dir("Hello World") >>> dir(dir)
当以交互方式运行 Python 以及动态探索您正在使用的对象和模块时,这可能是一个非常有用的功能。在这里阅读更多。
是的,真的。
$ pip install emoji
不要假装你不会尝试......
from emoji import emojize print(emojize(":thumbs_up:"))
Python流行的结果之一是总是有新版本在开发中。新版本意味着新功能——除非您的版本已经过时。不过不要害怕。__future__模块让您可以通过Python的未来版本导入功能。从字面上看就像时间旅行、魔法或其他东西。
from __future__ import print_function print("Hello World!")
为什么不尝试导入花括号?
地理对于程序员来说可能是一个具有挑战性的地形(哈,双关语!)。但是geopy模块使它变得非常容易。
$ pip install geopy
它通过抽象一系列不同地理编码服务的 API 来工作。它使您能够获得一个地方的完整街道地址、纬度、经度,甚至海拔。
还有一个有用的距离类。它以您喜欢的测量单位计算两个位置之间的距离。
from geopy import GoogleV3 place = "221b Baker Street, London" location = GoogleV3().geocode(place) print(location.address) print(location.location)
遇到编码问题并且不记得您之前看到的解决方案?需要查StackOverflow,但又不想离开终端?那么你需要这个有用的命令行工具。
$ pip install howdoi
无论您有什么问题,都可以问它,它会尽力回复。
$ howdoi vertical align css $ howdoi for loop in java $ howdoi undo commits in git
但请注意——它会从 StackOverflow 的最佳答案中抓取代码。它可能并不总是提供最有用的信息......
$ howdoi exit vim
Python的检查模块非常适合了解更深层次的东西。你甚至可以调用它自己的方法!
下面的代码示例inspect.getsource()
用于打印自己的源代码。它还可以用inspect.getmodule()
于打印定义它的模块。
最后一行代码打印出它自己的行号。
import inspect print(inspect.getsource(inspect.getsource)) print(inspect.getmodule(inspect.getmodule)) print(inspect.currentframe().f_lineno)
当然,除了这些小用途,inspect模块对于理解你的代码在做什么也很有用。您还可以使用它来编写自动文档化代码。
Jedi库是一个代码自动完成与分析库。它使编写代码更快、更高效。
除非您正在开发自己的IDE,否则您可能对使用Jedi作为编辑器插件非常感兴趣。幸运的是,这些都已经可用了!
您可能已经在使用Jedi了,IPython项目就是利用Jedi来实现其代码自动完成功能。
在学习任何语言时,都会有许多里程碑。对于使用Python,理解神秘的**kwargs
语法可能算作一个。字典对象前面的双星号允许您将该字典的内容作为命名参数传递给函数。字典的键是参数名称,值是传递给函数的值。你不需要传递参数!
dictionary = {"a": 1, "b": 2} def someFunction(a, b): print(a + b) return # these do the same thing: someFunction(**dictionary) someFunction(a=1, b=2)
这在您想编写可以处理未预先定义的命名参数的函数时很有用。
在Python编程中我最喜欢的事情之一是它的列表推导式。这些表达式可以很容易地编写非常干净的代码,几乎就像自然语言一样。您可以在此处阅读有关如何使用它们的更多信息。
numbers = [1,2,3,4,5,6,7] evens = [x for x in numbers if x % 2 is 0] odds = [y for y in numbers if y not in evens] cities = ['London', 'Dublin', 'Oslo'] def visit(city): print("Welcome to "+city) for city in cities: visit(city)
Python 通过许多内置功能支持函数式编程。最有用的map()
功能之一是函数——尤其是与lambda 函数结合使用时。
x = [1, 2, 3] y = map(lambda x : x + 1 , x)# prints out [2,3,4] print(list(y))
在上面的示例中,map()
将一个简单的 lambda 函数应用于x
. 它返回一个映射对象,该对象可以转换为一些可迭代对象,例如列表或元组。
如果您还没有看过它,那么准备好被Python的news 模块震撼吧。
它使您可以从一系列领先的国际出版物中检索新闻文章和相关的元数据。您可以检索图像、文本和作者姓名。
它甚至有一些内置的NLP功能。
因此,如果您正在考虑在下一个项目中使用 BeautifulSoup 或其他一些 DIY 网页抓取库,请为自己节省时间和精力$ pip install newspaper3k
。
Python 提供对运算符重载的支持,这是让您听起来像一个合法的计算机科学家的术语之一。
这实际上是一个简单的概念。有没有想过为什么 Python 允许您使用+
运算符来添加数字以及连接字符串?这就是操作符重载的作用。
您可以定义以自己的特定方式使用 Python 的标准运算符符号的对象。这使您可以在与您正在使用的对象相关的上下文中使用它们。
class Thing: def __init__(self, value): self.__value = value def __gt__(self, other): return self.__value > other.__value def __lt__(self, other): return self.__value < other.__valuesomething = Thing(100) nothing = Thing(0)# True something > nothing# False something < nothing# Error something + nothing
Python 的默认print
函数完成了它的工作。但是尝试打印出任何大的嵌套对象,结果相当难看。
这是标准库pretty-print模块介入的地方。它以易于阅读的格式打印出复杂的结构化对象。
任何使用非平凡数据结构的 Python 开发人员的必备品。
import requests import pprint url = 'https://randomuser.me/api/?results=1' users = requests.get(url).json() pprint.pprint(users)
Python 支持多线程,标准库的 Queue 模块促进了这一点。
这个模块让你实现队列数据结构。这些是允许您根据特定规则添加和检索条目的数据结构。
“先进先出”(或 FIFO)队列让您可以按添加顺序检索对象。“后进先出”(LIFO) 队列让您可以首先访问最近添加的对象。
最后,优先队列让您可以根据对象的排序顺序检索对象。
这是一个如何在Python中使用队列进行多线程编程的示例。
在 Python 中定义类或对象时,提供一种将该对象表示为字符串的“官方”方式很有用。例如:
>>> file = open('file.txt', 'r') >>> print(file)
这使得调试代码更加容易。将其添加到您的类定义中,如下所示:
class someClass: def __repr__(self): return "" someInstance = someClass() # prints print(someInstance)
Python 是一种很棒的脚本语言。有时使用标准的 os 和 subprocess 库可能有点头疼。
该SH库提供了一个整洁的替代品。
它让你可以像调用普通函数一样调用任何程序——对于自动化工作流和任务非常有用,所有这些都来自 Python。
import sh sh.pwd() sh.mkdir('new_folder') sh.touch('new_file.txt') sh.whoami() sh.echo('This is great!')
Python 是一种动态类型语言。定义变量、函数、类等时不需要指定数据类型。
这允许快速的开发时间。但是,没有什么比由简单的输入问题引起的运行时错误更烦人的了。从Python3.5开始,您可以选择在定义函数时提供类型提示。
def addTwo(x : Int) -> Int: return x + 2
您还可以定义类型别名:
from typing import List Vector = List[float] Matrix = List[Vector] def addMatrix(a : Matrix, b : Matrix) -> Matrix: result = [] for i,row in enumerate(a): result_row =[] for j, col in enumerate(row): result_row += [a[i][j] + b[i][j]] result += [result_row] return result x = [[1.0, 0.0], [0.0, 1.0]] y = [[2.0, 1.0], [0.0, -2.0]] z = addMatrix(x, y)
尽管不是强制性的,但类型注释可以使您的代码更易于理解。
它们还允许您使用类型检查工具在运行前捕获那些杂散的 TypeError。如果您正在处理大型、复杂的项目,这可能是值得的!
生成通用唯一 ID(或“UUID”)的一种快速简便的方法是通过Python标准库的uuid模块
import uuid user_id = uuid.uuid4() print(user_id)
这将创建一个随机的 128 位数字,该数字几乎肯定是唯一的。
事实上,可以生成超过 2¹²² 种可能的 UUID。这超过了五个十进制(或 5,000,000,000,000,000,000,000,000,000,000,000,000)。
在给定的集合中发现重复的概率极低。即使有一万亿个 UUID,重复存在的可能性也远低于十亿分之一。
两行代码相当不错。
这可能是我最喜欢的 Python 东西。
您可能同时在多个 Python 项目上工作。不幸的是,有时两个项目会依赖同一依赖项的不同版本。你在你的系统上安装哪个?
幸运的是,Python对虚拟环境的支持让您可以两全其美。从命令行
python -m venv my-project source my-project/bin/activate pip install all-the-modules
现在,您可以在同一台机器上运行 Python 的独立版本和安装。排序!
维基百科有一个很棒的 API,它允许用户以编程方式访问无与伦比的完全免费的知识和信息。
在维基百科模块,使访问该API几乎令人尴尬的方便。
import wikipedia result = wikipedia.page('freeCodeCamp') print(result.summary) for link in result.links: print(link)
和真实站点一样,该模块提供了多语言支持、页面消歧、随机页面检索,甚至还有一个donate()
方法。
幽默是Python语言的一个关键特征——毕竟,它是以英国喜剧小品剧巨蟒的飞行马戏团命名的。Python的大部分官方文档都引用了该节目最著名的草图。
不过,幽默感并不仅限于文档。试试运行下面的行:
import antigravity
永远不要改变,Python。不要改变。
YAML代表“YAML不是标记语言”。它是一种数据格式化语言,是 JSON的超集。与JSON不同,它可以存储更复杂的对象并引用它自己的元素。您还可以编写注释,使其特别适合编写配置文件。PyYAML模块可以让您借助Python使用YAML。安装如下:
$ pip install pyyaml
然后导入到您的项目中:
import yaml
PyYAML允许您存储任何数据类型的 Python 对象,以及任何用户定义类的实例。
分享给你的最后一招,这真的很酷。你曾经有过需要从两个列表生产字典吗?
keys = ['a', 'b', 'c'] vals = [1, 2, 3] zipped = dict(zip(keys, vals))
zip()
内置函数需要一系列可迭代的对象,并返回一个元组列表中。每个元组按位置索引对输入对象的元素进行分组。您还可以通过调用对象来“解压缩”对象*zip()
。
这些就是一系列的Python技巧——希望你已经找到了对你的下一个项目有用的东西。Python是一种非常多样化且发展良好的语言,因此肯定会有许多我没有提到的功能。请在下面留下回复,分享您最喜欢的 Python 技巧!