小编rbo*_*boy的帖子

可以覆盖Python中的文字吗?

无法找到更好地标题的方法,随意纠正.

我是Python的新手,目前正在尝试使用该语言.我注意到所有内置类型都不能与其他成员一起扩展.我想例如eachlist类型中添加一个方法,但那会不可能.我意识到它是出于效率原因而设计的,并且大多数内置类型都是用C实现的.

好吧,我发现重写此行为的原因之一是定义一个新类,该类扩展list但不执行任何操作.然后我可以将变量分配list给那个新类,每次我想实例化一个新列表时,我都会使用list构造函数,就像它用来创建原始list类型一样.

class MyList(list):
    def each(self, func):
       for item in self:
           func(item)
list = MyList

my_list = list((1,2,3,4))
my_list.each(lambda x: print(x))
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

当然,这个想法可以通过定义获取构建类型的方法并返回扩展该类型的类来概括.此外,原始list变量可以保存在另一个变量中以保持对它的访问.

我现在面临的唯一问题是,当你list通过它的文字形式(即[1,2,3,4])实例化它时,它仍将使用原始列表构造函数(或者它是什么?).有没有办法覆盖这种行为?如果答案是否定的,您是否知道其他一些方法可以让用户扩展内置类型?(就像javascript允许扩展内置原型).

我发现内置插件的这种限制(无法向其添加成员)是Python的一个缺点,使其与其他用户定义的类型不一致......总的来说我真的很喜欢这种语言,我真的不明白为什么这样绝对是必要的.

python macropy

11
推荐指数
1
解决办法
997
查看次数

__len__ 方法是如何在 Python 中的各种容器类型中实现的?

到现在为止,当我将该len函数与各种容器类型(list假设现在的类型)一起使用时,我假设每个容器类型都有一个字段成员,用于存储该特定对象的长度.. 来自 Java,这做了很多感觉。但是当我想到它时,我不认为这是真的,这让我感到困惑。

每当我len在一个实现的对象上使用该函数时__length__,它是通过迭代对象的元素来计算长度,还是立即以某种方式返回长度?

这个问题实际上来自使用dict内置类型。我向字典中添加了一些元素(很多),最终我需要获取字典中元素的数量,所以因为我不确定len函数的时间复杂度是多少,我决定将这些元素计算为我插入它们...但我不确定这是我问题的正确解决方案。

这是我的问题的示例代码:

d = {}
count = 0
for i in range(10 ** 6):
    d[i] = True
    count += 1
Run Code Online (Sandbox Code Playgroud)

VS

d = {i: True for i in range(10 ** 6)}
count = len(d)
Run Code Online (Sandbox Code Playgroud)

第二个解决方案对我来说看起来更好(和更短)......而且我知道理论上无论len函数是否即时,时间复杂度都是相同的,在第二个解决方案中,我担心它迭代两次到 10 ** 6 (第一个用于字典理解,其次用于长度计算)。

请赐教。

python

4
推荐指数
1
解决办法
2801
查看次数

自动完成的正则表达式

我有一个短语列表,这些短语由可以用空格、连字符、camelCase 或 PascalCase 分隔的单词组成。我希望能够通过只输入每个单词的几个字母来过滤这些短语,并且可能会跳过一些单词。对于熟悉 JetBrains IDE 的人来说,它类似于代码完成的工作方式。我想出于通用目的模拟该行为,而不仅仅是为了在 IDE 中编写代码。(一般用途是在网站中使用它来过滤短语,也许将它与 Bash 一起使用来获取文件列表,只需输入文件单词的一些首字母,或我所说的一些单词)。这是我经常使用的非常方便的工具(在 JetBrains 中)!

示例
给出以下短语:

  • LoremIpsumDolor
  • sitAmetConsectetur
  • adipisicing-elit-sed
  • Do Eiusmod Tempor incididunt

以下是我想过滤的一些典型词:

  • lodo-> 回馈LoremIpsumDolor(注意这里不区分大小写,这就是我想要的方式)
  • dotemporinc -> 回馈 Do Eiusmod Tempor incididunt
  • Do-> 回馈LoremIpsumDolorDo Eiusmod Tempor incididunt
  • ac -> 回馈 sitAmetConsectetur

我一直在考虑如何实现这种功能,我能想到的最好的办法是输入要过滤的单词 -lodo例如示例 1,将生成一个由单词的字母构成的正则表达式,分隔通过一些额外的表达式来形成整个正则表达式......然后它将针对该正则表达式测试列表中的每个短语,并仅返回匹配的那些。

我想过可能将单词 ( lodo)拆分为字母,并在每个字母之间(在开头和结尾处)添加以下正则表达式:([a-zA-Z][a-z]*)*,(此解决方案,如果可行,假设所有短语都是驼峰\PascalCased,但完整的解决方案还必须包括其他情况)。这将导致以下正则表达式: ^([a-zA-Z][a-z]*)*[lL]([a-zA-Z][a-z]*)*[oO]([a-zA-Z][a-z]*)*[dD]([a-zA-Z][a-z]*)*[oO]([a-zA-Z][a-z]*)*$

显然,这有一些源自回溯的巨大缺陷,更具体地说,我认为(但绝对不确定),如果我可以在 中禁用内部恒星表达式([a-zA-Z][a-z]*)*的回溯,只保留外部恒星的回溯,它应该工作。

我希望我能很好地解释自己。也许这个问题有一个已知的解决方案,那么我很想听听。

regex

4
推荐指数
1
解决办法
3949
查看次数

标签 统计

python ×2

macropy ×1

regex ×1