Python是世界上最受欢迎,最流行的编程语言之一。这有不少缘由:css
做为数据科学家的我,天天使用Python是我内在工做的一部分。在这个过程当中,我学会了一些有用的技巧和心得。html
在这里,我尝试以A~Z顺序共享其中一些。java
大多数这些“技巧”是我在平常工做中使用或偶然发现的事情。一些是我在浏览Python标准库文档时发现的。另一些是经过PyPi搜索到的。python
可是,应该归功于它 - 我在awesome-python.com上发现了其中的四个或五个。这是数百个有趣的Python工具和模块的精选列表。这是值得浏览的灵感!git
Python是如此流行的编程语言的缘由之一是由于具备可读性和表现力。程序员
人们常常开玩笑说Python是' 可执行的伪代码 '。可是当你能够编写这样的代码时,很难反驳:github
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")复制代码
您想在控制台中绘制图表吗?express
$ pip install bashplotlib复制代码
您能够在控制台中显示图表。编程
Python有一些很棒的默认数据类型,但有时候它们的行为并不像你想要的那样。json
幸运的是,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!")复制代码
曾经想知道如何查看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!")复制代码
为何不去导入花括号?
对于程序员来讲,地理位置多是一个具备挑战性的领域(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)复制代码
遇到编码问题而忘记了以前看到过的解决方案?须要检查StackOverflow,但不想离开终端?
而后你须要这个有用的命令行工具。
$ pip install howdoi复制代码
问你有什么问题,它会尽力回答。
$ howdoi vertical align css
$ howdoi for java in java
$ howdoi undo commits in git复制代码
请注意 - 它从StackOverflow的顶级答案中删除代码。它可能并不总能提供最有用的信息......
$ howdoi退出vim复制代码
Python的检查模块很是适合理解幕后发生的事情。你甚至能够本身调用它的方法!
下面的代码示例inspect.getsource()
用于打印本身的源代码。它还inspect.getmodule()
用于打印定义它的模块。
最后一行代码打印出本身的行号。
import inspect
print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)复制代码
固然,除了这些微不足道的用途以外,检查模块对于理解代码的做用很是有用。您也可使用它来编写自我记录代码。
Jedi库是一个代码辅助和代码分析的库。它使编写代码更快,更高效。
除非您正在开发本身的IDE,不然您可能最感兴趣的是将Jedi用做编辑器插件。幸运的是,已经可用了!
可是,您可能已经在使用Jedi了。IPython项目利用Jedi实现其代码自动完成功能。
学习任何语言时,沿途都有许多里程碑。使用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)复制代码
当您想要编写能够处理未事先定义的命名参数的函数时,这很是有用。
我最喜欢用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
。它返回一个map对象,能够将其转换为某个可迭代对象,例如list或tuple。
若是你尚未看过它,那么请准备好让你的思绪被Python的报纸模块所震撼。
它容许您从一系列领先的国际出版物中检索新闻文章和相关的元数据。您能够检索图像,文本和做者姓名。
它甚至还有一些内置的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.__value
something = Thing(100)
nothing = Thing(0)
# True
something > nothing
# False
something < nothing
# Error
something + nothing复制代码
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)复制代码
Python支持多线程,标准库的队列模块为此提供了便利。
此模块容许您实现队列数据结构。这些是容许您根据特定规则添加和检索条目的数据结构。
'先进先出'(或FIFO)队列容许您按照添加的顺序检索对象。“后进先出”(LIFO)队列容许您首先访问最近添加的对象。
最后,优先级队列容许您根据对象的排序顺序检索对象。
在Python中定义类或对象时,提供一种将该对象表示为字符串的“官方”方法颇有用。例如:
>>> file = open('file.txt', 'r')
>>> print(file)
<open file 'file.txt', mode 'r' at 0x10d30aaf0>复制代码
这使调试代码更容易。将其添加到您的类定义中,以下所示:
class someClass:
def __repr__(self):
return "<some description here>"
someInstance = someClass()
# prints <some description here>
print(someInstance)复制代码
Python是一种很棒的脚本语言。有时使用标准的操做系统和子进程库可能会让人头疼。
该SH库提供了一个整洁的替代品。
它容许您调用任何程序,就像它是一个普通函数同样 - 对于自动化工做流和任务很是有用,全部这些都来自Python。
import sh
sh.pwd()
sh.mkdir('new_folder')
sh.touch('new_file.txt')
sh.whoami()
sh.echo('This is great!')复制代码
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。若是您正在开展大型复杂项目,那多是值得的!
生成通用惟一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,重复存在的可能性也远远低于十亿分之一。
两行代码至关不错。
这多是我最喜欢的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语言的一个关键特征 - 毕竟,它是以英国喜剧素描Monty Python的飞行马戏团命名的。Python的大部分官方文档都引用了该剧最着名的草图。
但幽默感并不局限于文档。请按如下方式运行:
import antigravity复制代码
永远不要改变,Python。从不改变。
YAML表明' YAML Is Not Markup Language '。它是一种数据格式化语言,是JSON的超集。
与JSON不一样,它能够存储更复杂的对象并引用它本身的元素。您还能够编写注释,使其特别适合编写配置文件。
该PyYAML模块可以让您使用YAML使用Python。安装:
$ pip install pyyaml复制代码
而后导入到您的项目中:
import yaml复制代码
PyYAML容许您存储任何数据类型的Python对象,以及任何用户定义类的实例。
技巧的最后一招,真的很酷。曾经须要从两个列表中造成字典吗?
keys = ['a', 'b', 'c']
vals = [1, 2, 3]
zipped = dict(zip(keys, vals))复制代码
该zip()
内置函数须要一系列可迭代的对象,并返回一个元组列表。每一个元组按位置索引对输入对象的元素进行分组。
您也能够经过调用*zip()
它们来“解压缩”对象。
公众号:银河系1号联系邮箱:public@space-explore.com(未经赞成,请勿转载)