ACE源代码目录结构

ACE(ADAPTIVE Communication Environment),中文的意思就是自适配通讯环境,ACE是一个用于开发网络程序的优秀的C++的框架,在国外有很广泛的使用,在国内一些大的开发通讯产品的公司也有使用。我接触ACE也有一段时间了,虽然时间不长,但我还是感觉到ACE确实是一个好东西,对于丰富自己的知识面有很大的帮助。虽然我们项目目前是采用C语言来开发,但是当接触ACE后,你会发现“喔,原来程序还可以这样”。例如:我觉得ACE里面Reactor框架就是一个非常的东西,我们在开发网络程序的时候,常常采用poll来监视各种网络事件,但当采用该框架后,你现在只是需要关系你的业务逻辑,当发生特定的网络事件后,框架会回调你的业务逻辑。其实按照这个思路,我们完全可以用C来实现类似的功能,当你完成这个后,你会发现你原来用C语言写的过程风格的代码竟然有了OO的味道。

ACE确实是好东西,但也不是能轻松的就能掌握的,我们还需要一步一步的来蚕食这个大象。

万丈高楼平地起,首先我们还是了解一下ACE的目录结构,从整体上对ACE有一个认识,为今后的进一步学习打下一个基础。

解开ACE的压缩包后,你会发现一个ACE_wrappers目录,这个目录也就是ACE的HOME目录,它下面还包含着一些子目录:

ace:这个目录是ACE中最重要的目录,它包含了ACE的所有源码,但遗憾的是,ACE的所有源文件和头文件全部杂乱的堆在这个目录里,这可能也是很多开源软件的缺点。其实ACE的代码完全可以按照不同的功能进行不同目录的划分,例如:Reactor框架和thread框架代码完全可以划分开,我想一个代码组织良好的ACE,将会给大家的学习带来极大的好处,我将在后面的文章里给出ACE代码划分的方法;
ACEXML:这个目录包含了用ACE实现的一个XML解析器;
apps:这个目录包含了用ACE来实现的一些较大的应用程序,例如:JAWS,一个WEB服务器;

ASNMP:基于ACE的SNMP协议实现;
bin:包含里用例方便开发的perl脚本程序,例如:在WIN32上开发DLL时候,需要导出DLL的接口;
docs:ACE的一些帮助文档,其中ACE-subsets.html文档,对我们划分ACE的代码有很大的帮助;

examples:是用ACE来编写的一些例子程序,方便更好的学习和理解ACE;
include:也是ACE中一个比较重要的目录,它包含了在不同的平台上编译时候的编译规则,库的编译规则等;
netsvcs:一些基于ACE的在分布式系统中常用的程序,例如:分布式系统日志系统,网络锁,时间同步等;

TAO:基于ACE的实时CORBA实现,TAO在分布式系统中使用相当广泛,也是一个不可多得的好资源;
tests:用来对ACE进行回归测试,也提供了一个学习ACE的很好的例子代码;

***********************************************************************************************************************************

前几篇文章也提到过,ACE的所有源文件和头文件都杂乱堆在了ACE_wrappers/ace目录下。这样的代码组织方式给学习ACE带来了很大的困难,很多朋友在看到ace目录下庞大的代码的时候,几乎就失去了学习ACE的信心^_^。因此,我们有必要对ACE的代码进行重新组织,以降低学习曲线。下面,我将给出我对ACE源码的划分方法。其实,我也是刚学习ACE没有多久,对ACE的了解还甚少,所以,我的源码划方式法不一定十分正确,这里共享出来,仅供大家参考。

其实,在ACE的帮助文档里,ACE-subsets.html和ACE-categories.html,这两个文档对指导ACE的源码划分起到了很大的作用,否则,我刚刚接触ACE,就想对其进行源码划分,是不可能完成的。ACE-subsets.html,这个文档主要介绍了ACE的library

subsetting。正常情况下,在编译完ACE后,只会产生一个ACE的库。我们可以根据该文档的介绍,简单的修改一下Makefile,就可以对ACE的库进行子集化,我们可以编译出OS、Thread等这样的子库。ACE-categories.html,这个文档对ACE中的代码进行了一些功能上的分类。具体大家可以详细的参考一下这两个文档,这两个文档对学习ACE还是有一定的帮助的。

在ACE的源代码目录ace下,我将建立很多子目录,来对ACE的代码进行按功能分类:

ACE_OS:该目录里包含的代码是OS的API的wrapper,也就是ACE的OS适配层;
包含代码: ARGV.cpp          OS_Memory.cpp
   Argv_Type_Converter.cpp     OS_QoS.cpp
   Base_Thread_Adapter.cpp     OS_String.cpp
   Basic_Types.cpp             OS_TLI.cpp
   Copy_Disabled.cpp           OS_Thread_Adapter.cpp
   Env_Value_T.cpp             Sched_Params.cpp
   Handle_Set.cpp         Template_Instantiations.cpp
   Makefile                    Thread_Hook.cpp
   OS.cpp                      Time_Value.cpp
   OS_Dirent.cpp                
   OS_Errno.cpp                 
   OS_Log_Msg_Attributes.cpp

ACE_Codec:该目录包含的是ACE的各种编码类型的处理代码,目前只包含了BASE64编码的处理;
    包含代码:Codecs.cpp    Makefile

ACE_Connection:该目录包含的是ACE中的Acceptor-Connector框架代码和异步通讯类代码;
   包含代码:Acceptor.cpp            Connector.cpp
    Asynch_Acceptor.cpp             Makefile
    Asynch_Connector.cpp         POSIX_Asynch_IO.cpp
    Asynch_IO.cpp                   Strategies_T.cpp
    Asynch_IO_Impl.cpp              Svc_Handler.cpp
    Asynch_Pseudo_Task.cpp       WIN32_Asynch_IO.cpp
    Cached_Connect_Strategy_T.cpp  
    Caching_Strategies_T.cpp

ACE_Demux:该目录包含的是ACE中的Reactor和Proactor框架代码;
   
包含代码:Dev_Poll_Reactor.cpp      Priority_Reactor.cpp     
TP_Reactor.cpp        Event_Handler.cpp        
Proactor.cpp              TkReactor.cpp
   Event_Handler_T.cpp       QtReactor.cpp             WFMO_Reactor.cpp
   FlReactor.cpp             Reactor.cpp               WIN32_Proactor.cpp
   Makefile                  SUN_Proactor.cpp          XtReactor.cpp
   Msg_WFMO_Reactor.cpp      Select_Reactor.cpp       
   POSIX_CB_Proactor.cpp     Select_Reactor_Base.cpp  
   POSIX_Proactor.cpp        Select_Reactor_T.cpp

ACE_IPC:该目录包含的是ACE中进程间通讯的一些封装代码:
包含代码:ATM_Acceptor.cpp             Makefile
   ATM_Addr.cpp                 Pipe.cpp
   ATM_Connector.cpp            SPIPE.cpp
   ATM_Params.cpp               SPIPE_Acceptor.cpp
   ATM_QoS.cpp                  SPIPE_Addr.cpp
   ATM_Stream.cpp               SPIPE_Connector.cpp
   DEV.cpp                      SPIPE_Stream.cpp
   DEV_Addr.cpp                 SV_Message.cpp
   DEV_Connector.cpp            SV_Message_Queue.cpp
   DEV_IO.cpp                   SV_Semaphore_Complex.cpp
   FIFO.cpp                     SV_Semaphore_Simple.cpp
   FIFO_Recv.cpp                SV_Shared_Memory.cpp
   FIFO_Recv_Msg.cpp            Signal.cpp
   FIFO_Send.cpp                TLI.cpp
   FIFO_Send_Msg.cpp            TLI_Acceptor.cpp
   FILE.cpp                     TLI_Connector.cpp
   FILE_Addr.cpp                TLI_Stream.cpp
   FILE_Connector.cpp           TTY_IO.cpp
   FILE_IO.cpp                  Typed_SV_Message.cpp
   IOStream.cpp                 Typed_SV_Message_Queue.cpp
   IOStream_T.cpp               UNIX_Addr.cpp
   IO_SAP.cpp                   UPIPE_Acceptor.cpp
   MEM_Acceptor.cpp             UPIPE_Connector.cpp
   MEM_Addr.cpp                 UPIPE_Stream.cpp
   MEM_Connector.cpp            XTI_ATM_Mcast.cpp
   MEM_IO.cpp                  
   MEM_SAP.cpp                 
   MEM_Stream.cpp

ACE_LIB:该目录将包含ACE编译好的各个子库;

ACE_Logging:该目录包含ACE中的日志处理相关代码;
       包含代码:Dump.cpp                   Log_Msg_UNIX_Syslog.cpp
   Dump_T.cpp                 Log_Record.cpp
   Log_Msg.cpp                Logging_Strategy.cpp
   Log_Msg_Backend.cpp        Makefile
   Log_Msg_Callback.cpp       Trace.cpp
   Log_Msg_IPC.cpp           
   Log_Msg_NT_Event_Log.cpp

ACE_Memory:该目录包含了ACE内存处理相关代码;
     包含代码:Based_Pointer_Repository.cpp   Obstack.cpp
   Based_Pointer_T.cpp            Obstack_T.cpp
   Makefile                       PI_Malloc.cpp
   Malloc.cpp                     Read_Buffer.cpp
   Malloc_Allocator.cpp           Shared_Memory.cpp
   Malloc_Instantiations.cpp      Shared_Memory_MM.cpp
   Malloc_T.cpp                   Shared_Memory_SV.cpp
   Mem_Map.cpp                   
   Memory_Pool.cpp               
   Obchunk.cpp

ACE_Misc:ACE中一些没有明确功能分类的代码,属于杂项;
   包含代码:CE_Screen_Output.cpp   NT_Service.cpp
   Makefile               gethrtime.cpp

ACE_Nameservices:该目录包含了ACE中名字服务相关代码;
    包含代码: Name_Space.cpp
    Local_Name_Space.cpp           Naming_Context.cpp
    Local_Name_Space_T.cpp         Registry_Name_Space.cpp
    Makefile                       Remote_Name_Space.cpp
    Name_Proxy.cpp                
    Name_Request_Reply.cpp

ACE_Sockets:该目录包含的是ACE的socket封装代码;
      包含代码:Addr.cpp                       SOCK_CODgram.cpp
   INET_Addr.cpp                  SOCK_Connector.cpp
   IPC_SAP.cpp                    SOCK_Dgram.cpp
   LOCK_SOCK_Acceptor.cpp         SOCK_Dgram_Bcast.cpp
   LSOCK.cpp                      SOCK_Dgram_Mcast.cpp
   LSOCK_Acceptor.cpp             SOCK_IO.cpp
   LSOCK_CODgram.cpp              SOCK_SEQPACK_Acceptor.cpp
   LSOCK_Connector.cpp            SOCK_SEQPACK_Association.cpp
   LSOCK_Dgram.cpp                SOCK_SEQPACK_Connector.cpp
   LSOCK_Stream.cpp               SOCK_Stream.cpp
   Makefile                       Sock_Connect.cpp
   Multihomed_INET_Addr.cpp      
   SOCK.cpp                      
   SOCK_Acceptor.cpp

ACE_Streams:该目录包含了ACE中的Streams和Task框架代码;
      包含代码:CDR_Base.cpp                        Module.cpp
   CDR_Stream.cpp                      Multiplexor.cpp
   Codeset_IBM1047.cpp                 Reactor_Notification_Strategy.cpp
   Codeset_Registry.cpp                Stream.cpp
   Codeset_Registry_db.cpp             Stream_Modules.cpp
   IO_Cntl_Msg.cpp                     Task.cpp
   Makefile                            Task_T.cpp
   Message_Queue.cpp                  
   Message_Queue_T.cpp

ACE_Svcconf:该目录包含了ACE中的Service Configurator框架代码;
      包含代码:DLL.cpp                    Service_Types.cpp
   DLL_Manager.cpp            Shared_Object.cpp
   Dynamic_Service.cpp        Svc_Conf.l
   Dynamic_Service_Base.cpp   Svc_Conf.y
   Makefile                   Svc_Conf_Lexer_Guard.cpp
   Parse_Node.cpp             Svc_Conf_l.cpp
   Service_Config.cpp         Svc_Conf_y.cpp
   Service_Manager.cpp        XML_Svc_Conf.cpp
   Service_Object.cpp        
   Service_Repository.cpp    
   Service_Templates.cpp

ACE_Threads:该目录包含了ACE中的线程和同步机制相关代码,例如:thread manager;
      包含代码:Activation_Queue.cpp      Process_Manager.cpp       Thread.cpp
   Atomic_Op.cpp             Process_Mutex.cpp         Thread_Adapter.cpp
   Atomic_Op_T.cpp           Process_Semaphore.cpp     Thread_Control.cpp
   File_Lock.cpp             RW_Process_Mutex.cpp      Thread_Exit.cpp
   Future.cpp                Synch.cpp                 Thread_Manager.cpp
   Future_Set.cpp            Synch_Options.cpp         Token.cpp
   Makefile                  Synch_T.cpp              
   Process.cpp               Test_and_Set.cpp

ACE_Timer:该目录包含ACE中和时间相关的代码;
     包含代码:Timer_Heap.cpp
   Basic_Stats.cpp            Timer_Heap_T.cpp
   High_Res_Timer.cpp         Timer_List.cpp
   Makefile                   Timer_List_T.cpp
   Profile_Timer.cpp          Timer_Queue.cpp
   System_Time.cpp            Timer_Queue_Adapters.cpp
   Time_Request_Reply.cpp     Timer_Queue_T.cpp
   Timeprobe.cpp              Timer_Wheel.cpp
   Timeprobe_T.cpp            Timer_Wheel_T.cpp
   Timer_Hash.cpp            
   Timer_Hash_T.cpp

ACE_Token:Token是ACE中实现的一种同步机制,保证严格的FIFO或LIFO策略来获得锁。ACE通过Token机制实现了分布式同步机制。
     包含代码:Local_Tokens.cpp          Token_Collection.cpp      Token_Request_Reply.cpp
   Makefile                  Token_Invariants.cpp     
   Remote_Tokens.cpp         Token_Manager.cpp

ACE_Utils:ACE中的一些基础数据结构和算法的工具类代码;
    包含代码:ACE.cpp                             Init_ACE.cpp
   Active_Map_Manager.cpp              Intrusive_List.cpp
   Active_Map_Manager_T.cpp            Intrusive_List_Node.cpp
   Arg_Shifter.cpp                     Lib_Find.cpp
   Array_Base.cpp                      Makefile
   Auto_IncDec_T.cpp                   Managed_Object.cpp
   Auto_Ptr.cpp                        Map.cpp
   Cache_Map_Manager_T.cpp             Map_Manager.cpp
   Caching_Utility_T.cpp               Map_T.cpp
   Capabilities.cpp                    Message_Block.cpp
   Cleanup_Strategies_T.cpp            Message_Block_T.cpp
   Configuration.cpp                   Method_Request.cpp
   Configuration_Import_Export.cpp     Node.cpp
   Connection_Recycling_Strategy.cpp   Notification_Strategy.cpp
   Containers.cpp                      Object_Manager.cpp
   Containers_T.cpp                    Pair.cpp
   Date_Time.cpp                       Pair_T.cpp
   Dirent.cpp                          RB_Tree.cpp
   Dirent_Selector.cpp                 Recyclable.cpp
   Dynamic.cpp                         Refcountable.cpp
   Filecache.cpp                       Registry.cpp
   Flag_Manip.cpp                      SString.cpp
   Framework_Component.cpp             Sample_History.cpp
   Framework_Component_T.cpp           Singleton.cpp
   Free_List.cpp                       Stats.cpp
   Functor.cpp                         String_Base.cpp
   Functor_T.cpp                       String_Base_Const.cpp
   Get_Opt.cpp                         Swap.cpp
   Handle_Ops.cpp                      Unbounded_Queue.cpp
   Hash_Cache_Map_Manager_T.cpp        Unbounded_Set.cpp
   Hash_Map_Manager.cpp                Unbounded_Set_Ex.cpp
   Hash_Map_Manager_T.cpp              Vector_T.cpp
   Hash_Map_With_Allocator_T.cpp      
   Hashable.cpp

include:该目录又包含子目录ace,也就是说include/ace/目录下,包含了ACE的所有头文件和.i文件,之所以这样组织,是因为ACE中的源
文件和头文件的包含文件的方式为:#include
"ace/OS.h",所以采用这种目录结构方式来存放头文件和.i文件。这里,对头文件和.i  
文件,没有进一步按照功能划分,就是因为#include "ace/OS.h"这种包含方式,如果头文件和.i文件也按照功能划分,那么代码修改
量相当大;

通过上面给出的目录结构和源文件功能划分及头文件组织方式,相信读者以可以自行对ACE代码进行整理了。在实际整理和编译代码的过程中,需要修改Makefile和ACE头文件中以_T方式为后缀的头文件,例如:Obstack_T.h,需要修改里面模板源文件包含路径。我将在下一篇文章中进行描述。

我再次强调,上面ACE源码划分方式,不一定十分正确^_^,随着我们ACE学习和理解的深入,我们可能会进行更改。其实,在我们整理ACE源文件的时候,我们可以进一步了解ACE的各个源文件大致功能,对我们以后更深入的学习大有裨益。

***********************************************************************************************************************************

在ACE的源代码目录里,有源文件.cpp、头文件.h,我们还发现有以.i和.inl为扩展名的文件。其实,以.i和.inl为扩展名的文件是ACE源码中inline函数的存放形式。

在说明ACE中为什么采用这种方式来存放inline函数之前,我们来说一下inline关键字是什么意识。我们知道当调用一个函数的时候,涉及到返回地址和参数压栈等一些操作,这些操作是函数调用本身的开销。在原来的C代码中,通常采用宏定义的方式模拟函数,来消除函数调用的开销,因此我们知道宏是在预编译时候进行处理的。但是,宏定义本身也有很多缺陷,很容易造成错误的使用。这就是inline关键字诞生的原因。用inline关键字定义的函数,在编译的时候,并不会产生真正的函数,而是在该函数调用处直接展开代码,这样就消除了函数调用的开销。注意,inline关键字,只是给编译器的一个暗示,是不是真的进行了inline处理,是由编译器决定的。

那为什么ACE会采用这样一个特殊的方式来存放inline函呢?我们结合实例给出答案。
我们看一下,Reactor.h文件的结尾处,有如下的处理:
#if defined (__ACE_INLINE__)
#include "ace/Reactor.i"
#endif /* __ACE_INLINE__ */

在看一下Reactor.cpp文件开头处的宏处理:
#if !defined (__ACE_INLINE__)
#include "ace/Reactor.i"
#endif /* __ACE_INLINE__ */

上面的Reactor.h,Reactor.cpp和Reactor.i文件是ACE的Reactor框架的相关代码。上面的宏定义我们很好理解,在头文件中的处理为:如果定义了宏__ACE_INLINE__,那么我们就把Reactor.i文件include到头文件中。在源文件中处理为:如果没有定义宏__ACE_INLINE__,那么就把Reactor.i文件include到源文件中。其实有了上面inline含义的介绍,我们不难理解为什么采用这种方式来进行处理。这里我们假设定义了宏__ACE_INLINE__,并且Reactor.i文件是被include到源文件里,而不是被include头文件里,那么会产生什么后果那?我们知道inline函数,在编译器编译后,是不会产生真正的函数的,因此,如果有其它源文件,例如zhx.cpp,调用了Reactor.i文件中的inline函数,那么在连接的时候,就会抛出符号无法解析的错误,而如果Reactor.i文件是被include到了头文件中,并且我们在zhx.cpp中有调用Reactor.i文件中的函数,那么在zhx.cpp中,只需要包含Reactor.h头文件即可,则Reactor.i的相关inline函数在zhx.cpp也进行了代码展开处理。如果没有定义宏__ACE_INLINE__,则Reactor.i被include到源文件中,没有任何问题,因为Reactor.i中的函数在编译后,会产生真正的函数,而不是被inline处理。这就是ACE为什么采用这样的方式进行处理的原因。

在上面的介绍中,我们同时也发现了inline的缺点,就是它会造成代码的膨胀。因此,不是什么样的函数都适合用inline来定义,只有那些短小的函数才适合采用inline处理。

注:ACE为什么会采用.i和.inl两种扩展名形式的文件来存放inline函数,我还不是很清楚,但感觉以.inl形式存放的文件是早期ACE代码中的方式,后期的ACE代码采用.i方式来存放inline函数,也就是说这应该是一个历史遗留问题^_^,开源项目的缺点。

原文地址:https://www.cnblogs.com/aibox222/p/9682680.html

时间: 2024-10-14 21:04:48

ACE源代码目录结构的相关文章

Linux源代码目录结构介绍

1.arch目录:存放不同平台的相关代码,每种平台用不同的目录来区分. ******Alpha平台 ******Arm平台 ******Arv32平台 ******X86平台 2.drivers目录:存放驱动程序的目录,不同的驱动用不同的目录来加以区分. ******ftape:磁带驱动 ******hfmodem:无线电设备驱动 ******joystick:游戏杆驱动 ******paride:从并口访问IDE设备的支持 ******cdrom:光驱驱动 ******char:字符设备驱动

ntv.js框架(第二章) - 源代码目录结构

源代码目录结构: css              // 包含一些标签默认样式重置.常用class.组件所需的css样式 images       // 包含了2张透明图,具体用处后续介绍(可选目录) js               // 框架核心代码 js/effect    // 框架提供的效果插件,例如滚动div.滑动菜单 js文件结构: ?1common.js     // 公共函数类.例如:将document.getElementById(id)封装为 $("#id")函数

Android系统源代码目录结构 “Android源代码”“目录结构”

在讲述Android源码编译的三个步骤之前,将先介绍Android源码目录结构,以便读者理清Android编译系统核心代码在Android源代码的位置. Android源代码顶层目录结构如下所示: ├──abi #应用二进制接口,不同的操作系统,应用二进制接口不同,因此linux上的二进制可执行文件在windows上无法执行 ├──android #存放了一些xml文件,用于描述工程路径及其对应的远程仓库地址,repo工具将使用这些信息同步代码 ├──bionic #bionic C库,Andr

Android源代码目录结构

Android 2.2 |-- Makefile |-- bionic               (bionic C库) |-- bootable            (启动引导相关代码) |-- build                 (存放系统编译规则及generic等基础开发包配置) |-- cts                    (Android兼容性测试套件标准) |-- dalvik                (dalvik JAVA虚拟机) |-- develop

linux 源代码目录结构

Linux源代码目录树结构 (2008-04-21 09:14) 分类: Linux/Unix Linux用来支持各种体系结构的源代码包含大约4500个C语言程序,存放在270个左右的子目录下,总共大约包含200万行代码,大概占用58MB磁盘空间. 源代码所有在目录:/usr/src/linux (大部分linux发行版本中) init 内核初始化代码 kernel 内核核心部分:进程.定时.程序执行.信号.模块... mm 内存处理 arch 平台相关代码 i386 IBM的PC体系结构 ke

Python提取Linux内核源代码的目录结构

今天用Python提取了Linux内核源代码的目录树结构,没有怎么写过脚本程序,我居然折腾了2个小时,先是如何枚举出给定目录下的所有文件和文件夹,os.walk可以实现列举,但是os.walk是只给出目录名和文件名,而没有绝对路径.使用os.path.listdir可以达到这个目的,然后是创建目录,由于当目录存在是会提示创建失败的错误,所以我先想删除所有目录,然后再创建,但是发现还是有问题,最好还是使用判断如果不存在才创建目录,存在时就不创建,贴下代码: # @This script can b

Twitter Storm源代码分析之ZooKeeper中的目录结构

徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeeper上面写状态信息来分配任务,supervisor,task通过从zookeeper中读状态来领取任务,同时supervisor, task也会定义发送心跳信息到zookeeper, 使得nimbus可以监控整个storm集群的状态, 从而可以重启一些挂掉的task.ZooKeeper 使得整个sto

源代码管理工具(下)-SVN目录结构

正规项目的SVN目录结构一般有3个文件夹:trunk:主干,当前开发项目的主目录branches:分支目录,添加非主线功能时使用,开发测试之后,可以合并到主干项目中tags:标记目录,通常作为重大版本的备份 在svn服务器上再次创建一个仓库,这个仓库死真正的仓库,包含了trunk.branches.tags三个文件夹,模拟开发.修复bug.合并版本的流程. 1.创建仓库 2.命名仓库 3.初始化仓库: 4.访问设置: 5.仓库创建成功,预览URL: 6.查看创建的三个文件夹: 7.接下来,根据项

Day4 - 迭代器&生成器、装饰器、Json & pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青