草庐IT

python "if len(A) is not 0"与 "if A"语句

我的同事在条件下使用这种方式iflen(A)isnot0:print('Aisnotempty')我更喜欢这个ifA:print('Aisnotempty')什么是正反论点?她的观点是,第一种方式更直接地展示了她真正想要的东西。我的意思是我的路更短。还有第一种方法比我的方法快2倍:>>>importtimeit>>>timeit.timeit('len(A)isnot0',setup='A=[1,2,3]')0.048459101999924314>>>timeit.timeit('bool(A)',setup='A=[1,2,3]')0.09833707799998592但是>>>i

python - 在循环的条件语句中调用 len() 可以吗?

在C中,像这样调用strlen被认为是不好的做法:for(i=0;strlen(str)!=foo;i++){//stuff}当然,原因是它效率低下,因为它多次“计算”字符串中的字符。然而,在Python中,我经常看到这样的代码:foriinrange(0,len(list)):#stuff这是不好的做法吗?我应该将len()的结果存储在一个变量中并使用它吗? 最佳答案 在Python中,一个for循环遍历一个类似列表的对象,它没有每次都检查的条件语句。为了说明,以下两个循环在功能上是等价的;whileloop是for(i=0;i的

python - 为什么 len() 不支持迭代器?

许多Python的内置函数(any()、all()、sum()等等)都接受迭代,但是为什么len()没有?人们总是可以使用sum(1foriiniterable)作为等价物,但为什么len()一开始不采用iterables? 最佳答案 许多可迭代对象是由没有明确定义的len的生成器表达式定义的。采取以下永远迭代的方式:defsequence(i=0):whileTrue:i+=1yieldi基本上,要有明确定义的长度,您需要预先知道整个对象。将其与sum之类的函数进行对比。您无需立即了解整个对象即可对其求和-只需一次取一个元素并将其

python - 为什么在自定义迭代器上隐式调用 __len__()

我正在编写一个简单的链表实现如下:classNode(object):def__init__(self,value):self.value=valueself._next=Nonedef__iter__(self):here=selfwhilehere:yieldherehere=here._nextdef__len__(self):print("Calling__len__on:{}".format(self))returnsum(1for_inself)defappend_to_tail(self,value):ifself._nextisNone:self._next=Node(

python - 在 Pandas 数据框中使用 len()

这是我的DataFrame的外观:StateAbGivenNmSurnamePartyNmPartyAbElectedOrder35WAJoeBULLOCKAustralianLaborPartyALP236WAMichaeliaCASHLiberalLP337WALindaREYNOLDSLiberalLP438WAWayneDROPULICHAustralianSportsPartySPRT539WAScottLUDLAMTheGreens(WA)GRN6andIwanttolistalistofsenatorswhosesurnameismorethan9characterslo

python - 为什么 len ("".split ("")) 给出 1? Python

len("".split(""))==1显示True的pythonic解释是什么?为什么"".split("")会产生['']>>>len("".split(""))1>>>"".split("")[''] 最佳答案 str.split(sep)返回至少一个元素。如果在文本中找不到sep,则该元素是原始的、未拆分的文本。对于空字符串,sep定界符当然是找不到的,在文档中有专门的调用:Splittinganemptystringwithaspecifiedseparatorreturns[''].您可能对None分隔符选项(默认)的行

python - 为什么 somelist[len(somelist)] 生成一个 IndexError 而不是 somelist[len(somelist) :]?

我知道somelist[len(somelist)]无法访问定义列表之外的索引-这是有道理的。但是为什么Python允许你做somelist[len(somelist):]?我什至读过somelist[len(somelist):]=[1]等同于somelist.append(1)但为什么切片符号会改变索引“len(somelist)”仍然在列表范围之外的事实? 最佳答案 这是来自documentation的内容.任何可迭代对象的切片都有特定的规则;特别值得注意的是#4,强调我的:Thesliceofsfromitojisdefin

python - 覆盖 __init__.py 中的 len - python

我想通过以下方式在我的包的__init__.py文件中为len分配另一个函数:llen=lenlen=lambdax:llen(x)-1它工作正常,但只在__init__.py文件中。我怎样才能让它影响我包中的其他模块? 最佳答案 这可能不是您正在寻找的答案,但如果我是您,我不会这样做(而且我敢肯定,无论如何您都做不到)。你不应该这样做的原因是python在它的对象内部使用len来执行某些操作。另一个原因是纯粹的破坏逻辑。上面定义的len函数将为空列表或空内容返回一个负长度。这对我来说似乎很糟糕。您可以做的是仅在某些类上覆盖长度方法

python - 为什么 `len(l) != 0` 在 CPython 中比 `bool(l)` 快?

我正在做一些关于列表操作速度的实验。为此,我定义了两个列表:l_short=[]和l_long=list(range(10**7))。想法是将bool(l)与len(l)!=0进行比较在if竞赛中,以下实现比iflen(l)!=0:passifl:pass快很多但是没有if比赛我得到了以下结果:%%timeitlen(l_long)!=0#59.8ns±0.358nsperloop(mean±std.dev.of7runs,10000000loopseach)%%timeitbool(l_long)#63.3ns±0.192nsperloop(mean±std.dev.of7runs,

python - 为什么创建从 0 到 log(len(list), 2) 的范围这么慢?

我不知道为什么会这样。我正在处理一些列表,我需要一个从0到log(n,2)的for循环,其中n是列表的长度。但是代码出奇的慢,所以经过一番研究我发现问题出在范围生成上。演示示例代码:n=len([1,2,3,4,5,6,7,8])k=8timeit('range(log(n,2))',number=2,repeat=3)#Test1timeit('range(log(k,2))',number=2,repeat=3)#Test2输出2loops,bestof3:2.2sperloop2loops,bestof3:3.46µsperloop测试次数很少(我不希望它运行超过10分钟),但它