我们都知道在weblogic中JSP是每次第一次访问的时候才会编译,这就造成第一次访问某个JSP的时候性能下降,有时候我们也希望JSP被编译成class然后打包在jar中实现隐藏JSP的功能,下面介绍自己几天来的研究成果。在这里weblogic采用的是weblogic12c。

  前提知道JSP编译之后存放的位置在:%base%\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_user\Struts\km2umq\jsp_servlet文件夹下面。(Struts是我的项目根路径的名称,jsp_servlet是一个存放JSP编译之后的class文件的根文件)。

本文介绍的%base%表示E:\weblogic\user_projects\domains\base_domain\autodeploy\Struts,也就是项目的根目录

1.第一种预编译JSP的方法是手动的访问每个页面,然后让weblogic进行编译。(如果你有时间就这么做)

2.通过在weblogic.xml中设置JSP预编译

例如我的一个weblogic.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd"> <weblogic-web-app>
<jsp-descriptor>
<jsp-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</jsp-param>
<jsp-param>
<param-name>pageCheckSeconds</param-name>
<param-value>-1</param-value>
</jsp-param>
<jsp-param>
    <param-name>precompile</param-name>
    <param-value>true</param-value>
  </jsp-param>
<jsp-param>
<param-name>compilerSupportsEncoding</param-name>
<param-value>true</param-value>
</jsp-param>
<jsp-param>
<param-name>verbose</param-name>
<param-value>false</param-value>
</jsp-param>
</jsp-descriptor> <container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor> <context-root>/C8</context-root> </weblogic-web-app>

上面标红的地方就是设置weblogic对JSP进行预编译。

例如我项目中三个JSP文件的位置如下:

  %base%index.jsp

  %base%WEB-INF\jsps\index.jsp

  %base%\view\index.jsp

编译后的三个文件位置如下:

E:\weblogic\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_user\Struts\km2umq\jsp_servlet\__index.class

反编译查看头信息:(也就是jsp_servlet是一个根目录)

    

E:\weblogic\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_user\Struts\km2umq\jsp_servlet\_view\__index.class

E:\weblogic\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_user\Struts\km2umq\jsp_servlet\_web_45_inf_jsps\__index.class

  WEB-INF目录下的JSP比较特殊,会自动编译到jsp_servlet\_web_45_inf_jsps\目录下。

访问项目首页进行测试:  

  

有时候我们也希望将原来的JSP删掉,只保留编译后的class文件,这样可以隐藏JSP。如果在上面编译完之后只是将我们的JSP删掉,那么不会起作用。例如:

部署成功之后重新访问会报404:

我们将之前编译后的JSP打包放进项目的lib中:

ain/servers/AdminServer/tmp/_WL_user/Struts/km2umq
$ ls
jsp_servlet/ public/ war/ Administrator@MicroWin10-1535 MINGW64 /e/weblogic/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/Struts/km2umq
$ jar cvf ./jsp.jar ./jsp_servlet/
已添加清单
正在添加: jsp_servlet/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: jsp_servlet/_view/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: jsp_servlet/_view/__index.class(输入 = 5683) (输出 = 2656)(压缩了 53%)
正在添加: jsp_servlet/_web_45_inf/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: jsp_servlet/_web_45_inf/_jsps/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: jsp_servlet/_web_45_inf/_jsps/__index.class(输入 = 5715) (输出 = 2674)(压缩了 53%)
正在添加: jsp_servlet/__index.class(输入 = 5666) (输出 = 2649)(压缩了 53%)

在web.xml加入下面的配置:

  相当于springMVC入口一样,所以的jsp后缀请求都进weblogic的servlet中处理。(webservice的请求也是如此)

<servlet>
<servlet-name>JSPClassServlet</servlet-name>
<servlet-class>weblogic.servlet.JSPClassServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>JSPClassServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>

  再次启动访问项目即可,这样就达到了隐藏JSP和预编译JSP的目的。

:

3.Ant中用weblogic.jspc对JSP进行预编译

0.前沿

  有时候我们的项目采用ant进行部署,所以还必须ant编译JSP。于是研究了ant结合weblogic.jspc进行编译JSP的过程。

  实际上进行编译的JSPC位于:E:\weblogic\wlserver\modules\com.oracle.weblogic.package.jar内。

  我们发现E:\weblogic\wlserver\server\lib\weblogic.jar里面没有任何一个class,只有一个MANIFEST.MF,里面的classpath引入了几乎weblogic带的所有报,包括E:\weblogic\wlserver\modules下面的包。

  网上一篇关于  MANIFEST.MF中classpath的解释:

1. 基本格式  

属性名称+:+空格+属性值  

2. 没行最多72个字符,换行继续必须以空格开头  

3. 文件最后必须要有一个回车换行  

4. Class-Path 当前路径是jar包所在目录,如果要引用当前目录下一个子目录中的jar包,使用以下格式  

子目录/xxx.jar 子目录/yyy.jar  

技巧:多个jar包的引用,可以使用 .classpath 文件中classpathentry 的值  

5. 在任何平台上路径分割符都是 /,多个jar包引用以空格分开

Manifest-Version: 1.0
Agent-Class: com.ali.b2b.crm.dynamic.agent.MyAgentMain
Main-Class: com.ali.b2b.crm.dynamic.agent.Dynamic
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Boot-Class-Path: javassist.jar
Class-Path: lib/tools.jar lib/guava-r09.jar lib/guice-2.0.jar

  所以网上很多说jspc在weblogic包内,weblogic12的机制不是这样的,是在weblogic.jar内引入weblogic模块的其他包。编译JSP的话引入%weblogic%\wlserver\server\lib,这个模块自动依赖:%weblogic%\modules

    weblogic10.3.6确实在weblogic包内,不过还依赖其他许多lib。如果只是编译JSP,不想找的话可以引入两个目录下的lib分别是:%weblogic%\wlserver_10.3\server\lib,这个模块自动依赖:%weblogic%\modules

    

1.weblogic.jspc编译JSP的ant脚本:

<?xml version="1.0" encoding="UTF-8"?>
<project name="AppcTest" default="precompile" basedir=".">
<description>Sample build file using Ant to call WLS APPC</description>
<property name="wls_root" value="E:/weblogic" />
<property name="wls_home" value="${wls_root}/wlserver" /> <path id="wls.classpath">
<fileset dir="${wls_home}/server/lib">
<include name="*.jar" />
</fileset>
</path> <!-- =================================
target: precompile
================================= -->
<target name="precompile" description="--> description">
<!--compile JSP-->
<java classname="weblogic.jspc" classpathref="wls.classpath" fork="true" failonerror="yes" maxmemory="1028m">
<arg line="-webapp E:/xiangmu/WebTest/WebContent/ -d C:/Users/Administrator/Desktop/wlappc -compileAll" />
</java>
</target> </project>

参数解释:

  在precompile任务中,调用了weblogic.jspc,该类位于com.oracle.weblogic.package.jar包内,因此要将此包放入classpath内,这就是classpathref的作用(classpath引入weblogic.jar,其MANIFEST.MF又引入相关jar包),fork是叉牛排用的大叉子,因其一个把手多个爪子的特色,故而被借用到计算机中来代称“指令的派生”,一生二,二生三,三生无穷。。我们知道ant本身必须跑在虚拟机环境之中,而每个任务也同样必须跑在一个虚拟机环境之中。这样就存在一个选择的问题:任务可以和ant处在同一虚拟机中,也可以不。fork正是来干这件事的,它来负责做决定。Maxmemory属性要指定,不然文件多了就会失败。Arg标签指定了weblogic.jspc的一些参数,这里是比较关键的几个参数,-webapp表示web应用所在的目录,编译程序会在此目录及其子目录寻找jsp文件,-d参数指示jsp编译后的class文件放哪里,一般是web目录下的WEB-INF/classes目录,-compileAll表示编译-d指定的目录及其所有子目录(包括WEB-INF目录)。

  如果我们想查看更多的参数解释可以运行如下ant:

<?xml version="1.0" encoding="UTF-8"?>
<project name="AppcTest" default="precompile" basedir=".">
<description>Sample build file using Ant to call WLS APPC</description>
<property name="wls_root" value="E:/weblogic" />
<property name="wls_home" value="${wls_root}/wlserver" /> <path id="wls.classpath">
<fileset dir="${wls_home}/server/lib">
<include name="*.jar" />
</fileset>
</path> <!-- =================================
target: precompile
================================= -->
<target name="precompile" description="--> description">
<!--compile JSP-->
<java classname="weblogic.jspc" classpathref="wls.classpath" fork="true" failonerror="yes" maxmemory="1028m">
<arg line="-advanced" />
</java>
</target> </project>

结果:(然后自己去意会去把)

precompile:
[java] Usage: java weblogic.servlet.jsp.jspc20 [options] <jsp files>...
[java] where options include:
[java] -help Print the standard usage message.
[java] -version Print version information.
[java] -webapp <dir> Directory to be considered as the document
[java] root for resolving relative files.
[java] -verboseJspc whether JSP Compiler runs in verbose mode
[java] (default is false)
[java] -k continue compiling files, even when some fail
[java] -noPrintNulls show "null" in jsp expressions as ""
[java] -backwardcompatible Backward compatibility option.
[java] -charsetMap <charsetMapString> specify mapping of IANA or unofficial
[java] charset names used in JSP contentType
[java] directives to java charset names. E.g.,
[java] '-charsetMap x-sjis=Shift_JIS,x-big5=Big5'
[java] The most common mappings are built-in to
[java] jspc. Use this option only if a desired
[java] charset mapping isn't recognized.
[java] -maxfiles <int> Maximum number of generated java files to be
[java] compiled at one time.
[java] -forceGeneration Force generation of JSP classes. Without
[java] this flag, the classes may not be generated
[java] if it is determined to be unnecessary.
[java] -compressHtmlTemplate Remove additional white spaces in html
[java] template. Without this flag, html template
[java] will be output as is.
[java] -optimizeJavaExpression Optimize string concatenation in Java
[java] expression. Without this flag, Java
[java] expression will be output as is.
[java] -strictJspDocumentValidation Validate JSP document's format strictly
[java] with XML Parser.
[java] -keepgenerated Keep the generated .java files.
[java] -classpath <path> Classpath to use.
[java] -target <target> Target version.
[java] -d <dir> Target (top-level) directory.
[java] -encoding <options> Valid args are "default" to use the default
[java] character encoding of JDK, or named
[java] character encoding, like "8859_1". If the
[java] -encoding flag is not present, an array of
[java] bytes is used.
[java] -package <packageName> The package into which the .jsp files should
[java] be placed 这个参数用于设置默认的包名字,就是上面的jsp_servlet包名
[java] -superclass <superclass> The class name of the superclass which this
[java] servlet should extend.
[java] -advanced Print advanced usage options.

补充:ant也有编译的JRE版本,在编译JDK8的时候由于ant使用JDK7搞死我了--:

选中如图位置:External xxx....

配置ant的jre版本:

补充:如果有错误并且ant日志乱码,解决办法如下:

  在运行时修改ant 的运行时输出编码,我们添加(<sysproperty key="file.encoding" value="UTF-8" />) 后,控制台就可以正常显示中文了,如下:

    <!-- =================================
target: precompile
================================= -->
<target name="precompile" description="--> description">
<!--compile JSP-->
<java classname="weblogic.jspc" classpathref="wls.classpath" fork="true" failonerror="yes" maxmemory="1028m">
<sysproperty key="file.encoding" value="utf-8"/>
<arg line="-advanced" />
</java>
</target>

补充:如果我们希望在编译的classpath中引入某个目录下的class文件作为classpath,办法如下dirset就是将与build.xml同级的build\classes目录引入classpath(一般eclipse编译后文件在这个目录):

    <path id="wls.classpath">
<fileset dir="${wls_home}/server/lib">
<include name="*.jar" />
</fileset>
<dirset dir="./build/classes">
</dirset>
</path>

3.编译打包之后我们同样需要在web.xml中引入weblogic带的jspServlet入口并且在weblogic.xml关掉jsp预编译(我们也可以用ant的loadfile结合replace任务进行替换web.xml内容)

web.xml中加入:

 <servlet>
<servlet-name>JSPClassServlet</servlet-name>
<servlet-class>weblogic.servlet.JSPClassServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>JSPClassServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>

附一个完整的可以部署的脚本:

<?xml version="1.0" encoding="UTF-8"?>
<project name="AppcTest" default="precompile" basedir=".">
<description>Sample build file using Ant to call WLS APPC</description>
<property name="wls_root" value="E:/weblogic" />
<property name="wls_home" value="${wls_root}/wlserver" />
<property name="adf_lib_root" value="${wls_root}/oracle_common/modules" />
<property name="common_lib_root" value="${wls_home}/common/deployable-libraries" />
<property name="dist.dir" value="dist" />
<property name="web.dir" value="WebContent" />
<property name="weblogic.autodeploy" value="E:/weblogic/user_projects/domains/base_domain/autodeploy" />
<!--import file -->
<import file="" /> <path id="wls.classpath">
<fileset dir="${wls_home}/server/lib">
<include name="*.jar" />
</fileset>
</path> <!-- =================================
target: clean
================================= -->
<target name="clean" description="--> description">
<delete dir="${dist.dir}">
</delete>
</target> <!-- =================================
target: precompile
================================= -->
<target name="precompile" description="--> description">
<java classname="weblogic.jspc" classpathref="wls.classpath" fork="true" failonerror="yes" maxmemory="1028m">
<arg line="-webapp E:/xiangmu/WebTest/WebContent/ -d E:/xiangmu/WebTest/WebContent/WEB-INF/classes -compileAll" />
</java>
</target> <!-- =================================
target: jar
================================= -->
<target name="jar" depends="" description="--> package java">
<jar destfile="E:/xiangmu/WebTest/WebContent/lib/commons-jsp.jar">
<fileset dir="E:/xiangmu/WebTest/WebContent/WEB-INF/classes" includes="*.class">
</fileset>
</jar>
</target> <!-- =================================
target: war
================================= -->
<target name="war" depends="clean,precompile" description="--> description">
<mkdir dir="${dist.dir}" />
<war destfile="${dist.dir}/TestPreCompile.war" webxml="${web.dir}/WEB-INF/web.xml">
<classes dir="${web.dir}/WEB-INF/classes">
</classes>
<fileset dir="${web.dir}">
<include name="**/weblogic.xml" />
</fileset>
</war>
</target> <!-- =================================
target: deploy_war
================================= -->
<target name="deploy_war" depends="war" description="--> description">
<copy todir="${weblogic.autodeploy}" preservelastmodified="true">
<fileset dir="${dist.dir}">
<include name="*.war" />
</fileset>
</copy>
</target>
</project>

 附:JSPc 编译器选项 
使用以下选项的任何组合:

-classpath 
添加组成所需 CLASSPATH 的目录的列表(在 Windows NT/2000 平台上由分号分隔,在 UNIX 平台上由冒号分隔)。包括包含 JSP 所需的任何类的目录。例如(要在一行上输入): 
$ java weblogic.jspc -classpath java/classes.zip;/weblogic/classes.zip myFile.JSP 
-charsetMap 
指定 JSP contentType 指令中使用的 IANA 或非正式字符集名称到 Java 字符集名称的映射。例如: -charsetMap x-sjis=Shift_JIS,x-big5=Big5 
最常用的映射已内置到 JSP 编译器中。仅在未识别出所需的字符集映射时,才使用此选项。 
-commentary 
使 JSP 编译器将来自 JSP 的注释包含在生成的 HTML 页中。如果忽略此选项,则注释不会出现在生成的 HTML 页中。 
-compileAll 
递归编译当前目录中或通过 -webapp 标志指定的目录中的所有 JSP。(请参阅此选项列表中的 -webapp 条目)。还会编译子目录中的 JSP。 
-compileFlags 
将一个或多个命令行标志传递到编译器。将多个标志括在引号中,以空格分隔。例如: java weblogic.jspc -compileFlags "-g -v" myFile.jsp 
-compiler 
指定要用于从生成的 Java 源代码编译类文件的 Java 编译器。使用的默认编译器为 javac。除非您显式指定编译器的绝对路径,否则 Java 编译器程序应位于您的 PATH 中。 
-compilerclass 
将 Java 编译器作为 Java 类(而不是本地可执行文件)运行。 
-d <dir> 
指定已编译输出(即类文件)的目标。将此选项用作将已编译的类放入已位于 CLASSPATH 中的目录的快捷方式。 
-depend 
如果以前为某个 JSP 生成的类文件具有比该 JSP 源文件更新的日期戳,则不会重新编译该 JSP。 
-debug 
在启用调试的情况下进行编译。 
-deprecation 
将源文件编译为类文件时,如果在生成的 Java 源文件中使用了不赞成使用的方法,则会对此做出警告。 
-docroot directory 
请参阅 -webapp。 
-encoding default|named character encoding 
有效参数包括 (a) default,它指定使用 JDK 默认字符编码,(b) 指定的字符编码,如 8859_1。如果未指定 -encoding 标志,则使用字节数组。 
-g 
指示 Java 编译器将调试信息包含在类文件中。 
-help 
显示 JSP 编译器的所有可用标志的列表。 
-J 
获取传递到您的编译器的选项的列表。 
-k 
当使用单个命令编译多个 JSP 时,即使无法编译这些 JSP 中的一个或多个 JSP,编译器也会继续进行编译。 
-keepgenerated 
保留编译过程中作为中间级创建的 Java 源代码文件。通常情况下,这些文件会在编译之后删除。 
-noTryBlocks 
如果 JSP 文件具有许多自定义 JSP 标记或嵌套很深的自定义 JSP 标记,并且您在编译时收到 java.lang.VerifyError 异常,则使用此标志可使 JSP 正确进行编译。 
-nowarn 
从 Java 编译器关闭警告消息。 
-noPrintNulls 
在 JSP 表达式中将“null”显示为“”。 
-O 
在打开优化的情况下编译 Java 源文件。此选项会替换 -g 标志。 
-package packageName 
设置预规划给生成的 Java HTTP Servlet 的包名的包名。默认为 jsp_servlet。 
-superclass classname 
设置由生成的 Servlet 扩展的超类的类名。命名的超类必须是 HttpServlet 或 GenericServlet 的派生。 
-verbose 
将 verbose 标志传递到使用 compiler 标志指定的 Java 编译器。有关详细信息,请参阅编译器文档。默认值为 Off。 
-verboseJavac 
输出由指定的 JSP 编译器生成的消息。 
-version 
输出 JSP 编译器的版本。 
-webapp directory 
展开的目录格式的包含 Web 应用程序的目录名称。如果 JSP 包含对 Web 应用程序中的资源(如 JSP 标记库或其他 Java 类)的引用,则 JSP 编译器将在此目录中查找这些资源。如果在编译需要 Web 应用程序中的资源的 JSP 时省略此标志,则编译将失败。

  

weblogic对JSP预编译、weblogic读取JSP编译后的class文件、ant中weblogic.jspc预编译JSP的更多相关文章

  1. jsp配置文件数据信息读取

    一.jsp从配置文件*.properties读取信息 <%@ page language="java" import="java.util.*" cont ...

  2. Java实现word文档在线预览,读取office文件

    想要实现word或者其他office文件的在线预览,大部分都是用的两种方式,一种是使用openoffice转换之后再通过其他插件预览,还有一种方式就是通过POI读取内容然后预览. 一.使用openof ...

  3. Atitit.java c#.net php项目中的view复用(jsp,aspx,php的复用)

    Atitit.java c#.net php项目中的view复用(jsp,aspx,php的复用) 1.1. Keyword1 1.2. 前言1 2. Java项目使用.Net的aspx页面view1 ...

  4. 通过预编译头文件来提高C++ Builder的编译速度

    C++ Builder是最快的C++编译器之一,从编译速度来说也可以说是最快的win32C++编译器了.除了速度之外,C++builder的性能也在其它C++编译器的之上,但许多Delphi程序员仍受 ...

  5. jsp中的动作元素:<jsp:plugin>

    <jsp:plugin>用来产生客户端浏览器的特别标签(object或embed),可以使用它来插入Applet或JavaBean. 当jsp文件被编译把结果发给浏览器是,<jsp: ...

  6. springboot中tomcat找不到jsp页面【转载】

    这个原理还没搞明白,只知道是内嵌的tomcat找jsp时默认不读取resources目录,但是具体的默认读取的是哪个目录,打了一下午断点我也没找到.... 修改方式,添加配置修改tomcat的读取目录 ...

  7. windows7_下Eclipse中部署tomcat7.0进行JSP+servlet开发

    环境:windows 7+EclipseJava EE IDE for Web Developers +tomcat 7.02 插件:tomcatPluginV321.zip(百度搜索下载即可) 一. ...

  8. struts2中怎么把action中的值传递到jsp页面

    对于如何把struts2的action中的值传到jsp页面中,主要的方法有2种: 使用转发视图利用request域中储存所需的值 使用重定向时存储数据进入session使其在jsp中可以获得 下面,让 ...

  9. struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input

    原文地址:struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input jsp页面 1     function dosearch() {2         if ($(&q ...

随机推荐

  1. poj2586 【贪心】

    Accounting for Computer Machinists (ACM) has sufferred from the Y2K bug and lost some vital data for ...

  2. Leetcode 125.验证回文串 By Python

    思路 显然一个字符串不止包括字母和数字字符,所以我们可以先提取出来我们要进行比较的字符 还有一个问题是,字母是分大小写的,我们要统一大写或者统一小写,就是规范化 代码 class Solution(o ...

  3. 自学Aruba7.4-Aruba安全认证-MAC认证(web页面配置)

    点击返回:自学Aruba之路 自学Aruba7.4-Aruba安全认证-MAC认证(web页面配置) 由于前三节已经讲述了3种如何web页面配置安全认证,MAC认证就不过多讲解重复的步骤. 步骤1  ...

  4. emwin之窗口关闭按钮用法

    @2018-07-27 [小记] 使用函数 FRAMEWIN_AddCloseButton() 实现关闭当前窗口的功能时,调用其窗口的父窗口必须处于打开状态,否则将导致假死(当前窗口死了,系统还在工作 ...

  5. Android编程心得-在Assets文件夹中放入.sql文件实现创建SQlite表的操作

    当我们在使用SQLiteOpenHelper时,经常使用db.execSQL(String sql)方法写入对应语句实现创建表的操作,这样的确可以实现业务逻辑.与此同时还有一种更灵活的方法,从asse ...

  6. onTouchEvent方法的使用

    手机屏幕事件的处理方法onTouchEvent.该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件.该方法的签名如下所示. public  ...

  7. NinePatch图片

    绍 参考 :http://blog.sina.com.cn/s/blog_5033827f0100r4dm.html NinePatch图片以*.9.png结尾,和普通图片的区别是四周多了一个边框(如 ...

  8. 【uoj336】【清华集训2017】无限之环

    题目 描述 ​ 给出一个\(n*m\)的网格,每个格子里的水管可能向四个方向都有接口: ​ 游戏的目的是不能让水管漏水,即所有接口都有另一个接口与之相接: ​ 你一步可以将一个格子中的水管旋转\(90 ...

  9. CDQZ多校集训记

    20171218 DAY0 初相逢 今天的阳光很好,确实好极了.下午开始时,mercer说门外站了一堆人,我看都不用看就知道是衡水的.衡水人,怎么说呢,觉得还是挺不一样的.不知道像凡哥和超哥这种奇异的 ...

  10. Python基础学习(四)

    菜鸟咀嚼python基础之继续. 一.返回函数 第三章已经简单操作了Python的高阶函数,目前继续练手函数作为返回值的特效:通常,高阶函数除了可以接收函数作为参数外,还可以把函数作为结果值返回. 案 ...