- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我有类 Function
,它的实例是接受一个参数的可调用对象。我以直接的方式为这些类定义了逐点算法。这是我的代码的简化版本(实际上我在 __init__
和 __call__
中有更复杂的行为,但这与这个问题无关):
class Function:
'''
>>> f = Function(lambda x : x**2)
>>> g = Function(lambda x : x + 4)
>>> h = f/g
>>> h(6)
3.6
'''
def __init__(self, func):
self.func = func
def __call__(self, value):
return self.func(value)
def __truediv__(self, other):
if isinstance(other, Function):
return Function(lambda x:self(x)/other(x))
else:
return NotImplemented
# ...
当我尝试允许隐式类型转换时,我卡住了。例如,我希望能够写:
>>> f = Function(lambda x : x ** 2)
>>> g = f+1
>>> g(5)
26
换句话说,每当我在 Function
实例旁边的算术表达式中看到一个数字对象 v
时,我想转换 v
到 Function(lambda x : v)
。
此外,我想为我的一些用户定义类型实现类似的行为(同样,每当我在带有 Function
对象的相同二进制算术表达式中看到它们时)。
虽然我当然可以使用常规和反射二元算术运算符的强力分类来编写此逻辑,每个运算符都检查 isinstance(v, numbers.Number)
和 isinstance(v, MyUserDefinedType )
,我觉得可能有更优雅的方式。
此外,如果我的设计还有任何其他可能的改进,请告诉我。 (Function
对象很少创建,但经常调用,因此性能很重要。)
编辑:
为了解决@Eric 的评论,我应该澄清我有另一个用户定义的类 Functional
:
class Functional:
'''
>>> c = [1, 2, 3]
>>> f = Functional(lambda x : x + 1)
>>> f(c)
[2, 3, 4]
>>> g = Functional(lambda x : x ** 2)
>>> h = f + g
>>> h(c)
[3, 7, 13]
'''
def __init__(self, func):
self.func = func
@staticmethod
def from_function(self, function):
return Functional(function.func)
def __call__(self, container):
return type(container)(self.func(c) for c in container)
def __add__(self, other):
if isinstance(other, Functional):
return Functional(lambda x : self.func(x) + other.func(x))
else:
return NotImplemented
当我在同一算术表达式中同时看到 Function
和 Functional
实例时,我希望将 Function
隐式转换为 Functional
使用 Functional.from_function
方法。
因此,隐式类型转换层次结构是这样的:
我想隐式转换为在给定算术表达式中看到的此层次结构中的最高类型。
最佳答案
对于所有运算符(operator)来说,这样的事情会很有效:
def __truediv__(self, other):
if callable(other):
return Function(lambda x:self(x)/other(x))
else:
return Function(lambda x:self(x)/other)
关于python - 使用隐式类型转换实现逐点算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13679481/
我正在尝试从 1 循环到 12,并为应用中特定 View 的更改网格输出一些跨度宽度。 $span-width: 8.21875%; $gap: 0.125%; @for $i from 1 thro
我试图在 Jekyll 的液体模板引擎中做一些基本的算术。我已经分配了一个变量 numColumns我试图在条件语句中使用它。 {% assign numColumns = 3 %} 注意我在下面的表
与 shift_left ieee.numeric_std 的功能, 我想将信号左移并插入 1或 0从右边。 signal qo: signed (3 downto 0) := (others=>'0
您在控制台中输入一些内容,例如(8+8)。然后程序会告诉你括号的插入是否正确。 这是我对错误括号的定义(当然还没有完成): () this means if one array element is
我有两个表(使用 PostgreSQL),它们看起来如下: 表1(p点从1到450递增1) --------+-------+--------+---------+---------+-------+
我正在编写一个任意精度的有理数包,我需要测试它的正确性和效率。当然,我可以自己组合一组临时测试,但由于我远不是第一个这样做的人,所以我认为值得一问:任何人都可以推荐我可以使用的现有测试集吗? 编辑:我
我最近一直在使用和学习 CSS3,并享受它的许多功能。现在我想知道是否可以设置一个有条件地分配 block 元素宽度的 CSS 规则。我所追求的那种东西 - 如果屏幕宽度小于 500 像素,则使用 3
我对这个实验中h的值有点疑惑。在 cpp 中, int h,J=3,n=200,p=3,h_m=(n+p+1)/2; float rt=(float)h_m/n; for(int j=0,j
算术+和按位或有什么区别吗?这有什么不同。 uint a = 10; uint b = 20; uint arithmeticresult = a + b; uint bitwiseOR = a |
我一直在尝试让算术 if 运算符起作用,但我似乎做不到。我是 C++ 的新手,仍在学习基础知识,但我只是想知道我是否正确使用了这个运算符。如果 x using namespace std; int
我在 VC++2010 中做过一些混合不同大小的操作数导致添加操作溢出的测试: int _tmain(int argc, _TCHAR* argv[]) { __int8 a=127;
#include int main(int argc,char *argv[]) { int i=10; void *k; k=&i; k++; printf("%p\n
在过去的 5 个小时里,我一直在寻找答案。尽管我找到了很多答案,但它们并没有以任何方式提供帮助。 我基本上要寻找的是任何 32 位无符号整数的按位异或运算符的数学、算术唯一表示。 尽管这听起来很简单,
结果是 127 double middle = 255 / 2 虽然这产生了 127.5 Double middle = 255 / 2 同时这也会产生 127.5 double middle = (
我在 Java 1.7 中有以下代码: DateFormat df = DateFormat.getInstance(); Date startDate = df.parse("07/28/12 01
此查询有效,没有错误 select add_months(date '2011-01-31', 1) from dual; ,而这个: select date '2011-01-31' + inter
理论上来说,如果我有一个无序项目列表 Link1 Link1 我如何使用 jQuery 执行以下操作? 1) 找到每个单独a元素的宽度 2) 找到每个单独的 li 元素的宽度 3)
想法如下:假设我有一个列表 P = [(1,0),(4,3)] 或类似的列表。我想以以下方式计算此列表定义的多项式:1X^0 + 4X^3。 为此,我编写了以下内容: evaluate(P,X,Y)
我正在从 mysql 数据库中提取数据。我想添加多次运行的长度,并按照跑得最远的人的排名对它们进行排序。 function determineLength($db, $name){
当尝试执行一个简单的 bash 脚本以将前面带有 0 的数字递增 1 时,原始数字被错误地解释。 #!/bin/bash number=0026 echo $number echo $((number
我是一名优秀的程序员,十分优秀!