热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python故事,2018年7月

我正在运行pythonetc,这是一个有关Python和一般编程的电报频道。这是2018年7月的最佳帖子。常规语言常规语言是可以被有限状态机(FSM&#

我正在运行@pythonetc ,这是一个有关Python和一般编程的电报频道。 这是2018年7月的最佳帖子。

常规语言

常规语言是可以被有限状态机( FSM )识别的形式语言。 简而言之,这意味着要逐个字符地处理文本,您只需要记住当前状态,这种状态的数量是有限的。

美丽和简单的例子是一台机器的输入检查是否是像一个简单的数字-3 , 2.2001 。 本文开头的图片是FSM图。 双圆圈表示接受状态 ,它们标识机器可以停止的位置。

机器从①开始,可能匹配负号,然后按照③的要求处理尽可能多的数字。 此后,它可能与一个点(③→④)相匹配,该点后必须跟一个数字(④→⑤),但可能还要更多(⑤→⑤)。

非常规语言的经典示例是一串字符串,例如:

ab
aaa-bbb
aaaaa-bbbbb

形式上,我们需要包含N出现的a ,然后- ,然后N个出现的bN是大于零的整数。 您不能使用有限的机器来做到这一点,因为您必须记住遇到a字符数,这会导致您到达无数个状态。

正则表达式只能匹配正则语言。 记住要检查您尝试处理的线路是否完全可以被FSM处理。 JSON , XML甚至带括号的纯算术表达式。

有趣的是,许多现代的正则表达式引擎不是正则的 。 例如, Python regex模块支持递归( 这将有助于解决aaa-bbb问题)。

动态调度

当Python执行一个方法调用,例如af(b, c, d) ,它应该首先选择正确的f函数。 由于多态性,选择什么取决于a的类型。 选择方法的过程通常称为动态调度

Python仅支持单调度多态性,这意味着单独的单个对象(在示例中为a )会影响方法的选择。 但是,其他一些语言也可以考虑b , cd类型。 这种机制称为多重调度 。 C#是支持该技术的语言的显着示例。

但是,可以通过单次调度模拟多次调度。 访客设计模式正是为此而创建的。 访客本质上只使用两次单次派发来模仿两次派发。

请注意,重载方法(如Java和C ++)的能力与多重分派不同。 动态调度在运行时起作用,而重载仅影响编译时间。

以下是一些代码示例,可以更好地理解该主题: Python访问者示例 , Java重载不能用作多重调度 , C#多重调度 。

内置名称

在Python中,您可以轻松修改全局命名空间中可用的所有标准变量:

>>> print = 42
>>> print(42)
Traceback (most recent call last):
File "", line 1, in
TypeError: 'int' object is not callable

如果您的模块定义了一些与内置函数同名的函数,则可能会有所帮助。 如果您练习元编程并且接受任意字符串作为标识符,则也会发生这种情况。

但是,即使您隐藏了一些内置名称,您仍可能希望访问它们最初引用的内容。 builtins模块正是为此而存在的:

>>> import builtins
>>> print = 42
>>> builtins.print(1)
1

__builtins__变量在大多数模块中也可用。 不过有一个陷阱。 首先,这是cpython实现的细节,通常根本不应该使用。 其次, __builtins__可能指的是builtinsbuiltins.__dict__ ,这取决于当前模块的加载方式。

痕迹

有时,软件开始在生产中表现异常。 您可能不希望简单地重新启动它,而是希望了解发生了什么,以便稍后进行修复。

这样做的显而易见的方法是分析程序的工作并尝试猜测正在执行的代码段。 当然,正确的日志记录使该任务更加容易,但是您的应用程序日志可能不够详细,无论是设计使然还是由于配置中设置了高级日志记录。

在这种情况下, strace可能会非常有益。 这是一个Unix实用程序,可以为您跟踪系统调用。 您可以预先运行它strace python script.py但通常更适合连接到已经执行的应用程序: strace -p PID

$ cat test.py
with open('/tmp/test', 'w') as f:
f.write('test')
$ strace python test.py 2>&1 | grep open | tail -n 1
open("/tmp/test", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 3

跟踪中的每一行都包含系统调用名称,其后带有括号中的参数及其返回值。 由于某些参数用于从系统调用返回结果,而不是用于向其传递数据,因此在系统调用完成之前,行输出可能会中断。

在此示例中,输出被中断,直到有人写入STDIN:

$ strace python -c 'input()'
read(0,

元组文字

Python语法中最不一致的部分之一是元组文字。

基本上,要创建一个元组,只需编写用逗号分隔的值: 1, 2, 3 。 好,到目前为止,很好。 那么只包含一个元素的元组呢? 您只需将尾随逗号添加到唯一值: 1, ,。 好吧,这有点难看并且容易出错,但是很有意义。

空元组呢? 它是一个光秃秃的, ? 不,是() 。 括号会创建元组还是逗号? 不,他们没有, (4)不是元组,只有4

In : a = [
...: (1, 2, 3),
...: (1, 2),
...: (1),
...: (),
...: ]
In : [type(x) for x in a]
Out: [tuple, tuple, int, tuple]

为了使事情更加晦涩难懂,元组文字通常需要附加括号。 如果您希望元组是函数的唯一参数,则f(1, 2, 3)出于明显的原因而无效,则需要f((1, 2, 3))

From: https://hackernoon.com/python-stories-july-2018-c0b5443faff



推荐阅读
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有