我注意到一个预增量/减量运算符可以应用于变量(如++count).它编译,但它实际上并没有改变变量的值!
Python中预增量/减量运算符(++/ - )的行为是什么?
为什么Python偏离了C/C++中这些运算符的行为?
Python的Zen声明应该只有一种方法可以做 - 但我经常遇到决定何时使用函数与何时使用方法的问题.
让我们来看一个简单的例子 - 一个ChessBoard对象.假设我们需要一些方法来获得董事会所有合法的King移动.我们写ChessBoard.get_king_moves()或get_king_moves(chess_board)吗?
以下是我看到的一些相关问题:
我得到的答案基本上没有结果:
为什么Python使用某些功能的方法(例如list.index())但是其他功能(例如len(list))?
主要原因是历史.函数用于那些对一组类型通用的操作,这些操作甚至可以用于根本没有方法的对象(例如元组).当您使用Python的功能特性(map(),apply()等)时,拥有一个可以很容易地应用于无定形对象集合的函数也很方便.
事实上,实现len(),max(),min()作为内置函数实际上比将它们作为每种类型的方法实现它们的代码更少.人们可以对个别案例嗤之以鼻,但它是Python的一部分,现在进行这样的根本性改变为时已晚.必须保留这些功能以避免大量代码破坏.
虽然有趣,但上述内容并未真正说明采用何种策略.
这是原因之一 - 使用自定义方法,开发人员可以自由选择不同的方法名称,如getLength(),length(),getlength()或任何方法.Python强制执行严格命名,以便可以使用公共函数len().
稍微有点儿了.我的看法是函数在某种意义上是Pythonic版本的接口.
最后,来自Guido本人:
谈论能力/接口让我想到了一些我们的"流氓"特殊方法名称.在语言参考中,它说:"类可以通过定义具有特殊名称的方法来实现特殊语法(例如算术运算或下标和切片)调用的某些操作." 但是所有这些方法都有特殊的名称,
__len__或者__unicode__似乎是为了内置函数的优势而提供的,而不是为了支持语法.据推测,在基于接口的Python中,这些方法将变成ABC上的常规命名方法,这样就__len__可以了Run Code Online (Sandbox Code Playgroud)class container: ... def len(self): raise NotImplemented虽然,再考虑一下,我不明白为什么所有语法操作都不会在特定的ABC上调用适当的常用命名方法."
<"举例来说,大概会调用"object.lessthan"(或者是"comparable.lessthan").所以另一个好处是能够让Python远离这个错位名称奇怪,这在我看来是HCI的改进.嗯.我不确定我同意(数字:-).
有两点"Python基本原理"我想首先解释一下.
首先,由于HCI的原因,我选择len(x)而不是x.len()(
def __len__()后来发布).实际上有两个相互交织的原因,都是人机交互:(a)对于某些操作,前缀表示法只比读后缀更好 - 前缀(和中缀!)操作在数学中有悠久的传统,它喜欢视觉效果帮助数学家思考问题的符号.比较与我们改写像公式简单
x*(a+b)到x*a + x*b使用原始OO符号做同样的事情的笨拙.(b)当我阅读代码时,
len(x)我知道它是在询问某些东西的长度.这告诉我两件事:结果是一个整数,参数是某种容器.相反,当我阅读时x.len(),我必须知道这x是某种实现接口的容器或从具有标准的类继承len().当没有实现映射的类有一个get()或一个keys()方法,或者一个不是文件的东西有一个方法时,见证我们偶尔会遇到的困惑write().用另一种方式说同样的事情,我认为'len'是一种内置 操作 …
我最近一直在玩Python,有一件事我发现有点奇怪的是广泛使用'魔术方法',例如使其长度可用,一个对象实现一个方法,def __len__(self)然后它被调用时你写的len(obj).
我只是想知道为什么对象不是简单地定义一个len(self)方法并让它直接作为对象的成员调用,例如obj.len()?我确信Python必须有充分的理由这样做,但作为一个新手,我还没有弄清楚它们到底是什么.
例:
a_list = [1, 2, 3]
a_list.len() # doesn't work
len(a_list) # works
Python(非常)面向对象,我不明白为什么'len'函数不会被对象继承.另外,我一直在尝试错误的解决方案,因为它对我来说似乎是合乎逻辑的
有没有len(someObj)不调用someObj __len__函数的情况?
我最近用(成功的)努力将前者替换为后者以加速某些代码.我想确保在某些地方len(someObj)与someObj不同的边缘情况.__len__().
我有一个非唯一字符串列表:
list = ["a", "b", "c", "a", "a", "d", "b"]
我想用一个唯一标识每个字符串的整数键替换每个元素:
list = [0, 1, 2, 0, 0, 3, 1]
该数字无关紧要,只要它是唯一标识符即可.
到目前为止,我所能想到的是将列表复制到一个集合,并使用集合的索引来引用列表.我确信有更好的方法.