Python下划线

最近,我有机会听了有关C语言编程实践的好坏的演讲。 在其中,特别涉及到了解码看上去很有趣的程序代码(C中的表情符号 )的话题。 然后是关于在面试中使用这种令人困惑的代码来测试应聘程序员职位技能的适当性的辩论。 争端并未达成共识。

考虑一个面试中关于表情符号的可能问题,该职位暗示着对Python编程语言的了解。

挑战赛


有两个表达式:

  1. _+_ 
  2.  _|_ 

这两个表达式中的哪个更可能导致错误?为什么?

表达说明
应该注意的是,这些表达式的读法很差,不建议在工作代码中使用这些表达式,而只能将其用作难题。
您还需要记住,任务中的图不是用Python编写的(不符合PEP 8样式标准)。

解决方案


在Python中,下划线不是关键字 ;因此,通常,下划线可用于将某些值分配给变量。

该任务简化为考虑加法期间出现错误的情况,并使用“按位或”(为简便起见,简称为“或”)一个变量。 即 搜索实现了一项操作的Python内置类型(类),并搜索实现另一项操作的内置类型。

在Python控制台中,很容易验证是否存在下划线值,例如:

  1. 评估每个表达式没有错误
     >>> _ = 10 >>> _+_ 20 >>> _ = 10 >>> _|_ 10 
  2. 评估第一个表达式没有错误
     >>> _ = '10' >>> _+_ '1010' >>> _ = '10' >>> _|_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for |: 'str' and 'str' 
  3. 计算第二个表达式没有错误
     >>> _ = {1, 0} >>> _+_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'set' and 'set' >>> _|_ {0, 1} 
  4. 每个表达式的计算中有错误
     >>> _ = {1: 0} >>> _+_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'dict' and 'dict' >>> _|_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for |: 'dict' and 'dict' 

Python的神奇之处在于加法,“或”以及其他运算符的实现是在针对所需类描述的所谓“魔术方法”中进行的。
另外,这是方法

 __add__ 

对于“或”,这是一种方法

 __or__ 

每个魔术方法的名称都包含下划线,在相应单词的开头和结尾两个。

查找有关Python内置类的信息。
您可以尝试在Python官方网站上的内置类型的文档中找到所需的信息: https : //docs.python.org/3.7/library/stdtypes.html
您可以在Python终端中执行

 >>> import builtins >>> help(builtins) 

我更喜欢使用当前正在使用的Python确切版本的文档,请参考pydoc模块的Web界面。

为此,请在命令提示符下输入,例如:

 python3 -m pydoc -p 3344 

并打开浏览器文档模块http://本地主机:3344 / builtins.html

实现我们的方法的内置类:
__添加____或__
布尔布尔
字节数组冰封
个字节整型
复杂的设置
飘浮
整型
清单
力量
元组

九个内置类实现加法运算,四个实现“或”。
此外,您可以尝试推测在实际项目中使用基类的频率,非基类以及它们的上述方法的实现。 在面试中很可能会对此表示赞赏。

答1。
第二个表达式通常会导致错误。



有关面试重点的其他问题


下划线在命名对象时起什么作用?


答案2。
下划线可用于在Python中不同的实体命名样式分隔单词:

  1. 小写命名时

     lower_case_with_underscores 
  2. 大写命名时

     UPPER_CASE_WITH_UNDERSCORES 

保留一些仅限于下划线的名称:

  1. 名称开头带有下划线,在常规导入期间不会导入

     from module import * 
  2. 名称的两边都有两个下划线,不建议将其用于其他目的
  3. 名称开头带有两个下划线,被认为是班级的私有 (非公开)


单个下划线的作用是什么?


答案3。
在解释器中,如果下划线未明确用作变量,则它将存储屏幕上最后一次无错误操作的结果。

 $ python3 Python 3.6.8 (default, Feb 14 2019, 22:09:48) [GCC 7.4.0] on cygwin Type "help", "copyright", "credits" or "license" for more information. >>> _ Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name '_' is not defined >>> 2 * 5 10 >>> _ 10 >>> _ = 1 >>> _ 1 >>> 2 * 5 10 >>> _ 1 

这是因为sys.stdout正在使用displayhook进行转义。 以官方文档为例:

 def displayhook(value): if value is None: return # Set '_' to None to avoid recursion builtins._ = None text = repr(value) try: sys.stdout.write(text) except UnicodeEncodeError: bytes = text.encode(sys.stdout.encoding, 'backslashreplace') if hasattr(sys.stdout, 'buffer'): sys.stdout.buffer.write(bytes) else: text = bytes.decode(sys.stdout.encoding, 'strict') sys.stdout.write(text) sys.stdout.write("\n") builtins._ = value 

另外,为了方便内部化,通常使用单个下划线。

Source: https://habr.com/ru/post/zh-CN459672/


All Articles