标签 python 下的文章

这是 Python 之禅特别系列的一部分,重点介绍第十七和十八条原则:困难和容易。

 title=

一门语言并不是抽象存在的。每一个语言功能都必须用代码来实现。承诺一些功能是很容易的,但实现起来就会很麻烦。复杂的实现意味着更多潜在的 bug,甚至更糟糕的是,会带来日复一日的维护负担。

对于这个难题,Python 之禅 中有答案。

如果一个实现难以解释,那就是个坏思路 If the implementation is hard to explain, it's a bad idea

编程语言最重要的是可预测性。有时我们用抽象的编程模型来解释某个结构的语义,而这些模型与实现并不完全对应。然而,最好的释义就是解释该实现

如果该实现很难解释,那就意味着这条路行不通。

如果一个实现易于解释,那它可能是一个好思路 If the implementation is easy to explain, it may be a good idea

仅仅因为某事容易,并不意味着它值得。然而,一旦解释清楚,判断它是否是一个好思路就容易得多。

这也是为什么这个原则的后半部分故意含糊其辞的原因:没有什么可以肯定一定是好的,但总是可以讨论一下。


via: https://opensource.com/article/19/12/zen-python-implementation

作者:Moshe Zadka 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

苹果将在 iOS14.5 上代理安全浏览流量,以隐藏用户 IP 不被谷歌发现

安全浏览 Safe Browsing ”是谷歌推出的一项安全服务,其工作原理是将用户试图访问的 URL,以匿名状态发送至谷歌的安全浏览服务器,由谷歌访问该网站并扫描威胁。多年前,当谷歌推出安全浏览API时,谷歌是知道使用该服务的用户正在访问哪些网站的。虽然近年来,对用户通过安全浏览功能发送的数据进行了一定的匿名化处理,但谷歌仍然可以看到来自安全浏览检查的 IP 地址。

而据报道,在苹果即将发布的 iOS 14.5 版本将搭载一项功能,即通过苹果控制的代理服务器重新路由所有 Safari 的安全浏览流量,以防止谷歌了解 iOS 用户 IP 地址。当然,只有当用户在 iOS Safari 应用设置中激活“欺诈网站警告”选项时,新功能才能发挥作用。

看起来,苹果对谷歌的隐私底线不够信任,那么,作为最终用户,你是信谷歌还是信苹果?

自去年以来,webshell 的数量已经翻了一番

微软表示,近来每月约能检测到 14 万个 webshell,而去年 8 月才 7.7 万个。这个曾经被认为是脚本小子搞乱网站的工具,现在也是 DDoS 僵尸网络运营商的首选工具。

webshell 是简单的脚本,几乎可以用任何在 Web 服务器上运行的编程语言来编写,比如 PHP、ASP、JSP 或 JS。而这样的脚本,可以很容易地隐藏在网站的源代码内。这使得它们难以检测。此外,webshell 还为恶意行为者们提供了一种简单的方式,可以通过图形或命令行界面在被攻击的服务器上执行命令,为恶意行为者提供了一种简单的攻击方式。

这个数据是微软基于其安全软件遥测得到的数据,似乎我还没看到针对 Linux 的同类的开源安全软件。

谷歌为 Python 编程语言提供 35 万美元的资金支持

Python 对谷歌云及谷歌云的用户都至关重要,谷歌内部也使用 Python 来驱动其许多核心产品和服务。谷歌从 2010 年开始赞助 PSF,成为 Python 语言的第一个“有远见的赞助商”。现在,谷歌正在捐赠 35 万美元以支持一些 Python 软件基金会(PSF)的项目,这些项目旨在提高 Python 生态系统的供应链安全性。

谷歌对 PSF 的支持包括:对 PyPI 的恶意软件检测、对核心 Python 工具和服务的改进,以及 2021 年贡献一个 CPython 的全职开发者职位。

Python 的成功,除了生逢其时,也得益于这些赞助商和贡献者们。当然,这是相辅相成的。

这是 Python 之禅特别系列的一部分,重点是第十五和第十六条原则:现在与将来。

 title=

Python 一直在不断发展。Python 社区对特性请求的渴求是无止境的,对现状也总是不满意的。随着 Python 越来越流行,这门语言的变化会影响到更多的人。

确定什么时候该进行变化往往很难,但 Python 之禅 给你提供了指导。

现在有总比永远没有好 Now is better than never

总有一种诱惑,就是要等到事情完美才去做,虽然,它们永远没有完美的一天。当它们看起来已经“准备”得足够好了,那就大胆采取行动吧,去做出改变吧。无论如何,变化总是发生在某个现在:拖延的唯一作用就是把它移到未来的“现在”。

虽然将来总比现在好 Although never is often better than right now

然而,这并不意味着应该急于求成。从测试、文档、用户反馈等方面决定发布的标准。在变化就绪之前的“现在”,并不是一个好时机。

这不仅对 Python 这样的流行语言是个很好的经验,对你个人的小开源项目也是如此。


via: https://opensource.com/article/19/12/zen-python-timeliness

作者:Moshe Zadka 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

本文是 Python 之禅特殊系列的一部分,重点是第十二、十三和十四原则:模糊性和明确性的作用。

 title=

最小惊喜原则是设计用户界面时的一个 准则。它是说,当用户执行某项操作时,程序执行的事情应该使用户尽量少地感到意外。这和孩子们喜欢一遍又一遍地读同一本书的原因是一样的:没有什么比能够预测并让预测成真更让人欣慰的了。

在开发 ABC 语言)(Python 的灵感来源)的过程中,一个重要的见解是,编程设计是用户界面,需要使用与 UI 设计者相同的工具来设计。值得庆幸的是,从那以后,越来越多的语言采用了 UI 设计中的 可承受性 affordance 人体工程学 ergonomics 的概念,即使它们的应用并不严格。

这就引出了 Python 之禅 中的三个原则。

面对歧义,要拒绝猜测的诱惑 In the face of ambiguity, refuse the temptation to guess

1 + "1" 的结果应该是什么? "11"2 都是猜测。这种表达方式是歧义的:无论如何做都会让一些人感到惊讶。

一些语言选择猜测。在 JavaScript 中,结果为 "11"。在 Perl 中,结果为 2。在 C 语言中,结果自然是空字符串。面对歧义,JavaScript、Perl 和 C 都在猜测。

在 Python 中,这会引发 TypeError:这不是能忽略的错误。捕获 TypeError 是非典型的:它通常将终止程序或至少终止当前任务(例如,在大多数 Web 框架中,它将终止对当前请求的处理)。

Python 拒绝猜测 1 + "1" 的含义。程序员必须以明确的意图编写代码:1 + int("1"),即 2;或者 str(1) + "1",即 "11";或 "1"[1:],这将是一个空字符串。通过拒绝猜测,Python 使程序更具可预测性。

尽量找一种,最好是唯一一种明显的解决方案 There should be one—and preferably only one—obvious way to do it

预测也会出现偏差。给定一个任务,你能预知要实现该任务的代码吗?当然,不可能完美地预测。毕竟,编程是一项具有创造性的任务。

但是,不必有意提供多种冗余方式来实现同一目标。从某种意义上说,某些解决方案或许 “更好” 或 “更 Python 化 Pythonic ”。

对 Python 美学欣赏部分是因为,可以就哪种解决方案更好进行健康的辩论。甚至可以持不同观点而继续编程。甚至为使其达成一致,接受不同意的观点也是可以的。但在这一切之下,必须有一种这样的认识,即正确的解决方案终将会出现。我们必须希望,通过商定实现目标的最佳方法,而最终达成真正的一致。

虽然这种方式一开始可能并不明显(除非你是荷兰人) Although that way may not be obvious at first (unless you're Dutch)

这是一个重要的警告:首先,实现任务的最佳方法往往明显。观念在不断发展。Python 也在进化。逐块读取文件的最好方法,可能要等到 Python 3.8 时使用 walrus 运算符:=)。

逐块读取文件这样常见的任务,在 Python 存在近 30年 的历史中并没有 “唯一的最佳方法”。

当我在 1998 年从 Python 1.5.2 开始使用 Python 时,没有一种逐行读取文件的最佳方法。多年来,知道字典中是否有某个键的最佳方法是使用关键字 .haskey,直到 in 操作符出现才发生改变。

只是要意识到找到实现目标的一种(也是唯一一种)方法可能需要 30 年的时间来尝试其它方法,Python 才可以不断寻找这些方法。这种历史观认为,为了做一件事用上 30 年是可以接受的,但对于美国这个存在仅 200 多年的国家来说,人们常常会感到不习惯。

从 Python 之禅的这一部分来看,荷兰人,无论是 Python 的创造者 Guido van Rossum 还是著名的计算机科学家 Edsger W. Dijkstra,他们的世界观是不同的。要理解这一部分,某种程度的欧洲人对时间的感受是必不可少的。


via: https://opensource.com/article/19/12/zen-python-consistency

作者:Moshe Zadka 选题:lujun9972 译者:stevenzdg988 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

本文是 Python 之禅特别系列的一部分,重点此篇着眼于第七、八、九条原则:可读性、特殊情况和实用性。

 title=

软件开发是一门充满了取舍的学科。每一个选择,都有一个同样合理但相反的选择。将一个方法私有化?你在鼓励复制粘贴。将一个方法公开?你在过早地对一个接口做出承诺。

软件开发者每时每刻都在做艰难的选择。虽然 Python 之禅 中的所有原则都在一定程度上涵盖了权衡,但下面的原则对一些权衡进行了最艰难、最冷酷的审视。

可读性很重要 Readability counts

从某种意义上说,这一中间原则确实是整个 Python 之禅的中心。这条原则与编写高效的程序无关。在大多数情况下,它甚至与编写健壮的程序也无关。它讲的是编写出别人能读懂的程序

阅读代码,就其本质而言,发生在代码被添加到系统中之后。通常,它会发生在很久很久以后。忽略可读性是最简单的选择,因为它对现在没有伤害。无论添加新代码的原因是什么,它都会对现在造成影响,无论是一个令人痛苦的 bug 还是一个被强烈要求的功能。

如果面对巨大的压力,把可读性扔到一边,只管“解决问题”,而 Python 之禅提醒我们:可读性很重要。编写代码让它适合阅读,无论是对自己还是他人,都是一种慈悲。

特殊情况不足以违反规则 Special cases aren't special enough to break the rules

总是有各种借口:这个 bug 特别麻烦,先简单处理一下吧;这个功能特别紧急,别管美观了;这种情况下所涉及的领域规则特别复杂,嵌套深点也没关系。

一旦我们对特例的借口妥协,大坝就会破裂,就丧失了原则;事情就会演变成一个疯狂麦克斯的荒诞症,每个程序员都会为自己试图找到最好的借口。

纪律需要承诺。只有当事情艰辛、有强烈的诱惑时,才是对一个软件开发人员的考验。总是有合理的借口来破坏规则,这就是为什么必须坚守规矩的原因。纪律就是向例外说不的艺术。没有任何解释可以改变这一点。

虽然,实用性胜过纯洁性 Although, practicality beats purity

“如果你只想着击打、弹跳、撞击、触碰敌人,你将无法真正打倒他。” —— 《宫本武藏:水之卷

归根结底,软件开发是一门实用的学科。它的目标是解决真实的人所面临的实际问题。实用性比纯粹性更重要:首先,我们必须解决问题。如果我们只考虑可读性、简单性或美观性,我们将无法真正解决问题

正如宫本武藏所说的,每一次代码修改的首要目标应该是解决问题。这个问题需要我们心心念念地去解决它。如果我们不以解决问题为目标,只想着 Python 之禅,我们就辜负了这些原则。这是 Python 之禅所固有的另一种矛盾。


via: https://opensource.com/article/19/12/zen-python-trade-offs

作者:Moshe Zadka 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

使用我们的新电子书中的分步说明,以有趣的方式了解 Python。

 title=

Python 是目前最流行的程序设计语言之一。不管是为了工作还是娱乐为目的学习 Python,它都是一门功能强大且非常有用的编程语言。你可以创建应用程序来帮助你完成日常任务,创建你和朋友们喜欢玩的游戏,创建用于处理数据的脚本,创建用于生成或分析信息的应用程序等等。

无论你计划使用程序设计语言做什么,我们都认为通过创建游戏来学习比通过处理数字或变换字符串来学习更为有趣。然而,如果你完全是一个编程的新手,当你能看到代码在视频游戏等熟悉的环境中工作时,你会更容易理解为什么要用代码做某事。

你可能不会选择 Python 作为最好的编程语言(每个人对此都有自己的答案),但它不是一门令人恐惧的编程语言。 Python 可以使用很多关键字(例如 isis not)代替符号(例如 =!=)。它还能管理许多低级任务,因此你通常不必担心数据类型和垃圾收集之类的事情。通常,这意味着你马上就可以开始编写代码,而不会像在 CJava 那样的复杂编程语言面前遇到挫折。

为了帮助你学习 Python,我们编写了一本电子书,教你如何使用 Python 创建平台类视频游戏。在制作视频游戏的同时逐步通过课程学习 Python。另外一个好处是,你还将学习编程逻辑、语法、运算符等更多的内容。你可以在学习过程中立即看到结果,因此你学到的所有内容都会得到及时巩固。

一分钟上手 Python

Python 是一种用途广泛的编程语言,这意味着它(与大多数语言一样)提供了函数来对数字和字符做处理的“简单技巧”。Linux 操作系统用户已经安装了 Python。 Mac 操作系统用户使用的是较旧版本的 Python,但是你可以从 Python.org 网站 安装最新版本。Windows 操作系统用户可以从这篇 在 Windows 上安装 Python 的文章中学习如何安装 Python。

安装完成后,你可以启动交互式 Python Shell 进行算术运算:

$ python3
>>> 5+6
11
>>> 11/2
5.5
>>> 11//2
5
>>> 11%2
1

从该示例可以了解,需要一些特殊的符号,但学过数学的人都最熟悉不过了。也许你不喜欢数字,而更喜欢字母:

$ python3
>>> string = "hello world"
>>> print(string)
hello world
>>> print(string.upper())
HELLO WORLD
>>> print(string[0])
h
>>> print(string[1])
e
>>> print(string[2])
l
>>> print(string[3])
l
>>> print(string[4])
o

同样,相对地说基础的任务有特殊的符号表示法,但是即使没有说明,你也可能已经发现 [0][1] 符号表示法是将数据“切片”并且利用 print 函数将其中的数据显示在屏幕上。

五分钟用上 Pygame

如果你只想使用 Python 来创建一个视频游戏或任何超越基本计算的项目,这可能需要投入大量的学习、努力和时间。幸运的是,Python 诞生已有二十年了,开发者已经开发了代码库来帮助你(相对)轻松地完成典型的程序壮举。Pygame 是一套用于创建视频游戏的代码模块。它 不是唯一的这种类库,但是它是最古老的(不论好坏),因此在线上有很多文档和示例。

首先学习 推荐的 Python 虚拟环境工作流程

$ python3 -m venv mycode/venv
$ cd mycode
$ source ./venv/bin/activate
(venv)$

进入虚拟环境后,可以安全地将 Pygame 安装到项目文件夹中:

(venv)$ echo "pygame" >> requirements.txt
(venv)$ python -m pip install -r requirements.txt
[...] Installing collected packages: pygame
Successfully installed pygame-x.y.z

现在你已经安装了 Pygame,就可以创建一个简单的演示应用程序。它比你想象的要容易。Python 可以进行所谓的面向对象编程(OOP),这是一个漂亮的计算机科学术语,用于描述当代码结构化时,就像你在使用代码创建物理对象一样。然而,程序员并没有受到迷惑。他们知道在编写代码时并不是真的在制造物理对象,但是这样有助于想象,因为这样你就可以了解编程世界的局限性。

例如,如果你被困在一个荒岛上并想要一杯咖啡,那么你就必须收集一些黏土,做一个杯子,然后烘烤它。如果你足够聪明,先创建一个模具,以便每当需要另一个杯子时,都可以从模板中快速创建一个新杯子。即使每个杯子都来自相同的模板,它们在物理上也是独立的:如果一个杯子破裂,你还会有另一个杯子。你可以通过添加颜色或蚀刻使每个咖啡杯显得独一无二。

在 Pygame 和许多编程任务中,你都会使用类似的逻辑。在定义之前,它不会出现在你的编程项目中。下面是如何在 Python 和 Pygame 程序中让咖啡杯出现。

使用 Pygame 进行面向对象编程

创建一个名为 main.py 的文件,并输入以下代码用以启动 Pygame 模块,并使用 Pygame 模板创建一个窗口:

import pygame

pygame.init()

screen = pygame.display.set_mode((960,720))

就像你可能在现实生活中使用模板来创建对象一样,你也可以使用 Pygame 提供的模板来创建一个 妖精 sprite (这是 Pygame 的视觉游戏对象术语)。在面向对象的编程中,class 表示对象的模板。在你的文档中输入以下代码:

class Cup(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        # image
        img = pygame.image.load('coffeecup.png').convert()
        self.image = img

        # volume
        self.rect = self.image.get_rect()
        self.rect.x = 10
        self.rect.y = 10

该代码块使用 Pygame 的 sprite 模板设计一个咖啡杯子妖精。由于 self.image 的存在,你的咖啡杯妖精有一个图像,而 self.rect 则赋予了它体积(宽度和高度)。这些是 Pygame 期望妖精拥有的属性,但是如果你要创建一个可玩的视频游戏,则可以为其指定任何其他所需的属性,例如健康点和得分。

到目前为止,你所要做的就是创建一个窗口和一个用于咖啡杯的 模板 。你的游戏实际上还没有一个杯子。

你的代码的最后一部分必须使用模板来生成杯子并将其添加到游戏世界中。如你所知,计算机运行速度非常快,因此从技术上讲,你到目前为止创建的代码只会运行一毫秒左右。编写图形计算机应用程序时,无论计算机是否认为已完成规定的任务,都必须强制其保持打开状态。程序员使用 无限循环 来执行此操作,该循环在 Python 中由 while True 语句表示(True 始终为真,因此循环永远不会结束)。

无限循环可以确保你的应用程序保持打开状态足够长的时间,以使计算机用户可以查看和使用该应用程序:

cup = Cup()

while True:
    pygame.display.update()
    screen.blit(cup.image, cup.rect)

此代码示例从模板 Cup 创建杯子,然后使用 Pygame 函数更新显示。最后,使用 Pygame 的 blit 函数在其边框内绘制杯子的图像。

获取图形

在成功运行代码之前,你需要为咖啡杯准备一个图形。你可以在 FreeSVG.org 上找到许多 公用创作 咖啡杯图形。我用了 这个。将图形保存在项目目录中,并将其命名为 coffeecup.png

运行游戏

启动应用程序:

(venv)$ python ./main.py

 title=

Pygame 是一个功能强大的框架,除了在屏幕上绘制咖啡杯之外,你还可以做更多的事情。下载我们的免费电子书 更好地了解 Pygame 和 Python。


via: https://opensource.com/article/20/10/learn-python-ebook

作者:Seth Kenlon 选题:lujun9972 译者:stevenzdg988 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出