有很多关于Python与Ruby的讨论,我发现它们完全没有用,因为它们都转向了为什么功能X在语言Y中很糟糕,或者声称语言Y没有X,尽管事实上确实如此.我也确切地知道为什么我更喜欢Python,但这也是主观的,并且不会帮助任何人选择,因为他们可能没有和我一样的开发品味.
因此,客观地列出差异将是有趣的.所以没有"Python的lambdas糟透了".而是解释Ruby的lambdas可以做什么,Python不能.没有主观性.示例代码很好!
请不要在一个答案中有几个不同之处.并且对那些你认识的是正确的进行投票,然后对你所知道的那些是不正确的(或者是主观的).此外,语法上的差异也不大.我们知道Python使用缩进来处理Ruby用括号和结尾做什么,并且@在Python中称为self.
更新:这是一个社区维基,所以我们可以在这里添加很大的差异.
在Ruby中,您可以在类主体中引用类(self).在Python中,在类构造完成之前,您没有对类的引用.
一个例子:
class Kaka
puts self
end
Run Code Online (Sandbox Code Playgroud)
在这种情况下,self就是类,这段代码会打印出"Kaka".无法打印出类名或以其他方式从Python中的类定义体(外部方法定义)访问该类.
这使您可以开发核心类的扩展.以下是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拥有一流的regexp,$ -variables,awk/perl逐行输入循环和其他功能,使其更适合编写munge文本文件的小shell脚本或充当其他程序的粘合代码.
感谢callcc声明.在Python中,您可以通过各种技术创建延续,但是该语言没有内置支持.
使用"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) 我有一个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:我相信当我们有几个相同的情况需要最少的炸弹来清除上线时,我们选择在该行的"左侧"使用大多数炸弹的一个.还有什么证据可能是正确的吗?
虽然我从来没有需要这个,但让我感到震惊的是在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)
但是你可以通过和访问a
和b
变量,这很烦人.self[0]
self[1]
这在纯Python中是否可行?如果没有,我将如何使用C扩展?
(只能在Python 3中使用的答案是可以接受的).
更新:
因此,子类的元组是做纯Python,效果很好,除了通过访问数据的另一种可能性的方式[0]
,[1]
等等.所以,要完成这个问题,所有这一切都缺少的是HOWTO在C,做"正确的",这我怀疑是非常简单,只是没有实现任何geititem
或setattribute
等等.但我不是自己做,我为此提供赏金,因为我很懒.:)
我需要计算两个列表之间的余弦相似度,比如列表1,列表2是.我不能使用numpy或统计模块等任何东西.我必须使用通用模块(数学等)(尽可能使用最少的模块,以减少花费的时间).dataSetI
dataSetII
比方说,dataSetI
是[3, 45, 7, 2]
和dataSetII
是[2, 54, 13, 15]
.列表的长度始终相等.
当然,余弦相似度在0和1之间,并且为了它,它将四舍五入到第三或第四个十进制数format(round(cosine, 3))
.
非常感谢您提前帮助.
Python默认按字节值排序,这意味着é来自z和其他同样有趣的东西.在Python中按字母顺序排序的最佳方法是什么?
有这个图书馆吗?我找不到任何东西.最好排序应该有语言支持所以它理解åäö应该用瑞典语中的z排序,但是ü应该用u等排序.因此,Unicode支持是非常必要的.
如果没有库,那么最好的方法是什么?只需从字母到整数值进行映射,然后将字符串映射到整数列表即可?
即使对于没有任何编程经验但具有公平数学背景的人来说,功能也很容易理解.另一方面,课程似乎更难掌握.
假设我想创建一个类/函数来计算给定他/她的生日年和当前年份的人的年龄.我应该为此创建一个类,还是一个函数?或者是依赖于场景的选择?
PS我正在研究Python,但我想这个问题是通用的.
为什么在以下列表理解中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) 看起来像做以下事情是很自然的:
with socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
Run Code Online (Sandbox Code Playgroud)
但Python没有为socket实现上下文管理器.我可以轻松地将其用作上下文管理器,如果是,如何使用?
我有一个python脚本,当在Windows机器上运行时和在Mac上运行时提供不同的输出.在深入挖掘时,我发现这是因为当Python在Mac上读取换行符(从文件中读取)时,它会读入\r\n
,而在Windows中以某种方式\r
消失.
因此,如果我\n
将脚本中的每个更改为\r\n
,它在Mac上运行正常.但如果我这样做,它就会停止在Windows PC上运行.
有没有一种简单的方法来解决这个问题?
我有一个基类Person
和派生类Manager
和Employee
.现在,我想知道的是创建的对象是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 ×8
python-3.x ×2
algorithm ×1
base-class ×1
class ×1
collation ×1
function ×1
immutability ×1
macos ×1
matrix ×1
oop ×1
plone ×1
python-2.6 ×1
python-2.x ×1
ruby ×1
sockets ×1
sorting ×1
unicode ×1
windows ×1