扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
val[0:-1]是python特有的切片操作,也叫切割操作,这里的下标0表示左起第一个元素, -1表示倒数最后一个元素。
成都创新互联公司一直在为企业提供服务,多年的磨炼,使我们在创意设计,营销型网站到技术研发拥有了开发经验。我们擅长倾听企业需求,挖掘用户对产品需求服务价值,为企业制作有用的创意设计体验。核心团队拥有超过10多年以上行业经验,涵盖创意,策化,开发等专业领域,公司涉及领域有基础互联网服务成都服务器托管、成都app开发、手机移动建站、网页设计、网络整合营销。
取一个list或tuple的部分元素是非常常见的操作。比如,一个list如下:
“L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']”
取前3个元素,利用切片操作就是“L[0:3]”。如果第一个索引是0,还可以省略“L[:3]”。
也可以从索引1开始,取出2个元素出来,L[1:3],显示的结果就是“['Sarah', 'Tracy']”。
类似的,既然Python支持L[-1]取倒数第一个元素,那么它同样支持倒数切片,试试“L[-2:]”,返回的就是“['Bob', 'Jack']”,记住倒数第一个元素的索引是-1。
扩展资料:
对于具有序列结构的数据来说,切片操作的方法是:consequence[start_index: end_index: step]。
1、start_index:表示是第一个元素对象,正索引位置默认为0;负索引位置默认为 -len(consequence)
2、end_index:表示是最后一个元素对象,正索引位置默认为 len(consequence)-1;负索引位置默认为 -1。
3、step:表示取值的步长,默认为1,步长值不能为0。
注意:对于序列结构数据来说,索引和步长都具有正负两个值,分别表示左右两个方向取值。索引的正方向从左往右取值,起始位置为0;负方向从右往左取值,起始位置为-1。因此任意一个序列结构数据的索引范围为 -len(consequence) 到 len(consequence)-1 范围内的连续整数。
切片操作会将按照给定的索引和步长,截取序列中由连续的对象组成的片段,单个索引返回值可以视为只含有一个对象的连续片段。
切片的过程是从第一个想要的对象开始,到第一个不想要的对象结束。第一个想要的对象到第一个不想要的对象之间的连续对象就是你所有想要的对象。
因此在consequence[start_index: end_index]中,切片中包含了consequence[start_index],但不包括consequence[end_index]。
参考资料来源:百度百科——python
val()函数语法为:
i. val(字符表达式)
val()函数的功能为:将一组字符型数据的数字部分转换成相应的数值型数据
val()函数用法:
1. 例 x = "12 5fdsa DA456";
那么 val(x)应该返回125 后面的456不能返回来。
val()函数当识别到非数字,停止读入字符串。即如果字符串内有字母或其他非数字字符,val()函数只转换第一个 非数字字符之前的数字。当字符串的首字符为非数字时,返回值为0。
但是该函数可以识别进制符号比如八进制、十六进制。字符串中的空格和换行符也会从该参数中被去掉。
2. 例 a = "五颗星";
b = 3;
当进行运算 a + b 时显然是错误的。若想得到返回值为8,就要使用 val()函数
c = val(a) + b; 此时c的值为8。
ii. Val(C, V, Site)
功能为:将字符串C转换成与V相同的数值类型,并把转换后的结果赋值给V,如果字符串中有非数字,则V=0。Site用于返回非数字字符的位置。
推荐学习《python教程》。
基本算法就是二叉树的遍历,首先想到的是深度优先遍历。
难点在于,如何实现每个子路径的记录和append
binaryTreePaths函数只给了root变量,无法存储每个子路径,考虑写辅助函数res,添加存储路径的变量
res(root,temp)
同时还需要一个全局变量result存储最后的输出结果,result.append(temp)
1、%.2f是将该浮点数float保留两位小数。2表示保留的位数。
2、val[0:-1] 是对字符串的截取操作,str[a:b]表示截取字符串的a开始的位置,b表示结束位置。b是负数,表示去除后几位。
由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。
扩展资料:
关于python的控制语句:
1、if语句,当条件成立时运行语句块。经常与else,elif(相当于else if) 配合使用。
2、for语句,遍历列表、字符串、字典、集合等迭代器,依次处理迭代器中的每个元素。
3、while语句,当条件为真时,循环运行语句块。
4、class语句,用于定义类型。
5、def语句,用于定义函数和类型的方法。
6、try语句,与except,finally配合使用处理在程序运行中出现的异常情况。
7、class语句,用于定义类型。
8、def语句,用于定义函数和类型的方法。
参考资料来源:百度百科-Python
pow(2,1000)的结果是一个int型,而int型数据是不能用len函数来获取长度的,要把它转换成string型再获取长度,str(val)就是把val转换成string型
在Python中,访问一个属性的优先级顺序按照如下顺序:
1.类属性
2.数据描述符
3.实例属性
4.非数据描述符
5.__getattr__()方法。这个方法的完整定义如下所示:
[python] view plain copy
def __getattr__(self,attr) :#attr是self的一个属性名
pass;
先来阐述下什么叫数据描述符。
数据描述符是指实现了__get__,__set__,__del__方法的类属性(由于Python中,一切皆是对象,所以你不妨把所有的属性也看成是对象)
PS:个人觉得这里最好把数据描述符等效于定义了__get__,__set__,__del__三个方法的接口。
阐述下这三个方法:
__get__的标准定义是__get__(self,obj,type=None),它非常接近于JavaBean的get
第一个函数是调用它的实例,obj是指去访问属性所在的方法,最后一个type是一个可选参数,通常为None(这个有待于进一步的研究)
例如给定类X和实例x,调用x.foo,等效于调用:
type(x).__dict__["foo"].__get__(x,type(x))
调用X.foo,等效于调用:
type(x).__dict__["foo"].__get__(None,type(x))
第二个函数__set__的标准定义是__set__(self,obj,val),它非常接近于JavaBean的set方法,其中最后一个参数是要赋予的值
第三个函数__del__的标准定义是__del__(self,obj),它非常接近Java中Object的Finailize()方法,指
Python在回收这个垃圾对象时所调用到的析构函数,只是这个函数永远不会抛出异常。因为这个对象已经没有引用指向它,抛出异常没有任何意义。
接下来,我们来一一比较这些优先级.
首先来看类属性
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class A(object):
foo=3
print A.foo
a=A()
print a.foo
a.foo=4
print a.foo
print A.foo
上面这段代码的输出如下:
3
3
4
3
从输出可以看到,当我们给a.foo赋值的时候,其实与类实例的那个foo是没有关系的。a.foo=4 这句话给a对象增加了一个属性叫foo。其值是4。
最后两个语句明确的表明了,我们输出a.foo和A.foo的值,他们是不同的。
但是为什么a=A()语句后面的print
a.foo输出了3呢?这是因为根据搜索顺序找到了类属性。当我们执行a.foo=4的时候,我们让a对象的foo属性指向了4这个对象。但是并没有改变
类属性foo的值。所以最后我们print A.foo的时候,又输出了3。
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class A(object):
foo=3
a=A()
a.foo=4
print a.foo
del a.foo
print a.foo
上面的代码,我给a.foo赋值为4,在输出一次之后就del了。两次输出,第一次输出的是a对象的属性。第二次是类属性。不是说类属性的优先级比
实例属性的高吗。为啥第一次输出的是4而不是3呢?还是上面解释的原因。因为a.foo与类属性的foo只是重名而已。我们print
a.foo的时候,a的foo指向的是4,所以输出了4。
------------------------------------
然后我们来看下数据描述符这一全新的语言概念。按照之前的定义,一个实现了__get__,__set__,__del__的类都统称为数据描述符。我们来看下一个简单的例子。
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class simpleDescriptor(object):
def __get__(self,obj,type=None):
pass
def __set__(self,obj,val):
pass
def __del__(self,obj):
pass
class A(object):
foo=simpleDescriptor()
print str(A.__dict__)
print A.foo
a=A()
print a.foo
a.foo=13
print a.foo
上面例子的输出结果如下:
[plain] view plain copy
{'__dict__': attribute '__dict__' of 'A' objects, '__module__': '__main__', 'foo': __main__.simpleDescriptor object at 0x005511B0, '__weakref__': attribute '__weakref__' of 'A' objects, '__doc__': None}
None
None
None
从输出结果看出,print语句打印出来的都是None。这说明a.foo都没有被赋值内容。这是因为__get__函数的函数体什么工作都没有做。直接是pass。此时,想要访问foo,每次都没有返回内容,所以输出的内容就是None了。
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class simpleDescriptor(object):
def __get__(self,obj,type=None):
return "hi there"
def __set__(self,obj,val):
pass
def __del__(self,obj):
pass
class A(object):
foo=simpleDescriptor()
print str(A.__dict__)
print A.foo
a=A()
print a.foo
a.foo=13
print a.foo
把__get__函数实现以下,就可以得到如下输出结果:
[plain] view plain copy
{'__dict__': attribute '__dict__' of 'A' objects, '__module__': '__main__', 'foo': __main__.simpleDescriptor object at 0x00671190, '__weakref__': attribute '__weakref__' of 'A' objects, '__doc__': None}
hi there
hi there
hi there
为了加深对数据描述符的理解,看如下例子:
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class simpleDescriptor(object):
def __init__(self):
self.result = None;
def __get__(self, obj, type=None) :
return self.result - 10;
def __set__(self, obj, val):
self.result = val + 3;
print self.result;
def __del__(self, obj):
pass
class A(object):
foo = simpleDescriptor();
a = A();
a.foo = 13;
print a.foo;
上面代码的输出是
16
6
第一个16为我们在对a.foo赋值的时候,人为的将13加上3后作为foo的值,第二个6是我们在返回a.foo之前人为的将它减去了10。
所以我们可以猜测,常规的Python类在定义get,set方法的时候,如果无特殊需求,直接给对应的属性赋值或直接返回该属性值。如果自己定义类,并且继承object类的话,这几个方法都不用定义。
-----------------
在这里看一个题外话。
看代码
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class simpleDescriptor(object):
def __init__(self):
self.result = None;
def __get__(self, obj, type=None) :
return self.result - 10;
def __set__(self, obj, val):
if isinstance(val,str):
assert False,"int needed! but get str"
self.result = val + 3;
print self.result;
def __del__(self, obj):
pass
class A(object):
foo = simpleDescriptor();
a = A();
a.foo = "13";
print a.foo;
上面代码在__set__ 函数中检查了参数val,如果val是str类型的,那么要报错。这就实现了我们上一篇文章中要实现的,在给属性赋值的时候做类型检查的功能。
-----------------------------------------------
下面我们来看下实例属性和非数据描述符。
[python] view plain copy
# -*- coding:utf-8 -*-
'''''
Created on 2013-3-29
@author: naughty
'''
class B(object):
foo = 1.3
b = B()
print b.__dict__
b.bar = 13
print b.__dict__
print b.bar
上面代码输出结果如下:
{}
{'bar': 13}
13
那么什么是非数据描述符呢?
简单的说,就是没有实现get,set,del三个方法的所有类。
让我们任意看一个函数的描述:
def call():
pass
执行print dir(call)会得到如下结果:
[plain] view plain copy
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
先看下dir的帮助。
dir列出给定对象的属性或者是从这个对象能够达到的对象。
回到print dir(call)方法的输出,看到,call方法,有输出的那么多个属性。其中就包含了__get__函数。但是却没有__set__和__del__函数。所以所有的类成员函数都是非数据描述符。
看一个实例数据掩盖非数据描述符的例子:
[python] view plain copy
'''''
Created on 2013-3-29
@author: naughty
'''
class simpleDescriptor(object):
def __get__(self,obj,type=None) :
return "get",self,obj,type
class D(object):
foo=simpleDescriptor()
d=D()
print d.foo
d.foo=15
print d.foo
看输出:
('get', __main__.simpleDescriptor object at 0x02141190,
__main__.D object at 0x025CAF50, class '__main__.D')
15
可见,实例数据掩盖了非数据描述符。
如果改成数据描述符,那么就不会被覆盖了。看下面:
[python] view plain copy
'''''
Created on 2013-3-29
@author: naughty
'''
class simpleDescriptor(object):
def __get__(self,obj,type=None) :
return "get",self,obj,type
def __set__(self,obj,type=None) :
pass
def __del__(self,obj,type=None) :
pass
class D(object):
foo=simpleDescriptor()
d=D()
print d.foo
d.foo=15
print d.foo
代码的输出如下:
[plain] view plain copy
('get', __main__.simpleDescriptor object at 0x01DD1190, __main__.D object at 0x0257AF50, class '__main__.D')
('get', __main__.simpleDescriptor object at 0x01DD1190, __main__.D object at 0x0257AF50, class '__main__.D')
由于是数据描述符,__set __函数体是pass,所以两次输出都是同样的内容。
最后看下__getatrr__方法。它的标准定义是:__getattr__(self,attr),其中attr是属性名
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流