Python是世界上最受欢迎,最流行的编程语言之一。这有很多原因:
- 它很容易学习
- 它是超级多用途的
- 它有大量的模块和库
作为数据科学家的我,每天使用Python是我内在工作的一部分。在这个过程中,我学会了一些有用的技巧和心得。
在这里,我尝试以A~Z顺序共享其中一些。
学习Python中的小伙伴,需要学习资料的话,可以到我的微信公众号:Python学习知识圈,后台回复:“01”,即可拿Python学习资料
大多数这些“技巧”是我在日常工作中使用或偶然发现的事情。一些是我在浏览Python标准库文档时发现的。另外一些是通过PyPi搜索到的。
但是,应该归功于它 - 我在http://awesome-python.com上发现了其中的四个或五个。这是数百个有趣的Python工具和模块的精选列表。这是值得浏览的灵感!
all or any
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")
bashplotlib
您想在控制台中绘制图表吗?
$ pip install bashplotlib
您可以在控制台中显示图表。
collections
Python有一些很棒的默认数据类型,但有时候它们的行为并不像你想要的那样。
幸运的是,Python标准库提供了集合模块。这个方便的附加组件为您提供了更多的数据类型。
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!")
DIR
曾经想知道如何查看Python对象并查看它具有哪些属性?你当然有。
从命令行:
>>> dir()
>>> dir("Hello World")
>>> dir(dir)
当以交互方式运行Python以及动态浏览您正在使用的对象和模块时,这可能是一个非常有用的功能。
$ pip install emoji
from emoji import emojize
print(emojize(":thumbs_up:"))
from future import
Python受欢迎的一个后果是一直有新的版本在开发中。新版本意味着新功能 - 除非您的版本已过时。
但是,不要害怕。该f="https://link.juejin.im/?target=https%3A%2F%2Flink.zhihu.com%2F%3Ftarget%3Dhttps%253A%2F%2Fdocs.python.org%2F2%2Flibrary%2F__future__.html">future模块,让您可以用Python导入未来版本的功能。它实际上就像时间旅行,魔术或其他东西。
from __future__ import print_function
print("Hello World!")
为什么不去导入花括号?
geopy
对于程序员来说,地理位置可能是一个具有挑战性的领域(ha,a pun!)。但是geopy模块让它变得非常简单。
pip install geopy
它的工作原理是抽象出一系列不同地理编码服务的API。它使您可以获得一个地方的完整街道地址,纬度,经度,甚至高度。
还有一个有用的距离类。它会计算您最喜欢的测量单位中两个位置之间的距离。
from geopy import GoogleV3
place = "221b Baker Street, London"
location = GoogleV3().geocode(place)
print(location.address)
print(location.location)
howdoi
遇到编码问题而忘记了之前看到过的解决方案?需要检查StackOverflow,但不想离开终端?
然后你需要这个有用的命令行工具。
$ pip install howdoi
问你有什么问题,它会尽力回答。
$ howdoi vertical align css
$ howdoi for java in java
$ howdoi undo commits in git
请注意 - 它从StackOverflow的顶级答案中删除代码。它可能并不总能提供最有用的信息......
$ howdoi退出vim
inspect 检查
Python的检查模块非常适合理解幕后发生的事情。你甚至可以自己调用它的方法!
下面的代码示例inspect.getsource()
用于打印自己的源代码。它还inspect.getmodule()
用于打印定义它的模块。
最后一行代码打印出自己的行号。
import inspect
print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)
当然,除了这些微不足道的用途之外,检查模块对于理解代码的作用非常有用。您也可以使用它来编写自我记录代码。
Jedi
Jedi库是一个代码辅助和代码分析的库。它使编写代码更快,更高效。
除非您正在开发自己的IDE,否则您可能最感兴趣的是将Jedi用作编辑器插件。幸运的是,已经可用了!
但是,您可能已经在使用Jedi了。IPython项目利用Jedi实现其代码自动完成功能。
** kwargs
学习任何语言时,沿途都有许多里程碑。使用Python,理解神秘的**kwargs
语法可能算作一个。
字典对象前面的双星号允许您将该字典的内容作为命名参数传递给函数。
字典的键是参数名称,值是传递给函数的值。你甚至不需要叫它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)
当您想要编写可以处理未事先定义的命名参数的函数时,这非常有用。
List comprehensions
我最喜欢用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)
map
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
。它返回一个map对象,可以将其转换为某个可迭代对象,例如list或tuple。
newspaper3k
如果你还没有看过它,那么请准备好让你的思绪被Python的报纸模块所震撼。
它允许您从一系列领先的国际出版物中检索新闻文章和相关的元数据。您可以检索图像,文本和作者姓名。
它甚至还有一些内置的NLP功能。
因此,如果您正在考虑将BeautifulSoup或其他DIY网页爬虫库用于您的下一个项目,请节省您自己的时间和精力,用`$ pip install newspaper3k 代替。
Operator overloading 运算符重载
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.__value
something = Thing(100)
nothing = Thing(0)
# True
something > nothing
# False
something < nothing
# Error
something + nothing
pprint
Python的默认print
函数可以完成它的工作。但是尝试打印出任何大的嵌套对象,结果相当丑陋。
这是标准库的漂亮打印模块(Standard Library’s pretty-print module)的用武之地。它以易于阅读的格式打印出复杂的结构化对象。
任何使用非常规数据结构的Python开发人员必备的。
import requests
import pprint
url = 'https://randomuser.me/api/?results=1'
users = requests.get(url).json()
pprint.pprint(users)
Queue 队列
Python支持多线程,标准库的队列模块为此提供了便利。
此模块允许您实现队列数据结构。这些是允许您根据特定规则添加和检索条目的数据结构。
'先进先出'(或FIFO)队列允许您按照添加的顺序检索对象。“后进先出”(LIFO)队列允许您首先访问最近添加的对象。
最后,优先级队列允许您根据对象的排序顺序检索对象。
这是一个如何在Python中使用队列进行多线程编程的示例。
repr
在Python中定义类或对象时,提供一种将该对象表示为字符串的“官方”方法很有用。例如:
>>> file = open('file.txt', 'r')
>>> print(file)
这使调试代码更容易。将其添加到您的类定义中,如下所示:
class someClass:
def __repr__(self):
return ""
someInstance = someClass()
# prints
print(someInstance)
SH
Python是一种很棒的脚本语言。有时使用标准的操作系统和子进程库可能会让人头疼。
该SH库提供了一个整洁的替代品。
它允许您调用任何程序,就像它是一个普通函数一样 - 对于自动化工作流和任务非常有用,所有这些都来自Python。
import sh
sh.pwd()
sh.mkdir('new_folder')
sh.touch('new_file.txt')
sh.whoami()
sh.echo('This is great!')
Type hints
Python是一种动态类型语言。定义变量,函数,类等时,不需要指定数据类型。
这允许快速开发时间。但是,有一些事情比简单的键入问题导致的运行时错误更令人讨厌。
从Python 3.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)
虽然不是强制性的,但类型注释可以使您的代码更容易理解。
它们还允许您使用类型检查工具在运行时捕获那些杂散的TypeErrors。如果您正在开展大型复杂项目,那可能是值得的!
uuid
生成通用唯一ID(或“UUID”)的快捷方法是通过Python标准库的uuid模块。
import uuid
user_id = uuid.uuid4()
print(user_id)
这会创建一个随机的128位数字,几乎肯定是唯一的。
实际上,可以生成超过2 12 2个可能的UUID。这超过五亿十亿(或5,000,000,000,000,000,000,000,000,000,000,000,000,000)。
在给定集合中找到重复的概率非常低。即使有万亿UUID,重复存在的可能性也远远低于十亿分之一。
两行代码相当不错。
Virtual environments
这可能是我最喜欢的Python的地方。
您有可能在任何时候都在处理多个Python项目。不幸的是,有时两个项目将依赖于同一依赖项的不同版本。你在系统上安装了哪些?
幸运的是,Python 对虚拟环境的支持让您拥有两全其美的优势。从命令行:
python -m venv my-project
source my-project/bin/activate
pip install all-the-modules
现在,您可以在同一台计算机上运行独立版本和Python安装。
wikipedia 维基百科
维基百科有一个很棒的API,允许用户以编程方式访问无与伦比的完全免费的知识和信息。
在维基百科模块,使访问该API几乎令人意想不到的方便。
import wikipedia
result = wikipedia.page('freeCodeCamp')
print(result.summary)
for link in result.links:
print(link)
与真实网站一样,该模块提供对多种语言的支持,页面消歧,随机页面检索,甚至还有一种donate()
方法。
XKCD
幽默是Python语言的一个关键特征 - 毕竟,它是以英国喜剧素描Monty Python的飞行马戏团命名的。Python的大部分官方文档都引用了该剧最着名的草图。
但幽默感并不局限于文档。请按以下方式运行:
import antigravity
永远不要改变,Python。从不改变。
YAML
YAML代表' YAML Is Not Markup Language '。它是一种数据格式化语言,是JSON的超集。
与JSON不同,它可以存储更复杂的对象并引用它自己的元素。您还可以编写注释,使其特别适合编写配置文件。
该PyYAML模块可让您使用YAML使用Python。安装:
$ pip install pyyaml
然后导入到您的项目中:
import yaml
PyYAML允许您存储任何数据类型的Python对象,以及任何用户定义类的实例。
zip 压缩
技巧的最后一招,真的很酷。曾经需要从两个列表中形成字典吗?
keys = ['a', 'b', 'c']
vals = [1, 2, 3]
zipped = dict(zip(keys, vals))
该zip()
内置函数需要一系列可迭代的对象,并返回一个元组列表。每个元组按位置索引对输入对象的元素进行分组。
您也可以通过调用*zip()
它们来“解压缩”对象。