下划线在Python中的特殊含义

Python中的下划线

下划线在Python中是有特殊含义的,它们在Python的不同地方使用。

下面是Python中使用的不同类型的下划线:

图片

1.单下划线

图片

保存上次执行的表达式的值

使用一个下划线保存Python逐步命令最终中最后执行的表达式的值。我们还可以将值保存到另一个变量。

图片

在循环中忽略值

在Python中使用一个下划线_来忽略某些值。如果我们不想使用某些值,我们可以给引入值赋值给_。

#Single underscore used in for loopfor _ in range(5):    print ("Python")
'''Output:PythonPythonPythonPythonPython'''
#Iterating through listcolors=["red","blue","green"]for _ in colors:    print (_)'''Output:redbluegreen'''

忽略元组解压缩中的值

如果在元组解压缩时想要忽略某些值,可以将这些值分配给_。

#tuple unpackingt=("red","green","blue")#ignoring value "green" while tuple unpackingt1,_,t2=tprint (t1)#Output:redprint (t2)#Output:blue

#Ignoring multiple values in tuple unpackingtt=(1,2,3,4,5,6)#Ignoring all values except first and last element in tuple.t3,*_,t4=ttprint (t3)print (t4)

作为数字分隔符

下划线也可以使用数字的分隔符,用于整数,浮点数和复数等数值中的数字分组。下划线没有语义符号,并且文字被解析,就像没有下划线一样。

#grouping decimal numbers by _a=10_000_000print (a)#Output:10000000

2.临时基线下划线

它表示这些带有一个指针下划线的类,变量和方法名称被程序称为“私有”。如果我们从M import *中指定,那些以如果我们想引入这些变量/方法,我们必须在引入时指定名称。

引用PEP-8:

_single_leading_underline:弱的“内部使用”指示符。例如:从m import *不导入名称以下划线开头的对象。

#variable name having single leading underscore._a="hello"b="helloworld"
def add(x,y):    print (x+y)#function name having single leading underscoredef _sub(x,y):    print (x-y)
if __name__ == '__main__':    print (_a)#Output:hello    add(4,3)#Output:7    _sub(4,3)#Output:1

将上面提到的Python文件c1.py导入到c2.py

示例:从c1导入*

只有一个初步下划线的变量和函数不能被访问。

from c1 import *#accessing variable names having single leading underscore.print (_a)#Output:NameError: name '_a' is not defined

#accessing function name havig single leading underscoreprint (_sub(7,2))#Output:NameError: name '_sub' is not defined

#accessing variables and functions which is not having single leading underscore.# we will able to access those varaibles and functionsadd(3,4)#Output:7print (b)#helloworld

如果我们想引入只有一个初步下划线的变量和函数,那么在引入时必须提到这个变量名。

例如:从c1导入_a,_sub

from c1 import _a,_sub
#accessing variable names having single leading underscore.print (_a)#Output:hello

#accessing function name having single leading underscore_sub(7,2)#Output:5

3.单个后缀下划线

临时后缀下划线用于避免与Python关键字冲突。

引用PEP-8:

约定使用single_trailing_underline_:底层与Python关键字冲突

list=[1,2,3]
t=(5,6,7)
#Coverting tuple to list using list() constructort1=list(t)#Output:TypeError: 'list' object is not callable

在上面的示例中,我们可以使用list_作为变量名,并与Python关键字list发生冲突。

list_=[1,2,3]t=(5,6,7)#Coverting tuple to list using list() constructort1=list(t)print (t1)#Output:[5, 6, 7]

4.双下划线

双下划线告诉Python解释器重新子类的属性名和方法名,前缀命名冲突。用类扩展名更改属性名称的解释器称为名称改写。

用self._classname__methodname()代替self .__ methodname(),用

self._classname__attributename代替self .__ attributename。

根据Python文档:

“名称改写有助于让子类转化方法,而不会破坏类内的方法调用。”

引用PEP-8:

“ __double_leading_underline:当命名一个class属性时,调用名称改写(在类FooBar中,__ boo变成_FooBar__boo)”

class Student:    def __init__(self,name,rollno):        self.name=name        self.__rollno=rollno    def __repr__(self):        return "{},{}".format(self.name,self.rollno)
s=Student("Karthi",12)
print (s.name)#Unable to access attributes having leading double underscore.print (s.__rollno)#Output:AttributeError: 'Student' object has no attribute '__rollno'#Name Mangling - have to use class extension with variable nameprint (s._Student__rollno)#Output: 12

具有相同方法名的继承类:

class A:    def __getmethod(self):        print ("Inside Class A")
class B(A):    def __getmethod(self):        print ("Inside Class B")
b=B()#Accessing __getmethod() in Class A using Name Manglingb._A__getmethod()#Output:Inside Class A#Accessing __getmethod() in Class B using Name Manglingb._B__getmethod()#Output:Inside Class B

5.双末端双后缀下划线

它们在Python中被称为魔术方法/ dunder方法方法。

例如:__ init __,__ str __,__ repr __,__ len__,这些神奇的方法在Python中有特殊的意义,我们可以覆盖它们来改变我们的类的特性。

引用PEP-8:

__double_leading_and_trailing_underscore__:“魔术”对象或属性,位于用户控制的名称空间中。例如__init__ __  import____file__ 。永远不要发明这样的名称,只能根据记录使用。

根据Python约定,避免使用具有双重前缀和双后缀下划线的变量名。

我们可以使用dir()函数来查看类继承的神奇方法。

class Student:    def __init__(self,name,rollno):        self.name=name        self.rollno=rollno    def __repr__(self):        return "{},{}".format(self.name,self.rollno)
s=Student("karthi",12)print (s)#Output:karthi,12
print (dir(Student))'''Output:['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_'''

· 结束 ·

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页