我正在尝试实现一个前向管道功能,比如bash |或R最近%>%.我已经看到了这个实现http://dev-tricks.net/pipe-infix-syntax-for-python,但这要求我们事先定义可能与管道一起使用的所有函数.在寻找完全一般的东西时,这是我到目前为止所想到的.
此函数将其第一个参数应用于其第二个参数(函数)
def function_application(a,b):
return b(a)
Run Code Online (Sandbox Code Playgroud)
例如,如果我们有一个平方函数
def sq(s):
return s**2
Run Code Online (Sandbox Code Playgroud)
我们可以用这种繁琐的方式调用该函数function_application(5,sq).为了更接近前向管道,我们希望使用function_application中缀表示法.
由此绘制,我们可以定义一个Infix类,以便我们可以将函数包装在特殊字符中,例如|.
class Infix:
def __init__(self, function):
self.function = function
def __ror__(self, other):
return Infix(lambda x, self=self, other=other: self.function(other, x))
def __or__(self, other):
return self.function(other)
Run Code Online (Sandbox Code Playgroud)
现在我们可以定义我们的管道,它只是函数的中缀版本function_application,
p = Infix(function_application)
Run Code Online (Sandbox Code Playgroud)
所以我们可以做这样的事情
5 |p| sq
25
Run Code Online (Sandbox Code Playgroud)
要么
[1,2,3,8] |p| sum |p| sq
196
Run Code Online (Sandbox Code Playgroud)
在那个冗长的解释之后,我的问题是,是否有任何方法可以覆盖有效函数名称的限制.在这里,我已经命名了管道p,但是可以重载非字母数字字符吗?我可以命名一个功能,>所以我的管道是|>|?
我是学习Scala的新手,我很欣赏任何有关惯用方法的想法.我想计算一个单词中连续字母对的出现次数.
例如,对于单词"home",输出可能是Map("ho"->1,"om"->1,"me"->1).对于'lulu',结果将是Map("lu"->2, "ul"->1 ).
因此,执行简单的单字母计数可能会完成
"abracadabra".map(s => s).groupBy(identity).mapValues(_.length)
Run Code Online (Sandbox Code Playgroud)
但我很难过如何添加这个问题的双字母组件.谢谢你的想法.
试图了解Scala类和特征,这是一个简单的例子.我想定义一个指定各种操作的类,可以通过多种方式实现.我可能会开始,
sealed trait Operations{
def add
def multiply
}
Run Code Online (Sandbox Code Playgroud)
因此,例如,我可以使用一个对象来实例化这个类add,multiply非常明智,
case object CorrectOperations extends Operations{
def add(a:Double,b:Double)= a+b
def multiply(a:Double,b:Double)= a*b
}
Run Code Online (Sandbox Code Playgroud)
而且,可能还有其他方法来定义这些操作,例如这显然是错误的方式,
case object SillyOperations extends Operations{
def add(a:Double,b:Double)= a + b - 10
def multiply(a:Double,b:Double)= a/b
}
Run Code Online (Sandbox Code Playgroud)
我想将这样的实例传递给一个以特定方式执行操作的函数.
def doOperations(a:Double,b:Double, op:operations) = {
op.multiply(a,b) - op.add(a,b)
}
Run Code Online (Sandbox Code Playgroud)
我想doOperations采取任何类型的对象,operations以便我可以利用add和multiply,无论它们是什么.
我需要改变什么doOperations,以及我在这里误解了什么?谢谢
我正在尝试实现一个递归函数并遇到一些困难,会很感激你的想法.作为一个例子,让我们尝试创建一个调用的函数sliding,这是否
sliding("python", 2)
["py", "yt", "th", "ho", "on"]
Run Code Online (Sandbox Code Playgroud)
也就是说,对于所选择的整数,我们沿着字符串滑动,抓取适当长度的子串,然后将它们全部返回到列表中.
现在,我可以(愚蠢地)尝试以递归方式定义此方法:
def sliding(string,k):
return s if len(string)==k else [string[:k]].append(sliding(string[1:],k))
Run Code Online (Sandbox Code Playgroud)
这将不工作,主要是因为list.append()在地方发生,并返回None.所以我的问题是 - 有没有办法做这种递归函数,即使有很多Python方法到位?
这是我迄今为止最好的,
def sliding(s,k):
if len(s)==k:
return s
else:
temp = [s[:k]]
temp.append(sliding(s[1:],k) )
return temp
Run Code Online (Sandbox Code Playgroud)
这导致了
sliding("python",k=2)
['py', ['yt', ['th', ['ho', 'on']]]]
Run Code Online (Sandbox Code Playgroud)
这显然不是理想的输出,但是方向正确.还有什么其他方法可以做到这一点?谢谢你的想法.
由于身份验证失败,我无法使用Google App Engine部署应用.最近几次讨论过这个问题,
通常的解决方案是您需要对Google帐户进行更改,以允许"安全性"较低的应用程序访问(https://www.google.com/settings/security/lesssecureapps).我相当肯定这是我的问题,因为我在尝试部署之后立即收到来自谷歌的消息,并发出"不太安全"的第三方应用试图登录我的帐户的警告.
我的问题是为什么来自GAE的应用程序被谷歌认为"不太安全"?我之前没有这个问题就部署了应用程序,所以我需要更新GAE吗?我是否应该犹豫是否要启用"不太安全"的应用程序,因为肯定存在风险?
我对这个输出感到惊讶fold,我无法想象它在做什么.
我希望这something.fold(0, lambda a,b: a+1)将返回元素的数量something,因为折叠从每个元素开始0并添加1.
sc.parallelize([1,25,8,4,2]).fold(0,lambda a,b:a+1 )
8
Run Code Online (Sandbox Code Playgroud)
我来自斯卡拉,在那里折叠就像我描述的那样.那么如何折叠应该在pyspark中工作?谢谢你的想法.