Aleri –复杂事件处理

Sybase的Aleri流媒体平台是CEP市场中最受欢迎的产品之一。 它在Sybase的交易平台RAP版本中使用,该版本在资本市场中广泛用于管理投资组合中的头寸。 今天,在这个由多个部分组成的系列文章的第一个部分中,我希望提供Aleri平台的概述,并在需要时提供一些代码示例。 在第二部分中,我将介绍Aleri Studio,它是基于Eclipse的GUI,可简化CEP工作流程建模任务并通过仪表板监视Aleri服务器。

在我先前关于复杂事件处理的博客文章中 ,我演示了使用Esper,开源CEP软件和Twitter4J API处理来自Twitter的推文流的方法。 但是,CEP产品不仅仅只处理一个数据流。 单个数据流可以通过标准的异步消息传递平台轻松处理,并且不会带来非常具有挑战性的可伸缩性或延迟问题。 但是,当涉及消费多个实时数据流并进行实时分析时,并且当数据流之间的相关性很重要时,没有什么比CEP平台更胜一筹了。 源馈送流媒体平台的速度,数量和复杂性可能会有所不同。 真正的企业级CEP应该轻松有效地处理各种实时高速数据,例如股票行情自动收录器和速度较慢但数量众多的脱机批量上传。 除了提供标准接口之外,CEP还应该提供一种更简单的编程语言来查询流数据并通过诸如模式匹配和快照查询之类的功能来生成连续的情报。

Sybase交易平台– RAP版本。 引用网址

为了保持简单性和高水平,CEP可以分为三个基本部分。 第一种是获取/使用源数据的机制。 接下来是调查数据,识别事件和模式,然后通过为目标系统提供可操作的项与目标系统进行交互的过程。 可执行事件采用不同的形式和格式,具体取决于您使用CEP的应用程序。 一个行动项目可能是–根据风险监控应用程序中计算的风险出售股票头寸。 通过读取化工厂中的数千个传感器来指示洗钱应用程序中的潜在欺诈事件或监视系统中的灾难性事件。 从字面上看,有成千上万种情况是无法手动和离线检查数据的。 在完成以下部分之后,您可能需要自己尝试Aleri。 此链接http://www.sybase.com/aleriform可以直接将您带到Aleri下载页面。 可从Sybase的官方网站免费获得有效期为90天的评估副本。 大量的文档,出色的教程和网站上的一些示例代码应该可以帮助您快速入门。

如果您是任何CEP产品的现有用户,我建议您将Aleri与该产品进行比较,并与社区共享或在此博客上发表评论。 根据一些过时的估计,Tibco CEP是市场上最大的CEP供应商。 我不确定StreamBase另一个领先产品有多少市场份额。 您还可以在Youtube.com上观看 网络研讨会 ,该研讨会总体上介绍了CEP的好处,以及具体介绍了Streambase的一些关键功能。 对于新手来说,这是CEP和资本市场用例的绝佳介绍。

通过使用Studio(gui)或使用Splash(语言)或通过使用Aleri Modeling语言(ML)创建模型来构建Aleri CEP上的应用程序,这是部署之前的最后阶段。

以下是Splash的主要功能列表。

  • 数据类型 –支持标准数据类型和XML。 还为用户定义的数据类型支持'Typedef'。
  • 访问控制 –粒度级别的访问控制,允许访问一个或多个流(包含许多流)
  • SQL –建立模型的另一种方式。 由于其视觉范式,构建Aleri工作室模型可能需要更长的时间。 精通SQL的人应该可以使用Aleri SQL更快地完成它,这与众所周知的常规SQL非常相似。
  • 联接 –支持的联接为内部,左侧,右侧和完全联接
  • 过滤器表达式 –包括何处,拥有,分组拥有
  • ML – Aleri SQL以Aleri建模语言(ML)生成数据模型–熟练的ML用户可能仅使用ML(代替Aleri Studio和Aleri SQL)来构建模型。
  • 模式匹配语言 –包括诸如“内部”以指示间隔(滑动窗口),“从”以指示数据流和有趣的“ fby”以指示序列的结构(其后为)
  • 用户定义的函数 – Splash中提供的用户定义的函数接口使您可以用C ++或Java创建函数,并在模型的Splash表达式中使用它们。

高级模式匹配–功能在此处通过示例进行说明。 –以下三个代码段及其说明直接取自Sybase有关Aleri的文档。
第一个示例检查以查看经纪人是否发送与其他的客户之一相同的股票的买单,然后为该客户插入买单,然后出售该股票。 当这些动作按顺序发生时,它将创建一个“ buyahead”事件。

within 5 minutes
from
BuyStock[Symbol=sym; Shares=n1; Broker=b; Customer=c0] as Buy1,
BuyStock[Symbol=sym; Shares=n2; Broker=b; Customer=c1] as Buy2,
SellStock[Symbol=sym; Shares=n1; Broker=b; Customer=c0] as Sell
on Buy1 fby Buy2 fby Sell
{
if ((b = c0) and (b != c1)) {
output [Symbol=sym; Shares=n1; Broker=b];
}
}

本示例使用fby关系检查三个事件,一个接一个。 因为在三个模式中使用了相同的变量sym,所以三个事件中的值必须相同。 但是,不同的变量可能具有相同的值(例如n1和n2。),如果Buy1和Sell事件中的Broker和Customer相同,而Buy2事件中的Customer不同,则它将输出一个事件。

下一个示例显示对事件的布尔运算。 该规则描述了一种可能的盗窃情况,即在架子上有商品读取时(可能通过RFID),然后没有对该商品进行结帐,然后在门附近的扫描仪上读取了该商品。

within 12 hours
from
ShelfReading[TagId=tag; ProductName=pname] as onShelf,
CounterReading[TagId=tag] as checkout,
ExitReading[TagId=tag; AreaId=area] as exit
on onShelf fby not(checkout) fby exit
output [TagId=t; ProductName=pname; AreaId=area];

下一个示例显示了如果用户尝试在5分钟内三次未成功登录帐户,则如何发出警报。

from
LoginAttempt[IpAddress=ip; Account=acct; Result=0] as login1,
LoginAttempt[IpAddress=ip; Account=acct; Result=0] as login2,
LoginAttempt[IpAddress=ip; Account=acct; Result=0] as login3,
LoginAttempt[IpAddress=ip; Account=acct; Result=1] as login4
on (login1 fby login2 fby login3) and not(login4)
output [Account=acct];

希望闯入计算机系统的人们经常扫描多个TCP / IP端口以查找开放的端口,并尝试利用侦听这些端口的程序中的漏洞。 这是一条规则,检查是否单个IP地址尝试在三个端口上进行连接,以及是否使用“ sendmail”程序进行了连接。

within 30 minutes
from
Connect[Source=ip; Port=22] as c1,
Connect[Source=ip; Port=23] as c2,
Connect[Source=ip; Port=25] as c3
SendMail[Source=ip] as send
on (c1 and c2 and c3) fby send
output [Source=ip];

Aleri提供了许多现成的接口,可轻松与源系统和目标系统集成。 通过这些接口/适配器,Aleri平台可以与标准关系数据库,消息传递框架(如IBM MQ),套接字和文件系统文件进行通信。 Aleri可以通过标准化接口轻松使用csv,FIX,路透社市场数据,SOAP,http,SMTP等各种格式的数据。

以下是将Aleri与其他系统集成的可用技术。

  • Java,C ++和点网提供了发布/订阅API-一种标准的发布/订阅机制
  • 通过ODBC和JDBC连接使用带有SELECT,UPDATE,DELETE和INSERT语句的SQL接口
  • 内置用于市场数据和FIX的适配器

在本系列的下一部分中,我们将介绍Aleri Studio,它是可以帮助我们轻松构建CEP应用程序的gui。

在我的上一篇文章中,对Sybase的复杂事件处理平台Aleri进行了高级概述。

本周,让我们回顾一下Aleri Studio,Aleri平台的用户界面以及pub / sub api的使用,这是与Aleri平台进行交互的多种方式之一。 该工作室是平台不可或缺的一部分,并随附免费的评估版。 如果您尚未这样做,请从此处下载副本。 Aleri产品的安装过程非常简单,几分钟即可启动并运行。

aleri工作室是用于构建模型的创作平台,该模型定义了各种数据流之间的交互作用和排序。 它还可以合并多个流以形成一个或多个流。 使用这个基于Eclipse的工作室,您可以通过向其提供测试数据来测试所构建的模型,并实时监控流中的活动。 让我们看一下您可以在Aleri中定义的各种流及其功能。

源流 –只有这种类型的流才能处理传入的数据。 传入数据可以执行的操作是插入,更新,删除和向上插入。 Upsert,顾名思义,如果流中已经存在定义行的键,则更新数据。 否则,它将在流中插入一条记录。

聚合流 –此流为由特定属性定义的每个组创建摘要记录。 这提供了与ANSI SQL中的“分组依据”等效的功能。

复制流 –通过复制另一个流但使用不同的保留规则来创建此流。

计算流 –该流允许您在数据的每一行上使用一个函数来为数据流的每一行获取新的计算元素。

扩展流 –该流是通过其他列表达式从另一个流派生的

过滤流 –您可以为此流定义过滤条件。 就像扩展和计算流一样,此流在其他流上应用过滤条件以派生新流。

Flex Stream –通过自定义编码方法,在处理流数据方面具有显着的灵活性。 只有此流允许您编写自己的方法以满足特殊需求。

加入流 –通过在某些条件下加入两个或多个流来创建新流。 内连接和外连接均可用于连接流。

模式流 –模式匹配规则与此流一起应用

联合流 –顾名思义,这将连接具有相同行数据结构的两个或多个流。 与加入流不同,此流包含来自所有参与流的所有数据。

通过使用其中一些流和Aeri的pub api,我将演示将Twitter实时提要隔离到两个不同的流中。 Twitter实时提要由Twitter4j库中的侦听器使用。 如果您只想先尝试使用Twitter4j库,请按照我之前的文章“ 在Twitter上跟踪用户情绪 ”。 通过使用Aleri的发布API,将twitter4j侦听器接收的数据馈送到我们模型中的源流。 在本练习中,我们将尝试根据推文的内容将其分离出来。 基于我之前的帖子中的示例,我们将根据内容将传入流分为两个流。 一个流将获取任何包含'lol'的推文,而另一个流将在文本中显示带有笑脸“ :)”的推文。 首先,让我们列出使它成为一个可行示例所需执行的任务。

  1. 创建具有三个流的模型
  2. 验证模型没有错误
  3. 创建一个静态数据文件
  4. 启动Aleri服务器,并将静态数据文件手动输入到流中,以确认模型正确工作。
  5. 编写Java代码以使用Twitter提要。 使用发布API将推文发布到Aleri平台。
  6. 运行演示并观看实时数据流经各种流的过程。

该图像是Aleri Studio的三个流的快照-左侧的一个名为“ tweets”是源流,右侧的两个名为“ lolFilter”和“ smileyFilter”属于过滤器类型。 源流接受传入的数据,而过滤器流接收已过滤的数据。 这是我定义过滤条件的方式-例如(tweets.text,'%lol%')。 tweets是流的名称,text是我们感兴趣的流中的字段。%lol%表示,选择内容中带有“ lol”字符串的任何tweet。 每个流只有2个字段-id和text。 ID和文本映射到Twitter发送的ID和文本消息。 定义模型后,您可以通过单击顶部功能区中的复选标记来检查是否有任何错误。 如果出现任何错误,则会在图像右下方的面板中显示。 一旦您的模型没有错误,就可以进行测试了。

下图显示了Studio的测试界面。 首先尝试使用静态数据文件运行模型。 顶部的红色小方块表示Aleri服务器当前正在运行。 右下角的控制台窗口显示服务器消息,例如成功启动和停止等。在左窗格中的“运行测试”选项卡上,您可以在其中选择静态数据文件来馈送源流。 右侧窗格显示所有当前正在运行的流以及由流处理的实时数据。

下图显示了用于测试模型的数据文件的格式

tweets ALERI_OPS="i" id="1" text="324test 1234" ;
tweets ALERI_OPS="i" id="2" text="test 12345";
tweets ALERI_OPS="i" id="3" text="test 1234666" ;
tweets ALERI_OPS="i" id="4" text="test 1234888" ;
tweets ALERI_OPS="i" id="5" text="test 1234999" ;

此练习的源代码在底部。
请记住,您需要在构建路径中具有twitter4j库,并在运行程序之前运行Aleri服务器。 因为我没有在执行线程中添加任何计时器,所以停止执行的唯一方法是中止执行。 为了简洁起见,并且为了使代码行简短,我删除了所有异常处理和日志记录。 该代码仅利用Aleri的pub / sub api的发布部分。 我将在我的下一篇博文中演示api的sub side的用法。

package com.sybase.aleri;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;import twitter4j.Status;
import twitter4j.StatusDeletionNotice;
import twitter4j.StatusListener;
import twitter4j.TwitterException;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;import com.aleri.pubsub.SpGatewayConstants;
import com.aleri.pubsub.SpObserver;
import com.aleri.pubsub.SpPlatform;
import com.aleri.pubsub.SpPlatformParms;
import com.aleri.pubsub.SpPlatformStatus;
import com.aleri.pubsub.SpPublication;
import com.aleri.pubsub.SpStream;
import com.aleri.pubsub.SpStreamDataRecord;
import com.aleri.pubsub.SpStreamDefinition;
import com.aleri.pubsub.SpSubscription;
import com.aleri.pubsub.SpSubscriptionCommon;
import com.aleri.pubsub.impl.SpFactory;
import com.aleri.pubsub.impl.SpUtils;
import com.aleri.pubsub.test.ClientSpObserver;import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Vector;
import java.util.TimeZone;public class TwitterTest_2 {//make sure that Aleri server is running prior to running this programstatic {//creates the publishing platformcreatePlatform();}// Important objects from the publish APIstatic SpStream stream;static SpPlatformStatus platformStatus;static SpPublication pub;public static void main(String[] args) throws TwitterException, IOException {TwitterTest_2 tt2 = new TwitterTest_2();ConfigurationBuilder cb = new ConfigurationBuilder();cb.setDebugEnabled(true);//use your twitter id and passcodecb.setUser("Your user name");cb.setPassword("Your Password");// creating the twitter4j listenerConfiguration cfg = cb.build();TwitterStream twitterStream = new TwitterStreamFactory(cfg).getInstance();StatusListener_1 listener;listener = new StatusListener_1();twitterStream.addListener(listener);//runs the sample that comes with twitter4jtwitterStream.sample();}private static int createPlatform() {int rc = 0;//Aleri platform configuration - better alternative is to your properties fileString host = "localhost";int port = 22000;//aleri configured to run with empty userid and pwd stringsString user = "";String password = "";//name of the source stream - the one that gets the data from the twitter4jString streamName = "tweets";String name = "TwitterTest_2";SpPlatformParms parms = SpFactory.createPlatformParms(host, port, user,password, false, false);platformStatus = SpFactory.createPlatformStatus();SpPlatform sp = SpFactory.createPlatform(parms, platformStatus);stream = sp.getStream(streamName);pub = sp.createPublication(name, platformStatus);// Then get the stream definition containing the schema information.SpStreamDefinition sdef = stream.getDefinition();
/*int numFieldsInRecord = sdef.getNumColumns();Vector colTypes = sdef.getColumnTypes();Vector colNames = sdef.getColumnNames();*/return 0;}static SpStream getStream() {return stream;}static SpPlatformStatus getPlatformStatus() {return platformStatus;}static SpPublication getPublication() {return pub;}static int publish(SpStream stream, SpPlatformStatus platformStatus,SpPublication pub, Collection fieldData) {int rc = 0;int i = pub.start();SpStreamDataRecord sdr = SpFactory.createStreamDataRecord(stream,fieldData, SpGatewayConstants.SO_UPSERT,SpGatewayConstants.SF_NULLFLAG, platformStatus);Collection dataSet = new Vector();dataSet.add(sdr);System.out.println("\nAttempting to publish the data set to the Platform for stream <"+ stream.getName() + ">.");rc = pub.publishTransaction(dataSet, SpGatewayConstants.SO_UPSERT,SpGatewayConstants.SF_NULLFLAG, 1);// commit blocks the thread until data is consumed by the platformSystem.out.println("before commit() call to the Platform.");rc = pub.commit();return 0;}}

参考: Aleri –复杂事件处理–第一部分 , 理解Aleri –复杂事件处理–第二部分来自我们JCG合作伙伴 Mahesh Gadgil在“ 简单而实用”的博客上。


翻译自: https://www.javacodegeeks.com/2012/04/aleri-complex-event-processing.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python版本回退_Python爬虫之BeautifulSoup解析之路

上一篇分享了正则表达式的使用&#xff0c;相信大家对正则也已经有了一定的了解。它可以针对任意字符串做任何的匹配并提取所需信息。但是我们爬虫基本上解析的都是html或者xml结构的内容&#xff0c;而非任意字符串。正则表达式虽然很强大灵活&#xff0c;但是对于html这样结构…

WebStorm 运行Rect Native 项目

今天教大家如何直接使用WebStorm这个IDE直接完成编码运行项目工作.这样就可以不用打开Xcode了. 1.首先点击WebStorm右上方的下拉箭头弹出的Edit Configurations.... 2.然后会进入一个配置页面.点击左上方的.在弹出的列表中选中npm.如图. 3.在右边的配置框中,先选择Command为hel…

python编程比赛_用Python编程分析4W场球赛后,2018世界杯冠军竟是…

比赛已经开始&#xff0c;我们不妨用 Python 来对参赛队伍的实力情况进行分析&#xff0c;并大胆的预测下本届世界杯的夺冠热门球队吧&#xff01;通过数据分析&#xff0c;可以发现很多有趣的结果&#xff0c;比如&#xff1a;找出哪些队伍是首次进入世界杯的黑马队伍找出2018…

JavaFX 2 GameTutorial第2部分

介绍 Ť他的是一系列与一个JavaFX 2游戏教程博客条目的第二批。 如果您尚未阅读第1部分&#xff0c;请参阅JavaFX 2游戏教程的简介部分。 在第1部分中&#xff0c;我提到了游戏的某些方面以及原型飞船的简单演示&#xff08;原型由简单的形状组成&#xff09;&#xff0c;该飞船…

sqlyog连接mysql教程_如何用SQLyog实现远程连接MySQL

SQLyog客户端&#xff0c;用root用户远程链接MySQL时&#xff0c;提示ldquo;访问被拒绝rdquo;&#xff0c;在网上搜索了一下原因。原来是MySQL没有授权其远程链1&#xff0c;SQLyog客户端&#xff0c;&#xff0c;用root用户远程链接MySQL时&#xff0c;提示“访问被拒绝”&…

JavaME:Google静态地图API

无论您是需要基于位置的应用程序的地图还是只是出于娱乐目的&#xff0c;都可以使用有史以来最简单的方法&#xff1a;Google Static Maps API。 在这篇文章中&#xff0c;我们将看到如何从纬度和经度获得地图作为图像。 可以使用Location API获得纬度和经度&#xff0c;我们将…

深入探讨JS中的数组排序函数sort()和reverse()

最近在研究Javascript发现了其中一些比较灵异的事情。有点让人感到无语比如&#xff1a; alert(typeof( NaN NaN));//结果为假。 alert(typeof( NaN ! NaN));//结果为真。 嘿嘿&#xff0c;当然这个不是这篇文章要讨论的!!开始我们的正文 首先&#xff0c;我们来看一下JS中sor…

带有谓词的Java中的功能样式-第1部分

您一直在听到将要席卷全球的函数式编程&#xff0c;而您仍然坚持使用普通Java&#xff1f; 不用担心&#xff0c;因为您已经可以在日常Java中添加一些功能样式。 此外&#xff0c;它很有趣&#xff0c;可以节省许多代码行并减少错误。 什么是谓词&#xff1f; 实际上&#xff…

centos 6.5下安装文件上传下载服务

centos 6.5下安装文件上传下载服务 由于每次在CentOS中要下载一些配置文件到物理机&#xff0c;和上传一些文件到服务器&#xff0c;导致来回的开启ftp软件有点麻烦&#xff0c;这里我们可以使用文件上传下载服务&#xff0c;来解决上传和下载的问题。 1.登录服务器 2.执行命令…

Jenkins 入门系列--jenkins 介绍

第一章 Jenkins是什么&#xff1f; Jenkins 是一个可扩展的持续集成引擎。 主要用于&#xff1a; l 持续、自动地构建/测试软件项目。 l 监控一些定时执行的任务。Jenkins拥有的特性包括&#xff1a; l 易于安装-只要把jenkins.war部署到servlet容器&#xff0c;不需要数据库支…

20162303《程序设计与数据结构》第一周学习总结

学号 2016-2017-2 《程序设计与数据结构》第1周学习总结 教材学习内容总结 本周学习了基本的JAVA知识&#xff0c;虽然比较基础&#xff0c;但是在实际过程中还是出现了许许多多的问题&#xff0c;代码一遍遍的敲错&#xff0c;又一遍遍的修改&#xff0c;刚开始甚至不会切换模…

面向接口编程详解(三)——模式研究

通过前面两篇&#xff0c;我想各位朋友对“面向接口编程”的思想有了一定认识&#xff0c;并通过第二篇的例子&#xff0c;获得了一定的直观印象。但是&#xff0c;第二篇中的例子旨在展示面向接口编程的实现方法&#xff0c;比较简单&#xff0c;不能体现出面向接口编程的优势…

错误学习:Java + OSGi

最近&#xff0c;我致力于在OSGi环境中使Apache Hive工作。 虽然没有被证明是小菜一碟&#xff08;软件对吗&#xff1f;。。为什么我不感到惊讶&#xff1f; &#xff09;&#xff0c;它引导我解决了各种Java和OSGi错误。 在这里&#xff0c;我列出了其中一些让我有些吃力的东…

Business Component(BC)和Business Object(BO)

Siebel应用架构的一个成功的地方就是在应用里引入了BC&#xff0c;BO的概念&#xff0c;从而使得几千张关系数据表能够按照业务的含义组织成业务对象&#xff0c;对于业务人员而言具有了业务上的含义&#xff0c;而不仅仅是从技术人员的观点来对待数据&#xff08;就是关系表而…

NetBeans可用性提示

的Java IDE都来了&#xff0c;因为在很长的路要走天的JBuilder的 &#xff08;尽管JBuilder中似乎是一个值得欢迎提前在时间&#xff09;。 当今的Java IDE&#xff08;例如NetBeans &#xff0c; Eclipse &#xff0c; IntelliJ IDEA和JDeveloper &#xff09;是非常先进的工具…

WPF 反编译后错误处理

1. 首先&#xff0c;手动创建一个WPF工程&#xff08;WpfApplicationReflectorDemo&#xff09; 2. 把生成的WpfApplicationReflectorDemo.exe 拖到ILSpy里 3.点击 File -> Save Code...: 相应的代码会生成到指定地方。 4. 打开应用程序&#xff0c;并且编译它&#xff0c;此…

JavaFX 2 GameTutorial第1部分

介绍 我相信大多数软件开发人员可能会在年轻人&#xff08;年轻人&#xff09;一生中的某一时刻被迫创建游戏来帮助他们学习编程语言&#xff08;我知道我确实做到了&#xff09;。 以前&#xff0c;我的第一台计算机实际上是Franklin Ace 1000 &#xff0c;后来是Apple [] 。 …

虚拟现实-VR-UE4-认识UE4

VR的火热&#xff0c;让每个人都想参与一下&#xff0c; 公司在展会上面搞了一个VR的Demo&#xff0c;关注度超出预期&#xff0c;使得公司高层决定来个VR项目 所以 关于UE4 百度百科地址&#xff1a;http://baike.baidu.com/link?urlmEmbwOcqEuqtkfdu9lNdxVtWAkv0Q6UHZ4VgIHr…

轻松完成Birt报告

这是使用Birt插件在Eclipse中构建报告的完整指南。 Birt或Business Intelligence and Reporting工具是一种无需编写太多Java代码即可生成报告的工具。 如果您使用的是ireport&#xff0c;那么您知道我在说什么&#xff1a;&#xff09;&#xff08;晶体报告..毫无意义&#xff…

揭开Python科学计算的面纱

春牛春杖。无限春风来海上。便与春工。染得桃红似肉红。 春幡春胜。一阵春风吹酒醒。不似天涯。卷起杨花似雪花。 标准的Python中用列表保存一组值&#xff0c;可以当做数组使用&#xff0c;但是由于其值类型任意&#xff0c;所以列表中保存的是指针&#xff0c;这样的话保存一…