小编Len*_*bro的帖子

Ruby没有Python,反之亦然?

有很多关于Python与Ruby的讨论,我发现它们完全没有用,因为它们都转向了为什么功能X在语言Y中很糟糕,或者声称语言Y没有X,尽管事实上确实如此.我也确切地知道为什么我更喜欢Python,但这也是主观的,并且不会帮助任何人选择,因为他们可能没有和我一样的开发品味.

因此,客观地列出差异将是有趣的.所以没有"Python的lambdas糟透了".而是解释Ruby的lambdas可以做什么,Python不能.没有主观性.示例代码很好!

请不要在一个答案中有几个不同之处.并且对那些你认识的是正确的进行投票,然后对你所知道的那些是不正确的(或者是主观的).此外,语法上的差异也不大.我们知道Python使用缩进来处理Ruby用括号和结尾做什么,并且@在Python中称为self.

更新:这是一个社区维基,所以我们可以在这里添加很大的差异.

Ruby在类体中有一个类引用

在Ruby中,您可以在类主体中引用类(self).在Python中,在类构造完成之前,您没有对类的引用.

一个例子:

class Kaka
  puts self
end
Run Code Online (Sandbox Code Playgroud)

在这种情况下,self就是类,这段代码会打印出"Kaka".无法打印出类名或以其他方式从Python中的类定义体(外部方法定义)访问该类.

所有类在Ruby中都是可变的

这使您可以开发核心类的扩展.以下是rails扩展的示例:

class String
  def starts_with?(other)
    head = self[0, other.length]
    head == other
  end
end
Run Code Online (Sandbox Code Playgroud)

Python(想象没有''.startswith方法):

def starts_with(s, prefix):
    return s[:len(prefix)] == prefix
Run Code Online (Sandbox Code Playgroud)

您可以在任何序列(不仅仅是字符串)上使用它.为了使用它,你应该明确地导入它,例如,from some_module import starts_with.

Ruby具有类似Perl的脚本功能

Ruby拥有一流的regexp,$ -variables,awk/perl逐行输入循环和其他功能,使其更适合编写munge文本文件的小shell脚本或充当其他程序的粘合代码.

Ruby有一流的延续

感谢callcc声明.在Python中,您可以通过各种技术创建延续,但是该语言没有内置支持.

Ruby有块

使用"do"语句,您可以在Ruby中创建一个多行匿名函数,它将作为参数传递到do前面的方法中,并从那里调用.在Python中,您可以通过传递方法或使用生成器来执行此操作.

红宝石:

amethod { |here|
    many=lines+of+code
    goes(here)
}
Run Code Online (Sandbox Code Playgroud)

Python(Ruby块对应于Python中的不同构造):

with amethod() as here: # `amethod() is a context manager
    many=lines+of+code
    goes(here)
Run Code Online (Sandbox Code Playgroud)

要么

for here in amethod(): # `amethod()` …
Run Code Online (Sandbox Code Playgroud)

ruby python

264
推荐指数
23
解决办法
13万
查看次数

炸弹丢弃算法

我有一个n x m由非负整数组成的矩阵.例如:

2 3 4 7 1
1 5 2 6 2
4 3 4 2 1
2 1 2 4 1
3 1 3 4 1
2 1 4 3 2
6 9 1 6 4
Run Code Online (Sandbox Code Playgroud)

"掉落炸弹"会使目标小区的数量和其所有八个邻居的数量减少一个,最小为零.

x x x 
x X x
x x x
Run Code Online (Sandbox Code Playgroud)

什么算法可以确定将所有单元减少到零所需的最小炸弹数量?

B选项(由于我不是一个细心的读者)

实际上问题的第一个版本并不是我想要回答的问题.我没有仔细阅读整个任务,还有其他限制,让我们说:

当行中的序列必须不增加时,简单问题怎么办:

8 7 6 6 5 是可能的输入序列

7 8 5 5 2 因为7 - > 8在序列中生长是不可能的.

也许找到"更容易"的案例的答案将有助于找到更难的解决方案.

PS:我相信当我们有几个相同的情况需要最少的炸弹来清除上线时,我们选择在该行的"左侧"使用大多数炸弹的一个.还有什么证据可能是正确的吗?

language-agnostic algorithm matrix

212
推荐指数
9
解决办法
2万
查看次数

如何在Python中创建不可变对象?

虽然我从来没有需要这个,但让我感到震惊的是在Python中创建一个不可变对象可能会有点棘手.你不能只是覆盖__setattr__,因为那时你甚至不能设置属性__init__.对元组进行子类化是一种有效的技巧:

class Immutable(tuple):

    def __new__(cls, a, b):
        return tuple.__new__(cls, (a, b))

    @property
    def a(self):
        return self[0]

    @property
    def b(self):
        return self[1]

    def __str__(self):
        return "<Immutable {0}, {1}>".format(self.a, self.b)

    def __setattr__(self, *ignored):
        raise NotImplementedError

    def __delattr__(self, *ignored):
        raise NotImplementedError
Run Code Online (Sandbox Code Playgroud)

但是你可以通过和访问ab变量,这很烦人.self[0]self[1]

这在纯Python中是否可行?如果没有,我将如何使用C扩展?

(只能在Python 3中使用的答案是可以接受的).

更新:

因此,子类的元组是做纯Python,效果很好,除了通过访问数据的另一种可能性的方式[0],[1]等等.所以,要完成这个问题,所有这一切都缺少的是HOWTO在C,做"正确的",这我怀疑是非常简单,只是没有实现任何geititemsetattribute等等.但我不是自己做,我为此提供赏金,因为我很懒.:)

python immutability python-3.x

165
推荐指数
11
解决办法
7万
查看次数

2个数字列表之间的余弦相似度

我需要计算两个列表之间的余弦相似度,比如列表1,列表2是.我不能使用numpy或统计模块等任何东西.我必须使用通用模块(数学等)(尽可能使用最少的模块,以减少花费的时间).dataSetIdataSetII

比方说,dataSetI[3, 45, 7, 2]dataSetII[2, 54, 13, 15].列表的长度始终相等.

当然,余弦相似度在0和1之间,并且为了它,它将四舍五入到第三或第四个十进制数format(round(cosine, 3)).

非常感谢您提前帮助.

python python-3.x cosine-similarity

101
推荐指数
9
解决办法
21万
查看次数

如何在Python中按字母顺序对unicode字符串进行排序?

Python默认按字节值排序,这意味着é来自z和其他同样有趣的东西.在Python中按字母顺序排序的最佳方法是什么?

有这个图书馆吗?我找不到任何东西.最好排序应该有语言支持所以它理解åäö应该用瑞典语中的z排序,但是ü应该用u等排序.因此,Unicode支持是非常必要的.

如果没有库,那么最好的方法是什么?只需从字母到整数值进行映射,然后将字符串映射到整数列表即可?

python sorting unicode collation internationalization

94
推荐指数
6
解决办法
4万
查看次数

类与函数

即使对于没有任何编程经验但具有公平数学背景的人来说,功能也很容易理解.另一方面,课程似乎更难掌握.

假设我想创建一个类/函数来计算给定他/她的生日年和当前年份的人的年龄.我应该为此创建一个类,还是一个函数?或者是依赖于场景的选择?

PS我正在研究Python,但我想这个问题是通用的.

oop class function

56
推荐指数
6
解决办法
7万
查看次数

列表理解:为什么这是语法错误?

为什么在以下列表理解中print(x)这里不是有效的(SyntaxError)?

my_list=[1,2,3]
[print(my_item) for my_item in my_list]
Run Code Online (Sandbox Code Playgroud)

为了对比 - 以下不会给出语法错误:

def my_func(x):
    print(x)
[my_func(my_item) for my_item in my_list]
Run Code Online (Sandbox Code Playgroud)

python list-comprehension python-2.6

47
推荐指数
3
解决办法
3万
查看次数

如何在Python中使用socket作为上下文管理器?

看起来像做以下事情是很自然的:

with socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
Run Code Online (Sandbox Code Playgroud)

但Python没有为socket实现上下文管理器.我可以轻松地将其用作上下文管理器,如果是,如何使用?

python sockets contextmanager

41
推荐指数
2
解决办法
2万
查看次数

在Mac与Windows上的python中处理\ r \n与\n \n换行符

我有一个python脚本,当在Windows机器上运行时和在Mac上运行时提供不同的输出.在深入挖掘时,我发现这是因为当Python在Mac上读取换行符(从文件中读取)时,它会读入\r\n,而在Windows中以某种方式\r消失.

因此,如果我\n将脚本中的每个更改为\r\n,它在Mac上运行正常.但如果我这样做,它就会停止在Windows PC上运行.

有没有一种简单的方法来解决这个问题?

python windows macos python-2.x

33
推荐指数
4
解决办法
7万
查看次数

如何从基类获取派生类名

我有一个基类Person和派生类ManagerEmployee.现在,我想知道的是创建的对象是Manager或者Employee.

该人的具体如下:

from Project.CMFCore.utils import getToolByName
schema = getattr(Person, 'schema', Schema(())).copy() + Schema((TextField('FirstName', required = True, widget = StringWidget(label='First Name', i18n_domain='project')), TextField('Last Name', required = True, widget = StringWidget(label='Last Name', i18n_domain='i5', label_msgid='label_pub_city'))
class Manager(BaseContent):
  def get_name(self):
    catalog = getToolByName(self, "portal_catalog")
      people = catalog(portal_type='Person')
      person={}
      for object in people:
        fname = object.firstName
        lname = object.lastName
        person['name'] = fname+' '+ lname
        # if the derived class is Employee then i would like …
Run Code Online (Sandbox Code Playgroud)

python plone base-class derived-class

33
推荐指数
4
解决办法
2万
查看次数