Python 批量转化彩色图片为黑白图片

最近遇到了一个新的情景,需要将彩色图片转化为黑白图片,如果手动地去转化一张一张图片,那就真的太原始人了。

用Python,咱只需要几行代码就可以在几秒内转化上千张图片。而且,这个功能的用途相当广泛,不仅能使图片变得深邃,而且还可以简化一些复杂模型的数学计算,具体可见第三部分的分析。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装本文所需要的依赖模块:

pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

看到 Successfully installed xxx 则说明安装成功。

2.编写代码

首先写一下我们的彩色图转单色图的转化函数,接收两个参数,一个是输入文件的路径,一个是输出文件路径:

from PIL import Image

def colorful_to_single(input_img_path, output_img_path):
    """
    彩色图转单色图
    :param input_img_path: 图片路径
    :param output_img_path: 输出图片路径
    """

    img = Image.open(input_img_path)
    # 转化为黑白图片
    img = img.convert("L")
    img.save(output_img_path) 

(又是注释比代码长系列)

然后将你需要转化的图片放到一个文件夹中,我这里命名该文件夹为imgs,然后指定一个输出文件夹 output,如下:

dataset_dir = 'imgs'
output_dir = 'output'

# 获得需要转化的图片路径并生成目标路径
image_filenames = [(
    os.path.join(dataset_dir, file_dir),
    os.path.join(output_dir, file_dir)
) for file_dir in os.listdir(dataset_dir)]

# 转化所有图片
for path in image_filenames:
    colorful_to_single(path[0], path[1])

这里比较难理解的可能是image_filenames,用到了列表推导式,即遍历所有dataset_dir里的文件:

for file_dir in os.listdir(dataset_dir) 

并将其和我们指定的目录以路径的形式链接起来:

os.path.join(output_dir, file_dir) 

最终生成一个数组,第一个元素是输入路径,第二个元素是输出路径:

image_filenames = [(
    os.path.join(dataset_dir, file_dir),
    os.path.join(output_dir, file_dir)
) for file_dir in os.listdir(dataset_dir)]

3.效果及用途

黑白效果就是这样的:

用途当然也有很多了,比如:

1.在深度学习分类图像的时候,如果并不需要考虑颜色的维度,可以先将图片转化为黑白图,简化运算复杂度。

2.黑白图片有的时候比彩色图片更具备冲击力,能够更加突出主题。

3.黑白图片有些时候也有美颜的作用,因为此时注意力的重点在于脸型,如果那个人的脸型特别好看,但是肤色比较差,这时候黑白照片就很有效果。

我们的文章到此就结束啦,如果你喜欢我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 一键生成漂亮的生日快乐词云!

前段时间写了几篇关于生成词云的文章,其中包括:

Python 情人节超强技能 导出微信聊天记录生成词云

Python 绘制悼念的词云蜡烛

等等,但是这几篇文章的转化对象都必须是多词汇组成的,也就是说他们生成词云的条件是词组必须够多,只有一两个词的话无法生成完整词云。

最近遇到许多朋友有特殊的需求,他们只想把 【名字】和【生日快乐】两个词组在一起,祝他人生日快乐,不想弄太复杂的东西,基于前面两篇文章是无法做到的。今天我们就来说说如何用这么少的词汇生成漂亮的词云。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装我们所需要的依赖模块:

pip install wordcloud==1.5.0
pip install scipy==1.1.0
pip install multidict==4.5.2
pip install matplotlib==2.2.4
pip install fire==0.2.1
pip install numpy==1.16.4

看到 Successfully installed xxx 则说明安装成功。或公众号后台回复生日快乐可获得本文全部代码,然后进入文件夹,输入一行命令安装所有依赖:

pip install -r requirements.txt

如果你不想折腾代码,安装完依赖后,输入以下命令就可以生成你的词云:

python birthday.py 图片位置 对象姓名 

如:

python birthday.py example.png 宝典哥

2.编写代码

首先是引入词云对象,并初始化【生日快乐】和对方姓名:

    words = multidict.MultiDict()
    # 生日快乐和姓名的权重必须先初始化两个最大权重的
    words.add('生日快乐', 10)
    words.add(name, 12) 

细心的读者可能发现了,我们在这里用了MultiDict,这主要是因为wordcloud只允许接受【字典】数据结构,而Python内置的字典不允许重复值,所以我们只能引入multidict模块。

然后是插入新的生日快乐词云和对方姓名:

    # 随意插入新的词语
    for i in range(1000):
        words.add('生日', numpy.random.randint(1, 5))
        words.add('快乐', numpy.random.randint(1, 5))
        words.add(name, numpy.random.randint(1, 5)) 

然后我们需要对图片进行一些处理,现在网络上的图片很多都包含一些杂色,因此需要把这些杂色去掉:

def transform_format(val):
    # 用于去除杂色
    if val[0] > 245 and val[1] > 245 and val[2] > 245:
        val[0] = val[1] = val[2] = 255
        return val
    else:
        return val 

然后引入图片,去除杂色:

    # 设定图片
    bimg = imread(file)
    for color in range(len(bimg)):
        bimg[color] = list(map(transform_format, bimg[color]))

    wordcloud = WordCloud(
        background_color='white', mask=bimg,
        font_path='simhei.ttf'
    ).generate_from_frequencies(words) 

生成词云并渲染:

    # 生成词云
    bimgColors = ImageColorGenerator(bimg)

    # 渲染词云
    plt.axis("off")
    plt.imshow(wordcloud.recolor(color_func=bimgColors))
    plt.savefig(name+'.png')
    plt.show() 

完整代码如下:

# coding:utf-8
# Python 实用宝典
# 2020/03/23
import numpy
import multidict
import matplotlib.pyplot as plt
from scipy.misc import imread
from wordcloud import WordCloud, ImageColorGenerator

def transform_format(val):
    # 用于去除杂色
    if val[0] > 245 and val[1] > 245 and val[2] > 245:
        val[0] = val[1] = val[2] = 255
        return val
    else:
        return val

def gen_happy_birthday_cloud(file, name):
    words = multidict.MultiDict()
    # 生日快乐和姓名的权重必须先初始化两个最大权重的
    words.add('生日快乐', 10)
    words.add(name, 12)

    # 随意插入新的词语
    for i in range(1000):
        words.add('生日', numpy.random.randint(1, 5))
        words.add('快乐', numpy.random.randint(1, 5))
        words.add(name, numpy.random.randint(1, 5))

    # 设定图片
    bimg = imread(file)
    for color in range(len(bimg)):
        bimg[color] = list(map(transform_format, bimg[color]))

    wordcloud = WordCloud(
        background_color='white', mask=bimg,
        font_path='simhei.ttf'
    ).generate_from_frequencies(words)

    # 生成词云
    bimgColors = ImageColorGenerator(bimg)

    # 渲染词云
    plt.axis("off")
    plt.imshow(wordcloud.recolor(color_func=bimgColors))
    plt.savefig(name+'.png')
    plt.show()

# gen_happy_birthday_cloud('p2.png', '宝典哥')

3.整合一句运行

接下来,我们使用上次提到的 一行命令实现功能 将这个功能打包成输入命令就能运行的程序,比如:

python birthday.py 图片 宝典哥

在完整代码最后面加一行语句就行了:

import fire
fire.Fire(gen_happy_birthday_cloud) 

当然,别忘了还要import fire模块。最后实验一下:

python birthday.py example.png 宝典哥

我们的文章到此就结束啦,如果你喜欢我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 超方便超快速剪辑音乐

你没看错,Python剪辑音乐,只需要3行语句就能瞬间完成,比如我要剪辑33秒到1分10秒的音乐片段:

from pydub import AudioSegment
song = AudioSegment.from_mp3("end_of_time.mp3")
song[33,[object Object],1000].export('end_of_time_slice.mp3')

运行这个脚本,我们能瞬间完成剪辑:

对于Python而言,这个功能简直太基本了,难以言语的快。这段时间里,你的Adobe Audition 可能还没成功打开 。下面再介绍点更高级的玩法。

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装我们所需要的依赖模块:

pip install pydub

看到 Successfully installed xxx 则说明安装成功。你还需要安装ffmpeg, 这个网络上有许多教程,这里可以看我们上次的提取音乐高潮文章。公众号后台回复音乐剪辑可获得本文全部代码。

1.音量变化

我们还可以修改上面剪辑的这段音乐的入场音量大小和退场音量大小:

from pydub import AudioSegment

# 1秒=1000毫秒
SECOND = 1000
# 导入音乐
song = AudioSegment.from_mp3("end_of_time.mp3")

# 取33秒到70秒间的片段
song = song[33*SECOND:70*SECOND]

# 入场部分提高6分贝, 退场部分减少5分贝
ten_seconds = 10 * SECOND
last_five_seconds = -5 * SECOND
beginning = song[:ten_seconds] + 6
ending = song[last_five_seconds:] - 5

# 形成新片段
new_song = beginning + song[ten_seconds:last_five_seconds] + ending

# 导出音乐
new_song.export('end_of_time_slice.mp3') 

听听看:

效果和预期的一致,想想看,如果这个你用专业的音乐编辑器来做,得画段切片、设置音量,然后保存,细思极恐,太费时间了!Python可能在你打开软件的这段时间里就完成了。

2.重复片段

如何重复我们开头说到的33秒到70秒这段音乐片段?可简单了,你只要会做乘法就行:

from pydub import AudioSegment
song = AudioSegment.from_mp3("end_of_time.mp3")
(song[33*1000:63*1000])*2.export('end_of_time_slice.mp3')  

没错,在pydub中,片段和数量之间的运算里加法调音量,乘法调长度,你记住了吗?

3.渐进渐出

有时候我们的耳朵需要时间来适应音量的变化,尤其是在看短视频的时候,音量忽大忽小实在是太没有用户体验了,这时候渐进渐出的剪辑就尤为关键:

from pydub import AudioSegment

# 导入音乐
song = AudioSegment.from_mp3("end_of_time.mp3")

# 提取片段
song = song[33*1000:70*1000]

# 渐进渐出
awesome = song.fade_in(5000).fade_out(3000)

# 导出音乐  
awesome.export('end_of_time_fade.mp3') 

4.反转音乐

这可能是最有趣和最可能产生特别效果的操作,它会让你完全不认得这首歌:

from pydub import AudioSegment

# 导入音乐
song = AudioSegment.from_mp3("end_of_time.mp3")[33*1000:70*1000]

# 翻转音乐
backwards = song.reverse()

# 导出音乐
backwards.export("end_of_time_reverse.mp3") 

当然,反转音乐后会变得惨不忍睹,这也很正常,原来的“正向规律 ” 倒转后,音调节奏也变了(不排除有特殊口味的人喜欢这种感觉呢)。

把这首歌折腾了这么久,还是得把原曲放给大家听听的。是 K-391 / Alan Walker / Ahrix 的 End of Time(由于网站服务器有限,音质不会太好,建议大家到专业音乐播放器里搜索聆听) :

我们的文章到此就结束啦,如果你喜欢我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!

音乐相关教程:

Python 批量下载网易云音乐歌单

Python 制作音乐高潮副歌提取器

Python Django快速开发音乐高潮提取网(1)

Python Django快速开发音乐高潮提取网(2)

Python Django快速开发音乐高潮提取网(3)

Python 超方便超快速剪辑音乐

Python 提取音乐频谱并可视化


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

网飞公司(Netflix)是怎么用Python的?

本文译自网飞科技博客,原文:
https://netflixtechblog.com/python-at-netflix-bba45dae649e?gi=83b411a8aff

Netflix(网飞)是全球最大的视频流媒体平台,在除中国大陆地区之外的所有国家和地区都提供视频点播服务。Netflix是经营在线业务公司中的一个亮点。它成功地把传统的影像租赁业务和现代化的市场营销手段、先进的IT网络技术结合起来,从而开创了在线影像租赁的新局面。Netflix通过整合其自身的营销手段和最近的IT网络技术,成功地改变了消费习惯和打造了自己的品牌优势。

Netflix的技术本质上就是回答两个问题:

1. 如何提升用户观看体验?

2. 如何在内容上让用户喜欢?

而这两个问题,在Python的帮助之下,交了一份令人满意的答卷,让我们一起来看看 Python 在 Netflix 是如何应用的。

1.加快视频分发速度

为了加快视频的分发速度,网飞开发了一个名为 Open Connect 的内容分发网络(content delivery network,CDN),尽可能靠近用户,为客户改善流媒体体验,加快视频的下载速度。

而设计、构建和运营这个 CDN 基础设置所需的各种软件系统,其中很多都是用 Python 编写的。其有一个配置信息管理系统,里面跟踪网飞的网络设备库存:有哪些设备、哪些型号,用什么硬件组件,都位于什么位置。这些设备的配置由几个其他系统控制,包括数据源、设备配置的应用和备份。用于收集运行状况和其他运营数据的设备交互是另一个 Python 应用程序。

2.快速解决运营需求

网飞还用Python负责处理Netflix云的区域故障转移,流量管理,容量运营管理(管理内容可以维修的限制)等内容,使用的Python模块大致如下:

NumPy和SciPy

NumPy和SciPy是用于科学计算的库。Netflix使用这些Python库来执行数值分析,从而允许管理区域故障转移。

Boto3

Boto3是适用于Python的AWS(Amazon Web Services)的软件开发工具包(SDK)。这有助于Python开发人员将Python集成到AWS中,从而允许在基础架构中进行开发。

RQ(Redis队列)

这是一个Python库,可帮助跟踪队列中存在的任务并允许其执行,从而允许管理异步工作负载。

Flask

最后,Netflix使用Flask(Python Web开发库)API将所有先前的功能绑定在一起。

他们的工具主要是由 Python 构建的。编排故障转移的服务使用 numpy 和 scipy 来执行数值分析,boto3 对 AWS 基础设施进行更改,rq 用于运行异步工作负载,将其打包在一个 Flask API 的简单接口层中。放入 bpython shell 并进行临时制作的能力已经不止一次挽救了局面。

( bpython是一个不错的Python解释器的界面,开发者的目的是提供给用户所有的内置功能,很像现在的IDE(集成开发环境),但是将这些功能封装在在一个简单,轻量级的包里,可以在终端窗口里面运行,弥补原始解释器的不足。)

3.警报与统计、 自动修复

他们还用警报和统计分析工作中使用 Python。警报系统显示问题时,他们使用Python的许多统计和数学库(如 numpy、scipy、ruptures、pandas)来帮助自动分析 1000 多个相关信号。并开发了一个用于团队内外的时间序列相关系统 Spectator Python,以及分布式工作系统,用于并行处理大量的分析工作,以快速交付结果。

除此之外,他们也经常用Python来自动化任务、数据挖掘和清理的工具,也是可视化工作的方便工具。

4.信息安全

安全猴子徽标2017

网飞信息安全团队使用 Python 为 Netflix 实现了许多高层次目标:安全自动化、风险分类、自动修复和漏洞识别等等。利用 Python 来保护使用 Bless 的 SSH 资源、利用 Python 帮助使用 Repokid 进行 IAM 权限调整、使用 Python 来帮助Lemur 生成 TLS 证书等等。

5.个性化推荐

说起个性化算法,当然少不了机器学习和深度学习。他们使用 Python 来训练一些 Netflix 影响用户体验关键方面的机器学习模型,如决策树、XGBoost等,而且在开发过程中,实现了一套自动化流程。

6.优化Python极限

为了使得生产效率提高,他们还利用机器学习开发了一个叫Metafolw的Python框架。这个框架提升了 Python 的极限,通过良好的设计和对Python代码的部分改造,成功实现了使用Python来获取几十G数据的可能性,大大提升了计算能力。

7.大数据编排

为了更好地编排大数据,他们还构建了一个用Python编写的事件驱动型平台,将许多个系统统一到该工具中,转化成事件流的形式进行调度,并具有模板化的作业类型。

因此,他们能够随时解耦微服务,而且通过这个平台,他们能够了解数据的流动状况,以及发生的所有事情。当然,Netflix 的系统之所以能够如此稳定,还有更多的技术因素在里面,这里就不能够再赘述了。有兴趣可以看看下面这本书。

《 混沌工程:Netflix系统稳定性之道 [Chaos Engineering]


文中涉及到的部分项目、库的官方地址:

Open Connect: https://openconnect.netflix.com/en/

bpython: https://bpython-interpreter.org/

nteract: https://nteract.io/

visualization tools: https://github.com/nteract/nteract/tree/master/packages/data-explorer

Spectator: https://github.com/Netflix/spectator-py

Security Monkey: https://github.com/Netflix/security_monkey

Bless: https://github.com/Netflix/bless

我们的文章到此就结束啦,如果你喜欢我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 小游戏—加农炮送特朗普上太阳

美股熔断历史上只发生过4次,上上次熔断和上一次熔断,还要追溯到2020年3月9日和2020年3月13日,那两天我的记忆很深刻,那感觉,仿佛就在几天前。

话又说回来了,特朗普可是说过狠话的:

这是在2015年竞选期间他发过的一条推特:“如果有一天道琼斯指数单日狂跌超过1000点,那当时的总统就应该被装进加农炮里,以极快的速度被射向太阳。不能找任何借口!”

嘻嘻,见过骗吃骗喝的,还第一次见骗太空游的。而且还骗了3次,这招高明。 不过,各大媒体很快辟谣,推特实际上是网友的p图,特朗普本人可没有立过这样的flag。

不过这真的是一个有趣的话题,今天我们就来用Python模拟一下,制作一个太空小游戏。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装我们所需要的依赖模块:

pip install freegames
pip install turtle

看到 Successfully installed xxx 则说明安装成功。你可以在Python实用宝典公众号后台回复:加农炮的特朗普 获得本文完整数据和代码。

2.编写代码

原理很简单,就是用到了张特朗普的漫画图和freegames模块,以及turtle画图模块。turtle画图模块我们以前也写过不少文章,大家不了解可以看看:

1.Python turtle 画雪花
2.Python turtle 深入理解递归

2.1 模块加载与设定图像

首先,引入turtle模块,和freegames模块,我们这一次实验需要用到freegames模块里的向量vector(用于表示坐标)。

import turtle
from random import randrange
from freegames import vector

# 设定screen
screen = turtle.Screen()
screen.setup(420, 420, 370, 0)

# 加载trump图,并设为默认turtle
trump = '3.gif'
screen.addshape(trump)
turtle.shape(trump) 

2.2 准备画图

在开始画图之前,由于需要用特朗普头像作为移动点,我们需要隐藏原有的turtle对象,并设置不显示tracer,即特朗普移动的时候不画线。

最后设定当用户点击画布的时候,执行tap函数

turtle.hideturtle()
turtle.up()
turtle.tracer(False)
turtle.onscreenclick(tap) 

tap函数如下,即设定球体的位置和初始速度。

def tap(x, y):
    """
    回应屏幕点击
    :param x: x轴位置
    :param y: y轴位置
    """
    if not inside(ball):
        ball.x = -199
        ball.y = -199
        speed.x = (x + 200) / 25
        speed.y = (y + 200) / 25 

2.3 开始画图

这一部分的核心是move函数,不过在说道move函数前,我们要重点讲一下如何将原有端点换成特朗普的头像,那就是draw函数的功能:

def draw():
    """
    绘画出太阳和trump
    """
    turtle.hideturtle()
    turtle.clear()

    for target in targets:
        turtle.goto(target.x, target.y)
        turtle.dot(20, 'red')

    if inside(ball):
        turtle.showturtle()
        turtle.goto(ball.x, ball.y)

    turtle.update() 

还记得我们在一开始就将特朗普的头像设定为turtle的shape了吗?然后在move函数运行之前,又将turtle的点隐藏了起来,其实这个时候隐藏的就是特朗普的头像。而在开始移动的时候,我们仅需要将turtle重新show回来即可。因此核心语句便是:

turtle.showturtle()
turtle.goto(ball.x, ball.y)

这两句控制了头像的移动。

接下来看看move函数主体:

def move():
    """
    移动太阳和trump
    :return:
    """

    # 生成"太阳"球体
    if randrange(40) == 0:
        y = randrange(-150, 150)
        target = vector(200, y)
        targets.append(target)

    # 移动太阳
    for target in targets:
        target.x -= 0.5

    # 如果Trump在屏幕内,减速并移动
    if inside(ball):
        speed.y -= 0.35
        ball.move(speed)

    # 重新渲染"太阳"位置
    dupe = targets.copy()
    targets.clear()

    # 和Trump距离太近,则消去球体
    for target in dupe:
        if abs(target - ball) > 13:
            targets.append(target)

    # 渲染画布
    draw()

    # 没有目标了则终止游戏
    for target in targets:
        if not inside(target):
            return

    # 每隔50毫秒递归调用本函数
    turtle.ontimer(move, 50) 

其实注释写的挺清楚的,但是这里我们还是详细解释一下:

1.首先需要生成“太阳”球体,这里用到了vector,是一个用于生成坐标的函数,y是随机产生的,所以球体初始位置都在最右边(200, y)。
2.平移所有的太阳,包括新增的。
3.如果屏幕内存在Trump头像,令其移动。
4.重新渲染太阳位置,用新坐标代替,若和Trump距离过近,则消去该球体。
5.渲染所有的球体和Trump的新位置
6.如果没有球体了,则终止游戏,否则每50毫秒重新调用本函数。

基于这个逻辑大家也可以写一个属于自己的游戏哦。

3.玩笑终归玩笑

当然,这只是个游戏,Trump其实没说过加农炮送上太阳的那句话,不过近期美股的形式确实令人担忧。即使在美联储将利息降为0、大放水7000亿美元的情况下,依然无法挽回局势,不容乐观。

金融市场雪崩在劫难逃,站在金融周期的角度看,十年一次的洗盘即将到来,普通人如何保护好自己?那当然就是学习更多的本领啦!欢迎关注下方的Python实用宝典,优质的Python教程将源源不断奉出。

我们的文章到此就结束啦,如果你喜欢我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 计算 瑞幸和星巴克 谁的门店最多

如果不借助他人的数据,你能自己算出瑞幸咖啡和星巴克咖啡其各自的门店数量吗?

让你自己算出一个精确的值,你会使用什么方法进行计算一线城市门店数量?

难度高一点点,你怎么样才能知道二线城市的门店总数,甚至是全国的门店数量?

用我们今天的方法,你可以知道,瑞幸咖啡在一线城市的数量是:1634间,而星巴克则为:1587间

往下看答案之前,你可以想想有几种方法可以实现我们的目的。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装我们所需要的依赖模块:

pip install requests

看到 Successfully installed xxx 则说明安装成功。你可以在Python实用宝典公众号后台回复:咖啡门店数 获得本文完整数据和代码。

2.获取门店数

怎么样,文章开头提出的问题你想到答案了吗?

其实很简单,那就是调用地图的接口进行门店搜索。 通过这个方法,我们不仅可以算出门店的数量,还能得到每个门店的对应位置,并且可以用来做后续的数据分析:

所以现在问题就转化为找到有提供搜索接口的地图供应商,而且这个接口得是免费的,因此我找了腾讯地图的接口:

https://lbs.qq.com/

你只需要上去注册账号,申请Key即可调用相关的接口,申请完了记得开webserviceAPI,选择签名校验的形式调用接口:

2.1 初始化

为了使用API,我们得先初始化请求链接及其所需要的参数:

class LocationSearch(object):

    def __init__(self, keyword: str):
        self.keyword = keyword
        self.key = '你的Key'
        self.sk = '你的校验sk'
        self.url = (
            'https://apis.map.qq.com/ws/place/v1/search?'
            'boundary=region({},0)&key={}&keyword={}'
            '&page_index={}&page_size=20'
        )

Key是在你申请API权限的时候就会分配给你的,而sk是在你选择 签名校验 的形式调用接口时分配给你的。

那么我们如何用这两个数据请求接口呢?请看下面这个函数:

def request_data(self, location: str, page: int):
    """
    请求接口数据
    Arguments:
        location {str} -- 地点
        page {int} -- 第几页
    
    Returns:
        {list} -- 该页该地点的数据
        {int} -- 该地点结果总数
    """
    # 拼接链接
    url = self.url.format(location, self.key, self.keyword, page)
    # 获得数字签名,并将签名加到链接后面进行请求
    wait_sig = url.split('qq.com')[1] + str(self.sk)
    sig = hashlib.md5(wait_sig.encode('utf-8')).hexdigest()
    res = requests.get(url + '&sig=' + sig)
    # 获得数据返回
    pois = res.json()['data']
    # 避免请求上限
    time.sleep(0.2)
    return pois, res.json()['count'] 

首先是将初始化的请求链接拼接起来,然后由于需要签名校验,因此我们得如下进行操作:

GET请求分为:域名,请求路径和参数三个部分,用于签名计算的有:
请求路径: /ws/place/v1/search?
请求参数: boundary=region({},0)&key={}&keyword={} &page_index={}&page_size=20
注意{}是待填充的

1. 首先对参数进行排序:按参数名升序(本例结果为 boundary 在前,key在后,如果第一个字母相同,要依据第二个字母升序):
boundary=region({},0)&key={}(….后面略)

2. 签名计算(sig):
请求路径+”?”+请求参数+SK进行拼接,并计算拼接后字符串md5值,即为签名(sig):
要求:请求参数必须是未进行任何编码(如urlencode)的原始数据
md5(” /ws/place/v1/search?boundary=region({},0)&key={}&keyword={} &page_index={}&page_size=20你的SK“)

计算得到结果类似为:22dxxxxxxxxxxxxxx2b0bcc0e50

3. 生成最终请求:将计算得到的签名sig,放到请求中(参数名即为:sig):
https://apis.map.qq.com/ws/place/v1/search? boundary=region({},0)&key={}&keyword={} &page_index={}&page_size=20&sig= 22dxxxxxxxxxxxxxx2b0bcc0e50

注意:计算 sig 要使用原始参数值,不要进行任何编码,但最终发送时的参数,是需要时行url编码的

最后拿到返回的值,里面带有所有结果的地理位置及结果的数量。

2.2 按地点返回结果

这一部分其实很简单,就是调用2.1的函数,然后实现分页保存变量,最后输出门店数量,返回数据。

def get_single_location(self, location: str):
    """
    获得单个地点的数据
    
    Arguments:
        location {str} -- 地点
    
    Returns:
        {list} -- 该地点某关键词的所有数据
        {int} -- 该地点某关键词的所有数量
    """
    page = 1
    location_data = []
    pois, total = self.request_data(location, page)
    for poisition in pois:
        location_data.append(poisition)
    # 如果有多页
    while (total / 20) > page:
        pois, _ = self.request_data(location, page)
        for poisition in pois:
            location_data.append(poisition)
        page += 1
    print(f'{self.keyword} {location} 门店总数为:{total}')
    return location_data, total 

计算一线城市的结果如下:

F:\push\20200315>python scrapy.py
瑞幸咖啡 北京 门店总数为:492
瑞幸咖啡 上海 门店总数为:581
瑞幸咖啡 广州 门店总数为:301
瑞幸咖啡 深圳 门店总数为:260

2.3 汇总结果并保存

接下来我们需要汇总2.2计算到的每个城市的数据,保存到json文件,并计算总数。

def get_cities_data(self, cities: str):
    """
    获得所有城市某关键词的数据
    
    Arguments:
        cities {list} -- 城市列表
    """
    result = []
    keyword_count = 0
    for city in cities:
        # 获得该城市的所有门店和总数
        data, count = self.get_single_location(city)
        keyword_count += count
        result.extend(data)
    print(f'{self.keyword} 一线城市门店总数为:{keyword_count}')
    # 导出数据
    with open(f'{self.keyword}.json', 'w') as my_file:
        json.dump(result, my_file, ensure_ascii=False) 

最终可以获得一个 瑞幸咖啡.json 的文件,里面存有每个城市的咖啡店精确位置,并输出一个总数,这样调用即可:

if __name__ == '__main__':
    cities = ['北京', '上海', '广州', '深圳']

    loc = LocationSearch('瑞幸咖啡')
    loc.get_cities_data(cities)

    loc = LocationSearch('星巴克咖啡')
    loc.get_cities_data(cities)

F:\push\20200315>python scrapy.py
瑞幸咖啡 北京 门店总数为:492
瑞幸咖啡 上海 门店总数为:581
瑞幸咖啡 广州 门店总数为:301
瑞幸咖啡 深圳 门店总数为:260
瑞幸咖啡 一线城市门店总数为:1634

星巴克 北京 门店总数为:380
星巴克 上海 门店总数为:797
星巴克 广州 门店总数为:209
星巴克 深圳 门店总数为:201
星巴克 一线城市门店总数为:1587

看来瑞幸咖啡一线城市里的门店数量已经超过星巴克了,不愧是割资本主义国家韭菜,造福中国老百姓的企业啊!

3.扩展

就像文章开头所提到的,如果你需要算出每个城市的咖啡店数量其实也很简单,咱可以调用下面这个接口请求腾讯地图的所有行政区数据,获得所有城市的名称:

https://apis.map.qq.com/ws/district/v1/list

不过我已经dump了一个,大家在Python实用宝典公众号后台回复:咖啡门店数 即可获得。

使用这一个,你只需要读取该csv文件提取所有城市名,然后放入cities变量中进行计算,如下代码所示:

if __name__ == '__main__':
    with open('cities.csv', 'r', encoding='utf-8') as csvfile:
        reader = csv.reader(csvfile)
        cities = [row[0] for row in reader]

    loc = LocationSearch('瑞幸咖啡')
    loc.get_cities_data(cities)

    loc = LocationSearch('星巴克咖啡')
    loc.get_cities_data(cities)

不过,请注意一些特殊情况,比如说那个城市没有数据的时候,接口可能不会返回date数据,这时候要用字典的get方法进行处理:

# pois = res.json()['data']
pois = res.json().get('data', []) 

不过如果你要计算全国的数据的话,这个方法并不可靠,因为无法避免山寨店的存在,山寨店一样也会被记入到腾讯地图中,而一线城市的监管严格,比较少出现山寨店的情况,因此可以用这个方法计算。

我们的文章到此就结束啦,如果你喜欢我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 精美俄罗斯方块开源项目

最近想找一些Python相关的游戏开发例子,正好在itch.io上闲逛看到这个俄罗斯方块项目,瞬间被惊艳到了。作者是 Mikhail ,项目地址是:
tetris_for_two: https://gitlab.com/2pi360/tetris_for_two

1.游戏介绍

下面就给大家介绍一下这个用Python写的俄罗斯方块具体功能。它一共有七个游戏模式:

1. 单人模式
2. 普通双人模式
3. 镜像双人模式(即掉落方块都一样)
4. 双人加速模式(每消去一行都会给对方加速)
5. 双人交换控制模式(一次控制自己的方块,一次控制对方的)
6. 双人平衡模式(会改变对方的容量)
7. 双人单容器模式

没错,是不是被这丰富的游戏模式震惊到了?而且这款游戏的界面设计也是相当简洁舒服(而且玩这样的Python开源游戏,你永远不会被广告气到):

不仅如此,除了wasd和上下左右键,它还支持用游戏手柄(仅一个)进行游戏,并且能切换两个玩家的按键设置:

双人模式类似如下, 非常适合小情侣之间消耗时光哦(如果你们都喜欢玩俄罗斯方块的话)

尤其是双人协作模式,两个人一起解决问题也是增进感情的好方法:

还有其他几种游戏模式,大家可以上 itch 上下载游戏体验,或者在公众号后台回复 俄罗斯方块 下载完整源代码和游戏包(各个系统都有)。

2.源码剖析

当然,我们首要目的还是学习这款游戏的源代码,下面就给大家介绍一些这款游戏的部分核心代码。下载该开源项目后,你会发现它的py文件分布如下:

│ base.py
│ game_modes.py
│ main.py
│ run_to_release.py
│ tetris.py
│ … ….
├─assets
│ … …

└─screens
… …

其中,main.py是程序的入口点,首先看看模块引入,sys的引入是当然的,游戏结束的时候需要调用

sys.exit()

使得Python程序正常退出。pygame是这个游戏的引擎,是一个比较老的基于Python的2D游戏引擎,但也因为存在时间长,所以已经是一个很成熟且易上手的2D游戏开发库 。

作者自己写了两个模块,一个是base,里面有画布配置、按键配置、玩家配置等等一系列游戏的基础设置。而 game_modes 则是七种游戏模式的逻辑所在模块,里头还引用了tetris.py,这个模块定义了整个俄罗斯方块旋转的方法及其数据结构。

不过由于时间关系,我们重点看看base里的主循环main_loop:

pygame.time.Clock() 用于配置游戏的帧数,Clock.tick(frameate) 代表每秒framerate帧运行,也就是说,每秒不会执行超过 framerate 次循环 。这个参数的值,我们可以在主函数里看到是600. 也就是这个循环每秒不会超过600次。

pygame.event.get() 是pygame游戏引擎的事件处理器,它用于处理所有的事件,好像打开大门让所有的人进入,然后我们可以根据事件不同的属性做相应的操作,如 event.type == pgl.KEYDOWN 表示键盘被按下时,执行条件中的语句:

pressed_keys.add(event.key) 

于是便将其加入到pressed_keys集合中,yield返回生成器,也就是说只要程序不被终止,这个函数就会不断地返回四个值: events, time_passed, pressed_keys 或 {(0, 0)}。events就是用户触发的事件,time_passed就是这些事件的时长,pressed_keys即用户按下的键。

这样就完成了一次用户事件的传递,然后再又后端对用户的事件进行处理,展示在游戏当中。当然,更复杂的还在后面,这里只是一个简单的事件处理,当然也是最重要的事件处理部分,如果大家有兴趣的话,可以 在公众号后台回复 俄罗斯方块 下载完整源代码进行学习。

我们的文章到此就结束啦,如果你喜欢我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 机器学习预测泰坦尼克号存活概率

在泰坦尼克号上你能活下来吗?Python告诉你!

泰坦尼克号是英国的一艘客轮,在1912年4月的一个清晨,其从南安普顿出发,在行驶至目的地纽约的途中与冰山相撞后沉没,船上估计共有2224名乘客和船员,死亡1500多人,成为现代历史上最严重的和平时期海上灾难。

今天,我们将在著名的泰坦尼克号数据集上创建机器学习模型,这个数据集提供了有关泰坦尼克号上乘客的数据,比如经济状况、性别、年龄等等,让我们组合这些特征,构建一个根据参数预测某些人是否能够在当时那种情况下存活的机器学习模型,甚至可以用来测测自己存活的概率。

此图像的alt属性为空;文件名为2020031018172170.png

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装我们所需要的依赖模块:

pip install numpy
pip install pandas
pip install seaborn
pip install matplotlib
pip install scikit-learn

看到 Successfully installed xxx 则说明安装成功。啊,别忘了,还要下载数据集,你可以上kaggle官网进行下载,也可以在Python实用宝典公众号后台回复:泰坦尼克号 获得本文完整数据和代码。

2.分析基本数据

在开始使用机器学习进行分析前,我们需要先做一些常规的数据分析,比如缺失值检测、特征数量、基本关联分析等。

2.1 缺失值

首先是缺失值检测,这样的数据集不可能没有缺失值,我们在开始机器学习分析之前就应该把缺失的数据情况分析清楚。

这时候就要善用工具了:7行代码巧用Python热力图可视化表格缺失数据,丰富的知识积累在这个时候就能派上用场。生成热力图:

可见,cabin和Age的缺失值最多,这两列数据到了不得已的情况的话需要删除掉。还有Embarked有几个缺失值,这种情况好处理,我们用填充的方法就可以解决。热力图代码:

2.2 找到特征变量

这一小节,我们重点要找出哪些变量能使得乘客的存活率更高,比如年龄和性别、上船的位置、等等。

首先从年龄、性别上进行分析,根据训练集绘制如下的分析图:

我们可以看到,男性的死亡率其实更高,大体体现了让女性和儿童先逃亡的原则。对于5到18岁的男性而言,存活下来的几率似乎非常低,不过这可能是因为船上这个年龄段的人数少导致的。

再往下看,客舱等级和上船地点是否会对生存率造成影响?请看下图,Embarked是上船港口,pclass是客舱等级,数字1为头等舱。

可以看到,头等舱乘客的存活率高于其他舱的乘客,而且,C港口上岸的人男性存活概率大于女性,这不得不让人怀疑C港口乘客的品德了。

还有一点,亲戚越多是不是越可能存活呢?

可以看到,亲戚数量在1到3的人最有可能存活,不过,大于3之后的存活率可就不太好看了。

这部分可视化的代码如下:

3.机器学习预测

首先我们得根据刚刚的数据分析进行数据预处理,去除掉对我们模型没有帮助的数据【 乘客ID 】。

此外,【cabin】 实在是缺太多了,我们在这里也把它们都去掉。

【name 】 维度,名字要数字化才能分析,为了简化步骤,这里也去除掉。

还要去掉的一个是【Ticket】,都是唯一值,对我们而言没有意义,去除掉。

3.1 补全缺失数据

当然还得补完整我们的缺失值。根据年龄的平均值和标准差求得年龄的随机数,填充缺失的年龄数据。登船点均用S地来替代。

3.2 数字化数据

这里我们一共需要数字化三个维度:

1.票价,从浮点型转整形
2.性别转数字
3.上岸点转数字

不得不说,pandas是真的方便。Map就完事了。

3.3 单值转段值

由于年龄是一个一个的数字,在数据量不够大的情况,这样一个一个的数字没太大意义,我们要按照年龄段进行划分,票价也是如此,我们一起转化了:

3.4 创建模型

终于到了关键点了,然而这里是整个第三节最简单的部分,因为sklearn模块已经帮我们包装好了所有需要做的东西,我们需要做的仅仅是调用模块、传入数据训练、测试。

我们使用随机森林模型(说实话如果没有sklearn,这个模型能写到我头秃),关于随机森林的介绍可以看这一篇文章,其实就是解决了决策树的过拟合问题,这篇文章讲得通俗易懂:
https://blog.csdn.net/mao_xiao_feng/article/details/52728164

训练和测试的代码如下:

准确率如下:

>> python 1.p
0.9034792368125701

准确率有90%,这是挺高的准确率了,让我们把自己的情况带入进去,看看能不能存活,最终数据格式是这样的,你只需要把自己的情况带入,然后往测试数据追加属于你的一行即可:

比如我应该会坐二等舱(其实是三等舱,但是想想我都坐泰坦尼克号了为什么不坐二等舱?);Sex为 1 (男性),Age在范围 3 中(老了啊);SibSp是在船兄弟姐妹配偶的数量,Parch是在船父母、儿女数量,由于我可能是一个人出游,这里我们都设为 0,然后票价Fare应该是 2,Embarked随意选0.

>> python 1.py
1

天啊,我竟然能活下来,不容易 (滑稽,不知道是不是换了个舱的缘故) 。大家也试试看吧。完整代码太长了,在这里就不放出来了,大家可在Python实用宝典公众号后台回复 泰坦尼克号 获取。

本文参考自 https://towardsdatascience.com/predicting-the-survival-of-titanic-passengers-30870ccc7e8

我们的文章到此就结束啦,如果你喜欢我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 编程的最好搭档—VSCode 详细指南

刚学Python的同学可能会觉得每次写Python的时候都得打开Cmd有点烦躁,直接上手Pycharm的同学可能会觉得这软件太笨重了,晦涩难用。那么有没有省去打开CMD的步骤,又能弥补Pycharm笨重的特点的软件呢?——答案是VSCode.

诞生于2015年的VSCode编辑器,现在可以说是目前最强的编辑器之一,在微软的背书下,比各位历史悠久的老大哥成长快得多,不到5年的时间里便坐到了市场占有率第一的位置。这么短的时间里,它是怎么成功的?答案是:简单,可扩展性强

编辑器,简单很重要。还记得我多年前第一次用Vim编辑器时搜索的第一个问题:怎么退出Vim?一个工具的学习曲线会直接影响该工具的受众数量,对于编辑器而言尤其如此。任何使用起来复杂的东西最终都会被更容易使用的东西替代掉,不过Vim有其在运维方面的独特优势,所以它暂时是不可替代的。

Vim的不可替代是在服务器层面,对于我们在桌面端编程而言,越简单好用的编辑器越好,不要搞骚操作,最终烦的是自己。这就是为什么VSCode越来越火爆,而且它不仅简单易用,还能覆盖几乎所有语言的编写,如果我有一个小项目需要涉及到前后端所有代码,用VSCode一个编辑器就能解决了,而不是前端切Webstorm,后端切Pycharm.

好了,接下来就让我们来上手VSCode.

1.安装

毕竟是微软大爷的产品,安装VSCode你几乎不会遇到问题,打开:
https://code.visualstudio.com/

选择适合自己系统的版本下载安装,一路默认即可:

2.使用

如果你看不惯英文版的编辑器,下面教你怎么装中文插件:

2.1 中文插件

1. 点击View – Command Palette (或输入 Ctrl + shift + P) 进入命令面板.

打开命令面板

2. 输入 configure language, 选择Configure Display Language (配置显示语言)。

Configure Display Language

3. 检查有没有zh-cn的选项,如果有,直接选择zh-cn替换。然后按照提示重启vscode就能看到界面变回中文了。

如果没有zh-cn的选项,则选择install additional languages (添加其他语言选项),左边会弹出扩展窗口,扩展窗口找到中文简体,点击 install 安装,重复 第 1, 2 步骤 选择中文即可。

install additional languages

2.2 使用终端(Terminal)

这是用VSCode编写Python最核心的地方,你不用打开丑丑的CMD,直接在VSCode中就可以运行Python。

点击 【查看—终端 】 或直接快捷键 【Ctrl + ` 】 打开终端,会在下方产生一个CMD控制台:

在这里你做的最新修改都可以直接 python xx.py 运行:

不过要注意一下当前的文件夹是否和Python脚本文件处于同一个目录,如果不在同一个目录则要cd进去。

2.3 一键运行

很多同学都想一键运行Python,而非以命令的形式运行,这时候就需要Python扩展了,打开扩展页,输入Python,选择第一个进行安装 install 即可:

重新加载VSCode生效,在这后编辑完代码按F5即可运行(如果你不需要输入参数的话),初次运行可能会让你选环境,选择Python即可。

默认按F5后进入DEBUG模式,需要再按一次F5程序才会运行,如果要按F5马上运行需要将launch.json文件的 “stopOnEntry”: true,改为 “stopOnEntry”: false。 launch.json文件在设置中可以找到,如下图所示:

3.其他扩展

3.1 语法提示,配置flake8

写代码没有语法提示,其实是很难受的一件事情,IDE直接帮你做了这件事,不过VSCode需要你稍微配置一下:

1. 打开终端,输入 pip install flake8 安装flake8,我已经装过了,你的提示应该跟我的不一样:

2. 在settings.json文件中输入”python.linting.flake8Enabled”: true

3.2 自动格式化代码

Yapf是谷歌开源的一个用于格式化Python代码的工具,可以一键美化代码。支持两种规范:PEP8和Google Style,下面的步骤和3.1类似的就不再补图啦:

1. 打开终端

2. 输入 “pip install yapf” 安装yapf

3. 在settings.json文件中输入”python.formatting.provider”: “yapf”

4. 用一个看看, 按下快捷键 Alt+Shift+F 即可自动格式化代码。

3.3 文件及文件夹图标

默认的VSCode图标没有那么详细,只有几个重要文件类型的图标提示,可以安装vscode-icons解决,Mac的有vscode-icons-mac版本。如图所示:

之后的文件显示就详细多了:

3.4 生成注释格式

这个是我强烈推荐的插件,搜索docstring,目前排在第四位,由Nils Werner开发的autoDocstring,优秀的代表:

之后,你只需要在函数名后面输入三个双引号然后回车,即可生成docstring注释:

按Tab可以直接切换需要输入的位置,而不用鼠标去点击,加快了注释效率。不过,我有点不喜欢它comment出现的位置直接在三个双引号的后面,有点不太雅观,可能这就是东西方美感的差异?

3.5 更强大的自动补全

搜索Kite,安装下面这个插件:

然后需要安装一个叫 Kite Engine 的软件,直接前往官网下载对应的系统版本即可:

安装完成后,你可以不注册,一路下一步即可,然后返回VScode体验一下它的强大:

具有丝毫不逊色于Pycharm的代码补全功能。

VsCode系列文章:

Python 使用VS Code进行调试

VSCode 设置中文

Python 编程的最好搭档—VSCode 详细指南

我们的文章到此就结束啦,如果你喜欢我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

这些 PyCharm 高效操作你知道吗?

图片

熟话说,工欲善其事,必先利其器,PyCharm 作为最好用的 IDE 工具,有着各种各样的骚操作,这是高级开发工程师必须熟悉的基本技能。

pycharm 小技巧是很多的,今天就给大家推荐一些看似简单确非常高效的操作。让你脱离 CV 工程师走向更高一级台阶。

0x01 更换背景图

哈,每天的工作就是面对一堆代码有时候也是会觉得挺烦心的是吧,特别是找 bug 找好久依旧定位不到问题的时候,这时候就体现出男女搭配干活不累的好处了,通过更换 IDE 的背景图让你的程序员鼓励师每天不重样。

设置路径如下:Preferences -> Appearance -> Background Image

至于去哪里找程序员鼓励师的高清图片,我相信你们知道的肯定比我多,对吧。

图片

0x02 打开最近打开的文件

有时候打开的文件实在是太多了,tab 栏就会被占满,想定位到自己想要的文件还是很麻烦的,这时候这个快捷键操作就派上用场了,「command + E」,可以直接打开自己最近编辑过的文件,方便快捷,按两下有惊喜哦。

图片

0x03 查看源码

有时候代码一多,看起来很乱,根本不晓得这个变量是在哪里定义的,用来干嘛的,这时候就可以通过「command + B」来快速定位到定义变量的位置,亦或者在将光标定位到函数位置,按「command + B」可以直达函数的内部实现,看开源代码时特别方便。

图片

0x04 开启新的一行

写程序我们经常需要换行,这都是常规操作,如果你还是先将光标定位到行尾或者行首,之后按 Enter 键来换行,效率就有点低了。如论你的光标在一行的哪个位置,都可以通过「shift enter」在本行后面开启新的一行,通过「command + option + enter」在本行前面开启新的一行。

图片

0x05 快速返回

这个我一般会搭配「command + E」来一起使用,如果你想去的文件是刚编辑过的,那么可以直接使用 「command + option + 方向箭」来快速跳转到刚才编辑的位置,不仅仅局限于不同文件哦,在同一个文件内也是可以的。

图片

0x06 查找类/文件

当你想快速搜索一个类或者文件时,可以双击 shift,直接输入你要搜索的内容即可。同时如果你确定搜索的是类的话,那么可以通过「command + o」来开启精准搜索,如果搜索的是文件,那么可以通过「command + shift + o」精准搜索。

图片

0x07 自动清除没有引用的包

有时候看到那些变灰色的 import 很是烦人,难道只能一个一个删除么,当然不是,直接 「command + option + o」即可一键清除。

图片

总结

今天给大家普及了一些 PyCharm 的高效操作,希望对小伙伴们的工作和学习有所帮助。

有趣好用的Python教程