zoukankan      html  css  js  c++  java
  • python全栈开发- day14列表推导式、生成器表达式、模块基础

    一、列表推导式

    #1、示例      数据量小
    egg_list=[]
    for i in range(10):
        egg_list.append('鸡蛋%s' %i)
    
    egg_list=['鸡蛋%s' %i for i in range(10)]
    #2、优点:方便,改变了编程习惯,

    二、 生成器表达式

    #1、把列表推导式的[]换成()就是生成器表达式
    
    #2、示例:生一筐鸡蛋变成给你一只老母鸡,用的时候就下蛋,这也是生成器的特性
    chicken=('鸡蛋%s' %i for i in range(5))
    print(chicken)
    <generator object <genexpr> at 0x10143f200>
    next(chicken)
    #'鸡蛋0'
     list(chicken) #因chicken可迭代,因而可以转成列表
    #['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',]
    
    #3、优点:省内存,一次只产生一个值在内存中,主要应用数据量大

    三、 模块介绍

    1、什么是模块?

    常见的场景:
      一个模块就是一个包含了一组功能的集合体,比如spam.py(任意的名字,但是前提是不要和内置函数一样)
    模块名为spam,可以通过import spam使用。 在python中,模块的使用方式都是一样的,但其实细说的话,模块可以分为四个通用类别:    1、使用python编写的.py文件   2、已被编译为共享库或DLL的C或C++扩展   3、把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)   4、使用C编写并链接到python解释器的内置模块

    2、为何要使用模块?

      1、从文件级别组织程序,更方便管理

      2、拿来主义,提升开发效率

    四、使用模块之import

    1、import的使用  

      模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行

      import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,

      python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句)

    2、在第一次导入模块时会做三件事,重复导入会直接引用内存中已经加载好的结果

      1、为源文件创建新的名称空间

      2、执行模块对应文件,将产生的名字存放于1中的名称空间

      3、在当前执行文件中拿到一个模块名,该模块名指向1的名称空间

    3、被导入模块有独立的名称空间

      每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,

    这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突

    4、为模块名起别名

      为已经导入的模块起别名的方式对编写可扩展的代码很有用,在被导入函数后加as再加上新起的别名

    五、 使用模块之from ... import...

    1、from...import...的使用

     from 模块名字 import 具体的函数名,或者变量名字

    2、from...import 与import的对比

    唯一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀:spam.
    
    from...import...的方式有好处也有坏处
        好处:使用起来方便了
        坏处:容易与当前执行文件中的名字冲突

    3、也支持as,一行导入多个名字跟上一样

    4、from...import *

    #from 模块名字 import * 把模块中所有的不是以下划线(_)开头的名字都导入到当前位置
    
    #大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。

     可以使用__all__来控制*(用来发布新版本)

    __all__=[常用的函数名] #你自己的模块方法,想规定别人导入多少,就可以导入多少

    六、 py文件区分两种用途:模块与脚本

    编写好的一个python文件可以有两种用途:
        一:脚本,一个文件就是整个程序,用来被执行
        二:模块,文件中存放着一堆功能,用来被导入使用
    python为我们内置了全局变量__name__,
        当文件被当做脚本执行时:__name__ 等于'__main__'
        当文件被当做模块导入时:__name__等于模块名
    作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
        if __name__ == '__main__':

    七、模块搜索路径

    模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块

    官网解释:

    #官网链接:https://docs.python.org/3/tutorial/modules.html#the-module-search-path
    搜索路径:
    当模块被导入时
        解释器首先会从内建模块中寻找该名字
        找不到,则去sys.path中找该名字
    
    sys.path从以下位置初始化
        1 执行文件所在的当前目录
        2 PTYHONPATH(包含一系列目录名,与shell变量PATH语法一样)
        3 依赖安装时默认指定的
    
    注意:在支持软连接的文件系统中,执行脚本所在的目录是在软连接之后被计算的,换句话说,包含软连接的目录不会被添加到模块的搜索路径中
    
    在初始化后,我们也可以在python程序中修改sys.path,执行文件所在的路径默认是sys.path的第一个目录,在所有标准库路径的前面。
    这意味着,当前目录是优先于标准库目录的,需要强调的是:我们自定义的模块名不要跟python标准库的模块名重复。
  • 相关阅读:
    POJ-1502-MPI Maelstrom
    POJ-3259-Wormholes
    【BZOJ4399】—膜法少女LJJ(线段树合并)
    省选模板复习—【计算几何】
    【BZOJ2115】【WC2011】—Xor(线性基)
    【洛谷P5290】【十二省联考2019】春节十二响(贪心+启发式合并)
    【BZOJ5461】 【PKUWC2018】—Minimax(线段树合并优化dp)
    【LOJ#3043】【洛谷P5280】【ZJOI2019】—线段树(计数dp+线段树)
    【省选模拟】—猎人杀(概率dp)
    【BZOJ4828】【HNOI2017】—大佬(LmyAKIOI!)
  • 原文地址:https://www.cnblogs.com/ManyQian/p/8709699.html
Copyright © 2011-2022 走看看