前端学习第74天BS应用与Python内存管理

一.栅格系统

- 将所在父级的宽度等分为12等分
- 四种屏幕尺寸 col-xs- | col-sm- | col-md- | col-lg-
- 偏移 col-xs-offset- | ... | col-lg-offset-

```html
<div class="row">
    <div class="ele1 col-lg-4 col-xs-6"></div>
    <div class="ele2 col-lg-4 col-lg-offset-4 col-xs-6"></div>
</div>
<!-- 超大屏幕下: ele1占4等分 ele2与ele1间隔4等分,自己也占4等分 -->
<!-- 在超小,小,中等屏幕下, ele1与ele2均占6等分 -->
```
<head>
    <meta charset="UTF-8">
    <title>栅格系统</title>
    <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css">
    <style>
        .row div {
            height: 60px;
        }
        .box {
            width: 800px;
            height: 60px;
            /*margin: 0 0000;*/
            background-color: black;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="row bg-pink">
            <!--栅格系统-->
            <!--1.将父级的width等分为12等分, 子级占父级宽度的多少等分-->
            <!--2.子级们的总占比不要超过12等分-->
            <!--3.在12等分内,子级同行显示-->
            <div class="bg-danger col-md-4"></div>
            <div class="bg-info col-md-9"></div>
        </div>
        <div class="row box bg-warning">
            <!--4.总占比小于12等分,偏移通过col-?-offset-?来偏移-->
            <!--5.设置一个平面宽度下的栅格, 大于该屏幕尺寸,可以运用此套css
            小于该屏幕尺寸,不适用, 但可以接着设置更小屏幕尺寸的栅格-->
            <div class="bg-danger col-md-4 col-sm-6 col-xs-10"></div>
            <div class="bg-info col-md-7 col-md-offset-1 col-sm-6 col-xs-12"></div>
        </div>
    </div>
</body>
<script src="js/jquery-3.3.1.js"></script>
<script src="bootstrap-3.3.7-dist/js/bootstrap.js"></script>
</html>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>案例</title>
    <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css">
    <style>
        .row {
            /*background-color: yellow;*/
        }
        .box {
            height: 60px;
            /*margin: 0 -15px;*/
        }
        .left {
            margin-right: 25px;
        }
        .right {
            margin-left: 25px;
        }
    </style>
</head>
<body>
<!--需求1-->
<!--两个盒子之间间距为30px-->
<div class="container">
    <div class="row">
        <div class="container col-md-6">
            <div class="box bg-warning"></div>
        </div>
        <div class="container col-md-6">
            <div class="box bg-danger"></div>
        </div>
    </div>
</div>
<!--两个盒子之间间距50px, 且左右没有留白-->
<div class="container">
    <div class="row">
        <div class="col-md-6">
            <div class="row">
                <div class="box bg-warning left"></div>
            </div>
        </div>
        <div class="col-md-6">
            <div class="row">
                <div class="box bg-danger right"></div>
            </div>
        </div>
    </div>
</div>
<!--重点: 在任何结构下, 需要容器就可以设置容器来嵌套显示内容,
需要row来配个容器布局,就可以在容器内部设置row-->
</body>

二.移动端屏幕适配

```html
<meta name="viewport" content="width=device-width, user-scaleable=no" />
<!-- 
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>移动端适配</title>
    <!--注: 当页面没有适配移动端设备-->
    <!--注; 移动端设备不再以屏幕像素px作为布局宽度, 以屏幕像素点作为屏幕布局宽度-->
    <meta name="viewport" content="width=device-width, user-scalable=no">
    <!--<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">-->


    <link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css">

    <style>
        .row.bg-pink {
            height: 60px;
            width: 375px;
        }
    </style>
</head>
<body>
<div class="container-fluid">
    <nav class="navbar navbar-inverse">
        <div class="container-fluid">
            <!-- Brand and toggle get grouped for better mobile display -->
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
                        data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#">Brand</a>
            </div>

            <!-- Collect the nav links, forms, and other content for toggling -->
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                <ul class="nav navbar-nav">
                    <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li>
                    <li><a href="#">Link</a></li>
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
                           aria-expanded="false">Dropdown <span class="caret"></span></a>
                        <ul class="dropdown-menu">
                            <li><a href="#">Action</a></li>
                            <li><a href="#">Another action</a></li>
                            <li><a href="#">Something else here</a></li>
                            <li role="separator" class="divider"></li>
                            <li><a href="#">Separated link</a></li>
                            <li role="separator" class="divider"></li>
                            <li><a href="#">One more separated link</a></li>
                        </ul>
                    </li>
                </ul>
                <form class="navbar-form navbar-left">
                    <div class="form-group">
                        <input type="text" class="form-control" placeholder="Search">
                    </div>
                    <button type="submit" class="btn btn-default">Submit</button>
                </form>
                <ul class="nav navbar-nav navbar-right">
                    <li><a href="#">Link</a></li>
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
                           aria-expanded="false">Dropdown <span class="caret"></span></a>
                        <ul class="dropdown-menu">
                            <li><a href="#">Action</a></li>
                            <li><a href="#">Another action</a></li>
                            <li><a href="#">Something else here</a></li>
                            <li role="separator" class="divider"></li>
                            <li><a href="#">Separated link</a></li>
                        </ul>
                    </li>
                </ul>
            </div><!-- /.navbar-collapse -->
        </div><!-- /.container-fluid -->
    </nav>
</div>
<div class="container">
    <div class="row bg-pink">

    </div>
</div>
</body>

三.组件

1.表格

- 表格

```html
<!--striped条纹 bordered边框 hover悬浮-->
<table class="table table-striped table-bordered table-hover">
    <tr style="text-align: center">
        <th>标题</th>
        <th>标题</th>
        <th>标题</th>
    </tr>
    <tr>
        <td>单元格</td>
        <td>单元格</td>
        <td>单元格</td>
    </tr>
    <!-- 颜色强调,整行tr 或 单元格 th|td -->
    <tr class="success">
        <td>单元格</td>
        <td>单元格</td>
        <td>单元格</td>
    </tr>
    <tr>
        <td>单元格</td>
        <td class="danger">单元格</td>
        <td>单元格</td>
    </tr>
    <tr>
        <td>单元格</td>
        <td class="info" colspan="2" style="text-align: center">单元格</td>
        <!--<td>单元格</td>-->
    </tr>
</table>
```

2.表单

```html
<form action="">
    <!-- 分行: form-group -->
    <div class="form-group">
        <!--label的for是关联匹配的input的id, 当label点击时会让input获取焦点-->
        <label for="usr">用户名:</label>
        <!-- form-control: bs控制 -->
        <input class="form-control" type="text" name="usr" id="usr">
    </div>
    <div class="form-group">
        <label for="pwd">密码:</label>
        <input class="form-control" type="password" name="pwd" id="pwd">
    </div>
    <div class="form-group checkbox">
        <!--复选框-->
        <label>
            <input type="checkbox" value="reading" name="sk">请阅读
        </label>
    </div>
</form>

<!-- 内联表单 -->
<form class="form-inline"></form>

<!-- label与input同行显示 -->
<form action="" class="form-horizontal">
    <div class="form-group has-warning">
        <label for="usr2" class="col-sm-2 control-label">用户名:</label>
        <div class="col-sm-10">
            <input type="text" class="form-control" name="usr2" id="usr2" placeholder="请输入用户名">
        </div>
    </div>
</form>
```

四.python的内存管理

# Python的垃圾回收机制
## 引子:
我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,而变量名是访问到变量值的唯一方式,
所以当一个变量值没有关联任何变量名时,我们就无法再访问到该变量值了,该变量值就是一个垃圾会被Python解释的垃圾回收机制自动回收。。。 ## 一、什么是垃圾回收机制? 垃圾回收机制(简称GC)是Python解释器自带一种机,专门用来回收不可用的变量值所占用的内存空间 ## 二、为什么要用垃圾回收机制? 1程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),导致程序崩溃,因此管理内存是一件重要且繁杂的事情,
而python解释器自带的垃圾回收机制把程序员从繁杂的内存管理中解放出来。 ## 三、垃圾回收机制原理分析 Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象
可能产生的循环引用的问题,并且通过“分代回收”(generation collection)以空间换取时间的方式来进一步提高垃圾回收的效率。 ### 1、什么是引用计数? 引用计数就是:变量值被变量名关联的次数 如:name=‘jason' 变量值jason被关联了一个name,称之为引用计数为1![1544151982250](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1544151982250.png) 引用计数增加: x=10 (此时,变量值10的引用计数为1) y=x (此时,把x的内存地址给了y,此时,x,y都关联了10,所以变量值10的引用计数为2) 引用计数减少: x=3(此时,x与10解除了关联,与3 建立了关联,变量10的引用计数为1) del y(del的意思是解除变量名y与变量值10的关联关系,此时,变量10的引用计数为0) 这样变量值10的引用计数为0,其占用的内存地址就会被回收 ### 2、引用计数扩展阅读?(折叠) 引用计数机制执行效率问题:变量值被关联次数的增加或减少,都会引发引用计数机制的执行,这存在明显的效率问题 如果说执行效率还仅仅是引用计数机制的一个软肋的话,那么很不幸,引用计数机制还存在着一个致命的弱点,即循环引用(也称交叉引用)。 ```python # 变量名l1指向列表1,变量名l2指向列表2,如下 >>> l1=['列表1中的第一个元素'] # 列表1被引用一次 >>> l2=['列表2中的第一个元素'] # 列表2被引用一次 >>> l1.append(l2) # 把列表2追加到l1中作为第二个元素,列表2的引用计数为2 >>> l2.append(l1) # 把列表1追加到l2中作为第二个元素,列表1的引用计数为2 # l1与l2 # l1 = ['列表1中的第一个元素',列表2的内存地址] # l2 = ['列表2中的第一个元素',列表1的内存地址] ``` 循环引用可以使一组对象的引用计数不为0,然而这些对象实际上并没有被任何外部对象所引用,它们之间只是相互引用。这意味着不会再有人使用这组对象,
应该回收这组对象所占用的内存空间,然后由于相互引用的存在,每一个对象的引用计数都不为0,因此这些对象所占用的内存永远不会被释放。比如: ```python >>> l1 ['列表1中的第一个元素', ['列表2中的第一个元素', [...]]] >>> l2 ['列表2中的第一个元素', ['列表1中的第一个元素', [...]]] >>> l1[1][1][0] '列表1中的第一个元素' ``` 如果我们执行del l1,列表1的引用计数=2-1,即列表1不会被回收,同理del l2,列表2的引用计数=2-1,此时无论列表1还是列表2都没有任何名字关联,但是引用计数均不为0,
所以循环引用是致命的,这与手动进行内存管理所产生的内存泄露毫无区别 要解决这个问题,Python引入了其他的垃圾收集机制来弥补引用计数的缺陷:1、“标记-清除” 2、“分代回收” ##### 标记-清除 容器对象(比如:list,set,dict,class,instance)都可以包含对其他对象的引用,所以都可能产生循环引用。而“标记-清除”计数就是为了解决循环引用的问题。 在了解标记清除算法前,我们需要明确一点,内存中有两块区域:堆区与栈区,在定义变量时,变量名存放于栈区,变量值存放于堆区,内存管理回收的则是堆区的内容,详解如下图 标记/清除算法的做法是当有效内存空间被耗尽的时候,就会停止整个程序,然后进行两项工作,第一项则是标记,第二项则是清除 标记:标记的过程其实就是,遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以作为GC Roots对象),然后将所有GC Roots的对象可以直接或间接访问到的对象标记为存活的对象。 清除:清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。 GC roots对象直接访问到的对象,插图如下 GC roots对象间接访问到的对象,插图如下 用图形解释,环引用的例子中的l1与l2,在什么时候启动标记清除,标记清除的整个过程,插图 #### 分代回收 背景: 基于引用计数的回收机制,每次回收内存,都需要把所有对象的引用计数都遍历一遍,这是非常消耗时间的,于是引入了分代回收来提高回收效率,采用“空间换时间的策略”。 什么是分代回收? 分代: 分代回收的核心思想是:在多次扫描的情况下,都没有被回收的变量,gc机制就会认为,该变量是常用变量,gc对其扫描的频率会降低,具体实现原理如下: 分代指的是根据存活时间来为变量划分不同等级(也就是不同的代) 新定义的变量,放到新生代这个等级中,假设每隔1分钟扫描新生代一次,如果发现变量依然被引用,那么该对象的权重(权重本质就是个整数)加一,
当变量的权重大于某个设定得值(假设为3),会将它移动到更高一级的青春代,青春代的gc扫描的频率低于新生代(扫描时间间隔更长),假设5分钟扫描青春代一次,
这样每次gc需要扫描的变量的总个数就变少了,节省了扫描的总时间,接下来,青春代中的对象,也会以同样的方式被移动到老年代中。也就是等级(代)越高,被垃圾回收机制扫描的频率越低 回收: 回收依然是使用引用计数作为回收的依据 画图: #### 缺点: 例如一个变量刚刚从新生代移入青春代,该变量的绑定关系就解除了,该变量应该被回收,青春代的扫描频率低于新生代,所以该变量的回收时间被延迟。

 

posted @ 2019-01-02 19:52  凌、云  阅读(171)  评论(0编辑  收藏  举报