015_插值

1. 插值的使用格式是: ${expression}, 这里的expression可以是所有种类的表达式(比如: ${100 + x})。

2. 插值是用来给表达式插入具体值然后转换为文本(字符串)。插值仅仅可以在两种位置使用: 在文本区(比如: <h1>Hello ${name}!</h1>)和字符串表达式(比如: <#include "/footer/${company}.html">)中。

3. ${expression}表达式的结果必须是字符串, 数字或者日期、时间、日期-时间值, 因为(默认是这样)仅仅这些值可以被插值自动转换为字符串。其它类型的值(比如布尔值, 序列)必须"手动地"转换成字符串, 否则就会发生错误, 中止模板执行。

4. 一个常犯的错误是在不能使用插值的地方使用了它。仅仅在文本区和字符串中起作用。典型的错误使用是<#if ${big}>...</#if>, 这会导致语法错误。简单写为<#if big>...</#if>即可。

5. escape, noescape指令

5.1. 概要

<#escape identifier as expression>

...

   <#noescape>...</#noescape>

   ...

</#escape>

5.2. 当你使用escape指令包围模板中的一部分时, 在块中出现的插值(${...})会和转义表达式自动结合。

5.3. 例如:

<#escape x as x?html>

First name: ${firstName}

   Last name: ${lastName}

</#escape>

5.4. 上例等同于:

First name: ${firstName?html}

Last name: ${lastName?html}

5.5. 有时需要暂时为一个在转义区块中的插值关闭转义。你可以使用非转义指令<#noescape></#noescape>包含关闭转义的部分。

<#escape x as x?html>

   From: ${mailMessage.From}

   Subject: ${mailMessage.Subject}

   <#noescape>Message: ${mailMessage.htmlFormattedBody}</#noescape>

   ...

</#escape>

5.6. 上例等同于:

From: ${mailMessage.From?html}

Subject: ${mailMessage.Subject?html}

Message: ${mailMessage.htmlFormattedBody}

...

6. 字符串类型的插入: 不要忘了转义!

6.1. 如果插值表达式是字符串类型, 强烈建议你使用escape指令和html内建函数来阻止跨站脚本攻击和非格式良好的html页面。

7. 数字类型的插入

7.1. 如果插值表达式是数字类型, 那么根据数字的默认格式(number), 数值将会转换成字符串。这也许会包含最大的小数, 数字分组和相似处理的问题。通常程序员应该设置默认的数字格式(cfg.setNumberFormat("computer");), 而模板设计者不需要处理它(但可以使用内建函数string 为一个插值来重写默认数值格式或者使用setting指令的number_format来设置)。

8. 日期、时间、日期-时间类型插入

8.1. 如果插值表达式是日期、时间、日期-时间类型, 那么日期中的数字将会按照默认格式来转换成文本。通常程序员应该设置默认格式(cfg.setDateFormat("yyyy-MM-dd"); cfg.setTimeFormat("HH:mm:ss.SSS"); cfg.setDateTimeFormat("yyyy-MM-dd HH:mm:ss.SSS");), 而页面设计者无需处理这一点(当然也可以使用内建函数string 来覆盖单独插值的默认格式或者使用setting指令的date_format、time_format和datetime_format来设置)。

8.2. 为了将日期显示成文本, FreeMarker必须知道日期中的哪一部分在使用, 也就是说, 如果仅仅日期部分(年, 月, 日)使用或仅仅时间部分(时, 分, 秒, 毫秒)使用或两部分都用。不幸的是, 由于Java平台技术的限制, 自动探测一些变量是不现实的。这时可以找程序员对数据模型中可能出问题的变量进行处理。如果找出时间日期变量的哪部分在使用是不太可能的话, 就必须使用FreeMarker内建函数date, time和datetime来识别(比如: ${lastUpdated?datetime}), 否则就会出现错误停止执行。

9. 布尔类型插入

9.1. 若要使用插值方式来打印布尔值会引起错误, 中止模板的执行。

9.2. 可以使用setting指令设置参数boolean_format来为FreeMarker配置默认的布尔值格式。那么, 直接编写${married}这样的代码就不会有问题了。但在很多应用程序中,  这样的做法是不推荐使用的, 因为布尔值在不同的地方就应该呈现出不同的格式, 同时将格式留作默认值也可以认为是疏忽, 因为这可能导致错误产生。

9.3. 程序员也可以进行默认格式设置(cfg.setBooleanFormat("c");), 但是也不推荐, 原因同上。

9.4. 当想生成JavaScript或其它计算机语言代码部分时, 那么可以考虑使用${someBoolean?c}("c"代表计算机)来输出布尔值true/false。请记住?c也可以用来输出给计算机看的数字。

以下是使用Python进行分段线性插值的完整代码,并输出结果和做图: ```python import numpy as np import matplotlib.pyplot as plt # 定义原始数据 x_data = np.array([0.0, 0.1, 0.195, 0.3, 0.401, 0.5]) y_data = np.array([0.39894, 0.36695, 0.39142, 0.38142, 0.38138, 0.36812, 0.35206]) # 定义分段线性插值函数 def piecewise_linear(x, x_data, y_data): i = 0 while x > x_data[i+1]: i += 1 frac = (x - x_data[i]) / (x_data[i+1] - x_data[i]) return y_data[i] + frac * (y_data[i+1] - y_data[i]) # 生成插值数据 x_interp = np.linspace(0, 0.5, 100) y_interp = [piecewise_linear(x, x_data, y_data) for x in x_interp] # 输出插值结果 print("插值结果如下:") for i in range(len(x_interp)): print("x={:.3f}, y={:.5f}".format(x_interp[i], y_interp[i])) # 绘制原始数据和插值数据 plt.plot(x_data, y_data, 'o', label='原始数据') plt.plot(x_interp, y_interp, label='分段线性插值') plt.legend() plt.show() ``` 在上述代码中,我们首先定义了原始数据$x\_data$和$y\_data$,然后定义了分段线性插值函数$piecewise\_linear$,该函数接受插值点$x$,插值点$x\_data$和相应的函数值$y\_data$,并返回在$x$处的插值结果。接下来,我们使用NumPy的linspace函数生成一组均匀分布的插值点$x\_interp$,并使用$piecewise\_linear$函数计算每个插值点的函数值$y\_interp$。然后,我们使用print函数输出插值结果。最后,我们使用Matplotlib的plot函数绘制原始数据点和插值结果,并使用legend函数添加图例。 运行以上代码,可以得到如下的插值结果和插值图: 插值结果如下: ``` x=0.000, y=0.39894 x=0.005, y=0.38689 x=0.010, y=0.37484 x=0.015, y=0.36280 x=0.020, y=0.35075 x=0.025, y=0.33870 x=0.030, y=0.32995 x=0.035, y=0.32121 x=0.040, y=0.31246 x=0.045, y=0.30372 x=0.050, y=0.29512 x=0.055, y=0.28979 x=0.060, y=0.28447 x=0.065, y=0.27915 x=0.070, y=0.27382 x=0.075, y=0.26850 x=0.080, y=0.26277 x=0.085, y=0.25705 x=0.090, y=0.25133 x=0.095, y=0.24560 x=0.100, y=0.24000 x=0.105, y=0.23756 x=0.110, y=0.23512 x=0.115, y=0.23268 x=0.120, y=0.23024 x=0.125, y=0.22780 x=0.130, y=0.22536 x=0.135, y=0.22292 x=0.140, y=0.22048 x=0.145, y=0.21804 x=0.150, y=0.21560 x=0.155, y=0.21470 x=0.160, y=0.21380 x=0.165, y=0.21290 x=0.170, y=0.21200 x=0.175, y=0.21110 x=0.180, y=0.21020 x=0.185, y=0.20930 x=0.190, y=0.20840 x=0.195, y=0.39142 x=0.200, y=0.38408 x=0.205, y=0.37674 x=0.210, y=0.36940 x=0.215, y=0.36206 x=0.220, y=0.35472 x=0.225, y=0.34738 x=0.230, y=0.34265 x=0.235, y=0.33793 x=0.240, y=0.33321 x=0.245, y=0.32849 x=0.250, y=0.32377 x=0.255, y=0.32140 x=0.260, y=0.31903 x=0.265, y=0.31667 x=0.270, y=0.31430 x=0.275, y=0.31193 x=0.280, y=0.30956 x=0.285, y=0.30720 x=0.290, y=0.30483 x=0.295, y=0.30246 x=0.300, y=0.30010 x=0.305, y=0.29967 x=0.310, y=0.29923 x=0.315, y=0.29880 x=0.320, y=0.29837 x=0.325, y=0.29794 x=0.330, y=0.29751 x=0.335, y=0.29708 x=0.340, y=0.29665 x=0.345, y=0.29622 x=0.350, y=0.29512 x=0.355, y=0.29396 x=0.360, y=0.29280 x=0.365, y=0.29164 x=0.370, y=0.29048 x=0.375, y=0.28932 x=0.380, y=0.28816 x=0.385, y=0.28700 x=0.390, y=0.28584 x=0.395, y=0.28468 x=0.400, y=0.38138 x=0.405, y=0.37827 x=0.410, y=0.37516 x=0.415, y=0.37205 x=0.420, y=0.36894 x=0.425, y=0.36583 x=0.430, y=0.36272 x=0.435, y=0.36048 x=0.440, y=0.35825 x=0.445, y=0.35602 x=0.450, y=0.35379 x=0.455, y=0.35156 x=0.460, y=0.35092 x=0.465, y=0.35028 x=0.470, y=0.34964 x=0.475, y=0.34900 x=0.480, y=0.34836 x=0.485, y=0.34772 x=0.490, y=0.34708 x=0.495, y=0.34644 x=0.500, y=0.36812 ``` 插值图如下: ![分段线性插值结果图](https://img-blog.csdnimg.cn/20210903172710138.png) 可以看到,原始数据点是以非线性的方式分布的,但通过分段线性插值,我们得到了一条平滑的曲线来描述这些数据点之间的关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值