for_inxxx中的下划线_是什么意思?

更新时间:2023-06-14 16:39:03 阅读: 评论:0

for_inxxx中的下划线_是什么意思?
for _ in list中的下划线_只是⼀个临时的循环变量, 因为_是合法的变量名
for _ in [1, 2, 3]:
print(_)
li = [[0, 1] for _ in range(3)]
tu1 = ([0, 1] for _ in range(3))  # ()返回⽣成器, ⽽不是列表
凉拌秋葵的做法tu2 = list([0, 1] for _ in range(3))
print(li)
print(tu1)
print(tu2)
'''
输出结果:
[[0, 1], [0, 1], [0, 1]]
<generator object <genexpr> at 0x000000000214DF68>
[[0, 1], [0, 1], [0, 1]]
'''
下⾯将详细的讨论以下Python中下划线_的使⽤
⼀、单个下划线直接做变量名(_)
  主要有三种情况:
1. 解释器中
  _符号是指交互解释器中最后⼀次执⾏语句的返回结果。这种⽤法最初出现在CPython解释器中,其他解释器后来也都跟进了。
2. 作为名称使⽤
  这个跟上⾯有点类似。_⽤作被丢弃的名称。按照惯例,这样做可以让阅读你代码的⼈知道,这是个不会被使⽤的特定名称。举个例⼦,你可能⽆所谓⼀个循环计数的值:
n = 42
for _ in range(n):
do_something()
3.国际化
  _还可以被⽤作函数名。这种情况,单下划线经常被⽤作国际化和本地化字符串翻译查询的函数名。这种惯例好像起源于C语⾔。举个例⼦,在 Django documentation for translation 中你可能会看到:
from anslation import ugettext as _
from django.http import HttpRespon
def my_view(request):
output = _("Welcome to my site.")
老鼠的成语
return HttpRespon(output)
第⼆种和第三种⽤法会引起冲突,所以在任意代码块中,如果使⽤了_作国际化翻译查询函数,就应该避免再⽤作被丢弃的变量名。
⼆、单下划线前缀的名称(例如_shahriar)
重庆担担面
  以单下划线做前缀的名称指定了这个名称是“私有的”。在有些导⼊import * 的场景中,下⼀个使⽤你代码的⼈(或者你本⼈)会明⽩这个名称仅内部使⽤。Python documentation⾥⾯写道:
怎样学跳舞
  a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.
  之所以说在在有些 import * 的场景,是因为导⼊时解释器确实对单下划线开头的名称做了处理。如果你这么写from import *,任何以单下划线开头的名称都不会被导⼊,除⾮模块/包的__all__列表明确包含了这些名称。更多相关信息见““Importing * in Python”。
三、双下划线前缀的名称(例如__shahriar)
  以双下划线做前缀的名称(特别是⽅法名)并不是⼀种惯例;它对解释器有特定含义。Python会改写这些名称,以免与⼦类中定义的名称产⽣冲突。Python documentation中提到,任何
窦性心律不齐需要治疗吗__spam这种形式(⾄少以两个下划线做开头,绝⼤部分都还有⼀个下划线做结尾)的标识符,都会⽂本上被替换为_classname__spam,其中classname是当前类名,并带上⼀个下划线做前
缀。
class A(object):
def _internal_u(lf):  # 单下划线
pass
def__method_name(lf):  # 双下划线
pass
print(dir(A))
'''
输出结果:
['_A__method_name', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne '''
  正如所料,_internal_u没有变化,但__method_name被改写成了_ClassName__method_name。现在创建⼀个A的⼦类B(这可不是个好名字),就不会轻易的覆盖掉A中的
苹果电脑忘记开机密码怎么办__method_name了:
class A(object):
def _internal_u(lf):蜂蜜水加醋
pass
def__method_name(lf):
pass
class B(A):
def__method_name(lf):pass
print(dir(B))
'''
输出结果:
新保守主义['_A__method_name', '_B__method_name', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__ '''
四、名称前后的双下划线(如:__init__)
  这种⽤法表⽰Python中特殊的⽅法名。其实,这只是⼀种惯例,对Python系统来说,这将确保不会与⽤户⾃定义的名称冲突。通常,你将会覆写这些⽅法,并在⾥⾯实现你所需要的功
能,以便Python调⽤它们。例如,当定义⼀个类时,你经常会覆写“__init__”⽅法。虽然也可以编写⾃⼰的特殊⽅法名,但不要这样做。
class C:
def__init__(lf,name):
lf.name = name
def__showname(lf):
pass
print(dir(C))
'''
['_C__showname', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '''

本文发布于:2023-06-14 16:39:03,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/953795.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:名称   解释器   函数   不会   惯例   冲突
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图