我与 Crafting Dead 的故事
Read More ~
我的世界-Crafting Dead-行尸走肉模组最新安装教程
1.Crafting Dead 我的世界行尸走肉
模组官网:http://www.craftingdead.com/
模组安装:https://www.technicpack.net/modpack/official-crafting-dead-mod.41792
玩法:
岷叔合集:https://space.bilibili.com/686127/favlist?fid=761086911&ftype=collect
下载教程篇:
没有mc正版账号,或者不喜欢折腾:
选择以下任一网页中的帖子,进群下载客户端,即可游玩
https://tieba.baidu.com/f?kw=我的世界行尸走肉
https://www.secretmine.net/tag/xszr-fwq/
https://www.baidu.com/s?ie=UTF-8&wd=我的世界行尸走肉服务器
单人模式:
进入单人游戏,创建新地图,世界类型选择,Crafting Dead,创建世界。
不同服务器,质量不同,当然最好加上craftingdead材质包体验更佳。
多人模式:
进入多人模式,双击进入已经输入好的服务器或输入ip地址。
拥有mc正版账号,喜欢精致研究:
科技启动器下载地址:https://www.technicpack.net/
整合包名称:Official Crafting Dead
详见:https://www.bilibili.com/video/BV1Et411b7wn
你可能会遇到:
当你下载完TechnicLauncher,并找到 official-crafting-dead,然后开始下载安装Minecraft卡住 .... ...
第一步:
你需要点击“整合包选项”,找到以下位置:
C:\Users\计算机登录帐户名\AppData\Roaming\.technic\modpacks
进入official-crafting-dead-mod文件夹,“复制”红框所示文件夹,粘贴到“.minecraft”目录下,即文件夹craftingdead及mods:
此目录即“正版我的世界”游戏部分文件目录,位于“我的文档”中:
C:\Users\计算机登录帐户名\AppData\Roaming\.minecraft
因为 official-crafting-dead启动需要craftingdead文件夹里的craftingdead.json配置及mods文件夹里的craftingdead-1.3.5-1.6.4-obf.jar核心。
第二步:
给minecraft客户端打forge,minecraft客户端至少运行过一次1.6.4版本。
可参考:https://zhidao.baidu.com/question/1605006602578485307.html
或者自行访问,下载win稳定安装版:http://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.6.4.html
下载完成后,双击运行,配置以下所示:
红框地址为:C:\Users\计算机登录帐户名\AppData\Roaming\.minecraft,与步骤1位置一致。安装完成后,打开游戏,选择对于版本启动即可。
没有mc正版账号,但喜欢折腾:
在网络上获取到文件夹craftingdead及mods里面的文件,再准备一个“1.6.4盗版启动器”,重复上面正版操作的第二步,给现有客户端打forge,启动游戏,它会自动下载,最后启动成功。最后记得单人模式新建地图时选择craftingdead模式~~
喜欢作者,感谢、支持作者一波,可以扫下方二维码,请小弟喝杯茶~
还有疑问可直接评论回复或发送邮件到作者邮箱~
Read More ~
拥有一个浏览器干净的主页
为什么要设置一个干净的主页咋就不说了,饱受其苦,
那么如何设置一个干净的主页呢?主要通过设置默认主页的方式来设置
加载迅速简洁:
百度搜索:https://m.baidu.com/?wpo=btmfast&pu=sz%401321_480&from=1013843a
百度搜索(虽然logo是谷歌):https://leftshine.gitee.io/viaindex/2/One/index.html
https://leftshine.gitee.io/viaindex/quarklike1_43/index.html
https://leftshine.gitee.io/viaindex/via-ningjing-3.5/index.html
https://leftshine.gitee.io/viaindex/GoodEvening/Good%20evening.html
https://leftshine.gitee.io/viaindex/Lazy_Simple/index.html
https://leftshine.gitee.io/viaindex/Ya_ke+mod/index.html
https://leftshine.gitee.io/viaindex/Star0726/indexDark.html
樱花背景,首次加载较长:https://leftshine.gitee.io/viaindex/2/AniBg/index.html
恶龙:https://leftshine.gitee.io/viaindex/2/mengmeizi/index.html
超简洁:https://leftshine.gitee.io/viaindex/2/One/index.html
新鲜内容:
https://www.zhihu.com/question/21744542/answer/292104008
功能强大:
小呆导航:https://www.webjike.com/index.html
关于构想 123
js jquery html
python pyqt exe gui
java gui
js读入json
输出html
做出修改后
js读入变量
保存输出文件
https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js
Python-Tkinter图形化界面设计(详细教程):https://blog.csdn.net/RNG_uzi_/article/details/89792518
参考文献:
自定义简洁浏览器主页:https://www.cnblogs.com/thgpddl/p/12684475.html
有哪些网站适合做浏览器主页:https://www.zhihu.com/question/21744542
页面自动执行(加载)js的几种方法:https://www.cnblogs.com/2huos/p/js-autorun.html
浏览器报错 CORS 请求不是 http:https://blog.csdn.net/zeduan/article/details/104165628/
Read More ~
PHP学习路线
免费php学习课程:
https://www.imooc.com/course/list?c=php
PHP基础篇上、中、下(归纳编辑于):
已收录:
1.PHP入门篇:https://www.imooc.com/view/54
2.PHP进阶篇:https://www.imooc.com/view/26
未收录:
PHP7的基本变量:https://www.imooc.com/learn/1085
PHP+Mysql+Ajax实现分页:https://www.imooc.com/learn/1117
PHP-面向对象:https://www.imooc.com/learn/887
PHP函数篇:https://www.imooc.com/learn/827
PHP扩展安装指南:https://www.imooc.com/learn/757
PHP进阶篇-字符串操作:https://www.imooc.com/learn/726
Read More ~
PHP基础学习笔记(下)
一、数据库
数据库操作
PHP通过安装相应的扩展来实现数据库操作
当前主流的数据库有:
MsSQL,MySQL,Sybase,Db2,Oracle,PostgreSQL,Access
一般情况下常说的LAMP架构指的是:
Linux、Apache、Mysql、PHP
if (function_exists('mysql_connect')) {
echo 'Mysql扩展已经安装';
}
数据库扩展
数据库可能有一个或者多个扩展,其中既有官方的,也有第三方提供的。
像Mysql常用的扩展有原生的mysql库,可使用增强版的mysqli扩展,或使用PDO进行连接与操作。
不同的扩展提供基本相近的操作方法,不同的是可能具备一些新特性,以及操作性能可能会有所不同。
mysql扩展进行数据库连接的方法:
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');
mysqli扩展:
$link = mysqli_connect('mysql_host', 'mysql_user', 'mysql_password');
PDO扩展:
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
连接MySQL数据库
指定数据库的地址,用户名及密码。
$host = 'localhost';
$user = 'code1';
$pass = '666';
$link = mysql_connect($host, $user, $pass);
选择一个操作的数据库,mysql_select_db函数选择数据库。
mysql_select_db('code1');
设置当前连接使用的字符编码,一般使用utf8编码。
mysql_query("set names 'utf8'");
执行MySQL查询
采用mysql_query加sql语句的形式向数据库发送查询指令。
$res = mysql_query('select * from user');
查询类的语句会返回一个资源句柄(resource),可以通过该资源获取查询结果集中的数据。
$row = mysql_fetch_array($res);
var_dump($row);
默认的,PHP使用最近的数据库连接执行查询,
但如果存在多个连接的情况,则可以通过参数指令从那个连接中进行查询。
$link1 = mysql_connect('127.0.0.1', 'code1', '');
$link2 = mysql_connect('127.0.0.1', 'code1', '', true); //开启一个新的连接
$res = mysql_query('select * from user limit 1', $link1); //从第一个连接中查询数据
插入数据到MySQL
$sql = "insert into user(name, age, class) values('李四', 18, '高三一班')";
mysql_query($sql); //执行插入语句
//或
$name = '李四';
$age = 18;
$class = '高三一班';
$sql = "insert into user(name, age, class) values('$name', '$age', '$class')";
mysql_query($sql); //执行插入语句
//mysql_insert_id函数可以获取自增的主键id。
$uid = mysql_insert_id();
//可以用来判断是否插入成功,或者作为关联ID进行其他的数据操作。
取得数据查询结果
PHP有多个函数可以获取数据集中的一行数据,最常用的是mysql_fetch_array,
可以通过设定参数来更改行数据的下标,默认的会包含数字索引的下标以及字段名的关联索引下标。
$sql = "select * from user limit 1";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
可以通过设定参数MYSQL_NUM只获取数字索引数组,等同于mysql_fetch_row函数,
如果设定参数为MYSQL_ASSOC则只获取关联索引数组,等同于mysql_fetch_assoc函数。
$row = mysql_fetch_row($result);
$row = mysql_fetch_array($result, MYSQL_NUM); //这两个方法获取的数据是一样的
$row = mysql_fetch_assoc($result);
$row = mysql_fetch_array($result, MYSQL_ASSOC);
如果要获取数据集中的所有数据,我们通过循环来遍历整个结果集。
$data = array();
while ($row = mysql_fetch_array($result)) {
$data[] = $row;
}
查询分页数据
通过mysql的limit可以很容易的实现分页,limit m,n表示从m行后取n行数据,要构造m与n来实现获取某一页的所有数据。
假定当前页为page,每页显示page,每页显示page,每页显示n条数据,那么m为当前页前面所有的数据,
既m=(m = (m=(page-1) * $n,通过构造SQL语句在PHP中实现数据翻页。
$page = 2;
$n = 2;
$m = ($page - 1) * $n;
$sql = "select * from user limit $m, $n";
$result = mysql_query($sql);
//循环获取当前页的数据
$data = array();
while ($row = mysql_fetch_assoc($result)) {
$data[] = $row;
}
使用m与m与m与n变量来表示偏移量与每页数据条数,但推荐使用更有意义的变量名来表示,
比如$pagesize, $start, $offset等,这样更容易理解,有助于团队协作开发。
更新与删除数据
// 更新
$sql = "update user set name = '曹操' where id=2 limit 1";
if (mysql_query($sql)) {
echo '更新成功';
}
// 删除
$sql = "delete from user where id=2 limit 1";
if (mysql_query($sql)) {
echo '删除成功';
}
对于删除与更新操作,可以通过mysql_affected_rows函数来获取更新过的数据行数,
如果数据没有变化,则结果为0。
$sql = "update user set name = '曹操' where id=2 limit 1";
if (mysql_query($sql)) {
echo mysql_affected_rows();
}
关闭MySQL连接
mysql_close();
虽然PHP会自动关闭数据库连接,一般情况下已经满足需求,但是在对性能要求比较高的情况下,
可以在进行完数据库操作之后尽快关闭数据库连接,以节省资源,提高性能。
在存在多个数据库连接的情况下,可以设定连接资源参数来关闭指定的数据库连接。
$link = mysql_connect($host, $user, $pass);
mysql_close($link);
PHP+Mysql+Ajax实现分页
https://www.imooc.com/learn/1117
PHP环境LAMP/LNMP安装与配置
LAMP是Linux + Apache/Nginx + Mysql + PHP的简称。
目前,国内外,无论一线互联网企业还是创业公司,LAMP都是Web开发的主流,以其高性能、特稳定、开源免费等特性闻名于世。
https://www.imooc.com/learn/703
扩展学习:
PHP进阶篇-GD库图像处理:http://www.imooc.com/learn/701
来源:慕课网,内容持续更新中...
Read More ~
PHP基础学习笔记(中)
本文章是继PHP基础学习笔记(上)的下篇,主要记录php基础知识,资源整合自慕课网。
一、数组定义
数组就是一个键值对组成的语言结构,键类似于酒店的房间号,值类似于酒店房间里存储的东西。
$arr = array();
表示创建一个空数组,并把创建的空数组赋值给变量$arr。
索引数组初始化
PHP有两种数组:索引数组、关联数组。
索引和关联两个词都是针对数组的键而言的。
索引数组是指数组的键是整数的数组,并且键的整数顺序是从0开始,依次类推。
fruit
|香蕉|苹果|雪梨|
|:-|:-:|-:|
|0|1|2|
$fruit = array("苹果","香蕉","菠萝");
print_r($fruit);
索引数组赋值
赋值有三种方式:
$arr[0]='苹果';
array('0'=>'苹果');
$arr = array('0'=>'苹果');
if( isset($arr) ) {print_r($arr);}
isset() 函数是检查 括号内的是否被定义了,定义为null 也表示true。
索引数组内容
$fruit = array('苹果','香蕉');
$fruit0 = $fruit['0'];
print_r($fruit0);//结果为苹果
循环访问索引数组里的值
$fruit=array('苹果','香蕉','菠萝');
// for循环
for($i=0; $i<3; $i++){
echo '<br>数组第'.$i.'值是:'.$fruit[$i];
}
//foreach循环
foreach($fruit as $key=>$value){
echo '<br>第'.$key.'值是:';
}
关联数组初始化
// 创建一个关联数组,关联数组的键“orange”,值是“橘子”
$fruit = array(
// 关联数组赋值
'apple'=>"苹果",
'banana'=>"香蕉",
'pineapple'=>"菠萝"
);
// 访问关联数组内容
$fruit0 = $fruit['banana'];
print_r($fruit0);
// foreach循环访问关联数组里的值
foreach($fruit as $k=>$v){
echo '<br>水果的英文键名:'.$k.',对应的值是:'.$v;
二、类和对象
类是面向对象程序设计的基本概念,通俗的理解类就是对现实中某一个种类的东西的抽象。
如汽车可以抽象为一个类,
属性:名字、轮胎、速度、重量等,
操作方法:换挡、前进、后退等。
// 定义一个汽车类的方法为
class Car {
$name = '汽车'; //定义属性
function getName() { //定义方法
return $this->name; //方法内部可以使用$this伪变量调用对象的属性或者方法
}
}
// 类是一类东西的结构描述,而对象则是一类东西的一个具体实例,
// 例如汽车这个名词可以理解为汽车的总类,但这辆汽车则是一个具体的汽车对象。
// 对象通过new关键字进行实例化:
$car = new Car();
$car->name = '奥迪A6'; //设置对象的属性值
echo $car->getName(); //调用对象的方法 输出对象的名字
//也可以采用变量来创建
$className = 'Car';
$car = new $className();
//类与对象看起来比较相似,但实际上有本质的区别,
//类是抽象的概念,对象是具体的实例。
//类可以使程序具有可重用性。
对象之类的属性
在类中定义的变量称之为属性,
通常属性跟数据库中的字段有一定的关联,因此也可以称作“字段”。
属性声明是由以下关键字开头。
public:公开的
protected:受保护的
private:私有的
class Car {
//定义公共属性
public $name = '汽车';
//定义受保护的属性
protected $color = '白色';
//定义私有属性
private $price = '100000';
}
默认都为public,外部可以访问。
一般通过->对象操作符来访问对象的属性或者方法,对于静态属性则使用::双冒号进行访问。
当在类成员方法内部调用的时候,可以使用$this伪变量调用当前对象的属性。
$car = new Car();
echo $car->name; //调用对象的属性
echo $car->color; //错误 受保护的属性不允许外部调用
echo $car->price; //错误 私有属性不允许外部调用
受保护的属性与私有属性不允许外部调用,在类的成员方法内部是可以调用的。
class Car{
private $price = '1000';
public function getPrice() {
return $this->price; //内部访问私有属性
}
}
定义类的方法
方法就是在类中的function,很多时候我们分不清方法与函数有什么差别,
在面向过程的程序设计中function叫做函数,在面向对象中function则被称之为方法。
同属性一样,类的方法也具有public,protected 以及 private 的访问控制。
被定义为公有的类成员可以在任何地方被访问。
被定义为受保护的类成员则可以被其自身以及其子类和父类访问。
被定义为私有的类成员则只能被其定义所在的类访问。
class Car {
public function getName() {
return '汽车';
}
}
$car = new Car();
echo $car->getName();
使用关键字static修饰的,称之为静态方法。
静态方法不需要实例化对象,可以通过类名直接调用,操作符为双冒号::。
class Car {
public static function getName() {
return '汽车';
}
}
echo Car::getName(); //结果为“汽车”
// 静态方法也可以通过变量来进行动态调用
$func = 'getSpeed';
$className = 'Car';
echo $className::$func(); //动态调用静态方法
静态方法中,$this伪变量不允许使用。
可以使用self,parent,static在内部调用静态方法与属性。
class Car {
private static $speed = 10;
public static function getSpeed() {
return self::$speed;
}
public static function speedUp() {
return self::$speed+=10;
}
}
class BigCar extends Car {
public static function start() {
parent::speedUp();
}
}
BigCar::start();
echo BigCar::getSpeed();
车辆加速
class Car {
private static $speed = 10;
public function getSpeed() {
return self::$speed;
}
//在这里定义一个静态方法,实现速度累加10
public static function speedUp() {
return self::$speed+=10;
}
}
$car = new Car();
Car::speedUp(); //调用静态方法加速
echo $car->getSpeed(); //调用共有方法输出当前的速度值
构造函数和析构函数
__construct()定义一个构造函数,具有构造函数的类,
会在每次对象创建的时候调用该函数,因此常用来在对象创建的时候进行一些初始化工作。
class Car {
function __construct() {
print "构造函数被调用\n";
}
}
$car = new Car(); //实例化的时候 会自动调用构造函数__construct,这里会输出一个字符串
在子类中如果定义了__construct则不会调用父类的__construct,
如果需要同时调用父类的构造函数,需要使用parent::__construct()显式的调用。
class Car {
function __construct() {
print "父类构造函数被调用\n";
}
}
class Truck extends Car {
function __construct() {
print "子类构造函数被调用\n";
parent::__construct();
}
}
$car = new Truck();
同样,PHP5支持析构函数,使用__destruct()进行定义,
析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。
class Car {
function __construct() {
print "构造函数被调用 \n";
}
function __destruct() {
print "析构函数被调用 \n";
}
}
$car = new Car(); //实例化时会调用构造函数
echo '使用后,准备销毁car对象 \n';
unset($car); //销毁时会调用析构函数
当PHP代码执行完毕以后,会自动回收与销毁对象,因此一般情况下不需要显式的去销毁对象。
访问控制
类属性必须定义为公有、受保护、私有之一。
为兼容PHP5以前的版本,如果采用 var 定义,则被视为公有。
class Car {
$speed = 10; //错误 属性必须定义访问控制
public $name; //定义共有属性
}
类中的方法可以被定义为公有、私有或受保护。
如果没有设置这些关键字,则该方法默认为公有。
class Car {
//默认为共有方法
function turnLeft() {
}
}
如果构造函数定义成了私有方法,则不允许直接实例化对象了,
这时候一般通过静态方法进行实例化,在设计模式中会经常使用这样的方法来控制对象的创建,
比如单例模式只允许有一个全局唯一的对象。
class Car {
private function __construct() {
echo 'object create';
}
private static $_object = null;
public static function getInstance() {
if (empty(self::$_object)) {
self::$_object = new Car(); //内部方法可以调用私有方法,因此这里可以创建对象
}
return self::$_object;
}
}
//$car = new Car(); //这里不允许直接实例化对象
$car = Car::getInstance(); //通过静态方法来获得一个实例
对象继承
继承是面向对象程序设计中常用的一个特性,汽车是一个比较大的类,我们也可以称之为基类,
除此之外,汽车还分为卡车、轿车、东风、宝马等,因为这些子类具有很多相同的属性和方法,
可以采用继承汽车类来共享这些属性与方法,实现代码的复用。
class Car {
public $speed = 0; //汽车的起始速度是0
public function speedUp() {
$this->speed += 10;
return $this->speed;
}
}
//定义继承于Car的Truck类
class Truck extends Car {
public function speedUp(){
$this->speed = parent::speedUp() + 50;
}
}
$car = new Truck();
$car->speedUp();
echo $car->speed;
//结果:60
重载
PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的。
__set,对不存在属性赋值
__get,对不存在属性读取
__isset,判断属性是否设置
__unset,销毁属性
方法的重载通过__call来实现,当调用不存在的方法的时候,
将会转为参数调用__call方法,当调用不存在的静态方法时会使用__callStatic重载。
class Car {
public $speed = 10;
//在这里使用重载实现speedDown方法
public function __call($name, $args) {
if ($name == 'speedDown') {
$this->speed -= 10;
}
}
}
$car = new Car();
$car->speedDown(); //调用不存在的speedDown方法
echo $car->speed;
// $name 参数是要调用的方法名称。
// $arg 参数是一个枚举数组,包含着要传递给方法 $name 的参数。
// 所有的重载方法都必须被声明为 public。
//这些魔术方法的参数都不能通过引用传递。
//属性重载只能在对象中进行。在静态方式中,这些魔术方法将不会被调用。所以这些方法都不能被声明为 static。
详细:https://www.imooc.com/code/546
高级特性
class Car {
public $name = 'car';
public function __clone() {
$obj = new Car();
$obj->name = $this->name;
}
}
$a = new Car();
$a->name = 'new car';
$b = clone $a;
if ($a == $b) echo '=='; //true
if ($a === $b) echo '==='; //false
$str = serialize($a); //对象序列化成字符串
echo $str.'<br>';
$c = unserialize($str); //反序列化为对象
var_dump($c);
详细:https://www.imooc.com/code/547
三、正则表达式
正则表达式是对字符串进行操作的一种逻辑公式,
就是用一些特定的字符组合成一个规则字符串,称之为正则匹配模式。
$p = '/apple/';
$str = "apple banna";
if (preg_match($p, $str)) {
echo 'matched';
}
其中字符串'/apple/'就是一个正则表达式,用于匹配源字符串中是否存在apple字符串。
PHP中使用PCRE库函数进行正则匹配,比如上例中的preg_match用于执行一个正则匹配,
常用来判断一类字符模式是否存在。
基本语法
PCRE库函数中,正则匹配模式使用分隔符与元字符组成,分隔符可以是非数字、非反斜线、非空格的任意字符。经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~),例如:
/foo bar/
#^[^0-9]$#
~php~
//如果模式中包含分隔符,则分隔符需要使用反斜杠(\)进行转义。
/http:\/\//
//如果模式中包含较多的分割字符,建议更换其他的字符作为分隔符,也可以采用preg_quote进行转义。
$p = 'http://';
$p = '/'.preg_quote($p, '/').'/';
echo $p;
//分隔符后面可以使用模式修饰符,模式修饰符包括:i, m, s, x等,
//例如使用i修饰符可以忽略大小写匹配:
$str = "Http://www.imooc.com/";
if (preg_match('/http/i', $str)) {
echo '匹配成功';
}
// 忽略大小写匹配BBC
$p = '/bbc/i';
$str = "BBC是英国的一个电视台";
if (preg_match($p, $str)) {
echo '匹配成功';
}
元字符与转义
正则表达式中具有特殊含义的字符称之为元字符,常用的元字符有:
\ 一般用于转义字符
^ 断言目标的开始位置(或在多行模式下是行首)
$ 断言目标的结束位置(或在多行模式下是行尾)
. 匹配除换行符外的任何字符(默认)
[ 开始字符类定义
] 结束字符类定义
| 开始一个可选分支
( 子组的开始标记
) 子组的结束标记
? 作为量词,表示 0 次或 1 次匹配。位于量词后面用于改变量词的贪婪特性。 (查阅量词)
量词,0 次或多次匹配
量词,1 次或多次匹配
{ 自定义量词开始标记
} 自定义量词结束标记
//下面的\s匹配任意的空白符,包括空格,制表符,换行符。[\s]代表非空白符。[\s]+表示一次或多次匹配非空白符。
$p = '/^我[^\s]+(苹果|香蕉)$/';
$str = "我喜欢吃苹果";
if (preg_match($p, $str)) {
echo '匹配成功';
}
元字符具有两种使用场景,一种是可以在任何地方都能使用,另一种是只能在方括号内使用,在方括号内使用的有:
\ 转义字符
^ 仅在作为第一个字符(方括号内)时,表明字符类取反
标记字符范围
其中^在反括号外面,表示断言目标的开始位置,但在方括号内部则代表字符类取反,方括号内的减号-可以标记字符范围,例如0-9表示0到9之间的所有数字。
//下面的\w匹配字母或数字或下划线。
$p = '/[\w\.\-]+@[a-z0-9\-]+\.(com|cn)/';
$str = "我的邮箱是Spark.eric@imooc.com";
preg_match($p, $str, $match);
echo $match[0];
//匹配str中的电话
$p = '/\d+\-\d+/';
$str = "我的电话是010-12345678";
preg_match($p, $str, $match);
echo $match[0];
贪婪模式与懒惰模式
正则表达式中每个元字符匹配一个字符,当使用+之后将会变的贪婪,它将匹配尽可能多的字符,
但使用问号?字符时,它将尽可能少的匹配字符,既是懒惰模式。
贪婪模式:在可匹配与可不匹配的时候,优先匹配
//下面的\d表示匹配数字
$p = '/\d+\-\d+/';
$str = "我的电话是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //结果为:010-12345678
懒惰模式:在可匹配与可不匹配的时候,优先不匹配
$p = '/\d?\-\d?/';
$str = "我的电话是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //结果为:0-1
当我们确切的知道所匹配的字符长度的时候,可以使用{}指定匹配字符数
$p = '/\d{3}\-\d{8}/';
$str = "我的电话是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //结果为:010-12345678
匹配str中的姓名
$p = '/name:([\w\s]+)/';
$str = "name:steven jobs";
preg_match($p, $str, $match);
echo $match[1]; //结果为:steven jobs
正则表达式匹配
//正则匹配,并输出邮箱地址,匹配email的方法还有有很多
$subject = "my email is spark@imooc.com";
$pattern = '/[\w\-]+@\w+\.\w+/';
preg_match($pattern, $subject, $matches);
echo $matches[0];
详细:https://www.imooc.com/code/562
查找所有匹配结果
preg_match只能匹配一次结果,但很多时候我们需要匹配所有的结果,
preg_match_all可以循环获取一个列表的匹配结果数组。
$str = "<ul>
<li>item 1</li>
<li>item 2</li>
</ul>";
//在这里补充代码,实现正则匹配所有li中的数据
$p = "/<li>(.*)<\/li>/i";//解释下这个正则:
//后面的i表示不区分大小写,<li>(.*?)<\/li>表示li标签内的匹配的()内的值有多少,
括号内的.表示所有单字符,*表示数量为0个或者多个。也就是li标签内有字符就显示出来
preg_match_all($p, $str, $matches);
print_r($matches[1]);
结果:
Array
(
[0] => item 1
[1] => item 2
)
详细:https://www.imooc.com/code/563
正则表达式的搜索和替换
$str = '主要有以下几个文件:index.php, style.css, common.js';
//将目标字符串$str中的文件名替换后增加em标签
$p = '/\w+\.\w+/i';
$str = preg_replace($p, '<em>$0</em>', $str);
echo $str;
结果:
主要有以下几个文件:index.php, style.css, common.js
常用案例
$user = array(
'name' => 'spark1985',
'email' => 'spark@imooc.com',
'mobile' => '13312345678'
);
//进行一般性验证
if (empty($user)) {
die('用户信息不能为空');
}
if (strlen($user['name']) < 6) {
die('用户名长度最少为6位');
}
//用户名必须为字母、数字与下划线
if (!preg_match('/^\w+$/i', $user['name'])) {
die('用户名不合法');
}
//验证邮箱格式是否正确
if (!preg_match('/^[\w\.]+@\w+\.\w+$/i', $user['email'])) {
die('邮箱不合法');
}
//手机号必须为11位数字,且为1开头
if (!preg_match('/^1\d{10}$/i', $user['mobile'])) {
die('手机号不合法');
}
echo '用户信息验证成功';
四、cookie
Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据。
一般情况下,Cookie通过HTTP headers从服务端返回到客户端。
多数web程序都支持Cookie的操作,因为Cookie是存在于HTTP的标头之中,
所以必须在其他信息输出以前进行设置,类似于header函数的使用限制。
PHP通过setcookie函数进行Cookie的设置,任何从浏览器发回的Cookie,PHP都会自动的将他存储在$_COOKIE的全局变量之中,因此我们可以通过$_COOKIE['key']的形式来读取某个Cookie值。
PHP中的Cookie具有非常广泛的使用,经常用来存储用户的登录信息,购物车等,且在使用会话Session时通常使用Cookie来存储会话id来识别用户,Cookie具备有效期,当有效期结束之后,Cookie会自动的从客户端删除。同时为了进行安全控制,Cookie还可以设置域跟路径,我们会在稍后的章节中详细的讲解他们。
setcookie('test', time());
ob_start();
print_r($_COOKIE);
$content = ob_get_contents();
$content = str_replace(" ", '&nbsp;', $content);
ob_clean();
header("content-type:text/html; charset=utf-8");
echo '当前的Cookie为:<br>';
echo nl2br($content);
设置cookie
PHP设置Cookie最常用的方法就是使用setcookie函数,setcookie具有7个可选参数,
我们常用到的为前5个:
name( Cookie名)可以通过$_COOKIE['name'] 进行访问
value(Cookie的值)
expire(过期时间)Unix时间戳格式,默认为0,表示浏览器关闭即失效
path(有效路径)如果路径设置为'/',则整个网站都有效
domain(有效域)默认整个域名都有效,如果设置了'www.imooc.com',则只在www子域中有效
$value = 'test';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600); //有效期一小时
setcookie("TestCookie", $value, time()+3600, "/path/", "imooc.com"); //设置路径与域
PHP中还有一个设置Cookie的函数setrawcookie,setrawcookie跟setcookie基本一样,
唯一的不同就是value值不会自动的进行urlencode,因此在需要的时候要手动的进行urlencode。
setrawcookie('cookie_name', rawurlencode($value), time()+60*60*24*365);
因为Cookie是通过HTTP标头进行设置的,所以也可以直接使用header方法进行设置。
header("Set-Cookie:cookie_name=value");
设置一个名为test的Cookie
$value = time();
setcookie('test', $value);
if (isset($_COOKIE['test'])) {
echo 'success';
}
删除与过期时间
setcookie('test', time());
//在这里试着删除test的cookie值
setcookie('test', '', time()-1);
var_dump($_COOKIE);
将cookie的过期时间设置到当前时间之前,则该cookie会自动失效,也就达到了删除cookie的目的。
之所以这么设计是因为cookie是通过HTTP的标头来传递的,客户端根据服务端返回的Set-Cookie段来进行cookie的设置,如果删除cookie需要使用新的Del-Cookie来实现,则HTTP头就会变得复杂,
实际上仅通过Set-Cookie就可以简单明了的实现Cookie的设置、更新与删除。
了解原理以后,我们也可以直接通过header来删除cookie。
header("Set-Cookie:test=1393832059; expires=".gmdate('D, d M Y H:i:s \G\M\T', time()-1));
这里用到了gmdate,用来生成格林威治标准时间,以便排除时差的影响。
有效路径
cookie中的路径用来控制设置的cookie在哪个路径下有效,默认为'/',
在所有路径下都有,当设定了其他路径之后,则只在设定的路径以及子路径下有效,例如:
setcookie('test', time(), 0, '/path');
上面的设置会使test在/path以及子路径/path/abc下都有效,但是在根目录下就读取不到test的cookie值。
一般情况下,大多是使用所有路径的,只有在极少数有特殊需求的时候,会设置路径,
这种情况下只在指定的路径中才会传递cookie值,可以节省数据的传输,增强安全性以及提高性能。
当我们设置了有效路径的时候,不在当前路径的时候则看不到当前cookie。
setcookie('test', '1',0, '/path');
var_dump($_COOKIE['test']);
session与cookie的异同
cookie将数据存储在客户端,建立起用户与服务器之间的联系,
通常可以解决很多问题,但是cookie仍然具有一些局限:
cookie相对不是太安全,容易被盗用导致cookie欺骗
单个cookie的值最大只能存储4k
每次请求都要进行网络传输,占用带宽
session是将用户的会话数据存储在服务端,没有大小限制,通过一个session_id进行用户识别,PHP默认情况下session id是通过cookie来保存的,因此从某种程度上来说,seesion依赖于cookie。但这不是绝对的,session id也可以通过参数来实现,只要能将session id传递到服务端进行识别的机制都可以使用session。
使用session
//先执行session_start方法开启session
session_start();
//设置一个session,然后通过全局变量$_SESSION进行session的读写
$_SESSION['test'] = time();
//显示当前的session_id
echo "session_id:".session_id();
echo "<br>";
//读取session值
echo $_SESSION['test'];
// var_dump($_SESSION);
//删除与销毁一个session
unset($_SESSION['test']);
echo "<br>";
var_dump($_SESSION);
//如果要删除所有的session,可以使用session_destroy函数销毁当前session,
//session_destroy会删除所有数据,但是session_id仍然存在。
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
session_destroy();
//session_destroy并不会立即的销毁全局变量$_SESSION中的值,只有当下次再访问的时候,
//$_SESSION才为空,因此如果需要立即销毁$_SESSION,可以使用unset函数。
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
unset($_SESSION);
session_destroy();
var_dump($_SESSION); //此时已为空
//如果需要同时销毁cookie中的session_id,通常在用户退出的时候可能会用到,
//则还需要显式的调用setcookie方法删除session_id的cookie值。
session会自动的对要设置的值进行encode与decode,
因此session可以支持任意数据类型,包括数据与对象等。
session_start();
SESSION[′ary′]=array(′name′=>′jobs′);_SESSION['ary'] = array('name' => 'jobs');
SESSION[′ary′]=array(′name′=>′jobs′);_SESSION['obj'] = new stdClass();
var_dump($_SESSION);
默认情况下,session是以文件形式存储在服务器上的,因此当一个页面开启了session之后,会独占这个session文件,这样会导致当前用户的其他并发访问无法执行而等待。可以采用缓存或者数据库的形式存储来解决这个问题,
session来存储用户的登录信息
session可以用来存储多种类型的数据,因此具有很多的用途,
常用来存储用户的登录信息,购物车数据,或者一些临时使用的暂存数据等。
用户在登录成功以后,通常可以将用户的信息存储在session中,
一般的会单独的将一些重要的字段单独存储,然后所有的用户信息独立存储。
$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['userinfo'] = $userinfo;
一般来说,登录信息既可以存储在sessioin中,也可以存储在cookie中,
他们之间的差别在于session可以方便的存取多种数据类型,而cookie只支持字符串类型,
同时对于一些安全性比较高的数据,cookie需要进行格式化与加密存储,而session存储在服务端则安全性较高。
session_start();
//假设用户登录成功获得了以下用户数据
$userinfo = array(
'uid' => 10000,
'name' => 'spark',
'email' => 'spark@imooc.com',
'sex' => 'man',
'age' => '18'
);
header("content-type:text/html; charset=utf-8");
/* 将用户信息保存到session中 */
$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['name'] = $userinfo['name'];
$_SESSION['userinfo'] = $userinfo;
//* 将用户数据保存到cookie中的一个简单方法 */
$secureKey = 'imooc'; //加密密钥
$str = serialize($userinfo); //将用户信息序列化
//用户信息加密前
$str = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), $str, MCRYPT_MODE_ECB));
//用户信息加密后
//将加密后的用户数据存储到cookie中
setcookie('userinfo', $str);
//当需要使用时进行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), base64_decode($str), MCRYPT_MODE_ECB);
$uinfo = unserialize($str);
echo "解密后的用户信息:<br>";
print_r($uinfo);
结果:
解密后的用户信息:
Array
(
[uid] => 10000
[name] => spark
[email] => spark@imooc.com
[sex] => man
[age] => 18
)
五、文件系统
读取文件内容
$content = file_get_contents('./test.txt');
// file_get_contents,可以将整个文件全部读取到一个字符串中
$content = file_get_contents('./test.txt', null, null, 100, 500);
//可通过参数控制读取内容的开始点以及长度。
echo $content;
PHP也提供类似于C语言操作文件的方法,使用fopen,fgets,fread等方法,
fgets可以从文件指针中读取一行,freads可以读取指定长度的字符串。
$fp = fopen('./text.txt', 'rb');
while(!feof($fp)) {
echo fgets($fp); //读取一行
}
fclose($fp);
$fp = fopen('./text.txt', 'rb');
$contents = '';
while(!feof($fp)) {
$contents .= fread($fp, 4096); //一次读取4096个字符
}
fclose($fp);
使用fopen打开的文件,最好使用fclose关闭文件指针,以避免文件句柄被占用。
判断文件是否存在
is_file与file_exists.
file_exists:
//判断文件是否存在,同时也可以判断目录是否存在
$filename = './test.txt';
if (file_exists($filename)) {
echo file_get_contents($filename);
}
is_file:
//is_file是确切的判断给定的路径是否是一个文件,从函数名可以看出
$filename = './test.txt';
if (is_file($filename)) {
echo file_get_contents($filename);
}
is_readable与is_writeable更加精确
在文件是否存在的基础上,判断文件是否可读与可写。
//可写
$filename = './test.txt';
if (is_writeable($filename)) {
file_put_contents($filename, 'test');
}
//可读
if (is_readable($filename)) {
echo file_get_contents($filename);
}
取得文件的修改时间
文件有很多元属性,包括:文件的所有者、创建时间、修改时间、最后的访问时间等。
fileowner:获得文件的所有者
filectime:获取文件的创建时间
filemtime:获取文件的修改时间
fileatime:获取文件的访问时间
其中最常用的是文件的修改时间,通过文件的修改时间,
可以判断文件的时效性,经常用在静态文件或者缓存数据的更新。
mtime=filemtime(mtime = filemtime(mtime=filemtime(filename);
echo '修改时间:'.date('Y-m-d H:i:s', filemtime($filename));
$filename = '/data/webroot/usercode/code/resource/test.txt';
echo '所有者:'.fileowner($filename).'<br>';
echo '创建时间:'.filectime($filename).'<br>';
echo '修改时间:'.filemtime($filename).'<br>';
echo '最后访问时间:'.fileatime($filename).'<br>';
//给$mtime赋值为文件的修改时间
$mtime = filemtime($filename);
//通过计算时间差 来判断文件内容是否有效
if (time() - $mtime > 3600) {
echo '<br>缓存已过期';
} else {
echo file_get_contents($filename);
}
取得文件的大小
$filename = '/data/webroot/usercode/resource/test.txt';
echo filesize($filename);
//没法通过简单的函数来取得目录的大小,目录的大小是该目录下所有子目录以及文件大小的总和,
//因此需要通过递归的方法来循环计算目录的大小。
详细:https://www.imooc.com/code/578
写入内容到文件
$filename = '/data/webroot/usercode/code/test2.txt';
$fp = fopen($filename, 'w');
fwrite($fp, 'hello world');
fclose($fp);
// 或者
$fp = fopen('./test.txt', 'w');
fwrite($fp, 'hello');
fwrite($fp, 'world');
fclose($fp);
删除文件
跟Unix系统命令类似,PHP使用unlink函数进行文件删除。
unlink($filename);
删除文件夹使用rmdir函数,文件夹必须为空,如果不为空或者没有权限则会提示失败。
rmdir($dir);
如果文件夹中存在文件,可以先循环删除目录中的所有文件,然后再删除该目录,循环删除可以使用glob函数遍历所有文件。
foreach (glob("*") as $filename) {
unlink($filename);
}
六、异常处理
从PHP5开始,PHP支持异常处理,异常抛出之后,后面的代码将不会再被执行。
当代码中使用了try catch的时候,抛出的异常会在catch中捕获,否则会直接中断。
基本语法
try{
//可能出现错误或异常的代码
//catch表示捕获,Exception是php已定义好的异常类
} catch(Exception $e){
//对异常处理,方法:
//1、自己处理
//2、不处理,将其再次抛出
}
//每一个 "throw" 必须对应至少一个 "catch",当然可以对应多个"catch"
//Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。
创建可抛出一个异常的函数
function checkNum($number){
if($number>1){
throw new Exception("异常提示-数字必须小于等于1");
}
return true;
}
//在 "try" 代码块中触发异常
try{
checkNum(2);
//如果异常被抛出,那么下面一行代码将不会被输出
echo '如果能看到这个提示,说明你的数字小于等于1';
}catch(Exception $e){
//捕获异常
echo '捕获异常: ' .$e->getMessage();
}
检测文件是否存在
$filename = 'test.txt';
try {
if (!file_exists($filename)) {
throw new Exception('文件不存在');
}
} catch(Exception $e) {
echo $e->getMessage();
}
异常处理类
Exception具有几个基本属性与方法,其中包括了:
message 异常消息内容
code 异常代码
file 抛出异常的文件名
line 抛出异常在该文件的行数
其中常用的方法有:
getTrace 获取异常追踪信息
getTraceAsString 获取异常追踪信息的字符串
getMessage 获取出错信息
class MyException extends Exception {
function getInfo() {
return '自定义错误信息';
}
}
try {
throw new MyException('error');
} catch(Exception $e) {
echo $e->getInfo();
}
详细:https://www.imooc.com/code/601
捕获异常信息
在实际应用中,不会轻易的抛出异常,只有在极端情况或者非常重要的情况下,才会抛出异常,
抛出异常,可以保障程序的正确性与安全,避免导致不可预知的bug。
//一般的异常处理流程代码为:
try {
throw new Exception('wrong');
} catch(Exception $ex) {
echo 'Error:'.$ex->getMessage().'<br>';
echo $ex->getTraceAsString().'<br>';
}
echo '异常处理后,继续执行其他代码';
获取错误发生的所在行
在实际应用中,我们通常会获取足够多的异常信息,然后写入到错误日志中。
通过我们需要将报错的文件名、行号、错误信息、异常追踪信息等记录到日志中,以便调试与修复问题。
try {
throw new Exception('wrong');
} catch(Exception $ex) {
$msg = 'Error:'.$ex->getMessage()."\n";
$msg.= $ex->getTraceAsString()."\n";
$msg.= '异常行号:'.$ex->getLine()."\n";
$msg.= '所在文件:'.$ex->getFile()."\n";
//将异常信息记录到日志中
PHP异常处理之 file_put_contents('error.log', $msg);
}
扩展学习:
PHP进阶篇-函数 :http://www.imooc.com/learn/737
PHP进阶篇-日期时间函数:http://www.imooc.com/learn/698
来源:慕课网,内容持续更新中...
Read More ~
PHP基础学习笔记(上)
学习一门新的计算机语言,对于基础基础不能丢三落四、模凌两可,这是一定要过关的。这对于以后遇到问题,能事半功倍,快人一步。不然会处处碰壁,事倍功半。假如你不是特别优秀的人,那可以选择像我一样,重复再重复吧,加油💪~
一、符号
单引号括,双引号都可以用:
<?php echo "Hi,imooc!";?>
<?php echo 'Hi,imooc!';?>
连接符(.):
<?php echo 'Hi,'.'imooc!';?>
php在这一点比较特殊,其它语言中是用加号(+)来表示的,比如:JavaScirpt、Asp、C。
结尾要加分号:
(;)分号;一定在半角状态下输入。
注释语句:
PHP:// 注释语句
Html:<!--注释语句-->
CSS:/*注释语句*/
注释语句可以在PHP程序的任意位置(但注释语句一定要写在之间)。
二、变量
定义&输出:
$var_name = "苹果";
$n = 10;
var_dump($var_name);
var_dump($n);
命名规则
1.变量名必须以字母或下划线 “_”开头,
"$_name"√
"$name" √
"$name2"√
"$9name"×
2.由字母、数字、“_”、汉字组成。
"$_qq"√
"$qq308"√
"$my_apple"√
"$name我等" √
"$name*"× (不允许符号)
"$666"× (不允许纯数字)
"$my apple"× (不允许空格)
格式
1.下划线法:$my_apple
2.驼峰命名法:$myApple
3.在PHP中变量名是区分大小写,
“$my_book”
“$my_Book”
代表两个不同的变量。
变量的数据类型
php支持八种原始类型:
1.四种标量类型:
boolean 布尔型
①只有两个值,一个是TRUE,另一个FALSE。即为是或否/真或假。
②不区分大小写, "TRUE" = "true "
③主要用在条件结构。
④用”echo”输出时,“true”则输出“1”,“false”不输出。
所以需要注意变量的类型,“1”可能是整型也可能是true,所以需要var_dump输出一下,
如:https://www.imooc.com/code/745
integer 整型
$data_int = 123; // 十进制数 ,123
$data_int = -123; // 一个负数 ,-123
$data_int = 0123; // 八进制数(等于十进制的 83) ,83
$data_int = 0x123; // 十六进制数(等于十进制的 26) ,291
// 十进制、八进制(数字前“0”)、十六进制(数字前“0x”)。(0是阿拉伯数字0,不是英文字母"欧/o")
float 浮点型(也称double)
$num_float = 1.234; //小数点 ,1.234
$num_float = 1.2e3; //科学计数法,小写e ,1200
$num_float = 7.0E-10; //科学计数法,大写E ,0.007
// 支持小数点、科学计数法小写的e,大写的E表示。
string (字符串)
“$str_string1 = '我是字符串';”
// 字符和字节一样,所以一共有256种不同字符的可能性。
// 三种方法定义:单引号形式、双引号形式和Heredoc结构形式。
// 单双引号嵌入与转义符“\”
$str_string1 = '甲问:"你在哪里学的PHP?"';
$str_string2 = "乙毫不犹豫地回答:'当然是慕课网咯!'";
$str_string3 = '甲问:\'能告诉我网址吗?\'';
$str_string4 = "乙答道:\"www.imooc.com\"";
// 美元符号标识的变量与单双引号
$love = "I love you!";
$string1 = "慕课网,$love"; 输出:慕课网,I love you!
$string2 = '慕课网,$love'; 输出:慕课网,$love
// Heredoc结构形式,很长的字符串
$string1 = <<<GOD
我有一只小毛驴,我从来也不骑。
有一天我心血来潮,骑着去赶集。
我手里拿着小皮鞭,我心里正得意。
不知怎么哗啦啦啦啦,我摔了一身泥.
GOD;
2.两种符合类型:
array 数组
object 对象
3.特殊类型:
resource 资源
资源是由专门的函数来建立和使用的,
// 例如打开文件、数据连接、图形画布。
$file=fopen("f.txt","r"); //打开文件
$con=mysql_connect("localhost","root","root"); //连接数据库
$img=imagecreate(100,100);//图形画布
// 对资源进行创建、使用和释放
$file_handle = fopen("/data/webroot/resource/php/f.txt","r");
if ($file_handle){
//接着采用while循环(后面语言结构语句中的循环结构会详细介绍)一行行地读取文件,然后输出每行的文字
while (!feof($file_handle)) { //判断是否到最后一行
$line = fgets($file_handle); //读取一行文本
echo $line; //输出一行文本
echo "<br />"; //换行
}
}
fclose($file_handle);//关闭文件
// 任何资源,在不需要的时候应该被及时释放。
// 忘记了释放资源,系统自动启用垃圾回收机制,在页面执行完毕后回收资源,以避免内存被消耗殆尽。
null
NULL是空类型,对大小写不敏感,NULL类型只有一个取值,表示一个变量没有值,
①当被赋值为NULL:var1 = null;/var1 = NULL;
②或者尚未被赋值:var_dump(var2);③或者被unset():var2);
③或者被unset():var2);③或者被unset():var3 = "节日快乐!";unset($var3);
这三种情况下变量被认为为NULL。
变量占用内存
echo $m1 = memory_get_usage();
// 获取当前PHP消耗的内存,结果:624432,
// 在变量中,由于变量占用的空间单元不一样(占的地盘大小不一样),分成几种数据类型。
详见:https://www.imooc.com/code/743
三、常量
常量可以理解为值不变的量(如圆周率);
或者是常量值被定义后,在脚本的其他任何地方都不可以被改变。分为自定义常量和系统常量
自定义常量
根据我们开发的需要,而定义的常量,它通过使用PHP中的函数define()定义。
(注:函数,我们可以理解为一个混凝土搅拌机,亦或是一个筛子,通过入口提供原料,然后出口产出结果,在函数中也允许入口不提供任何数据,出口也允许不返回任何值。)
// define()函数的语法格式为(3个参数):
bool define(string $constant_name, mixed $value[, $case_sensitive = true])
//“constant_name”为必选参数,常量名称,即标志符,常量的命名规则与变量的一致,但是要注意哦,它可不带美元符号哦。
//“value”为必选参数,它是常量的值。
//“case_sensitive”为可选参数,指定是否大小写敏感,设定为true表示不敏感,一般不指定第三个参数的情况下,默认第三个参数的值为false。
注:
string表示参数类型为字符串类型,
mixed表示参数类型可以接受为多种不同的类型,
case_sensitive = true表示默认为布尔类型TRUE
如:
$p = "PII";
define("PI",3.14);
define($p,3.14);
echo PI;
echo "<br />";
echo PII;
结果:
3.14
3.14
常量的作用
常量主要功效是可以避免重复定义,篡改变量值。在我们进行团队开发时,或者代码量很大的时候,对于一些第一次定义后不改变的量,如果我们使用变量,在不知情的情况下,使用同一变量名时,变量值就会被替换掉,从而会引发服务器执行错误的任务。
此外,使用常量还能提高代码的可维护性。如果由于某些原因,常量的值需要变更时候,我们只需要修改一个地方。例如在做计算中,起初我们取圆周率为3.14,于是很多计算中我们都使用3.14进行计算,当要求计算精度提高,圆周率需要取3.142的时候,我们不得不修改所有使用3.14的代码,倘若代码量比较多时,不仅工作量大,还可能遗漏。
系统常量
系统常量是PHP已经定义好的常量,我们可以直接拿来使用,常见的系统常量有:
echo __FILE__;
// php程序文件名。它可以帮助我们获取"当前文件在服务器的物理位置"。
echo __LINE__;
// PHP程序文件行数。它可以告诉我们,"当前代码在第几行"。
echo PHP_VERSION;
// 当前解析器的版本号。可以提前知道"PHP代码是否可被该PHP解析器解析"。
echo PHP_OS;
// 执行当前PHP版本的操作系统名称。"服务器所用的操作系统名称",可以根据该操作系统优化我们的代码。
常量取值
获取常量值的有两种方法取值。
第一种是使用常量名直接获取值;例如计算圆周率的面积:
define("PI",3.14);
$r=1;
$area = PI*$r*$r; //计算圆的面积
第二种是使用constant()函数。它和直接使用常量名输出的效果是一样的,
但函数可以动态的输出不同的常量,在使用上要灵活、方便,其语法格式如下:
$p="";
//定义圆周率的两种取值
define("PI1",3.14);
define("PI2",3.142);
//定义值的精度
$height = "中";
//根据精度返回常量名,将常量变成了一个可变的常量
if($height == "中"){
$p = "PI1";
}else if($height == "低"){
$p = "PI2";
}
$r=1;
echo $p; // 若不使用constant,输出的就是Pi1
$area= constant($p)*$r*$r;
echo $area;
mixed constant(string constant_name)
第一个参数constant_name为要获取常量的名称,也可为存储常量名的变量。
如果成功则返回常量的值,失败则提示错误信息常量没有被定义。
(注:mixed表示函数返回值类型为多种不同的类型,string表示参数类型为字符串类型)
判定常量是否被定义
如果常量被重复定义以后,PHP解析器会发出“Constant XXX already defined”的警告,
提醒我们该常量已经被定义过。在团队开发,或代码量很大的情况下,如何去判定一个常量是否被定义呢?
defined()函数可以帮助我们判断一个常量是否已经定义,其语法格式为:
define("PI1",3.14);
$p = "PI1";
$is1 = defined($p);
$is2 = defined("PI2");
var_dump($is1);
var_dump($is2);
结果:
bool(true)
bool(false)
//其中,赋值给$p目的就是间接来表明PI1已经被定义,所以$is1 = defined(PI1);亦可行。
// define方法是定义一个常量的方法,返回的是该已定义的常量;
// defined方法是判断一个常量是否定义,返回的是一个bool值(true/false)。
bool defined(string constants_name)
它只有参数constant_name,指的是要获取常量的名称,若存在则返回布尔类型true,否则返回布尔类型false; (注:bool表示函数返回值类型为布尔类型)
四、运算符
分为算术运算符、赋值运算符、比较运算符、三元运算符、逻辑运算符、字符串连接运算符、错误控制运算符。
算术运算符:
加法运算、减法运算、乘法运算、除法运算
赋值运算符:
(1)“=”:把右边表达式的值赋给左边的运算数。它将右边表达式值复制一份,交给左边的运算数。
换而言之,首先给左边的运算数申请了一块内存,然后把复制的值放到这个内存中。
(2)“&”:引用赋值,意味着两个变量都指向同一个数据。
它将使两个变量共享一块内存,如果这个内存存储的数据变了,那么两个变量的值都会发生变化。
$a = "学习PHP!";
$b = $a;
$c = &$a;
$a = "我天天在学习PHP!";
echo $b."<br />";
echo $c."<br />";
结果:
学习PHP!
我天天在学习PHP!
比较运算符
三元运算符
(“?:”)三元运算符也是一个比较运算符,
对于表达式(expr1)?(expr2):(expr3),如果expr1的值为true,则此表达式的值为expr2,否则为expr3。
$a = 78;//成绩
$b = $a >= 60 ? "及格": "不及格";
echo $b;
结果:及格
逻辑运算符
1、逻辑与:要求所有人都投票同意,才会通过某协议;
2、逻辑或:只要求一个人投票同意就行;
3、逻辑异或:只能有且只能有一个人投票同意;
4、逻辑非:某个人要反对,但是通过逻辑非,使其反对无效;
“与”和“或”有两种不同形式运算符的原因是它们运算的优先级(就是运算的有限顺序,比如我们小学的时候学习四则运算,加减乘除混合在一起啦,优先计算乘除,再计算加减)不同。
字符串连接运算符
(1)连接运算符(“.”):它返回将右参数附加到左参数后面所得的字符串。
$a = "张先生";
$tip = $a.",欢迎您在慕课网学习PHP!";
echo $tip."<br />";
结果:
张先生,欢迎您在慕课网学习PHP!
(2)连接赋值运算符(“.=”):它将右边参数附加到左边的参数后。
$b = "东边日出西边雨";
$b .= ",道是无晴却有晴";
$c = "东边日出西边雨";
$c = $c.",道是无晴却有晴";
echo $b."<br />";
echo $c."<br />";
结果:
东边日出西边雨,道是无晴却有晴
东边日出西边雨,道是无晴却有晴
错误控制运算符
PHP中提供了一个错误控制运算符“@”,对于一些可能会在运行过程中出错的表达式时,我们不希望出错的时候给客户显示错误信息,这样对用户不友好。于是,可以将@放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉;
如果激活了track_error(这个玩意在php.ini中设置)特性,表达式所产生的任何错误信息都被存放在变量$php_errormsg中,此变量在每次出错时都会被覆盖,所以如果想用它的话必须尽早检查。
需要注意的是:错误控制前缀“@”不会屏蔽解析错误的信息,不能把它放在函数或类的定义之前,也不能用于条件结构例如if和foreach等。
$conn = @mysql_connect("localhost","username","password");
// 这样就不会报错并打印出来
取整函数
ceil() 函数向上舍入为最接近的整数。
echo(ceil(0.60);
echo(ceil(0.40);
echo(ceil(5);
echo(ceil(5.1);
echo(ceil(-5.1);
echo(ceil(-5.9));
输出:
1
1
5
6
-5
-5
五、顺序结构
顺序结构就像一条直线,按着顺序一直往下执行。我们编写的代码默认都是按照顺序结构执行的。
条件结构:
if…else…
if(条件){
//分配服务器干的任务A
}else{
//分配服务器干的任务B
}
if…else if…
if(条件一){
//分配服务器干的任务A
}else if(条件二){
//分配服务器干的任务B
}
if…else if…else…
if(条件一){
//分配服务器干的任务A
}else if(条件二){
//分配服务器干的任务B
}else{
//分配服务器干的任务C
}
当两个条件对立时用if…else,当两个条件不存在对立关系时用if…else if…
switch…case…
switch (条件)
{
case 条件值一:
//任务一
break;
case 条件值二:
//任务二
break;
default:
//默认任务
}
switch…case…中的break:
break的作用是结束switch,亦可以避免冗长的 “if..else if..else”代码块。
//A例子
$num = 2;
$sum = 10;
switch($num){
case 1:
$sum = $sum + 10;
break;
case 2:
$sum = $sum + 10;
break;
case 3:
$sum = $sum + 10;
break;
default:
$sum = $sum + 10;
}
echo "A例子的值是:".$sum."<br />";
结果:A例子的值是:20
// 直接查询到num为2,sum加10后即刻break,跳出查找。
//B例子
$num = 2;
$sum = 10;
switch($num){
case 1:
$sum = $sum + 10;
case 2:
$sum = $sum + 10;
case 3:
$sum = $sum + 10;
default:
$sum = $sum + 10;
}
echo "B例子的值是:".$sum."<br />";
结果:B例子的值是:40
//查询到num为2后,sum加10,因为没break,继续执行case3,加了10,再执行了defailt。
while循环语句
while(条件){
//执行任务
}
首先判断某个条件是否符合(条件返回值是否为TRUE),
若符合则执行任务,执行完毕任务,再判断条件是否满足要求,符合则重复执行此任务,否则结束任务。
do while循环语句
do{
//执行任务
}while(条件)
首先执行任务(while语句是先判断条件是否成立,再执行任务),执行任务完毕,判断某个条件是否符合(条件返回值是否为TRUE),若符合则再次执行任务,执行完毕任务,继续判定条件。
while与do…while循环语句的区别:
while先判断条件是否成立,后执行循环,do...while先执行一次任务,再判断是否继续执行循环,也就是说do...while至少会执行一次任务。当条件为FALSE时,while中的任务会一次也不执行,do...while中的任务会执行1次。
for循环语句
for(初始化;循环条件;递增项){
//执行任务
}
for($i = 1,$i<=100;$i++){
echo "666";
}
for 语句中,“初始化”在循环开始前无条件求值一次,“循环条件”在每次循环开始前求值。如果值为 TRUE,则继续循环,执行循环体语句(执行任务)。如果值为 FALSE,则终止循环。“递增项”在每次循环之后被求值(执行)。其常用于循环执行代码块指定的次数。
foreach循环语句
常用于遍历数组,一般有两种使用方式:不取下标、取下标。
//eg
$students = array(
'2010'=>'令狐冲',
... ...
... ...
'2019'=>'宁中则',
);//10个学生的学号和姓名,用数组存储
(1)只取值,不取下标
foreach (数组 as 值){
//执行的任务
}
//使用循环结构遍历数组,获取学号和姓名
foreach($students as $v)
{
echo $v;//输出(打印)姓名
echo "<br />";
}
(2)同时取下标和值
foreach (数组 as 下标 => 值){
//执行的任务
}
//使用循环结构遍历数组,获取学号和姓名
foreach($students as $key =>$v)
{
echo $key.":".$v;//输出(打印)学号:姓名
echo "<br />";
}
?>
结构嵌套
条件嵌套
if里加if,
if (条件)
{
if 条件成立时执行的代码;
}
elseif (条件)
{
elseif 条件成立时执行的代码;
}
else
{
条件不成立时执行的代码;
}
循环嵌套
常用于遍历二维数组。
$students = array(
'2010'=>array('令狐冲',"59"),
... ...
... ...
'2019'=>array('宁中则',"90"),
);//10个学生的学号、姓名、分数,用数组存储
foreach($students as $key=>$val)
{ //使用循环结构遍历数组,获取学号
echo $key; //输出学号
echo ":";
//循环输出姓名和分数
foreach($val as $v)
{
echo $v;
}
echo "<br />";
}
#循环结构与条件结构嵌套
$students = array(
'2010'=>'令狐冲',
... ...
... ...
'2019'=>'宁中则',
);//10个学生的学号和姓名,用数组存储
$query = '2014';
//使用循环结构遍历数组,获取学号和姓名
foreach($students as $key =>$v)
{
//使用条件结构,判断是否为该学号
if($key == $query)
{
echo $v;//输出(打印)姓名
break;//结束循环(跳出循环)
}
}
在执行任务时,对于一些特殊的任务进行额外处理。
扩展学习:
PHP进阶篇-字符串操作:http://www.imooc.com/learn/726
来源:慕课网,内容持续更新中...
为什么有了这么完备的“慕课网学习系统”,还要做个复制粘贴呢?
1.这是一个笔记,是慕课课程的提炼,为学精一门语言而开辟的一个学习笔记文章。
2.再好的学习平台,也可能会有结束的一天,所以我现在做的事情,可能可以为优秀的平台在茫茫的互联网长河中留下一点点痕迹。
Read More ~
目前流行的9大前端框架
Vue
https://cn.vuejs.org
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
php交互:
https://www.cnblogs.com/cc1997/p/10522678.html
[Vuejs+php] MySQL数据转JSON传值到前端
React
https://react.docschina.org/
React 是一个用于构建用户界面的 JAVASCRIPT 库。React主要用于构建UI,很多人认为 React 是 MVC 中的 V(视图)。React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 2013 年 5 月开源。React 拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。
Angular
https://angular.io
AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVVM、模块化、自动化双向数据绑定、语义化标签、依赖注入等等。
QucikUI
http://www.uileader.com/product_quickui
QucikUI 4.0是一套完整的企业级web前端开发解决方案,由基础框架、UI组件库、皮肤包、示例工程和文档等组成。底层基于jquery构建。使用QucikUI 开发者可以极大地减少工作量,提高开发效率,快速构建功能强大、美观、兼容的web应用系统。
Layui
https://www.layui.com/
layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用。其外在极简,却又不失饱满的内在,体积轻盈,组件丰盈,从核心代码到 API 的每一处细节都经过精心雕琢,非常适合界面的快速开发。layui 首个版本发布于2016年金秋,她区别于那些基于 MVVM 底层的 UI 框架,却并非逆道而行,而是信奉返璞归真之道。准确地说,她更多是为服务端程序员量身定做,你无需涉足各种前端工具的复杂配置,只需面对浏览器本身,让一切你所需要的元素与交互,从这里信手拈来。
入门:
开始使用:https://www.layui.com/doc/
组件:https://www.layui.com/demo/
详细说明:https://www.layui.com/doc/element/layout.html
CDN引入:
https://www.layuicdn.com/
为 Layui 的广大用户提供免费的CDN静态库,非常稳定、快速、免费的 Layui开源组件项目 国内CDN加速服务
PHP交互:
https://fly.layui.com/jie/32688/
PHP后台怎么写才能使返回的数据渲染layui表格呢
Avalon
http://avalonjs.coding.me/
avalon2是一款基于虚拟DOM与属性劫持的 迷你、 易用、 高性能 的 前端MVVM框架, 拥有超优秀的兼容性, 支持移动开发, 后端渲染, WEB Component式组件开发, 无需编译, 开箱即用。
Dojo
https://dojo.io/
Dojo致力于实现最大的互操作性。Web组件提供了一种机制,可以在Dojo应用程序中利用非Dojo组件,并在非Dojo应用程序中轻松使用基于Dojo的小部件。Dojo为Web组件提供一流的支持。您今天做出的决定不应该将您锁定在未来的决策中。
Ember
https://emberjs.com/
Ember.js可能是最固执己见的主流框架,这也是其最大的优势。它有创建Ember.js应用程序的正确方法,通常只有一种方法来创建应用程序。Ember.js更类似于一个产品或平台,在那里你会到一个供应商的长期支持和维护。Ember.js提供了对其平台的全面版本管理,升级工具以及对API升级的强大指导和工具。成熟,是对Ember.js的一个很好的总结。
Aurelia
https://aurelia.io/
Aurelia是一个令人惊叹的框架,它在不牺牲功能的情况下采用简单而干净的代码。在本教程中,我们将通过构建“Todo”应用程序向您介绍Aurelia的简单性。您将看到应用程序代码的简洁程度,您将学习Aurelia的几个基本概念和功能。
Read More ~
Pytorch预训练的Resnet模型 Danbooru2018
原作者:https://github.com/RF5/danbooru-pretrained
准备环境
Pytorch (>1.0)
提取图片的以下特征:
Read More ~
工具网站
二次元识图工具网站
https://trace.moe/ 找番剧网站,有大量日番资源
优点:找到图片番剧后可实时预览
缺点:只能识别番剧,魔改、加水印、模糊等图片不可用
https://saucenao.com/ 找画网站,接入p站等数据
优点:识别很多画师原创图及同人图
缺点:查找结果为英文、日文、罗马音等。需要借助翻译工具
https://www.baidu.com/ 搜索引擎类,百度谷歌等
优点:可找的范围很广,包括但不限于:动漫、各类MV、影视剧等等,全中文
缺点:结果并不是很精确需要进一步搜索,可能出现奇怪的结果
人肉识别@凉风Kaze[doge]
优点:快 准 狠
缺点:消耗一个三连(误)
各种搜索引擎,某度,某狗,某歌等等……
优点:谷歌搜索更广更专业
缺点:国内没有,可尝试这个第三方国内版https://gfsoso.fcczp.com/image.html
线上 PDF 工具
https://smallpdf.com/cn/
优点:功能一应俱全、简单好用
缺点:免费次数有限
Read More ~
动漫人物数据集
Danbooru :
Danbooru2019:
https://www.gwern.net/Danbooru2019
A LARGE-SCALE CROWDSOURCED AND TAGGED ANIME ILLUSTRATION DATASET
一个大规模的众包和标记动画插图数据集
Danbooru2017:
https://www.gwern.net/Danbooru2019#danbooru2017
Danbooru2018:
https://www.gwern.net/Danbooru2019#danbooru2018
Getchu : (原址需科学上网访问)
百度云:
https://pan.baidu.com/s/1bTWoEcJRzXJaMM8jELPCBA
CSDN:
https://blog.csdn.net/ONE_SIX_MIX/article/details/95935010
github 仓库:
https://github.com/One-sixth/getchu_character_picture_grabber
Niconico : (仅限于学术目的的图)
需要科研机构申请才可以下载。【放弃~】
nico-opendata:https://nico-opendata.jp/en/index.html
At Niconico, we are providing a wide variety of data from our services,
to be used for academic purposes. 仅限用于学术目的。
包含:
Nico-Illust 超过40万张图像(插图)
This dataset contains over 400,000 images (illustraions) from Niconico Seiga and Niconico Shunga.
Niconico Seiga is a community for posting illustrations. 一个发布插图的社区。
Niconico Shunga is a community for posting illustrations, where submission of explicit content is allowed. Viewers under age 18 are prohibited in this website. 本网站禁止18岁以下观众观看。
其他:
IIIT-CFW
https://zhuanlan.zhihu.com/p/25138563
集合了各种类型的数据集(好多没见过的,感觉很全?可能有用,得再看看。),
比较麻烦的就是得登陆某个网站、再用度盘下载。
各领域公开数据集下载
“整理了一些网上的免费数据集,分类下载地址如下,希望能节约大家找数据的时间。”
真实人脸:
VGGFace2 : A large scale image dataset for face recognition
http://www.robots.ox.ac.uk/~vgg/data/vgg_face2/index.html#about
9000+身份,330w+图像
Read More ~
PHP、JS、CSS基操
PHP
免费快速学习php
PHP入门篇:https://www.imooc.com/learn/54
PHP进阶篇:https://www.imooc.com/learn/26
更多:https://www.imooc.com/search/?words=php
PHP环境LAMP/LNMP安装与配置
https://www.imooc.com/learn/703
PHP+Mysql+Ajax实现分页
https://www.imooc.com/learn/1117
PHP生成随机数的几种方法
https://www.cnblogs.com/jjxhp/p/9601147.html
PHP 升级到5.5后MySQL的代替法
https://blog.csdn.net/apple_llb/article/details/51406648
php调用exe一直加载怎么回事?
https://ask.csdn.net/questions/231711
还有可能是在exec()后面给予了任务,导致一直加载。
cmd命令语句还在后台运行中,没有黑框弹出来,需等待更长时间。
使用PHP实现用户注册登录的功能
https://github.com/Micanss/PHP-Register-Login
... ...
JavaScript
报错TypeError: $(...).live is not a function
解决:用 .on 代替 .live , 旧的版本被替换了
https://blog.csdn.net/qq_36370731/article/details/79016451
报错TypeError: $(…).ajaxForm is not a function
可能:
1.jquery版本和bootstrap冲突
2.同时加载了两次jquery
https://stackoverflow.com/questions/35261239/ajaxform-is-not-a-function#
【JavaScript】按钮绑定点击事件-onCliek事件
https://blog.csdn.net/kye055947/article/details/79619538
iframe 自适应高度,更改内容时iframe高度怎么根据新的内容高度自动改变
https://blog.csdn.net/txqd1989/article/details/78551943
... ...
CSS 前端
css input[type=file] 样式美化,input上传按钮美化
https://blog.csdn.net/cuilei210/article/details/78842231
菜鸟教程:CSS 按钮示范
https://www.runoob.com/css3/css3-buttons.html
cmd
##运行CMD里面,怎么把得到的结果数据保存为文本文件
https://zhidao.baidu.com/question/596846191.html
用批处理命令获取文件夹名称
创建test.bat,双击运行内容如下:
@Echo off
dir /b>test.txt
https://zhidao.baidu.com/question/936329819153763892.html
Read More ~
Tensorflow利用inception_v3模型和retrain实现图像分类训练
参考文献:
https://blog.csdn.net/ZeyiRTangent/article/details/87886445
#准备:
1.五个分类好存有各自类别的文件夹【文件夹及其内图片的名称全小写,绝对路径名中不能包含中文】
2.inception_v3模型下载,无需解压【http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz】
3.克隆/下载 https://github.com/tensorflow/tensorflow & https://github.com/tensorflow/hub (在~hub-master\examples\image_retraining中找到retrain.py文件,待会需要定位文件位置)
。。。
可能遇到的问题:
查看Windows下TensorFlow对python版本的要求
https://blog.csdn.net/sinat_23619409/article/details/84202596
windows10 conda python多版本切换
https://www.cnblogs.com/simuhunluo/p/8540459.html
windows 怎么更新 Python 版本(现有 Python 版本装了很多库)卸载重装,工作量就大了,有没有什么直接更新的方式,不会删库那种办法
https://www.v2ex.com/amp/t/477473
conda(anaconda)删除清华源,改回原源
https://blog.csdn.net/qinglingLS/article/details/89363368
PackagesNotFoundError: The following packages are not available from current channels:
https://blog.csdn.net/miao0967020148/article/details/85230430
迁移学习关于下载不了inception-v3,自己网络又加载不了的问题
https://blog.csdn.net/nationalline450/article/details/82085007
原址:
https://tfhub.dev/google/imagenet/inception_v3/feature_vector/3
出现以下报错:
Warning! ***HDF5 library version mismatched error***
The HDF5 header files used to compile this application do not match
the version used by the HDF5 library to which this application is linked.
Data corruption or segmentation faults may occur if the application continues.
This can happen when an application was compiled by one version of HDF5 but
linked with a different version of static or shared HDF5 library.
You should recompile the application or check your shared library related
settings such as 'LD_LIBRARY_PATH'.
You can, at your own risk, disable this warning by setting the environment
variable 'HDF5_DISABLE_VERSION_CHECK' to a value of '1'.
Setting it to 2 or higher will suppress the warning messages totally.
Headers are 1.10.4, library is 1.10.5
SUMMARY OF THE HDF5 CONFIGURATION
=================================
General Information:
-------------------
HDF5 Version: 1.10.5
Configured on: 2019-03-04
... ... ...
... ... ...
Function Stack Tracing: OFF
Strict File Format Checks: OFF
Optimization Instrumentation:
Bye...
(多版本导致冲突)pip uninstall h5py
Ubuntu: HDF5报错: HDF5 header version与HDF5 library不匹配
https://www.cnblogs.com/platero/p/4077934.html
Python环境中HDF5报错:HDF5 library version mismatched error
https://blog.csdn.net/zhaoyin214/article/details/104095227
使用conda装完plt/pillow后,错误又出来了,详细看,conda在安装pillow时帮你安装hdf5版本了:
再卸载一次h5py,然后可能提示:
ModuleNotFoundError: No module named 'matplotlib' , python导入'matplotlib'包报错
解决:https://blog.csdn.net/weixin_43670105/article/details/87911820
【不能解决】 UserWarning: h5py is running against HDF5 1.10.2 when it was built against 1.10.3, this may ca...
https://www.jianshu.com/p/c248bbea1da7
tensorflow版本:2.0过高怎么办?
解决:
适当回退tensorflow版本:
pip install tensorflow==1.13.1
安装Tensorflow 2.0后的坑has no attribute 'contrib'
https://blog.51cto.com/cfy10/2446977?source=dra
ModuleNotFoundError: No module named 'tensorflow.contrib.rnn'
https://blog.csdn.net/u014742995/article/details/86496292
提示python版本过高、冲突(tensorflow版本)怎么办?
conda install python=3.6
Anaconda中将python 3.7版本退回python 3.6版本
https://blog.csdn.net/Fhujinwu/article/details/85851587
遇到 label xxx no image found 类问题:
如 提示:
CRITICAL:tensorflow:Label 51 has no images in the category validation.
Tensorflow - No valid folders of images found at XXXXX #10104
ERROR:tensorflow:No valid folders of images found at
https://github.com/tensorflow/tensorflow/issues/10104
http://www.codeclip.com/4141.html
参考文献:
https://blog.csdn.net/ZeyiRTangent/article/details/87886445
相似推荐,有助思考:
https://blog.csdn.net/weixin_38663832/article/details/80555341
https://blog.csdn.net/EZ_guachong/article/details/90048846
https://github.com/sourcedexter/tfClassifier
https://stackoverflow.com/questions/45076911/tensorflow-failed-to-create-a-newwriteablefile-when-retraining-inception
迁移学习
https://blog.csdn.net/chaipp0607/article/details/73380390
https://blog.csdn.net/Night___Raid/article/details/102975023
Read More ~
TensorFlow支持的动漫人物识别网站的存储库
开始:
在知乎上偶然阅读到这位作者的文章:https://zhuanlan.zhihu.com/p/70511070
参考:
https://gitee.com/littlebuzi/danbooru-pretrained
https://github.com/freedomofkeima/MoeFlow
https://github.com/freedomofkeima/transfer-learning-anime
https://github.com/nagadomi/animeface-2009
https://github.com/KichangKim/DeepDanbooru/releases/tag/v1-20191108-sgd-e30
Read More ~
About Download
下载
https://www.4kdownload.com/zh-cn/downloads
https://github.com/soimort/you-get
Read More ~
Python基操
Python 爬虫 beautifulsoup4 基础
pycharm、python环境搭建好后
装载html文档,使用beautifulsoup的第一步是把html文档装载到beautifulsoup中,使其形成一个beautifulsoup对象。
import requests
from bs4 import BeautifulSoup
url = "xxxx"
r = requests.get(url)
htmls = r.text
#print(htmls)
soup = BeautifulSoup(htmls, 'html.parser')
初始化BeautifulSoup类时,需要加入两个参数,第一个参数即是我们爬到html源码,第二个参数是html解析器,常用的有三个解析器,分别是”html.parser”,”lxml”,”html5lib”,官网推荐用lxml,因为效率高,当然需要pip install lxml一下。
例子
html对象:
uls='''
<h3>Header3 (Start here)</h3>
<ul>
<li>List items</li>
<li>Etc...</li>
</ul>
<h3>Header 3</h3>
<ul>
<li>List items</li>
<ul>
<li>Nested list items</li>
<li>Nested list items</li></ul>
<li>List items</li>
</ul>
<h2>Header 2 (end here)</h2>
lis = []
for ul in uls:
for li in ul.findAll('li'):
if li.find('ul'):
break
lis.append(li)
for li in lis:
print(li.text)
#print(li.text.encode("utf-8"))
https://www.jb51.net/article/156907.htm
https://blog.csdn.net/huxiny/article/details/79679066
百度图片爬虫:
https://blog.csdn.net/qq_40774175/article/details/81273198
Python代码报错 FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。
检查路劲是否有中文,有则换成英文或数字
https://zhidao.baidu.com/question/1309336445243832299.html
Python 读取和输出到 txt 文件
with open("test.txt", "r",encoding='UTF-8') as f: # 打开文件
data = f.read() # 读取文件
print(data)
读入这种文件时:
test.txt
樱之宫莓香
轰焦冻
鬼灯
和泉守兼定
str=[]
with open("test.txt", "r",encoding='UTF-8') as f: # 打开文件
data = f.readlines()
for line in data:
line = line.strip('\n') # 去掉列表中每一个元素的换行符
str.append(line)
print(str)
参考:
https://blog.csdn.net/zhang__shuang_/article/details/82527314
Python读取文件时出现UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position xx: 解决方案:
https://blog.csdn.net/zhang__shuang_/article/details/82527314
①:Python 正则表达式 re 中出现'str' object has no attribute 'findall'
②:出现TypeError: 'list' object is not callable异常的情况与解决方法
③:利用python将中文名转换为英文名
python递归遍历目录和子目录下的所有文件,并将文件目录存入列表
import os
def get_file(root_path,all_files=[]):
'''
递归函数,遍历该文档目录和子目录下的所有文件,获取其path
'''
files = os.listdir(root_path)
for file in files:
if not os.path.isdir(root_path + '/' + file): # not a dir
all_files.append(root_path + '/' + file)
else: # is a dir
get_file((root_path+'/'+file),all_files)
return all_files
# example
path = './raw_data'
print(get_file(path))
https://blog.csdn.net/weixin_39858881/article/details/86543689
Python中复制文件的两种简单方式
方法一:借助操作系统中本身的拷贝命令
import os
os.system("xcopy C:\\1.txt D:")
方法二:借助shutil模块来完成拷贝操作
import shutil
shutil.copyfile('C:\\1.txt', 'D:\\1.txt')
Read More ~
Pr+Au+MMD入门
Pr入门:
https://www.jianshu.com/p/d88b5b8e6520
https://baijiahao.baidu.com/s?id=1625249302308705665&wfr=spider&for=pc
下载:
http://www.32r.com/search.asp?wd=Premiere%20Pro
Au入门:
https://jingyan.baidu.com/article/cbf0e500d381706faa2893e0.html
下载:
http://www.32r.com/search.asp?wd=audition
MMD入门:
1.下载
https://www.bilibili.com/video/av20662019/
http://blog.sina.com.cn/s/blog_15fe57f4d0102x6g9.html
http://www.3322.cc/search.asp?wd=miku
2.教程
http://blog.sina.com.cn/s/blog_15fe57f4d0102x7mm.html
http://tieba.baidu.com/p/5868731425
http://blog.sina.com.cn/s/blog_15fe57f4d0102x66y.html
https://zhidao.baidu.com/question/488239911574372932.html
https://tieba.baidu.com/p/5020448822?pn=1
Read More ~
Win 搭建 Go + Beego + Idea
1.安装 Go
选择window版本:https://golang.google.cn/dl/
2.安装 idea
下载:IntelliJ IDEA 2018.3 安装+永久激活:(版本需小于2019,有可能plugins商店使用异常)
idea 中配置安装 go
https://blog.csdn.net/cui_yonghua/article/details/90900336
idea 中安装 bee
IDEA打开命令行快捷键:Alt + F12
5.安装 beego
输入:
//检验
go version
//下载beego框架
go get -u github.com/astaxie/beego
go get -u github.com/beego/bee
//等待片刻
下载完后:
go bee version(检验)
//成功
6.第一个 go 项目
在windows环境下搭建beego环境 以及第一个项目
Read More ~