26个你不知道的Python技巧

 

Python是目前世界上最流行的编程语言之一。因为:

1.它容易学习

2.它用途超广

3.它有非常多的开源支持(大量的模块和库)

不好意思,优达菌又啰嗦了。

本文作者 Peter Gleeson 是一名数据科学家,日常工作几乎离不开python。一路走来,他积累了不少有用的技巧和tips,现在优达菌就将这些技巧分享给大家。这些技巧将根据其首字母按A-Z的顺序进行展示。

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 标准库提供了collection模块。它让你可以使用更为多样数据类型。

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的时候一个非常有用的功能,用于动态探索你所使用的对象和模块。更多详情,可以查看这里:https://docs.python.org/3/library/functions.html#dir

emoji

对的,你没看错!

$ pip install emoji

用python来创建表情包,你也可以。

from emoji import emojize
print(emojize(":thumbs_up:"))

from __future__ import

Python非常受欢迎,这也就导致了它的版本更新非常快,新的版本往往会有很多新特性。你不更新,就无法使用。

然而,不要害怕。__future__ 模块可以让你导入未来版本的功能。有点像时空穿梭有木有!

from __future__ import print_function
print("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上找,但又不想离开这个终端。这个时候,你需要下面这个工具——howdoi

$ pip install howdoi

你所遇到的任何问题都可以问它,它会尽他所能给你返回一个答案。

$ howdoi vertical align css
$ howdoi for loop in java
$ howdoi undo commits in git

需要注意的是——它只从StackOverflow最顶端的答案中抓取代码。所以它给你返回的不总是最有用的信息...

$ howdoi exit vim

inspect

Python的inspect模块用于收集Python对象的信息,可以获取类或函数的参数的信息,源码,解析堆栈等等

下方的代码样例使用了 inspect.getsource() 来打印它自身的源码。同样还使用了 inspect.getmodule()来打印定义了inspect.getmodule()的模块。最后一行代码则是打印了本行代码所在的行号。在本例中,就是 4 。

import inspect
print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)
 

inspect模块可以有效地让你知道你的代码是如何工作的,你也可以利用它来完成一些个人的源码。

Jedi

Jedi库是一个代码自动补齐和静态分析的库。它可以使你更快更高效地书写代码。

除非你在开发自己的编辑器,否则你可能会非常喜欢将Jedi作为自己的编辑插件。

你可能已经正在使用Jedi而只是没发现。IPython项目就是利用Jedi来实现其自动补全功能。

**kwargs

无论你学习那种语言,在这条学习之路上总有那么一些里程碑。在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)

当你想要创建一个函数,它需要能处理事先没有定义过的参数,那么就要用到前面提到的技巧了。

List comprehensions

List comprehensions(列表推导式)

列表推导式可以说是我最喜欢的Python技巧之一。这种表达式可以让你写出像自然语言一样易于理解并且还很简洁的代码。

你可以通过这个链接了解更多关于列表推导式的用法。地址:https://www.learnpython.org/en/List_Comprehensions

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()对x中的每一个元素都应用了一个简单的lambda函数。它会返回一个map对象,这个对象可以被转化成可迭代对象,如列表或者元组。

newspaper3k

newspaper3k,如果你还没有见过它,那么你可能会被这个Python newspaper模块所惊艳到。

它可以让你检索到一系列国际领先出版物中的新闻和相关的元数据。你可以检索图片、文本和作者名。它甚至有一些内置的自然语言处理功能。所以,如果你正在考虑使用BeautifulSoup 或其他自制的爬虫库来应用于你的下一个项目。那么,省省时间和精力吧,你其实只需要$ 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函数可以满足日常的输出任务,但如果要打印更大的、嵌套式的对象,那么使用默认的print函数打印出来的内容会很丑陋。

这个时候我们就需要pprint了,它可以让复杂的结构型对象以可读性更强的格式显示。这对于经常要面对非普通数据结构的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__

当你定义一个类的时候,提供一个方法可以返回用来表示该类对象的可打印字符串会非常有用。例如:

>>> file = open('file.txt', 'r')
>>> print(file)
<open file 'file.txt', mode 'r' at 0x10d30aaf0>

这使得debug更加方便,具体的定义方式如下:

class someClass:
def __repr__(self):
return "<some description here>"
someInstance = someClass()
# prints <some description here>
print(someInstance)

sh

sh库让你像调用方法那样调用系统中的命令。

from sh import *
sh.pwd()
sh.mkdir('new_folder')
sh.touch('new_file.txt')
sh.whoami()
sh.echo('This is great!')

Type hints(类型提示)

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)

虽然不是强制性的,类型注释可以让你的代码理解起来更加简单。它们也允许你使用类型检测工具在运行之前捕获这些零散的类型错误。如果你正在从事大型、复杂的项目,那么类型注释也许会非常有帮助

uuid

通过Python标准库中的uuid模块,可以快速并简单地生成统一的唯一ID(又称UUID).

import uuid
user_id = uuid.uuid4()
print(user_id)

UUID是128位的全局唯一标识符,通常由32字节的字符串表示。它可以保证时间和空间的唯一性,也称为GUID,全称为:UUID —— Universally Unique IDentifier,Python 中叫 UUID。它通过MAC地址、时间戳、命名空间、随机数、伪随机数来保证生成ID的唯一性。

Virtual environments

这可能是我最喜欢的Python技巧了。你可能经常要处理不止一个Python项目,不幸的是,有时候不同项目会依赖不同的Python版本。这个时候,你应该在系统里安装哪个Python版本呢?

幸运的是,Python可以支持建立不同的虚拟环境来满足不同的版本需求。

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

现在你可以在一台机器上安装和运行各个独立版本的Python。太棒了!

wikipedia

Wikipedia有一个很棒的API,它可以让用户通过编程访问到维基的词条内容。使用Python中的wikipedia模块可以让你以最便捷的方式访问该API。

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

与真实站点一样,该模块支持多种语言、页面消除歧义、随机页面检索,甚至还有donate()方法。

xkcd(著名Python漫画)

幽默是Python语言的一个重要特性——毕竟,它是以英国喜剧小品节目《Monty Python’s Flying Circus》(《蒙提·派森的飞行马戏团》)命名的。Python的许多官方文档都引用了该剧中的著名情节。

这种幽默感不仅在文档中可以找到,不信,你可以试试运行下方的代码:

import antigravity

你将打开兰道尔·门罗的著名幽默漫画《xkcd》:)

YAML

YAML是“YAML不是一种标记语言”的外语缩写。它是一个数据格式语言,是JSON的父集。和JSON不同的是,它可以存储更复杂的对象,并且可以引用自身的元素。你还可以写注释,这让YAML特别适合于书写配置文件。

PyYAML模块可以让你使用Python调用YAML。使用下列语句安装:

$ pip install pyyaml

然后导入到项目中:

import yaml

PyYAML 使你能够储存任何数据类型的Python对象,以及任何用户定义类的实例。

zip

最后一个技巧也非常酷。你是否曾想要让两个列表中的元素逐个映射,组合成字典?那么你应该使用zip。

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

内置函数zip()接收若干可迭代对象,然后返回一个由多个元组组成的列表。每个元组根据输入对象的位置索引对其元素进行分组。还可以使用*zip()来“解压”对象。

python 26个技巧的更多相关文章

  1. <转> 30 个有关 Python 的小技巧

    目录[+] 1.1 拆箱 1.2 拆箱变量交换 1.3 扩展拆箱(只兼容python3) 1.4 负数索引 1.5 切割列表 1.6 负数索引切割列表 1.7指定步长切割列表 1.8 负数步长切割列表 ...

  2. python基础===Python 代码优化常见技巧

    Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 8 ...

  3. 30个有关Python的小技巧,给程序员的 30 个基本 Python 贴士与技巧

    30个有关Python的小技巧 2013/07/04 · Python, 开发 · 4 评论 · Python 分享到: 66 本文由 伯乐在线 - Kevin Sun 翻译.未经许可,禁止转载!英文 ...

  4. 【转载】Python 代码调试技巧

    https://www.ibm.com/developerworks/cn/linux/l-cn-pythondebugger/ Python 代码调试技巧 张 颖2012 年 5 月 03 日发布 ...

  5. 理解 python metaclass使用技巧与应用场景分析

    理解python metaclass使用技巧与应用场景分析       参考: decorator与metaclass:http://jfine-python-classes.readthedocs. ...

  6. Python:文件操作技巧(File operation)(转)

    Python:文件操作技巧(File operation) 读写文件 # ! /usr/bin/python #  -*- coding: utf8 -*- spath = " D:/dow ...

  7. python 统计使用技巧

    python 统计使用技巧 # 1.不输入回车获取值 注:需要tty模块配合. fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) ...

  8. Python学习小技巧之列表项的排序

    Python学习小技巧之列表项的排序 本文介绍的是关于Python列表项排序的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 典型代码1:     data_list = [6, 9, 1, ...

  9. Python 高效编程技巧实战(2-1)如何在列表,字典, 集合中根据条件筛选数据

    Python 高效编程技巧实战(2-1)如何在列表,字典, 集合中根据条件筛选数据 学习目标 1.学会使用 filter 借助 Lambda 表达式过滤列表.集合.元组中的元素: 2.学会使用列表解析 ...

随机推荐

  1. vivado实现模16的计数器

    `timescale 1ns / 1ps module ctr_mod_16( clk, rst_n, count ); input clk, rst_n; :] count; wire clk, r ...

  2. poj-1061-exgcd

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 128285   Accepted: 27962 Descript ...

  3. ​ 别忘了Nologging哦

    ​ ​ 别忘了Nologging哦

  4. vs 2017 Integrated Security 为sspi 含义

    关于sql连接语句中的Integrated Security=SSPI解决方法:即:Security Support Provider Interface设置Integrated Security为 ...

  5. GSON使用之对特殊字符的转换的处理

    很多人是在转换时特殊字符被替换成了unicode编程格式,而我碰到的类似,只不过是后台转换成json字符串到前端,前端解析时 '' 双引号和 / 斜杠被原样转换,冲突了json的关键字符,导致解析时提 ...

  6. [hdu 6191] Query on A Tree

    Query on A Tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Othe ...

  7. Hadoop--Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Starting namenodes on [localhost]

    Unable to load native-hadoop library for your platform... using builtin-java classes where applicabl ...

  8. python(6)之文件

    一.读写文件 以追加文件内容(a).读(r).写(w),读写(r+)的形式打开文件: f = open('yesterday','a',encoding='utf-8')#文件句柄 #输出一行文件内容 ...

  9. matlab作图 latex插图

    推荐用saveas eps,再用eps2pdf转成pdf.这样可以之间pdflatex编译. if result.savepic saveas(gcf,[ pwd '/picture/right_' ...

  10. Linux第八周作业

    一 理解编译链接的过程和ELF可执行文件格式 这张图说明了可执行程序的产生 大致过程为 .c文件汇编成汇编代码.asm, 然后再汇编成目标码.o, 然后链接成可执行文件a.out, 这时可执行文件就可 ...