登录
首页精彩阅读26个示例教你A-Z个非常有用的python小技巧
26个示例教你A-Z个非常有用的python小技巧
2020-03-25
收藏


26个示例教你A-Z个非常有用的<a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>小技巧

作者 | CDA数据分析师

前言

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

  • 简单易学,语法简洁,可以快速入门
  • 超级通用,无论是在开发、运维、数据科学、科研等应用场景下,都完美可行
  • 它具有广泛的模块和库,数量众多且更新快速,一个新出现的算法模型,几个月内就会有对应的、完善的python包出现

在CDA数据科学研究院,我几乎每天都在使用Python来实现数据科学相关工作。 在此过程中,我获得了一些有用的技巧和提示。在这里,我将以A-Z共26条小技巧来分享了其中的一些内容,在拼凑A-Z字母开头的过程中,就出现了一些可能大家没接触过的知识,总有对你有帮助的。

这些“小技巧”大部分是我在日常工作中曾经使用或偶然发现的东西。其中有一些是在Python标准库.docs中发现的。还有,分享几个非常有用的的论坛和网站,首先是awesome-python . com,对,没错,创办者就是那么喜欢python,用awesome-python来命名, 这里有这数百种有趣的Python工具和模块的精选列表,都是非常实用的。

all or any

Python之所以成为如此流行的语言,其众多的原因之一是因为它具有绝佳的可读性和表现力。

人们经常开玩笑说Python是可执行的伪代码。不会用python的人都可以读出他的意思,但是,当您可以编写这样的代码时,您绝对会乐在其中:

x = [True, True, False]
if any(x):     # 如果列表x中任意元素为真
    print("At least one True")
if all(x):     # 如果列表x中所有元素为真
    print("Not one False")
if any(x) and not all(x):      # 列表x中任意元素为真且并非全部元素为真
    print("At least one True and one False")

bashplotlib

看到这个包的名字。可能你能猜到了,您想在控制台中绘制图形吗?

$ pip install bashplotlib

使用bashplotlib包,您可以在控制台中使用图形,当然,其精美度肯定没有图形工具中那么好,但是也是挺好玩的,例如:

$ hist --file data/exp.txt


26个示例教你A-Z个非常有用的<a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>小技巧

collections

Python具有一些非常好的默认数据类型,但是有时它们无法完全按照所希望的方式来运行。幸运的是,Python标准库提供了collections模块。 这个方便的加载项为您提供了更多的数据类型。

from collections import OrderedDict, Counter

# 记住按键的添加顺序!
x = OrderedDict(a=1, b=2, c=3)
x
# 计算每个字符的频率
y = Counter("Hello World!")
y

结果演示:

OrderedDict([('a', 1), ('c', 3), ('b', 2)])

Counter({' ': 1,
         '!': 1,
         'H': 1,
         'W': 1,
         'd': 1,
         'e': 1,
         'l': 3,
         'o': 2,
         'r': 1})

dir

有没有想过如何在Python对象内部查找并查看其具有的属性? 当然有,在命令行中:

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

在交互式运行Python以及动态浏览正在使用的对象和模块时,对于某些python使用者来说,这应该是一个非常有用的功能。

emoji

是的,没错,表情包的那个emoji。

$ pip install emoji

不要假装你不会尝试,给你的python加多点乐趣把!

from emoji import emojize
print(emojize(":thumbs_up:"))
26个示例教你A-Z个非常有用的<a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>小技巧


from future import

Python受欢迎的一个后果是,总是有新版本正在开发中, 新版本意味着新功能。目前python3.8正式版已发布,python3.9发布周期已经开始,到2020年,python2将彻底退出市场。

但是不要害怕。 future模块允许您从将来的Python版本导入功能。 从字面上看,就像时间旅行,魔术一样。

from __future__ import print_function
print("Hello World!")

geopy

对于程序员来说,地理环境可能是一个充满挑战的领域。 但是geopy模块使它变得异常简单。

$ pip install geopy

它通过一系列不同地理编码服务的API来工作。它使您可以获取地点的完整街道地址,纬度,经度甚至海拔高度。还有一个有用的距离包。 可以以您喜欢的度量单位计算两个位置之间的距离。

1、由名字来查位置和经纬度

## 1、由名字来查位置和经纬度
from geopy.geocoders import Baidu, Bing, GoogleV3, DataBC, Nominatim
#geolocator = Nominatim(user_agent="specify_your_app_name_here")
geolocator = Baidu('EiQTTRKzlV3dKN1zcZ3c7iVhIl126xvC')
#geolocator = Bing('Ajg52RB8D2BIXygYwUTcJytDGsgqURLj5lfBptOH4jmTGHHFUvt0cMqdhdhdYfr-')
#geolocator = GoogleV3('AIzaSyAVwjaaOBKbssuyQsvyqQAQDwfuzO1PKCA')

location = geolocator.geocode("广州市CDA数据分析师")
print(location.address)
print((location.latitude, location.longitude))

输出结果:

城市
(23.135336306695006, 113.27143134445974)

2、用坐标来查地点

## 2、用坐标来查地点
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="specify_your_app_name_here")
location = geolocator.reverse("52.509669, 13.376294")
print(location.address)
print((location.latitude, location.longitude))
print(location.raw)

输出结果:

Backwerk, Potsdamer Platz, Tiergarten, Mitte, Berlin, 10785, Deutschland

(52.50958575, 13.3762845319028)

{'display_name': 'Backwerk, Potsdamer Platz, Tiergarten, Mitte, Berlin, 10785, Deutschland', 
 'osm_id': 464904422, 
 'osm_type': 'way',
 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright', 
 'lat': '52.50958575',
 'boundingbox': ['52.5095298', '52.5096533', '13.3762456', '13.3763382'], 
 'place_id': 176241040, 
 'address': {'state': 'Berlin', 'postcode': '10785', 'country': 'Deutschland', 'country_code': 'de','bakery': 'Backwerk', 'city_district': 'Mitte', 'footway': 'Potsdamer Platz', 'suburb': 'Tiergarten'}, 'lon': '13.3762845319028'}

3、计算两坐标距离

## 3、计算距离
>>> from geopy import distance
>>> newport_ri = (41.49008, -71.312796)
>>> cleveland_oh = (41.499498, -81.695391)
>>> print(distance.distance(newport_ri, cleveland_oh).miles)
538.39044536

>>> wellington = (-41.32, 174.81)
>>> salamanca = (40.96, -5.50)
>>> print(distance.distance(wellington, salamanca, ellipsoid='GRS-80').km)
19959.6792674

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模块非常适合了解函数的一些基本信息。 您甚至可以自行调用其方法!

下面的代码示例使用inspect.getsource( )来打印自己的源代码。 它还使用inspect.getmodule( )来打印定义它的模块。最后一行打印出自己的行号。

import inspect

print(inspect.getsource(inspect.getsource))   # 查看非内置函数的函数定义代码
print(inspect.getmodule(inspect.getmodule))   # 查看函数所属模块和安装路径
print(inspect.currentframe().f_lineno)        # 打印这一行所在的行号,如本段代码中此函数在第5行,则返回5

当然,除了这些琐碎的用途外,检查模块对于证明您的代码在做什么很有用。 您也可以使用它来编写自文档代码。

Jedi

Jedi库是一个自动完成和代码分析库。 它使编写代码更快,更高效。除非您自己开发IDE,否则您可能会对使用Jedi作为编辑器插件感兴趣。 幸运的是,您可能已经在使用Jedi。目前 IPython项目使用Jedi作为其代码自动完成功能。

kwargs

该方法不是一个函数或者一个包,而是一种可以使用在函数上的一种小技巧,如示例中自定义的someFunction函数中,有两个参数,且参数未在函数体内未被定义上固定的值。除了正常的参数使用方式,还能使用字典的形式来传递函数的参数,字典对象前面的双星号可以使python知道该字典的内容作为参数值传递给函数。

字典的键是参数名称,值是传递给函数的值。字典的名字不限,不一定要用kwargs,当您要编写可以处理事先未定义的命名参数的函数时,此功能很有用。

dictionary = {"a": 1, "b": 2}

def someFunction(a, b):
    print(a + b)
    return

# 下面执行的效果是一样的
someFunction(**dictionary)     # 这两个星号*是必须加上的,以字典的形式传递参数
someFunction(a=1, b=2)

List comprehensions

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]
print(evens)
print(odds)

Certifies = ['CDA数据分析师', 'CFA特许金融分析师', 'CPA注册会计师']

def research(Certify):
    print("祝贺你通过"+Certify)
for Certify in Certifies:
    research(Certify)

输出结果:

[2, 4, 6]
[1, 3, 5, 7]
祝贺你通过CDA数据分析师
祝贺你通过CFA特许金融分析师
祝贺你通过CPA注册会计师

map

Python通过许多内置功能支持函数式编程。 最有用的功能之一是map()函数-尤其是与lambda函数结合使用。在下面的示例中,map()将简单的lambda函数应用于x中的每个元素。 它返回一个映射对象,可以将其转换为一些可迭代的对象,例如列表或元组。

tlist = [1,2,3,4,5]
y = map(lambda x : x ** 2 , tlist)
ylist = list(y)
print(ylist)     # print out:[1, 4, 9, 16, 25]

# map(lambda x : x ** 2 , tlist)   等价于
def Square(x):
    return x**2
result = []
for i in range(len(tlist)):
    result.append(Square(tlist[i]))
# print out:[1, 4, 9, 16, 25]

可以看到,使用了map()函数+lambda函数的方式,一行简洁的代码就是实现几行的代码的功能。

newspaper3k

如果您还没有看过,请准备让Python的newspaper模块震惊。它使您可以从一系列领先的国际出版物中检索新闻文章和相关的元数据。 您可以检索图像,文本和作者名称。它甚至还具有一些内置的NLP功能。

因此,如果您打算为下一个项目使用BeautifulSoup或其他DIY网站抓取库,不妨试一下更省力的方式,相信我,你会爱上它的

$ pip install news3k

以下以新浪为例,简单做个例子:

import newspaper
sina_paper = newspaper.build('http://www.sina.com.cn/', language='zh')
print(len(sina_paper.category_urls()))          # 搜索到的网站数量
for category in sina_paper.category_urls():     # 逐一打印搜索到的网站
    print(category)

out:
153
http://anli.jiaju.sina.com.cn
http://photo.auto.sina.com.cn
http://www.sina.com.cn/
......


article = sina_paper.articles[125]    # 选取其中一篇
article.download()
article.parse()
print(article.title)

out:多项新政聚焦稳投资 资金加速涌入基建

print(article.text)
out:
原标题:多项新政聚焦稳投资 资金加速涌入基建 来源:经济参考报

专项债、资本金政策双管齐下 补短板全面提速

时至年底,稳投资补短板开始全面提速,尤其是在破解资金来源困局方面,近期多项重磅新政落地:2020年新增专项债额度已提前下达1万亿元,固定资产投资项目资本金管理新规也已正式下发。专家分析,专项债叠加项目资本金,双管齐下助力基础设施项目融资,无疑对稳投资具有重要的促进作用。受益于专项债和项目资本金等新政策措施的支持,今年年底基建投资有望企稳回升。具体而言,有一定经营性收入或收费机制的交通、环保和市政等基础设施投资或将迎来较快增长。
......

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)

something > nothing     # True

something < nothing     # False

something + nothing     # TypeError: unsupported operand type(s) for +: 'Thing' and 'Thing'

pprint

Python的默认print功能可以完成其规定的所有打印的工作。 但是,打印出任何较大的多层的嵌套对象,print打印的结果会直接无格式的直接堆出来,可读性较差。

而pprint模块不一样,它能够打印出标准格式的结果,即使打印多层嵌套的复杂结构时,也会通过缩进打印出来,有很好的可读性。这是任何使用非数据结构的Python使用人员的必备工具。

import requests
import pprint

url = 'https://randomuser.me/api/?results=1'
users = requests.get(url).json()
print(users)             # print正常打印
pprint.pprint(users)     # pprint标准格式打印

print打印结果的部分内容,不太友好,可读性非常差:

{'results': [{'picture': {'medium': 'https://randomuser.me/api/portraits/med/men/22.jpg', 'large': 'https://randomuser.me/api/portraits/men/22.jpg', 'thumbnail': 'https://randomuser.me/api/portraits/thumb/men/22.jpg'}, 'email': 'andy.frazier@example.com', 'login': {'salt': 'lfIp3jL3', 'sha1': 'a9d428929b17a07ec04110c2383bcfab2d7e37a9', 'username': 'happypanda484', 'sha256': '4f63a0c687b9f6147dd7110838489dfa4cc692927b9952dda5d7c088b70febf9', 'md5': '2b676af5708fbf390cebebba10dfb2ef', 'uuid': '0415c30e-3184-4e29-a96b-68a30b4f4e2f', 'password': 'mike'}......

pprint标准格式打印的部分内容,可读性强:

{'info': {'page': 1,
          'results': 1,
          'seed': '9139afcfa8db8189',
          'version': '1.3'},
 'results': [{'cell': '081-287-4240',
              'dob': {'age': 47, 'date': '1972-11-24T04:22:50.682Z'},
              'email': 'andy.frazier@example.com',
              'gender': 'male',
              'id': {'name': 'PPS', 'value': '7870181T'},
              'location': {'city': 'Cavan',
                           'coordinates': {'latitude': '24.4086',
                                           'longitude': '-41.6859'},
                           'country': 'Ireland',
                           'postcode': 92828,
                           'state': 'Cavan',
                           'street': {'name': 'Station Road', 'number': 3614},
                           'timezone': {'description': 'Hawaii',
                                        'offset': '-10:00'}}
              ......

Queue

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

__repr__

在Python中定义类或对象时,提供一种很有用的方式可以将该对象表示为字符串。 例如:

>>> file = open('file.txt', 'r')
>>> print(file)

这使调试代码容易得多。将其添加到您的类定义中,如下所示:

class someClass:
    def __repr__(self):
        return ""

someInstance = someClass()
print(someInstance)
# prints

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

通过Python标准库的uuid模块,可以快速简便地生成通用唯一ID(或“ UUID”)。

import uuid

user_id = uuid.uuid4()
print(user_id)

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

Virtual environments

您有可能同时从事多个Python项目,可能出现有时两个项目依赖于不同的python版本。您在系统上安装哪个?幸运的是,Python的对虚拟环境的支持使您拥有两全其美的体验。 在命令行中输入:

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

现在,您可以在同一台计算机上运行Python的独立版本和安装!

wikipedia

维基百科具有出色的API,允许用户以编程方式访问完全免费的知识和信息。wikipedia模块使访问此API变得非常方便。

import wikipedia

result = wikipedia.page('freeCodeCamp')
print(result.summary)

for link in result.links:
    print(link)

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

xkcd

xkcd是兰道尔·门罗(Randall Munroe)的网名,又是他所创作的漫画的名称。作者Randall Munroe给作品的定义是一部"关于浪漫、讽刺、数学和语言的网络漫画",被网友誉为深度宅向网络漫画。

Python语言也是幽默的,Python的许多官方文档都引用了英国喜剧速写节目“Monty Python's Flying Circus”中最著名的草图。不过,python的幽默感不仅仅限于文档。你可以试试调用一下下面这个库:

import antigravity

YAML

YAML代表 YAML不是标记语言。 它是一种数据格式语言,并且是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))
zipped

out:
{'a': 1, 'b': 2, 'c': 3}

内置的zip()函数接受许多可迭代的对象,并返回一个元组列表。 每个元组通过其位置索引将输入对象的元素分组。您也可以通过在对象上调用*zip()来“解压缩”对象。

以上的内容部分参考Peter Gleeson的分享,非常感谢,以上的A-Z共26个Python小技巧,希望能对您下一个项目有所帮助。


数据分析咨询请扫描二维码

客服在线
立即咨询