手把手带你进行Golang环境配置

前言

大家好,我是星期八,是一个每天都要在镜子前给自己梳仅剩三根头发的三年码农

本次我们来安排一下如何在win平台上配置Go语言开发环境。

整体来说,Go配置环境还是挺轻松的,和Python差不多,并且会自动添加环境变量。

下载地址

Go官方镜像站点:

https://golang.google.cn/dl/

选择默认的最高版本就好,Go代码向下兼容版本之间的差异并无所谓

手把手带你进行Golang环境配置

安装

1、找到下载好的安装文件。

手把手带你进行Golang环境配置

2、双击进行安装

手把手带你进行Golang环境配置

3、选择同意

手把手带你进行Golang环境配置

4、自定义安装位置。

手把手带你进行Golang环境配置

5、点击install进行安装。

手把手带你进行Golang环境配置

6、安装进行中,等到安装完成。

手把手带你进行Golang环境配置

7、点击finish,安装完成。

手把手带你进行Golang环境配置

查看是否安装成功

上述安装过程没问题后,打开CMD窗口,输入go version命令,如图所示

手把手带你进行Golang环境配置

注:由于已经是1.11+版本,我们以后使用go mod进行管理依赖,不需要配置GOPATH等奇怪的东西。

配置GOPROXY(代理)

可能我们需要借用Go下载一些包什么的。

但是默认官网源,GOPROXY=https://proxy.golang.org,direct,在国内访问不到

输入go env查看Go配置

手把手带你进行Golang环境配置

需要修改成国内镜像站点,这里推荐:

https://goproxy.io

执行以下命令,进行修改

go env -w GOPROXY=https://goproxy.cn,direct

重新打开CMD,执行go env查看Go配置

手把手带你进行Golang环境配置

Go开发编辑器

Go现在的开发编辑器主要有VSCode,Goland两种。本次教程推荐的是Goland,和Pycharm同属一家公司。Goland的安装,破解,在此不做叙述。

为什么没选择VSCode

刚开始写Go时,其实我是用的也是VSCode,但是我在使用时发现,VSCode总是不自动提示,并且设置了自动保存也常常自动失效,经历了几次折腾之后,还是拥抱了专为Go开发的IDE,Goland!!!,真香。

结尾

我是码农星期八,本文到此就先告一段落咯,下篇正在筹备。如果你觉得文章还可以,记得点赞支持我们哈。感谢你的阅读~~

Mysql查询语句之连表查询和增删改查语句补充

前言

Hey,大家好,我是码农星期八!

上次怎么大概说了一下or,!=,in/not in between,like,limit,order by,group by。

但是还没完,咱们接着往下说!

查询

我们的数据是这样的。

Mysql查询语句之连表查询和增删改查语句补充

发现class_id是一个数字,这是因为我们在设计时,将学生表班级表分开设计的。

Mysql查询语句之连表查询和增删改查语句补充

但是如果我们偏偏想要查询这个人是几班的,怎么办?

连表查询

方式一,where连表

语法

SELECT * from1,表2 WHERE1.外键列=表2.被外键列;
SELECT1.1,表1.2,表2.1,... from1,表2 WHERE1.外键列=表2.被外键列;

连表显示所有列

SELECT * from student,class WHERE student.class_id=class.id;

执行结果

Mysql查询语句之连表查询和增删改查语句补充

喏,这样就知道哪个学生是哪个班的了!

连表显示指定列

SELECT student.id,student.`name`,class.title from student,class WHERE student.class_id=class.id;

执行结果

Mysql查询语句之连表查询和增删改查语句补充

方式二,left连表

通过where连表固然简单,但是缺点明显。

因为我们的where后面是要跟判断条件的,使用where进行连表会造成逻辑有些混乱

在一般连表操作中,使用的也是left进行连表。

语法

SELECT * from1 LEFT JOIN2 on1.外键字段=表2.被外键字段;
SELECT1.1,表1.2,表2.1,... from1 LEFT JOIN2 on1.外键字段=表2.被外键字段;

连表显示所有列

SELECT * from student LEFT JOIN class on student.class_id=class.id;

执行结果

Mysql查询语句之连表查询和增删改查语句补充

选择指定列查询

SELECT student.id,student.`name`,class.title from student LEFT JOIN class on student.class_id=class.id;

执行结果

Mysql查询语句之连表查询和增删改查语句补充

其实这和where连表是一样的。

方式三,inner连表

inner和left是差不多的,只不过left是正向连表,inner是反向连表。

就像学生表和课程表。

如果是通过学生表连课程表,属于正向,用left。

如果是通过课程表连学生表,就属于反向,用inner。

如果反向连表硬生生用left,会出现一些空值现象。

inner语法同left,只不过是表的前后顺序不一样。

其他操作

上述所有的操作,都属于查询操作,基本上入门是可以的,下面咱们来看一下剩下的增,删,改操作。

增(insert)

单条插入

语法

INSERT INTO 表(列名1,列名2,...) values(值1,值2,...);

添加一条学生信息

INSERT into student(name,age,gender,class_id) VALUES("吴彦祖",22,"男",1);

执行结果

Mysql查询语句之连表查询和增删改查语句补充

表内容

Mysql查询语句之连表查询和增删改查语句补充

多条插入

语法

INSERT INTO 表(列名1,列名2,...) values(值1,值2,...),(值1,值2,...);

批量添加学生信息

INSERT INTO student (NAME, age, gender, class_id)
VALUES
    ("范冰冰", 18, "女", 2),
    ("成龙", 24, "男", 3);

执行结果

Mysql查询语句之连表查询和增删改查语句补充

表内容

Mysql查询语句之连表查询和增删改查语句补充

改(update)

语法

UPDATE <表> set 列 = 值 where <条件>;

将李四的年龄修改成88岁

UPDATE student set age = 88 where name = "张三"

执行结果

Mysql查询语句之连表查询和增删改查语句补充

删除(delete)

语法

delete from <表名>
delete from <表名> where <条件>

删除张三

DELETE from student where name="张三"

执行结果

Mysql查询语句之连表查询和增删改查语句补充

总结

这章有点像收尾部分,补充了连表查询,后续又补充了Mysql的增删改查。

连表查询要区分一下left和inner的区别,一个是正向连,一个是反向连。

插入数据可以插入单条数据和多条数据,多跟参数即可。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

越努力,越幸运。

我是码农星期八,如果觉得还不错,记得动手点赞一下哈。

感谢你的观看。

手把手教你进行Mysql查询操作

大家好,我是IT共享者,人称皮皮。今天给大家讲讲MySQL中的查询操作。

前言

我们在以前,大概学了一下如何通过命令创建数据库,创建表等基本操作。

但是实际上啊,至少在我的实际工作中,用到的不是太多,了解就可以。

因为我们可以通过一些可视化软件,像Navicat for MySQL等。

可以很方便的帮助我们创建数据库,创建表,修改表等操作。

Navicat for MySQL简单示例

创建数据库

使用Navicat for MySQL连接好一个Mysql服务之后。

  1. 右击–> 新建数据库

  1. 选择新建数据库信息字符集一定要选择utf8mb4 — UTF-8 Unicode,这个表示支持存储Emoji表情。排序规则一定要选择utf8mb4_general_ci。至于为什么,我也不知道…,原谅我是个码农吧。

就这样,一个数据库创建完成了,是不是很轻松。

创建表

  1. 右击表–> 新建表

  1. 制定表结构
  2. 保存表(Ctrl+s)

设计表

在实际中,我们常常会更改表结构,也叫设计表

  1. 右击表–>设计表
  2. 修改表

3.保存即修改

查询

上述主要复现了一下如何通过可视化软件操作数据库,确实会比直接命令方便很多很多。

但是查询这个操作,那可视化软件就真的无能为力了。

毕竟我们不管是封装在后台还是自己的软件中。

都是要使用原生SQL的,这个是无法避免的,并且原生SQL查询是最灵活的!!!

终于迎来了最最最重要的环节,学习原生sql。

需求分析

假设我们现在要做一个学生管理系统,所以首先确定,会有一个学生表,用于存放学生的信息,像姓名了,年龄了,性别了,等。

然后想了又想,学生肯定要属于哪个班级的,张三是一班的,李四是二班的,等。

所以我们可能就会有两张表了,一个是学生信息表,一个是班级表,然后学生属于哪个班级。

就像小时候戴的学生胸牌一样,姓名:xxx,班级:xxx等。

想了想,我觉得表结构大概如下

表结构图

表结构图.xlsx

表结构代码

school_test.sql

应该通过这两张表,基本可以把我们的sql语法,学的差不多,一起来看看叭。

查询(select)

既然表里面有这么多数据,那就需要查询了,首先是。

查询所有

sql

-- 语法
SELECT * from <表名>;
-- 例如,查询学生表
SELECT * from student;

执行结果

where条件查询

但是有时候,我们可能需要查询带有一些条件的,比如id=1的,或者name=张三的等。

这时候就需要用到where。

sql

-- 语法
SELECT * from <表名> where <条件>;
-- 例如,查询id=1的数据
SELECT * from student where id=1;

执行结果

这样,我们就把id=1的数据查找出来了。

同理,还可以写其他条件。

查询性别为男的(gender=男)

SELECT * from student where gender="男";

执行结果

这样,就把gender=男的都查出来了。

where多个条件查询(and)

假设现在表内容如下。

有俩琪琪,一个是男琪琪,一个是女琪琪,那我们查的时候,肯定要区分是男的还是女的琪琪了。

所以这时候需要where多个条件了。

and的意思是查询满足所有条件的数据。

sql

-- 语法
SELECT * from student where <条件> and <条件> ...;
-- 例如,查询男琪琪
SELECT * from student where name="琪琪" and gender="男";

执行结果

这样,通过多个条件就卡住了更精准的数据。

select 选择列

在上面使用时,我们使用的都是select * from <表名>。

假设我们的数据如下

select *就表示,选择所有列

结果如下

如果是select id,name age,表示选择指定列

结果如下

select还能给列起别名

例如

SELECT id,name as "姓名",age from student;

执行结果

总结

本章主要讲述了如何使用Navicat for MySQL新建数据库,新建表,设计表等简单操作。

后续又根据实际需求设计出简单的学生表班级表,并且简单是使用了select查询。

后来又讲解select *和select 列1,列2的区别。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

敬往事一杯酒,自此不再回头。

我是码农星期八,如果觉得还不错,记得动手点赞一下哈。感谢你的观看。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

手把手教你利用JavaScript 获取任意网站图片链接

前言

大家好,我是IT共享者,人称皮皮。

妹纸图这个网站想必大家都非常熟悉了,老司机的天堂。小编第一次进表示身体逐渐变得空虚,表示一定要克制自己,远离这种正能量的网站。话不多说,今天带大家获取妹纸图上的图片链接。然后大家都懂得。

一、项目准备

360浏览器,仅此而已

二、项目目的

获取页面所有美女图片

三、项目步骤

1.打开浏览器,搜索图片,我们以美女图片为例:

画面太美,不忍直视。

2.打开浏览器控制台

F12,即可打开浏览器控制台,我们今天要做的是获取所有的图片链接,顺便查看下图片。如下图:

今天我们就是要在这里面获取到所有的图片链接,相信没接触过前端的人肯定对此一无所知,但是小编接下来讲过了之后你还是一无所知,那就是你的不对了。

3.控制台功能大揭秘

大家可能觉得这个地方没啥用处,啥都没有,还不如Element Network用处大;诚然前两者的确用处很大,可以用来分析网页结构和网页请求,但是我想说的是控制台的功能你永远不要小瞧了,因为它可以使你在开发过程中能快速的见到效果图,比如,你写个代码,但是你想看看它现在能否运行,一般的做法就是写个HTML+CSS然后将JavaScript嵌入到里面去,这样做显然太麻烦,而且你修改后还得在刷新才能浏览器中运行看到效果,到最后就是浏览器和编辑器频繁切换,影响开发速度和效率甚至占用多余的系统资源。于是,控制台应运而生,它使得我们可以轻松的使用JavaScript代码而无需再搭配HTML和CSS才能运行,一个Console统统搞定,这就是我们刚刚说的控制台。我们可以先来看看它的功能:

可以看到,它是有自动提示功能的,而且比任何三方IDE的都要全面,因为它是和浏览器配套使用的,而其它IDE则无法做到这么齐全,所以你可以看到有时候如果你想用某种方法它不会提示,那就只有一个原因,就是你用错了。

1).改变它的编辑状态

控制台输入:

![4](4.jpgdocument.body.contentEditable=true

在编辑状态下,我们的点击操作是没有任何作用的,也就是说只能修改,如果想还原,刷新一下浏览器即可。

2).定位特定元素

这里我们可以先看看我们要看的浏览器图片元素的信息,可以先打印出所有的图片 ,这里使用一个特殊符号:

我们可以看到,通过这个语法糖可以打印当前页面所有的图片信息,显示70,说明这个页面有70张图片,当小编再次滚动鼠标时发现图片数量就变多了,变成了136张图片,这说明它是Ajax加载的。

除了这种获取图片的方式外,还可以这样:

document.images

得到的结果和上面的一模一样,有了这几样的知识点积累,我们现在就可以轻松获取所有的图片链接了。

4.获取图片链接和图片名

这里我们要把获取到的图片添加到数组中,然后在遍历即可打印出所有的图片。

1).建立数组存放所有的图片

ab=document.images #获取当前页面所有图片
var aa=[]           #建立数组
for(const y of ab){    #建立const变量使得无法修改
    aa.push(y); #把图片装进数组
}

2).遍历数组打印图片链接

这里可以使用多种方法,小编一 一介绍。

1)).For …in

for(const a in aa){
    console.log(aa[a])
}

2)).For…of

for(const a of aa){
    console.log(a)
}

3)).ForEach

aa.forEach(function(val,item,array){
  console.log(val)
});

4)).Map

![10](10.jpgaa.map(function(val,item,array){
  console.log(val)
});

可以看到第四种方法和第三种方法差不多,但是它们还是有差别的,前者是没有返回值的,而后者有并且后者支持修改返回值。虽然我们打印出了图片链接,但是图片名字并没有打印出来,于是小编开始找图片名字:

发现它在Div标签里,于是小编开始找满足条件的Div:

document.querySelectorAll('div.img_tit')#精确找到所有类名为img_tit的Div
document.getElementsByClassName('img_tit')#找到所有类名为img_tit

然后我们先输出图片名再输出图片链接,这样就可以使用循环然后进行判断,如下图:

var a=0;
do{
  a++;
  if(a%2==0){
    console.log(aa[a])
}
    else{
    console.log(ac[a])
  }


}
while(a<ac.length)

可以看到按照顺序打印出了。另外,我们发现当我们打印出了这些结果值后感觉控制台都已经爆满了,我们想清空这些信息那该怎么办了?一行代码就能搞定啦。

当然,这项功能你可别指望它能在你控制台相当干净的时候起作用。看了这么多了我们再来看看图片的查看功能吧。

5.图片查看

希望上面的方法应该不会让读者眼花缭乱才是,因为Js是一门动态语言,所以它的骚操作实在是太多了,你懂的。言归正传,如果我们现在想快速查看某一张图片,那么怎么办呢?有人说单击它,我想告诉你的是,虽然这可以实现查看功能,但这是在被包裹的网页中查看,如果我们在单独的网页中查看了,比如说这样:

那我们要想只看这一张图片而不看其它的内容了,那又该怎么办了?最传统的方法:

点击红色箭头处,可以看到如下图:

感觉是不是就好多了,没有其它的东西干扰我们,专心致志的看图,多爽。但是我们开发者可不能这么做,因为太没技术含量了,我们要时时刻刻挑战自己;所以我决定用JS代码来查看这张图片。

我们可以先看看这个,代码如下:

function view(src,filename) {
                var link = document.createElement('a');#创建a标签
                link.setAttribute("download", filename);#设置download属性
                link.href = src;#设置href属性
                document.body.appendChild(link);#将a标签添加到网页主体中
                link.click();
                document.body.removeChild(link);#删除a标签
            }
view('https://p0.ssl.qhimgs1.com/bdr/326__/t0160c8456511be3c4e.jpg','t0160c8456511be3c4e.jpg')

可以看到我们成功在浏览器中查看了这张图片。

四、总结

突然发现小编还是比较有才的,这都能被小编捕捉到,不过还是不能太得意,以免翻车。另外,如果大家想在自家服务器上添加图片下载功能,超简单的,一行代码搞定。

<a href="http://localhost:8080/12.jpg" download="12.jpg">点我下载</a>

这样就能生成一个下载图片的点击链接了。

一篇文章帮助你理解跑马灯的滚动原理

走马灯效果其实就是利用<marquee>标签进行图片和文字滚动,设置的样式不一样,滚动的效果就不一样,实现“走马观花”的效果。

一、滚动方式

1. 普通滚动

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>


    </body>
  <marquee>这里是您要填的内容</marquee>
</html>
一篇文章帮助你理解跑马灯的滚动原理

1.1 文字碰到左边就会停止

<marquee behavior="slide">这里是您要填的内容</marquee>
一篇文章帮助你理解跑马灯的滚动原理

1.2 文字碰到右边就会停止

<marquee behavior=”slide” direction=”right”>这里是您要填的内容</marquee>

一篇文章帮助你理解跑马灯的滚动原理

2.图片滚动

2.1 预设滚动

图片滚动到右边界,自动再从左边滚动。

<marquee behavior="scroll"><img src="img/border.png"></marquee>
一篇文章帮助你理解跑马灯的滚动原理

2.2 来回滚动

<marquee behavior="alternate"><img src="img/border.png"></marquee>
一篇文章帮助你理解跑马灯的滚动原理

2.3 滚动的方向

向左滚动

<marquee direction="left"><img src="img/border.png"></marquee>

向右滚动

<marquee direction="right"><img src="img/border.png"></marquee>

向下滚动

<marquee direction="down"><img src="img/border.png"></marquee>

向上滚动

<marquee direction="up"><img src="img/border.png"></marquee>
一篇文章帮助你理解跑马灯的滚动原理

二、参数

1. 设定滚动次数(可自行更改参数)

<marquee loop="2">这里是您要填的内容</marquee>

2. 设定背景颜色 (16进位颜色或文字输入)

<marquee bgcolor="#??????">这里是您要填的内容</marquee>

3. 设定滚动宽度

为了方便辨别,这里加上bgcolor属性。

<!doctype html>
<html lang="en">


    <head>
        <meta charset="UTF-8">
        <title>Document</title>


        <body>
        <div >
            <p>初始化</p>
            <marquee bgcolor="red"; >这里是您要填的内容</marquee>
        </div>
        <div>
            <p>设置高度</p>
            <marquee bgcolor="aqua";width="380">这里是您要填的内容</marquee>
        </div>


</body>
</html>
一篇文章帮助你理解跑马灯的滚动原理

4. 设定滚动高度

<!doctype html>
<html lang="en">


    <head>
        <meta charset="UTF-8">
        <title>Document</title>


        <body>
        <div >
            <p>初始化</p>
            <marquee bgcolor="red"; >这里是您要填的内容</marquee>
        </div>
        <div>
            <p>设置高度</p>
            <marquee bgcolor="aqua"; height="38">这里是您要填的内容</marquee>
        </div>


</body>
</html>
一篇文章帮助你理解跑马灯的滚动原理

5. 设定滚动速度 (可自行更改参数)

<marquee scrollamount="30">这里是您要填的内容</marquee>
一篇文章帮助你理解跑马灯的滚动原理

三、总结

本文以html为基础,主要介绍了常见的效果(跑马灯)的滚动原理,详细介绍了三种常见的滚动以及其相关属性,以及对设置参数时遇到的难题一一解答,希望能够帮助你学习。

如何来理解Python中的字典数据类型

大家好,我是IT共享者,人称皮皮。今天给大家讲解下Python中的字典数据类型。

一、前言

字典是Python中的数据类型,可让将数据存储在键/值对中。

二、什么是字典理解?

字典理解是创建字典的一种优雅简洁的方法。

字典理解优化

使用字典理解优化函数。

例:

# 字典理解例:
square_dict = {num: num*num for num in range(1, 11)}
print(square_dict)

运行结果:

注·:

创建了square_dict带有数字平方键/值对的字典。但是,使用字典理解可以使在一行中创建字典。

三、使用字典理解

字典理解的最小语法为:

dictionary = {key: value for vars in iterable}

1. 图解析语法

让将此语法与上例中的字典理解进行比较。

2. 案例

如何使用字典理解

例:

#item price in dollars
old_price = {'milk': 1.02, 'coffee': 2.5, 'bread': 2.5}


dollar_to_pound = 0.76
new_price = {item: value*dollar_to_pound for (item, value) in old_price.items()}
print(new_price)

输出结果

注:

可以看到以美元为单位检索商品价格并将其转换为英镑。使用字典理解使此任务更加简单和短。

四、字典理解中的条件

可以通过添加条件来进一步自定义字典理解。让来看一个实例。

案例

1. 如果条件字典理解

例:

original_dict = {'jack': 38, 'michael': 48, 'guido': 57, 'john': 33}


even_dict = {k: v for (k, v) in original_dict.items() if v % 2 == 0}
print(even_dict)

输出结果

可以看到,由于if字典理解中的子句,仅添加了具有偶数值的项目。

2. 多重if条件字典理解

例:

original_dict = {'jack': 38, 'michael': 48, 'guido': 57, 'john': 33}


new_dict = {k: v for (k, v) in original_dict.items() if v % 2 != 0 if v < 40}
print(new_dict)

输出结果

在这种情况下,仅奇数值小于40的项目已添加到新字典中。

这是因为if字典理解中有多个子句。等效于and必须同时满足两个条件的操作。

3. if-else条件字典理解

例:

original_dict = {'jack': 38, 'michael': 48, 'guido': 57, 'john': 33}


new_dict_1 = {k: ('old' if v > 40 else 'young')
    for (k, v) in original_dict.items()}
print(new_dict_1)

输出结果

在这种情况下,将通过子典理解来创建新字典。

价值大于等于40的商品的值为“old”,而其他商品的值为“young”。

五、嵌套字典理解

可以将字典理解本身添加到字典理解中以创建嵌套字典。

案例

具有两个字典理解的嵌套字典

例:

dictionary = {
    k1: {k2: k1 * k2 for k2 in range(1, 6)} for k1 in range(2, 5)
}
print(dictionary)

输出结果

注:

在嵌套字典中构造了一个乘法表,用于2到4的数字。每当使用嵌套字典理解时,Python都会首先从外部循环开始,然后再进入内部循环。

六、使用字典理解的优势

如所见,字典理解大大缩短了字典初始化的过程。

它使代码更具pythonic风格,在的代码中使用字典理解可以缩短代码行,同时保持逻辑完整。

七、总结

本文基于Python基础,介绍了如何使用字典。通过分类对每一模块,进行详细的讲解。使用图解析语法,实例代码演示,运行效果图的展示,能够帮读者更好的理解。

在实际案例中遇到的问题,提供了一些有效的解决方案。使用Python语言,能够更直观的,加深读者对内容的理解。

代码很简单,希望能够帮助你更好的学习。

一篇文章带你了解HTML的网页布局结构

大家好,我是IT共享者,人称皮皮。这篇我们来讲讲CSS网页布局。

一、网页布局

网页布局有很多种方式,一般分为以下几个部分:头部区域、菜单导航区域、内容区域、底部区域


1. 头部区域

头部区域位于整个网页的顶部,一般用于设置网页的标题或者网页的 logo:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS 项目(runoob.com)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body {
  margin: 0;
}


/* 头部样式 */
.header {
  background-color: #f1f1f1;
  padding: 20px;
  text-align: center;
}
</style>
</head>
<body>


<div class="header">
  <h1>头部区域</h1>
</div>


</body>
</html>


2. 菜单导航区域

菜单导航条包含了一些链接,可以引导用户浏览其他页面:

/* 导航条 */
.topnav {
  overflow: hidden;
  background-color: #333;
}
 
/* 导航链接 */
.topnav a {
  float: left;
  display: block;
  color: #f2f2f2;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
}
 
/* 链接 - 修改颜色 */
.topnav a:hover {
  background-color: #ddd;
  color: black;
}

3. 内容区域

内容区域一般有三种形式:

  • 1 列:一般用于移动端。
  • 2 列:一般用于平板设备。
  • 3 列:一般用于 PC 桌面设备。

不相等的列

不相等的列一般是在中间部分设置内容区域,这块也是最大最主要的,左右两次侧可以作为一些导航等相关内容,这三列加起来的宽度是 100%。

例:

.column {
  float: left;
}
 
/* 左右侧栏的宽度 */
.column.side {
  width: 25%;
}
 
/* 中间列宽度 */
.column.middle {
  width: 50%;
}
 
/* 响应式布局 - 宽度小于600px时设置上下布局 */
@media screen and (max-width: 600px) {
  .column.side, .column.middle {
    width: 100%;
  }
}

4. 底部区域

底部区域在网页的最下方,一般包含版权信息和联系方式等。

.footer {
  background-color: #F1F1F1;
  text-align: center;
  padding: 10px;
}

二、响应式网页布局

通过以上等学习我们来创建一个响应式等页面,页面的布局会根据屏幕的大小来调整:

案例

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>项目</title>
<style>
* {
  box-sizing: border-box;
}
 
body {
  font-family: Arial;
  padding: 10px;
  background: #f1f1f1;
}
 
/* 头部标题 */
.header {
  padding: 30px;
  text-align: center;
  background: white;
}
 
.header h1 {
  font-size: 50px;
}
 
/* 导航条 */
.topnav {
  overflow: hidden;
  background-color: #333;
}
 
/* 导航条链接 */
.topnav a {
  float: left;
  display: block;
  color: #f2f2f2;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
}
 
/* 链接颜色修改 */
.topnav a:hover {
  background-color: #ddd;
  color: black;
}
 
/* 创建两列 */
/* Left column */
.leftcolumn {   
  float: left;
  width: 75%;
}
 
/* 右侧栏 */
.rightcolumn {
  float: left;
  width: 25%;
  background-color: #f1f1f1;
  padding-left: 20px;
}
 
/* 图像部分 */
.fakeimg {
  background-color: #aaa;
  width: 100%;
  padding: 20px;
}
 
/* 文章卡片效果 */
.card {
  background-color: white;
  padding: 20px;
  margin-top: 20px;
}
 
/* 列后面清除浮动 */
.row:after {
  content: "";
  display: table;
  clear: both;
}
 
/* 底部 */
.footer {
  padding: 20px;
  text-align: center;
  background: #ddd;
  margin-top: 20px;
}
 
/* 响应式布局 - 屏幕尺寸小于 800px 时,两列布局改为上下布局 */
@media screen and (max-width: 800px) {
  .leftcolumn, .rightcolumn {   
    width: 100%;
    padding: 0;
  }
}
 
/* 响应式布局 -屏幕尺寸小于 400px 时,导航等布局改为上下布局 */
@media screen and (max-width: 400px) {
  .topnav a {
    float: none;
    width: 100%;
  }
}
</style>
</head>
<body>


<div class="header">
  <h1>我的网页</h1>
  <p>重置浏览器大小查看效果。</p>
</div>


<div class="topnav">
  <a href="#">链接</a>
  <a href="#">链接</a>
  <a href="#">链接</a>
  <a href="#" style="float:right">链接</a>
</div>


<div class="row">
  <div class="leftcolumn">
    <div class="card">
      <h2>文章标题</h2>
      <h5>xx 年xx月 xx日</h5>
      <div class="fakeimg" style="height:200px;"><img src="img/bird.png"></div>
      <p>文本...</p>
      <p>当热诚变成习惯,恐惧和忧虑即无处容身。缺乏热诚的人也没有明确的目标。热诚使想象的轮子转动。一个人缺乏热诚就象汽车没有汽油。
      善于安排玩乐和工作,两者保持热诚,就是最快乐的人。热诚使平凡的话题变得生动。!</p>
    </div>
    <div class="card">
      <h2>文章标题</h2>
      <h5>xx 年 xx 月xx日</h5>
      <div class="fakeimg" style="height:200px;"><img src="img/border.png"></div>
      <p>文本...</p>
      <p>一切事无法追求完美,唯有追求尽力而为。这样心无压力,出来的结果反而会更好!</p>
    </div>
  </div>
  <div class="rightcolumn">
    <div class="card">
      <h2>关于我</h2>
      <div class="fakeimg" style="height:100px;"></div>
      <p>6666</p>
    </div>
    <div class="card">
      <h3>热门文章</h3>
      <div class="fakeimg"><img src="img/fy2_wp.png">\</div>
    
    </div>
    <div class="card">
      <h3>关注我</h3>
      <p>本站发布的系统与软件仅为个人学习测试使用,请在下载后24小时内删除,
      不得用于任何商业用途,否则后果自负,请支持购买正版软件!如侵犯到您的权益,请及时通知我们,我们会及时处理。


声明:为非赢利性网站 不接受任何赞助和广告。</p>
    </div>
  </div>
</div>


<div class="footer">
  <h2>底部区域</h2>
</div>


</body>
</html>

三、总结

本文主要介绍了Html的网页布局结构,如何去了解网络的布局,介绍了常见的移动设备的三种网页模式,最后通过一个小项目,总结之前讲解的内容。

代码很简单,希望可以帮助你学习。

厉害了,Python也能操作注册表

前言

大家好,我是IT共享者,人称皮皮。

注册表这个东西大家可能都不是很熟悉,因为我们平时用到的少;但是它是Windows的核心,很多软件的启动和日志记录什么的都包含在里面,可以说它是一个大型的数据库也不为过,今天我们就来看看Python是如何操作注册表的吧。

一、注册表初次见面

进入系统注册表的方法多种多样,最常见的就是运行窗口输入命令“regedit”,即可进入注册表:

注册表中的几个菜单分别对应机器的根目录登陆的用户信息和本地机器信息以及用户信息和本地配置信息等。

二、认识操作注册表的模块

在Python中就有这么一个神奇的模块,它可以用来操作注册表。它就是—–“winreg”,一个Python自带的操作注册表的模块。

三、导入

import winreg

1.常量

”winreg“总有很多有用的方法,基本上就是操作注册表中的键值,我们挑几个重要的来说说。首先我们来了解下”winreg“中的各个常量:

1).HKEY_ 常量

winreg.HKEY_CLASSES_ROOT     #存储应用和shell的信息
winreg.HKEY_CURRENT_USER     #当前用户自定义的信息
winreg.HKEY_LOCAL_MACHINE    #计算机系统所有的信息
winreg.HKEY_USERS            #所有用户信息
winreg.HKEY_PERFORMANCE_DATA #性能数据
winreg.HKEY_CURRENT_CONFIG   #本地计算机系统的硬件配置文件
winreg.HKEY_DYN_DATA         #windows98后的版本无法使用

2).访问权限

winreg.KEY_ALL_ACCESS           #所有权限
winreg.KEY_WRITE                #可写
winreg.KEY_READ                 #可读
winreg.KEY_EXECUTE              #可执行相当于KEY_READ
winreg.KEY_QUERY_VALUE          #查询注册表键值
winreg.KEY_SET_VALUE            #创建、删除或设置一组注册表值
winreg.KEY_CREATE_SUB_KEY       #创建一个注册表子项的注册表键
winreg.KEY_ENUMERATE_SUB_KEYS   #枚举注册表子项所需的注册表键
winreg.KEY_NOTIFY               #修改注册表键时的提示
winreg.KEY_CREATE_LINK          #创建一个链接,预留给系统用

3).64位的具体应用

winreg.KEY_WOW64_64KEY  #在64位Windows应用程序应该运行在64位注册表视图
winreg.KEY_WOW64_32KEY  #在64位Windows应用程序应该运行在32位注册表视图

4).值类型

winreg.REG_BINARY                  #任何形式的二进制数据
winreg.REG_DWORD                   #32位的数
winreg.REG_DWORD_LITTLE_ENDIAN     #32位的数字在低位优先的格式,相当于REG_DWORD
winreg.REG_DWORD_BIG_ENDIAN        #32位的数字在高位优先的格式
winreg.REG_EXPAND_SZ               #以null结尾的字符串包含环境变量的引用(% %)
winreg.REG_LINK                    #Unicode符号链接
winreg.REG_MULTI_SZ                #一个以null结尾的字符串序列,由两个空字符结束
winreg.REG_NONE                    #没有定义的值类型
winreg.REG_QWORD                   #64位的数
winreg.REG_QWORD_LITTLE_ENDIAN         #在低位优先一个64位的数字格式,相当于REG_QWORD
winreg.REG_RESOURCE_LIST               #设备驱动器资源列表
winreg.REG_FULL_RESOURCE_DESCRIPTOR    #硬件设置
winreg.REG_RESOURCE_REQUIREMENTS_LIST  #硬件资源列表
winreg.REG_SZ                          #一个以null结尾的字符串

四、注册表相关操作

1.连接远程计算机注册表

reg=winreg.ConnectRegistry('\\计算机名',winreg.HKEY_LOCAL_MACHINE)#返回值是所开打键的句柄
#第一个参数是指远程计算机名,第二个参数是指注册表中的键,如HKEY_LOCAL_MACHINE,它是winreg中的常量。

不过我们在这里要注意的是,如果远程注册表没有系统管理员权限,是无法正常访问注册表的。所以我们先要判断下它的访问权限。这里就要用到我们之前讲的”ctypes”模块中的判断用户是否是管理员用户的方法了。

import ctypes
import sys
def admin():
    aa=ctypes.windll.shell32.IsUserAnAdmin()
    return aa


if admin()==1: #有管理员权限可打开远程注册表
    winreg.ConnectRegistry('\\计算机名',winreg.HKEY_LOCAL_MACHINE)
else:
    if sys.version_info[0]==3: #python版本是3以上的版本
        ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
    else: #python2 版本
        ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(__file__), None, 1)

2.关闭连接注册表

连接之后我们不想用了,就要随手把它给关闭了,也很简单,只要拿到打开注册表的句柄,就可以关闭了。

winreg.CloseKey(reg)

可以看到句柄的值不一样。

其实还有一种方法,就是利用注册处理对象的方法来关闭。

reg.Close()

注册对象还支持上下文和分离处理对象周期:

reg.detach() #返回一个整数,记录当前对象的生命周期,如果关闭注册句柄对象,那么则为0

3.打开注册表键

#打开指定的键,返回一个处理对象
winreg.OpenKey(key, sub_key, reserved=0, access=winreg.KEY_READ)
winreg.OpenKeyEx(key, sub_key, reserved=0, access=winreg.KEY_READ)
#key:HKEY_ 常量
#sub_key:指定键的子键
#reserved:一个保留的证书,必须是零。默认值为零
#access:访问权限

4.创建新的注册表键

winreg.CreateKey(key,sub_key)
winreg.CreateKeyEx(key,sub_key,reserved=0,access=winreg.KEY_WRITE)
#key:HKEY_ 常量
#sub_key:指定键的子键
#reserved:一个保留的证书,必须是零。默认值为零
#access:访问权限

5.删除注册表中指定的键

winreg.DeleteKey( key,sub_key) #不能删除带有子项的键
winreg.DeleteKeyEx(key,sub_key,reserved=0,access=winreg.KEY_WOW64_64KEY)#不能删除带有子项的键
winreg.DeleteValue(key, value)#从某个注册键中删除一个命名值项
#用法与上面相同,只是结果是删除罢了

可以看到”cnm“已经被删除了。如果键不存在,删除会报错。

6.枚举注册表键

winreg.EnumKey(key,index) #枚举打开的注册表键的子键,并返回一个字符串
winreg.EnumValue(key,index)#枚举打开的注册表键值,并返回一个元组
#index:一个整数,用于标识所获取键的索引

7.刷新注册表键

winreg.FlushKey(key)  #同步某个键的所有属性写入注册表

8.读取注册表

winreg.LoadKey(key,sub_key,file_name)
#file_name:读取注册表的数据的文件名

9.查找注册表键

winreg.QueryInfoKey(key) #返回一个3元素元组的键的信息
winreg.QueryValue(key,sub_key) #用一个字符串来检索一个键的值
winreg.QueryValueEx(key,value_name) #检索与开放权限的注册表键相关联的指定值的数据类型和名称

10.保存注册表键

winreg.SaveKey(key, file_name) #保存指定的键和所有指定文件的注册表子项

11.启用禁用注册表

winreg.DisableReflectionKey(key) #禁用
winreg.EnableReflectionKey(key)  #启用

12.反射状态是否禁用

winreg.QueryReflectionKey(key) #结果为True 则表示禁用

13.在指定键上关联值

winreg.SetValue(key, sub_key, type, value) #添加键和值
winreg.SetValueEx(key,value_name,reserved,type,value)#将数据存储在一个开放的注册表键值字段
#value_name:该字符串名称的注册表子键
#type:值类型
#value:子键的键值

可以看出它们的区别,而且前者值类型只能指定为“winreg.REG_SZ”,而后者什么类型都可以。

14.寻找应用程序的位置并打开

前面我们介绍了”winreg”几乎所有的方法,现在我们就来具体做一个应用练练手,就拿我们的360安全卫士为例,我们尝试着通过注册表先找到它的位置然后打开它。那么接下来小编开始表演了:

1).定位360安全卫士的注册表项:

1)).打开系统注册表编辑器,然后进行搜索关键字:

2)).定位到注册表路径

2).打开注册表键

通过我们找到的子键然后对其进行查找操作,得到处理对象的句柄“reg”

reg=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\360安全卫士")

3).找到应用的绝对路径并打印

通过数值名称找到数值数据,

path=winreg.QueryValueEx(reg,'DisplayIcon')

这样就找到了这个应用的绝对路径了,返回值是一个元祖,我们使用索引访问:

path[0]

可以看到我们已经成功打印出了我们要找的应用程序的绝对路径了,接下来就可以愉快的打开它了。打开的方法多种多样,什么“os”,“subprocess”,”ctypes”,”pywin32″,一大堆的方法,不过小编还是觉得“os”最方便。

os.popen(path[0])

最后别忘了关闭对象处理句柄哦。

#两种方法都可以关闭
winreg.CloseKey(reg)
reg.Close()

四、总结

利用”winreg“可以完成很多骚操作,你也可以通过注册表设置系统开机启动项以及其它操作,如果你想往黑客方面发展的话。

一篇文章带你了解CSS 文本样式

大家好,我是IT共享者,人称皮皮。这篇文章我们来讲讲CSS的文本样式。

一、文本颜色Color

颜色属性被用来设置文字的颜色。

颜色是通过CSS最经常的指定:

  • 十六进制值 – 如”#FF0000″。
  • 一个RGB值 – “RGB(255,0,0)”。
  • 颜色的名称 – 如”红”。

一个网页的文本颜色是指在主体内的选择:

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=640, user-scalable=no">
        <title>项目</title>
        <style>
            body {
                color: blue;
            }


            h1 {
                color: #00ff00;
            }


            h2 {
                color: rgb(255, 0, 0);
            }
</style>
    </head>


    <body>
        <h2>hello world</h2>
        <h1>welcome to CaoZhou</h1>
    </body>


</html>

注:对于W3C标准的CSS:如果你定义了颜色属性,你还必须定义背景色属性。

二、属性

1. text-align 文本的对齐方式

文本排列属性是用来设置文本的水平对齐方式。

文本可居中或对齐到左或右,两端对齐。

当text-align设置为”justify”,每一行被展开为宽度相等,左,右外边距是对齐(如杂志和报纸)。

<!doctype html>
<html lang="en">


    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            h1 {
                text-align: center;
            }


            p.date {
                text-align: right;
            }


            p.main {
                text-align: justify;
            }
</style>
    </head>


    <body>


        <p class="date">2015 年 3 月 14 号</p>
        <p class="main"> 从前有个书生,和未婚妻约好在某年某月某日结婚。到那一天,未婚妻却嫁给了别人。书生受此打击, 一病不起。  这时,路过一游方僧人,从怀里摸出一面镜子叫书生看。书生看到茫茫大海,一名遇害的女子一丝不挂地躺在海滩上。路过一人, 看一眼,摇摇头,走了。又路过一人,将衣服脱下,给女尸盖上,走了。再路过一人,过去,挖个坑,小心翼翼把尸体掩埋了。  僧人解释道, 那具海滩上的女尸,就是你未婚妻的前世。你是第二个路过的人,曾给过他一件衣服。她今生和你相恋,只为还你一个情。但是她最终要报答一生一世的人,是最后那个把她掩埋的人,那人就是他现在的丈夫。书生大悟,病愈。


        </p>
        <p><b>注意:</b> 重置浏览器窗口大小查看 "justify" 是如何工作的。</p>
    </body>


</html>

2. text-decoration文本修饰

text-decoration 属性用来设置或删除文本的装饰。

从设计的角度看 text-decoration属性主要是用来删除链接的下划线:

<!doctype html>
<html lang="en">


    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            .none {}


            .del {
                text-decoration: none;
            }
</style>
    </head>


    <body>
        <p>原来的样子</p>
        <a href="#" class="none">wwwwwwwwwwwwwwwwww</a>
        <p>去掉下划线</p>
        <a href="#" class="del">wwwwwwwwwwwwwwwwwwwww</a>
    </body>


</html>

也可以这样装饰文字:

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=640, user-scalable=no">
        <title>项目</title>
        <style>
            h1 {
                text-decoration: overline;
            }


            h2 {
                text-decoration: line-through;
            }


            h3 {
                text-decoration: underline;
            }
</style>
    </head>


    <body>
        <h1>This is heading 1</h1>
        <h2>This is heading 2</h2>
        <h3>This is heading 3</h3>
    </body>


</html>

注:不建议强调指出不是链接的文本,因为这常常混淆用户。

3. text-transform文本转换

text-transform文本转换属性是用来指定在一个文本中的大写和小写字母。

  • uppercase:转换为全部大写。
  • lowercase:转换为全部小写。
  • capitalize :每个单词的首字母大写。
<!DOCTYPE html>
<html>


    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=640, user-scalable=no">
        <title>项目</title>
        <style>
            p.uppercase {
                text-transform: uppercase;
            }


            p.lowercase {
                text-transform: lowercase;
            }


            p.capitalize {
                text-transform: capitalize;
            }
</style>
    </head>


    <body>
        <p class="uppercase">This is some text.</p>
        <p class="lowercase">This is some text.</p>
        <p class="capitalize">This is some text.</p>
    </body>


</html>

4. text-indent文本缩进

text-indent文本缩进属性是用来指定文本的第一行的缩进。

p {text-indent:50px;}

5. letter-spacing 设置字符间距

增加或减少字符之间的空间。

<style>
     h1 {
       letter-spacing:2px;
}
      h2 {
        letter-spacing:-3px;
}
</style>

6. line-height设置行高

指定在一个段落中行之间的空间。

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=640, user-scalable=no">
        <title>项目</title>
        <style>
            p.small {
                line-height: 70%;
            }


            p.big {
                line-height: 200%;
            }
</style>
    </head>


    <body>
        <p>
            This is a paragraph with a standard line-height.<br> This is a paragraph with a standard line-height.<br> The default line height in most browsers is about 110% to 120%.<br>
        </p>


        <p class="small">
            This is a paragraph with a smaller line-height.<br> This is a paragraph with a smaller line-height.<br> This is a paragraph with a smaller line-height.<br> This is a paragraph with a smaller line-height.<br>
        </p>


        <p class="big">
            This is a paragraph with a bigger line-height.<br> This is a paragraph with a bigger line-height.<br> This is a paragraph with a bigger line-height.<br> This is a paragraph with a bigger line-height.<br>
        </p>


    </body>


</html>

7. word-spacing 设置字间距

增加一个段落中的单词之间的空白空间。

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=640, user-scalable=no">
        <title>项目</title>
        <style type="text/css">
            p {
                word-spacing: 30px;
            }
</style>
    </head>


    <body>


        <p>
            This is some text. This is some text.
        </p>


    </body>


</html>

8. vertical-align 设置元垂直居中

设置文本的垂直对齐图像。

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=640, user-scalable=no">
        <title>项目</title>
        <style>
            img{
                width: 200px;
                height: 100px;
            }
            img.top {
                vertical-align: text-top;


            }


            img.bottom {
                vertical-align: text-bottom;


            }
</style>
    </head>


    <body>
        <p>An <img src="img/logo.png"  /> image with a default alignment.</p>
        <p>An <img class="top" src="img/logo.png" /> image with a text-top alignment.</p>
        <p>An <img class="bottom" src="img/logo.png" /> image with a text-bottom alignment.</p>
    </body>


</html>

9. text-shadow 设置文本阴影

设置文本阴影。

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=640, user-scalable=no">
        <title>项目</title>
        <style>
         h1{
            text-shadow: 2px 2px #FF0000;
     }
</style>
    </head>


    <body>
    <h1>Text-shadow effect</h1>
    </body>


</html>

三、总结

本文主要介绍了CSS文本样式实际应用中应该如何去操作,通过讲解文本中对应的属性去改变文本的表现形式。使用丰富的效果图的展示,能够更直观的看到运行的效果,能够更好的理解。使用Html语言,代码结构更佳的清晰,能够帮助你更好的学习。

盘点HTML中常见的ul ol 列表和常见的列表标记图标

大家好,我是皮皮。

一、概念

CSS列表属性作用如下:设置不同的列表项标记为有序列表。设置不同的列表项标记为无序列表。设置列表项标记为图像。

二、什么是种类型的列表?

种类型的列表:

  • ul无序列表 – 列表项标记用特殊图形(如小黑点、小方框等)
  • ol有序列表 – 列表项的标记有数字或字母。

使用CSS,可以列出进一步的样式,并可用图像作列表项标记。

三、常见的ul ol列表项标记

list-style-type属性指定列表项标记的类型是:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
        <style>
            ul.a {
                list-style-type: circle;
            }


            ul.b {
                list-style-type: square;
            }


            ol.c {
                list-style-type: upper-roman;
            }


            ol.d {
                list-style-type: lower-alpha;
            }
</style>
    </head>


    <body>
        <p>Example of unordered lists:</p>


        <ul class="a">
            <li>语文</li>
            <li>数学</li>
            <li>英语</li>
        </ul>


        <ul class="b">
            <li>语文</li>
            <li>数学</li>
            <li>英语</li>
        </ul>


        <p>Example of ordered lists:</p>


        <ol class="c">
            <li>语文</li>
            <li>数学</li>
            <li>英语</li>
        </ol>


        <ol class="d">
            <li>语文</li>
            <li>数学</li>
            <li>英语</li>
        </ol>


    </body>


</html>

四、ul ol列表项标记的图像浏览器兼容性解决方案

要指定列表项标记的图像,使用列表样式图像属性list-style-image。

在所有的浏览器,下面的例子会显示图像标记:

ul
{
list-style-type: none;
padding: 0px;
margin: 0px;
}
ul li
{
background-image: url(sqpurple.gif);
background-repeat: no-repeat;
background-position: 0px 5px; 
padding-left: 14px; 
}

代码解析

  • ul:
    • 设置列表样式类型为没有删除列表项标记
    • 设置填充和边距0px(浏览器兼容性)
  • ul中所有li:
    • 设置图像的URL,并设置它只显示一次(无重复)
    • 您需要的定位图像位置(左0px和上下5px)
    • 用padding-left属性吧文本置于列表中

五、拓展

ul ol列表缩写属性

在单个属性中可以指定所有的列表属性。这就是所谓的缩写属性。

为列表使用缩写属性,列表样式属性设置如下:

ul
{
list-style: square url("sqpurple.gif");
}

如果使用缩写属性值的顺序是:

①list-style-type 。②list-style-position。 ③list-style-image。

如果上述值丢失一个,其余仍在指定的顺序,就没关系。

六、总结

本文基于HTML基础,本文主要介绍了HTML常见的ul ol 列表、常见的列表标记图标。对于浏览器兼容列表图像的问题,提供了一系列的解决方案,最后扩展相关知识,优化代码,希望能够帮助你学习。