我一直认为函数式编程可以用Python完成.因此,我很惊讶Python在这个问题上没有得到很多提及,当提到它时,它通常不是很积极.然而,没有给出很多理由(没有提到模式匹配和代数数据类型).所以我的问题是:为什么Python不适合函数式编程?是否有更多的原因,而不是缺乏模式匹配和代数数据类型?或者这些概念对函数式编程如此重要,以至于不支持它们的语言只能被归类为二级函数式编程语言?(请记住,我在函数式编程方面的经验非常有限.)
我刚刚意识到这一点
x.real*x.real+x.imag*x.imag
Run Code Online (Sandbox Code Playgroud)
比做的快三倍
abs(x)**2
Run Code Online (Sandbox Code Playgroud)
其中x是一个复数的numpy数组.为了代码可读性,我可以定义一个类似的函数
def abs2(x):
return x.real*x.real+x.imag*x.imag
Run Code Online (Sandbox Code Playgroud)
它仍然比abs(x)**2快得多,但它是以函数调用为代价的.是否可以内联这样的函数,就像在C中使用宏或使用内联关键字一样?
我想将一个函数传递给Python中的函数.我知道我可以通过将函数名称作为参数来实现,例如:
blah(5, function)
Run Code Online (Sandbox Code Playgroud)
但是,我想将int()函数和float()函数传递给此函数.如果我只是把函数名称放在那里它假定我指的是int和float类型而不是将字符串转换为整数和浮点数的函数.
有没有办法传递函数而不是类型?
比如我有
x = ['a','b','c']
Run Code Online (Sandbox Code Playgroud)
我需要将其转换为:
y['a']['b']['c'] = ''
Run Code Online (Sandbox Code Playgroud)
那可能吗?
对于后台,我有一个配置文件,其中包含指向某些json数据中某个位置的点符号.我想使用带点的符号字符串来访问json文件中的特定数据.例如,在配置中:
path_to_data = "user.name.first_name"
Run Code Online (Sandbox Code Playgroud)
我希望我的脚本能够认识到:
json_data["user"]["name"]["first_name"]
Run Code Online (Sandbox Code Playgroud)
所以我可以得到first_name字段的值.我将原始字符串转换为列表,现在我不知道如何将其转换为嵌套字典.
编辑:我需要应用dict的现有数据结构.让我们说:
m = {'a': {'b': {'c': 'lolcat'}}}
Run Code Online (Sandbox Code Playgroud)
以便
m['a']['b']['c']
Run Code Online (Sandbox Code Playgroud)
给了我'lolcat'.如果我得到了正确的字典结构(正如一些回复所做的那样),我仍然需要将它应用于现有字典'm'.
所以,再次,我从配置文件中得到这个:
c = 'a.b.c'
Run Code Online (Sandbox Code Playgroud)
我转换成一个列表,认为这将使事情变得更容易:
x = ['a','b','c']
Run Code Online (Sandbox Code Playgroud)
现在我有一个类似json的数据结构:
m = {'a': {'b': {'c': 'lolcat'}}}
Run Code Online (Sandbox Code Playgroud)
所以从'x'生成的嵌套字典应该能够遍历'm'
m['a']['b']['c']
Run Code Online (Sandbox Code Playgroud)
让我成为猫.
我想将一个可选的'if'语句传递给要执行的python方法.例如,该方法可能会将某些文件从一个文件夹复制到另一个文件夹,但该方法可能采用可选条件.
因此,例如,对方法的一次调用可以说" 如果source.endswith(".exe")将文件从源复制到dest .
下一个调用可能只是无条件地将文件从源复制到目标.
如果今天是星期一,下一个电话可能是将文件从源复制到目的地
你如何将这些条件传递给python中的方法?
我有一个对象列表,我想更改所有对象的属性值(相同的值 - NewValue).
map()在函数(lambda)没有返回任何值的情况下,是否比正常for循环更有效?
map ( lambda x: x.attribute = NewValue, li)
Run Code Online (Sandbox Code Playgroud)
VS
for i in li:
i.attribute = NewValue
Run Code Online (Sandbox Code Playgroud)