仅使用纯函数创建一个包含值的列表 - python
Create a list with a value in it using only pure functions - python
为什么这个问题没有简单的解决方案是因为我只需要使用 pure functions.
来解决
仅使用来自 Python 的函数式编程页面 (https://docs.python.org/3/howto/functional.html#) 的纯函数,如何创建一个包含值的列表?如果我们想创建一个包含值的列表,我们(在代码中)只需要
x = [1]
我不认为 []
是我们在这里查看的函数的一部分,因为它没有签名并且不能像任何其他函数一样调用。
仅使用函数来做到这一点并非易事。我的一个想法是使用 list()
创建一个新列表,然后向其附加值。但是 list().append
是可变的,并且不会 return 一个新的或包含其中项目的列表。
我真正想做的是把["a","b","c"]
变成[["a"],["b"],["c"]]
,有上面的约束。
已经提出了其他建议,比如创建我自己的(纯)函数来做我想做的事情:
def create_list(value) -> list:
return [value]
然后只需执行 map(create_list, ["a","b","c"])
即可获得解决方案。
但这是一个自定义函数,并非来自任何 python 包函数(如前所述,在 https://docs.python.org/3/howto/functional.html 内)
单元素:
def to_list(elem):
return list(range(elem, elem+1)))
通过列表理解将[1,2,3]
转换为[[1], [2], [3]]
(可以很容易地更改为map
):
return [to_list(el) for el in input_list]
没有(丑陋,但有效^^)
import itertools
def make_gen(elem):
yield elem
def to_list(elem):
return list(make_gen(elem))
def helper(elem, l):
return list(itertools.chain(to_list(to_list(elem)), l))
def convert(l):
if not l:
return []
return helper(l[0], convert(l[1:]))
print(convert([1, 2, 3]))
Using only pure functions from Python's functional programming page
(https://docs.python.org/3/howto/functional.html#), how can one create
a list with a value in it? If we'd like to create a list with number 1
in it
您可能会利用生成器,因为其中描述了生成器
def justone():
yield 1
lst = list(justone())
print(lst)
输出
[1]
justone
是函数(可以使用 inspect.isfunction
检查)并且是纯函数(因为它不会改变外部的任何东西)
lst=[1,2,3];
#this will print [[1],[2],[3]]
print(list(map(lambda x: [x],lst)));
在您 link 的文档中,有对迭代器和生成器的引用,它们是 Python(和其他语言)中存在的强大结构。您可以考虑一个函数来构建一个列表,如下所示:
def list_from_args(*args):
return [*args]
这是迭代器功能的(多余的)包装器。您可以利用 Python 中的迭代器模式来完成很多工作,无论是 creating/consuming 对象(例如列表、元组、字典),还是用于处理数据(例如 reading/writing 到文件行-逐行,对 API 或数据库查询等进行分页)
上面的代码执行以下操作,例如:
>>> example = list_from_args(1, 'a', 'ham', 'eggs', 44)
>>> example
[1, 'a', 'ham', 'eggs', 44]
我将上述功能标记为多余的原因:通常,如果您需要即时创建列表,可以使用 list comprehensions。
为了确保不可变性,您可能希望使用元组而不是列表(或者对您的列表非常严格)。
使用列表理解是一种有效的函数式方法:
A = [1,2,3]
B = [ [i] for i in A ] # [[1], [2], [3]]
或元组:
A = (1,2,3)
B = tuple( (i,) for i in A ) # ((1,), (2,), (3,))
如果你必须使用函数,那么 map() 可能是一个很好的解决方案:
A = [1,2,3]
B = list(map(lambda i:[i],A))
如果连 [i]
都被禁止(但为什么会这样),您可以使用 a 函数直接从其参数创建列表:
def makeList(*v): return list(*v)
A = makeList(1,2,3)
B = makeList(*map(makeList,A))
# combined
makeList(*map(makeList,makeList(1,2,3)))
顺便说一句,函数式编程不是关于“只使用函数”,它更多的是关于结果的非可变性(以及避免副作用)。你可能想问问是谁派你来的。
这只使用 https://docs.python.org/3/library/functional.html
中的函数
import functools
import itertools
map(
list,
map(
functools.partial(
itertools.repeat,
times=1,
),
[1,2,3]
)
)
functools.partial
创建一个 itertools.repeat
的新函数,并将“times”参数设置为 1。然后列表中的每个值重复一次,并使用 list
变成一个新列表函数。
>>> [[1], [2], [3]]
为什么这个问题没有简单的解决方案是因为我只需要使用 pure functions.
来解决仅使用来自 Python 的函数式编程页面 (https://docs.python.org/3/howto/functional.html#) 的纯函数,如何创建一个包含值的列表?如果我们想创建一个包含值的列表,我们(在代码中)只需要
x = [1]
我不认为 []
是我们在这里查看的函数的一部分,因为它没有签名并且不能像任何其他函数一样调用。
仅使用函数来做到这一点并非易事。我的一个想法是使用 list()
创建一个新列表,然后向其附加值。但是 list().append
是可变的,并且不会 return 一个新的或包含其中项目的列表。
我真正想做的是把["a","b","c"]
变成[["a"],["b"],["c"]]
,有上面的约束。
已经提出了其他建议,比如创建我自己的(纯)函数来做我想做的事情:
def create_list(value) -> list:
return [value]
然后只需执行 map(create_list, ["a","b","c"])
即可获得解决方案。
但这是一个自定义函数,并非来自任何 python 包函数(如前所述,在 https://docs.python.org/3/howto/functional.html 内)
单元素:
def to_list(elem):
return list(range(elem, elem+1)))
通过列表理解将[1,2,3]
转换为[[1], [2], [3]]
(可以很容易地更改为map
):
return [to_list(el) for el in input_list]
没有(丑陋,但有效^^)
import itertools
def make_gen(elem):
yield elem
def to_list(elem):
return list(make_gen(elem))
def helper(elem, l):
return list(itertools.chain(to_list(to_list(elem)), l))
def convert(l):
if not l:
return []
return helper(l[0], convert(l[1:]))
print(convert([1, 2, 3]))
Using only pure functions from Python's functional programming page (https://docs.python.org/3/howto/functional.html#), how can one create a list with a value in it? If we'd like to create a list with number 1 in it
您可能会利用生成器,因为其中描述了生成器
def justone():
yield 1
lst = list(justone())
print(lst)
输出
[1]
justone
是函数(可以使用 inspect.isfunction
检查)并且是纯函数(因为它不会改变外部的任何东西)
lst=[1,2,3];
#this will print [[1],[2],[3]]
print(list(map(lambda x: [x],lst)));
在您 link 的文档中,有对迭代器和生成器的引用,它们是 Python(和其他语言)中存在的强大结构。您可以考虑一个函数来构建一个列表,如下所示:
def list_from_args(*args):
return [*args]
这是迭代器功能的(多余的)包装器。您可以利用 Python 中的迭代器模式来完成很多工作,无论是 creating/consuming 对象(例如列表、元组、字典),还是用于处理数据(例如 reading/writing 到文件行-逐行,对 API 或数据库查询等进行分页)
上面的代码执行以下操作,例如:
>>> example = list_from_args(1, 'a', 'ham', 'eggs', 44)
>>> example
[1, 'a', 'ham', 'eggs', 44]
我将上述功能标记为多余的原因:通常,如果您需要即时创建列表,可以使用 list comprehensions。
为了确保不可变性,您可能希望使用元组而不是列表(或者对您的列表非常严格)。
使用列表理解是一种有效的函数式方法:
A = [1,2,3]
B = [ [i] for i in A ] # [[1], [2], [3]]
或元组:
A = (1,2,3)
B = tuple( (i,) for i in A ) # ((1,), (2,), (3,))
如果你必须使用函数,那么 map() 可能是一个很好的解决方案:
A = [1,2,3]
B = list(map(lambda i:[i],A))
如果连 [i]
都被禁止(但为什么会这样),您可以使用 a 函数直接从其参数创建列表:
def makeList(*v): return list(*v)
A = makeList(1,2,3)
B = makeList(*map(makeList,A))
# combined
makeList(*map(makeList,makeList(1,2,3)))
顺便说一句,函数式编程不是关于“只使用函数”,它更多的是关于结果的非可变性(以及避免副作用)。你可能想问问是谁派你来的。
这只使用 https://docs.python.org/3/library/functional.html
中的函数import functools
import itertools
map(
list,
map(
functools.partial(
itertools.repeat,
times=1,
),
[1,2,3]
)
)
functools.partial
创建一个 itertools.repeat
的新函数,并将“times”参数设置为 1。然后列表中的每个值重复一次,并使用 list
变成一个新列表函数。
>>> [[1], [2], [3]]