一系列有用的Python技巧

Python作为世界上最受欢迎的编程语言之一。这有很多原因:

  • 易于学习

  • 超级通用

  • 具有大量的模块和库

本文将尝试以A-Z的顺序分享其中一些有用的技巧和窍门。这些“窍门”大部分是我在日常工作中曾经使用或偶然发现的东西,也有一些是我在浏览Python标准文档时发现的,还有一小部分是通过PyPi搜索到的。

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

如果想在控制台绘制图表,可以通过执行下面一行代码安装bashplotlib

$ pip install bashplotlib

collections

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!")

dir

无论何时你想查看Python对象的内部和看它包含哪些属性,可以通过下面的命令实现:

>>> dir()
>>> dir("Hello World")
>>> dir(dir)

当以交互方式运行Python并动态浏览正在使用的对象和模块时,这可能是一个非常有用的功能。

emoji

首先我们需要安装emoji模块

$ pip install emoji
from emoji import emojize
print(emojize(":thumbs_up:"))

????

from __future__ import

Python受欢迎的一个后果是,总是有新版本正在开发中,新版本意味着新功能-除非您的版本已过期。通过__future__模块,我们可以用Python的未来版本导入功能。从字面上看,这就像时间旅行、魔术一样。

from __future__ import 
print_functionprint("Hello World!")

geopy

对于程序员来说,地理环境可能是一个充满挑战的领域(双关语!)。但是,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 loop in java
$ howdoi undo commits in git

注意:它会从StackOverflow的主要答案中抓取代码。有些问题的准确性可能不被保证…

$ howdoi exit vim

inspect

Python的inspect模块非常适合了解幕后发生的事情。我们甚至可以自己调用其方法!下面的代码示例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。它返回一个映射对象,可以将其转换为一些可迭代的对象,例如列表或元组。

newspaper3k

它使我们可以从一系列领先的国际出版物中检索新闻文章和相关的元数据。我们可以检索图像、文本和作者名称。它甚至具有一些内置的NLP功能。因此,如果我们打算为下一个项目使用BeautifulSoup或其他DIY Web抓取库,则可通过安装此模块以节省时间和精力,而不必花时间。

$ 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功能可以完成其工作。但是,尝试打印出任何较大的嵌套对象,结果会很丑陋。这是标准库的漂亮打印模块所处的位置。它以易于阅读的格式打印出复杂的结构化对象,是任何使用非平凡数据结构的Python开发人员的必备工具。

import requests
import pprint


url = 'https://randomuser.me/api/?results=1'
users = requests.get(url).json()


pprint.pprint(users)

Queue

Python支持多线程,标准库的Queue模块促进了这一点。该模块使我们可以实现队列数据结构。这些数据结构使我们可以根据特定规则添加和检索条目。“先进先出”(或FIFO)队列使您可以按添加顺序检索对象。“后进先出”(LIFO)队列使您可以首先访问最近添加的对象。最后,优先级队列使您可以根据对象的排序顺序检索对象。

__repr__

在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)

sh

Python是一种很棒的脚本语言。有时使用标准os和子流程库可能会让人有些头疼。

该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)

尽管不是强制性的,但类型注释可以使我们的代码更易于理解。它们还允许我们使用类型检查工具在运行时捕获那些杂散的TypeError。如果我们正在从事大型、复杂的项目,它或许会起到很大帮助!

uuid

生成通用唯一ID(或“ UUID”)的快速简便方法是通过Python标准库的uuid模块。

import uuid


user_id = uuid.uuid4()
print(user_id)

这将创建一个随机的128位数字,几乎可以肯定是唯一的。实际上,可以生成超过2^122的UUID,总量超过五十亿。因此在给定集合中找到重复项的可能性非常低。即使拥有一万亿个UUID,重复存在的可能性也远远小于十亿分之一。


Virtual environments

我们有可能同时从事多个Python项目。不幸的是,有时两个项目将依赖于同一依赖项的不同版本。您在系统上安装哪个?幸运的是,Python 对虚拟环境的支持使我们可以两全其美。从命令行:

python -m venv my-project
source my-project/bin/activate
pip install all-the-modules

现在,我们可以在同一台计算机上运行安装独立版本的Python。

wikipedia

Wikipedia具有出色的API,允许用户以编程方式访问无与伦比的完全免费的知识和信息。在Wikipedia模块,使访问API非常的方便。

import wikipedia


result = wikipedia.page('freeCodeCamp')
print(result.summary)
for link in result.links:
    print(link)

与实际站点一样,该模块提供了对多种语言,页面歧义消除,随机页面检索的支持,甚至提供了一种donate()方法。

xkcd

幽默是Python语言的一项主要功能-毕竟,它是以英国喜剧速写节目Monty Python的Flying Circus命名的。Python的许多官方文档都引用了展览中最著名的草图。

但是,幽默感不仅仅限于文档。可以运行以下行:

import antigravity

YAML

YAML是一种数据格式语言,并且是JSON的超集。与JSON不同,它可以存储更复杂的对象并引用其自己的元素。我们还可以编写注释,使其特别适合编写配置文件。该PyYAML模块可让我们在Python中使用YAML。安装方式:

$ pip install pyyaml

然后导入到我们的项目中:

import yaml

PyYAML允许我们存储任何数据类型的Python对象以及任何用户定义类的实例。

zip

ya的最后一招,这确实是很酷的。它可以将两个列表中的元素组成一个字典。

keys = ['a', 'b', 'c']
vals = [1, 2, 3]
zipped = dict(zip(keys, vals))

zip()内置函数需要一系列可迭代的对象,并返回一个元组列表中。每个元组通过其位置索引将输入对象的元素分组。我们也可以通过调用对象来“解压缩”对象*zip()

以上就构成了一系列的Python技巧,希望有一些可以用得到的内容帮助您在实际项目中使用。Python作为一种非常多样化且开发完善的语言,因此肯定会有很多没有提到的功能。在后续的文章中遇到有趣的技巧再继续分享。

·  END  ·

RECOMMEND

推荐阅读

 1. 效率提升的软件大礼包

 2. 深度学习——入门PyTorch(一)

 3. 深度学习——入门PyTorch(二)

 4. PyTorch入门——autograd(一)

5. PyTorch入门——autograd(二)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值