[……]
「MySQL」- 基于位置复制
内容简介[……]
「MySQL」- 搭建主从复制(基于位置复制)
第一步、修改配置(主库)
修改主库配置文件,以启用 binlog 功能:
[mysqld]
server_id = 26
log_bin = /var/log/mysql/binlog
binlog_format = ROW
expire_logs_days = 30
max_binlog_size = 500M
sync_binlog = 1
创建用于复制的用户,从库将使用该用户进行复制:
GRANT REPLICATION SLAVE ON *.* TO ‘replication’@’%’ IDENTIFIED BY ‘XXXXXXXX’;
至此启动数据服务即可。
第二步、修改配置(从库)
从库配置文件:
[mysqld]
server_id = 27
relay_log = /var/log/mysql/relay_log
启动数据库服务。
第三步、启用从库复制
STOP SLAVE;
CHANGE MASTER TO master_host = ‘host’, master_port = ‘port’,
master_user = ‘username’, master_password = ‘password’,
master_log_file = ‘binlog file’, master_log_pos = ‘position’;
START SLAVE;[……]
「MySQL」- 搭建主从复制(基于 GTID 复制)
第一步、修改主库配置
主库配置文件:
[mysqld]
gtid_mode=ON
enforce-gtid-consistency=ON
log_bin = /var/log/mysql/binlog
binlog_format = ROW
expire_logs_days = 30
max_binlog_size = 500M
sync_binlog = 1
创建用于复制的用户,从库将使用该用户进行复制:
GRANT REPLICATION SLAVE ON *.* TO ‘replication’@’%’ IDENTIFIED BY ‘XXXXXXXX’;
至此启动数据服务即可。
第二步、修改从库配置
从库配置文件:
[mysqld]
gtid_mode=ON
enforce-gtid-consistency=ON
启动数据库服务。在启动从库时,应该指定 –skip-slave-start 选项,因为此时从库还没有指定好复制参数。
第三步、启用从库复制
CHANGE MASTER TO master_host = ‘host’, master_port = ‘port’,
master_user = ‘username’, master_password = ‘password’,
MASTER_AUTO_POSITION = 1;
START SLAVE;
参考文献
MySQL 5.7 Reference Manual/Setting Up Replication Using GTIDs[……]
「MySQL」- 双主复制(基于GTID复制)
内容简介
所谓「双主复制」,其实就是“互做主从复制”。即每台master主机,既是master角色,又是slave角色。这样,任何一方所做的变更,都会通过主从复制到另一台主机的数据库中,以实现数据的一致性。这就是「双主复制」。
数据库复制有两种方式:基于GTID的复制;基于二进制日志位置的复制。本文讨论的前者「基于GTID的复制」。
系统环境
操作系统:
CentOS Linux release 7.4.1708 (Core)
软件版本:
MySQL 5.6.45
网络信息:
master-01: 10.10.50.115
master-02: 10.10.50.116
安装MySQL服务
(跳过,详细参考「MySQL 5.6 (CentOS 7)」一文)
配置服务
# On master-01
#!/bin/sh
################################################################################
# (0)创建必要的目录:
################################################################################
mkdir -pv /var/log/mysql/
chown mysql.mysql /var/log/mysql/
################################################################################
# (1)修改/etc/mysql/my.cnf文件:
# !!!发行版不同,配置位置也不相同,请不要照搬!请不要照搬!请不要照搬!
################################################################################
mv /etc/mysql/my.cnf /etc/mysql/my.cnf.backup
cat <<MYCNF >> /etc/mysql/my.cnf
server_id = 1
auto-increment-offset = 1
auto-increment-increment = 2
log_bin = mysql-bin
binlog_format = MIXED[……]
「MySQL」- 双主复制(基于位置的复制)
内容简介
所谓「双主复制」,其实就是“互做主从复制”。即每台master主机,既是master角色,又是slave角色。这样,任何一方所做的变更,都会通过主从复制到另一台主机的数据库中,以实现数据的一致性。这就是「双主复制」。
数据库复制有两种方式:
基于GTID的复制
基于二进制日志位置的复制
本文讨论的后者「基于二进制日志位置的复制」,但是「基于GTID的复制」可能是更好的选择。
系统环境
属性
参数
操作系统:
CentOS Linux release 7.4.1708 (Core)
软件版本:
MySQL 5.6.45
网络信息:
master-01: 10.10.50.115
master-02: 10.10.50.116
第一步、安装数据库服务
参考 MySQL 5.6 (CentOS 7) 笔记,详细过程跳过。
配置服务
# On master-01
#!/bin/sh
################################################################################
# (0)创建必要的目录:
################################################################################
mkdir -pv /var/log/mysql/
chown mysql.mysql /var/log/mysql/
################################################################################
# (1)修改/etc/mysql/my.cnf文件:
# !!!发行版不同,配置位置也不相同,请不要照搬!请不要照搬!请不要照搬!
################################################################################
mv /etc/mysql/my.cnf /etc/mysql/my.cnf.backup
cat <<MYCNF >> /etc/mysql/my.cnf
[mysqld]
server_id = 1
auto-increment-offset = 1
auto-inc[……]
「MySQL」- 使用 mysqldump 进行数据备份与恢复(迁移)
第一步、在旧主机中导出备份
备份单个数据库:
# 该备份文件不包含 CRETAE DATABASE 与 USE 语句,在恢复时需要选择数据库。
mysqldump test > dump.sql
# 该备份文件包含 CRETAE DATABASE 与 USE 语句,可直接用于恢复。
mysqldump –databases “<dbname>” > “<dbname>”.sql
备份多个数据库:
#!/bin/sh
# 备份 db1 数据库中的 db2、db3 这两张表
mysqldump db1 db2 db3 > dump.sql
# 备份 db1、db2、db3 数据库
mysqldump –databases db1 db2 db3 > dump.sql
备份所有数据库:
#!/bin/sh
# 备份所有数据库
mysqldump –all-databases > dump.sql
# 备份所有数据库,并添加 DROP DATABASE 语句
mysqldump –all-databases –add-drop-database > dump.sql
备份输出使用 gzip 压缩:
#!/bin/sh
mysqldump | gzip > outputfile.sql.gz
附加说明: 1)这里没有对函数、存储过程、视图等内容进行备份; 2)在使用 mysqldump 命令时,注意 –databases,–table 等选项的配合使用; 3)在 MySQL 8.0 前,使用 –all-databases 即可;在 MySQL 8.0 后,还要指定 –routines 和 –events 选项;
第二步、传输数据到新的主机
#!/bin/sh
scp [database name].sql [username]@[servername]:path/to/database/
第三步、在新数据库主机上的操作
#3 导入数据
#!/bin/sh
mysql -uroot -p < /path/to/newdatabase.sql
# 如果备份语句里没有 CRAETE 和 USE 语句,需要选择数据库
# 如果导出文件为 gzip 格式:
zcat /path/to/file.sql.gz | mysql -u ‘root’ -p your_database
#4 用户迁移
#!/bin/sh
# 在新的数据库主机上创建用户。(略过……)
简化操作[……]
「XtraBackup」- 备份实例及实例恢复
问题描述
本文将介绍如何使用 XtraBackup 工具进行 MySQL 数据库实例备份,以及如何使用该备份数据进行恢复。
注意事项 1)、这里“备份实例”指备份整个数据库实例,并非“单个数据库的全量备份”; 2)、在备份中将包含 mysql、sys、perfomance_schema 数据库以及由用户创建的数据库;
创建数据库的备份
第一步、执行备份命令
#!/bin/sh
xtrabackup –backup –user=root –password –target-dir=/data/backups/
备份时间取决于数据库大小;并且可以取消,这并不会影响数据库。
关于备份命令 命令行使用xtrabackup –backup选项进行备份。 命令行使用xtrabackup –target-dir指定备份目录(不存在,则自动创建)。 如果备份目录已经存在且不为空,并且会产生错误(不会覆盖现有文件)。 如果 InnoDB 数据或日志文件在不同目录中,需要在命令行选项指定其所子目录。
注意事项: 日志复制线程会检查事务日志,以确定是否存在需要读取的日志记录。但是如果在日志记录被读取之前已经被写入,就会产生错误。
使用备份恢复数据
准备工作(前提条件)
1)需要将 MySQL 停机; 2)数据库 datadir 目录必须为空;
第一步、进行“预备”操作
什么是“预备”(Prepare)? 在备份完成后,生成的文件不能马上用于恢复。因为备份的数据不是在特定时间点生成的:在备份过程中,数据是在不同时间点复制过来的。所以这些备份不能马上用于恢复,需要先处理。
执行预备命令 执行如下命令来处理备份数据:
#!/bin/sh
xtrabackup –prepare –target-dir=/data/backups/
在 xtrabackup 中,内置修改版 InnoDB 引擎,用于处理备份文件。因此预备动作可以在任何主机中执行。
关于工具版本 在备份数据与预备数据时,建议使用相同版本 xtrabackup 工具。虽然不同版本也是可以的(只要都支持特定数据库版本),为了减少不必要的麻烦,依旧建议使用相同版本进行操作。
附加说明 不建议中断该过程,因为中断会破坏数据完整性。
另外如果该全量备份用于增量备份,需要使用xtrabackup –apply-log-only选项。否则无法用于增量备份,参考「Incremental Backups (XtraBackup)」部分。
第二步、进行数据恢复
本质上只是数据库文件的复制:
#!/bin/sh
# 下面的三种方法都是可以的
xt[……]
「MySQL」- 恢复数据到特定时间点
问题描述
数据误删、统计某个时间点前的数据(没有时间戳字段)等等,有很多场景需要我们将数据恢复到特定时间点。
本文笔记将记录将数据恢复到特定时间点的方法。
解决方法
方法:将数据恢复到特定时间点:(1)要么拥有在该时间点创建的备份;(2)要么需要知晓 SQL 语句执行历史,在曾经备份基础上进行 SQL 重放。
对比:对于(1)方法,不具有普适性,很难预测未来需要哪些时间点的数据。我们通常使用(2)方法,在已有备份的基础上,使用 binlog 重放。
补充:当然除了 binlog 以外,只要有 SQL 执行历史,在理论上都可以用于重放。
mysqldump + binlog
过程:将使用 mysqldump 创建的备份导入到数据库,然后再进行 binlog 重放。 要求:对于使用 mysqldump 备份,需要在创建备份时记录 binlog 位置,以在重放时指定该位置。
XtraBackup + binlog
过程:将使用 Xtrabackup 创建的备份导入到数据库,然后再进行 binlog 重放。 补充:对于使用 XtraBackup 备份,在备份目录中保存有 binlog 位置,可以直接恢复数据。
使用 XtraBackup + binlog 恢复
前提条件及注意事项
1)要拥有历史备份数据,以作为 binlog 重放的基础; 2)在 binlog 中包含众多数据库的修改历史,注意过滤以防止影响其他数据库;
第一步、使用备份恢复
使用 Xtrabackup 恢复数据,数据恢复过程不再赘述。
第二步、确定重放范围(关键步骤)
查看数据库当前 binlog 文件状态,以确定我们即将使用的 binlog 文件仍存在:
mysql> SHOW BINARY LOGS;
+——————+———–+
| Log_name | File_size |
+——————+———–+
| mysql-bin.000001 | 126 |
| mysql-bin.000002 | 1306 |
| mysql-bin.000003 | 126 |
| mysql-bin.000004 | 497 |
+——————+———–+
查看当前正在使用的 binlog 文件(File):
mysql> SHOW MASTER STATUS;
+——————+———-+————–+———–[……]
「XtraBackup」- 备份数据的“预备”(Prepare)操作
问题描述
使用 XtraBackup 产生的备份数据无法直接使用 在数据备份(–backup)后,由于数据文件复制的时间点不同,因此数据不一致而无法使用。另外 InnoDB 会将这些数据文件视为损坏,将拒绝启动。
如何才能使备份数据正常使用,以用于数据库恢复 需要对数据进行“预备”(Prepare)操作,使数据文件完全一致,然后才能用于数据恢复及在 InnoDB 中运行。
环境描述
软件版本:Xtrabackup 2.2
附加说明
在预备操作时发生了什么? 在预备时,XtraBackup 将启动内嵌的修改版 InnoDB 引擎,以处理复制的备份文件,是数据文件保持一致。
执行预备操作的位置 可以在任意服务器中进行预备操作。
配置文件问题 在备份过程中,会在备份目录生成 backup-my.cnf 文件,保存 InnoDB 配置信息。
在预备操作时,需要该配置文件,会被自动加载。错误的配置文件会导致错误的恢复。
软件版本问题 (1)旧版 XtraBackup 备份的数据,可以使用新版 XtraBackup 进行预备操作,但是反过来不行。 (2)另外新版 XtraBackup 可能移除对旧版数据库的支持,也无法用于数据预备操作。比如 XtraBackup 2.2 不再支持 MySQL 5.0,需要使用 XtraBackup 2.1 进行预备操作。
总的来说,保证版本相同就不会有太大问题。
预备命令使用方法
第一次执行
预备操作非常简单,无需关注底层细节:
#!/bin/sh
xtrabackup –prepare –target-dir=/data/backups/mysql/
在预备操作完成并成功后,将显示如下输出:
101107 16:40:15 InnoDB: Shutdown completed; log sequence number <LSN>
第二次执行
可以在备份数据上再次预备:
#!/bin/sh
xtrabackup –prepare –target-dir=/data/backups/mysql/
此时将生成 InnnoDB 日志文件(否则在 MySQL 启动时自动生成,将耗费些时间):
xtrabackup: This target seems to be already prepared.
xtrabackup: notice: xtrabackup_logfile was already used to ‘–prepare’.
101107 16:54:10 InnoDB: Log file ./ib_logf[……]
「MySQL」- 错误日志
# Error Log
https://dev.mysql.com/doc/refman/5.7/en/error-log.html[……]
「MySQL」- 数据库配置
问题描述
该笔记将记录:与 MySQL 配置相关的内容,及相关问题的解决办法。
解决方案
配置文件的位置:
#!/bin/sh
mysql –help | grep -A 1 ‘Default options’
# 输出:
# Default options are read from the following files in the given order:
# /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
# 如上,/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 是配置文件的位置。
FIXME MySQL,动态修改配置,并持久保存,无重启;
关于配置文件优化
当正确把 MySQL 的基本项配置之后,剩下的主要精力要放在查询、索引等方面的优化。 不要配置当作救命稻草。有些特殊配置确实可以显著提升性能,但是这些配置不能作为基本配置。 如果我们不懂,就不会去配置,更不会到网上搜索配置来直接使用。[……]
「MySQL」- 表结构同步
主题:介绍MySQL表结构同步方法。
MySQL测试环境与生产环境的表结构同步方法。
方法一、Navicat
使用 navicat,“工具” => “结构同步”。 这个“结构同步“可以生成“差异SQL”,勾选要同步的内容,执行”运行“即可同步到生产环境。这里不再赘述。
注意: Navicat的同步方式是直接运行SQL语句。额,这么做并不好因,为DDL操作会锁表,大数据量的时候就尴尬了。推荐使用:pt-online-schema-change
方法二、mysqldiff
(1). 首先比较数据库结构差异。
比较有很多方法,下面是我知道的:
mysqldiff。关于mysqldiff的使用请查看:《mysqldiff》
额,也可以:导出表结构;使用diff比较;。
使用Navicat的”结构同步“,直接生成差异SQL。
(2). 然后执行差异SQL语句,修改表结构。
建议使用pt-online-schema-change(关于pt-online-schema-change查看:《pt-online-schema-change》)进行结构同步。
之所以使用pt-online-schema-change的原因只是因为DDL的锁表太让人尴尬了。你要是坚持使用DDL命令的话,等你吃亏的时候你就知道了。
参考文献
5.7 mysqldiff — Identify Differences Among Database Objects[……]
「MySQL」- 结束查询
第一步、查看当前进程
— 方法一、关键是 ID 与 INFO 列
SELECT
*
FROM
INFORMATION_SCHEMA. PROCESSLIST;
— 方法二、通常用于查看
SHOW FULL PROCESSLIST;
第二步、结束某个进程
— 通过某个 ID 结束查询
KILL “<ID>”;
— 如果由大量的SQL语句需要结束,可以使用如下SQL生成
SELECT
concat(‘KILL ‘, id, ‘;’)
FROM
information_schema.PROCESSLIST
WHERE
USER = ‘username’;
相关链接
mysqladmin processlist mysqladmin kill
参考文献
How to find MySQL process list and to kill those processes? 13.7.6.4 KILL Syntax 13.7.5.29 SHOW PROCESSLIST Syntax 24.18 The INFORMATION_SCHEMA PROCESSLIST Table[……]
「MySQL」- 调整密码策略等级
问题描述
在修改数据库密码时,产生如下错误提示:
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
问题原因
第一种,在执行 GRANT ALTER ON `itop`.* TO “itop”@”127.0.0.1”; 也会产生该错误。经过我们简单的测试,可能是因为用户不存在而导致该问题的出现。本文不讨论这种情况,而且该问题也较容易解决。
第二种,由于对用户设置的密码没有满足 MySQL 密码策略的要求。这是我们要讨论并解决的问题。
解决方法
解决办法有两种:(1)使用符合密码策略的密码;(2)修改配置以降低密码策略。
自然应该采用(1)方法,但是在某些情况下,我们不得不采用(2)方法以解决问题。我们这里介绍的也是(2)方法。
查看当前密码策略
mysql> SHOW VARIABLES LIKE ‘validate_password%’;
+————————————–+——–+
| Variable_name | Value |
+————————————–+——–+
| validate_password_dictionary_file | |
| validate_password_length | 8 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM |
| validate_password_special_char_count | 1 |
+————————————–+——–+
修改密码策略
密码策略的修改实际就是配置参数的修改,编辑 my.cnf 的 [mysqld] 部分:
[mysqld]
validate_password_policy=LOW
或者调整全局变量:
SET GLOBAL validate_password_length = 6;
SET GLOBAL validate_passw[……]
「innotop」-
innotop,MySQL及InnoDB事务/状态监控。
章节列表
innotop的功能
innotop安装
相关命令选项
innotop安装
从发行版的源中安装
#!/bin/sh
# Ubuntu 16.04 LTS:mariadb-client-10.0和mysql-client-5.7中都包含该命令,根据自己的需要来安装。
apt-get install mysql-client-5.7
从源码中安装 到Github上下载源码,下载地址:https://github.com/innotop/innotop.git 安装方法在INSTALL文件中,这里不再介绍。
命令行语法格式
To monitor servers normally:
innotop
To monitor InnoDB status information from a file:
innotop /var/log/mysql/mysqld.err
To run innotop non-interactively in a pipe-and-filter configuration:
innotop –count 5 -d 1 -n
To monitor a database on another system using a particular username and
password:
innotop -u <username> -p <password> -h <hostname>
命令简述
innotop monitors MySQL servers. Each of its modes shows you a different
aspect of what’s happening in the server. For example, there’s a mode for
monitoring replication, one for queries, and one for transactions.
innotop refreshes its data periodically, so you see an updating view.
innotop has lots of features for power users, b[……]
「Haskell」
Haskell,高级的、纯函数编程语言。
更新日期:2020年09月11日 @IGNORECHANGE GHC 编译器
Cabal Cable,用于构建和打包Haskell库和程序的一个系统。这么说可能太抽象,Cabal类似于Perl的cpan,Python的pypi,Ruby的gem。
Stack Stack是用于Haskell开发的跨平台构建工具,用于处理工具链的管理。
参考文献
Haskell Homepage[……]
「Cabal」- 仓库、包管理
Cable,用于构建和打包 Haskell 库和程序的一个系统。Cabal 类似于 Perl 的 cpan,Python 的 pypi,Ruby 的 gem;
Cabal 的特征
自动安装 GHC,安装在隔离的位置; 安装项目需要的包; 构建项目 测试项目 对项目进行基准测试
如何安装 Cabal 中的包
安装 Cabal 中的包有两种方式:
手动安装
使用 Cabal-Install 安装;
有关 Cabal 包的安装详细内容可参见官方文档
方式一:使用手动安装
# 1. 进入下载的 Cabal 包中;
# 2. 配置、构建、安装
runhaskell Setup configure
runhaskell Setup build
runhaskell Setup install
# Note: runhaskell 命令属于 GHC。所以要先安装 GHC;
方式二:使用 Cabal-Install 安装
安装 Cabal-Install 包,此时会安装 cabal 命令
使用 cabal 命令来安装软件包。cabal 的使用方法,可查看官方手册
Cabal Install
Cabal-Install 包提供了 cabal 命令,通过对 Haskell 库和程序的获取、配置、编译、安装进行自动化处理,简化了 Haskell 软件的管理过程。这些包装必须使用 Cabal 进行准备,并应存在于Hackage中;
首先,Cabal library 安装 Cabal-Install 依赖于 Cabal library,所以样先安装 Cabal library; 先下载 Cabal library,然后进行手动安装:
#!/bin/sh
# 1. 进入下载的 Cabal library 中;
# 2. 配置、构建、安装
runhaskell Setup configure –prefix=/usr/local
runhaskell Setup build
runhaskell Setup install
# Note: runhaskell 命令属于 GHC。所以要先安装 GHC;
然后,安装 Cabal-Install 下载 Cabal-Install,进入源码目录中,有个 bootstrap.sh 脚本,使用./bootstrap.sh 进行安装:
#!/bin/sh
./bootstrap.sh –sandbox /usr/local
# 查看帮助可以使用:
# ./bootstrap.sh –help
升级 Cabal-Ins[……]
「PYTHON」- Quickly and Eeffectively
问题描述
该笔记将整理:与 Python 编程相关的内容,多与 Python 编程语言相关。
学习路线
阅读官方,我只看了前四章节。鉴于之前有其他语言的编程经验,所以可以快速进行编码。剩下的一路 stackoverflow 搜索。
运行环境
环境设置:Python Setup and Usage
语言学习
基础入门:The Python Tutorial 标准类库:The Python Standard Library 语言参考:The Python Language Reference 特殊话题:Python HOWTOs
模块安装
安装模块:Installing Python Modules 发布模块:Distributing Python Modules
高级进阶
Extending and Embedding the Python Interpreter Python/C API Reference Manual
其他话题
Python Frequently Asked Questions
相关连接
https://www.python.org/ https://pypi.python.org/pypi https://www.riverbankcomputing.com/news http://www.crifan.com/files/doc/docbook/python_beginner_tutorial/release/html/python_beginner_tutorial.html http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/ https://docs.python.org/2.7/[……]
「Python」- Quick Start and Tutorial
问题描述
该部分笔记将整理:与 Python 语言学习笔记及常用文档。
语法基础
if __name__ = ‘__main__’:
print(“Hello World.”)
定义变量
WIP
定义函数
WIP
笔记及相关文章
标准对象和模块的描述:「The Python Standard Library」
正式的语言定义:「The Python Language Reference」
使用C/C++编写扩展:「Extending and Embedding the Python Interpreter」「Python/C API Reference Manual」
属于词汇表:「Glossary」
交互式输入编辑和历史替换:「Interactive Input Editing and History Substitution」
交互执行,选项-c执行命令,选项-m执行模块;
命令行选项及环境变量:「Command line and environment」
命令行中的参数传递:import sys
when no script and no arguments are given, sys.argv[0] is an empty string
When the script name is given as ‘-‘ (meaning standard input), sys.argv[0] is set to ‘-‘
When -c command is used, sys.argv[0] is set to ‘-c’
When -m module is used, sys.argv[0] is set to the full name of the located module
Options found after -c command or -m module are not consumed by the Python interpreter’s option processing but left in sys.argv for the command or module to handle.
交互模式:「Interactive Mode」
文件编码:在第二行或者第一行使用:# -*- coding: encoding -*-
可用的文件编码:「codecs」
支持的数据类型:int, float, Decimal, Fraction, complex numbers, String, List, Dictionary, …[……]
「Python」- 语法学习笔记
问题描述
该笔记将记录:在学习 Python 过程中,我们遇到的与其他语言不同的地方,以及常见问题处理。
解决方案
pass
类似于空代码块({});
Ternary Operator(三元运算符)
a, b = 10, 20
min = a if a < b else b # 能够嵌套
min = a < b and a or b # [expression] and [on_true] or [on_false]
min = (b, a) [a < b]
min = {True: a, False: b} [a < b]
min = (lambda: b, lambda: a)[a < b]())
from…import…as
import os
import os as RealOs
from os import path as p
try…except…else
# 抛出异常
raise Exception(‘I know Python!’)
raise NotImplementedError
# 捕获异常
try:
return True
except ZeroDivisionError:
print(“division by zero!”)
except IOError as exc:
print(‘An exception flew by!’)
else:
print(“result is”, result)
finally:
return False
yield
1)与 return “类似”,但是会从“停止”处继续执行(或者说,继续执行 yield 之后的代码)。 2)yield 返回的是 Generator 对象(但是,在使用时,很像可迭代的列表)。
如下示例,将演示 yield 的特性:
# 示例一:
def simpleGeneratorFun():
yield 1
yield 2
yield 3
for value in simpleGeneratorFun():
print(value) # 将顺序打印 1 2 3
# 示例二、使用如下方法,单独调用(与「示例一」类似)
gen = simpleGeneratorFun()
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
# 示例三、与前两种不同
# 每次调用 simpleGeneratorFun() 将返回新的 Generator 对象
print(next([……]
「Python」- return(学习笔记)
从函数中,返回多个参数
Returning Multiple Values in Python – GeeksforGeeks
在 Python 中,我们使用 return Tuple 的方式,从函数中返回多个参数,并直接赋值给变量。
# A Python program to return multiple
# values from a method using tuple
# This function returns a tuple
def fun():
str = “geeksforgeeks”
x = 20
return str, x; # Return tuple, we could also
# write (str, x)
# Driver code to test above method
str, x = fun() # Assign returned tuple
print(str)
print(x)
参考文献
The Python return Statement: Usage and Best Practices – Real Python[……]
「Python」- 数据类型(学习笔记)
Text Type: str Numeric Types: int, float, complex Sequence Types: list, tuple, range Mapping Type: dict Set Types: set, frozenset Boolean Type: bool Binary Types: bytes, bytearray, memoryview
用于存储数据集的四种数据类型
List、Set、Dictionary、Tuple:
Type
Example
Features
Tuple
(1, 2, 3, 4)
ordered, unchangeable, allow duplicates
List
[1, 2, 3, 4]
ordered, changeable, allow duplicates
Set
{1, 2, 3, 4}
unordered, unchangeable, do not allow duplicates
Dictionary
{“a”: 1, “b”: 2, “c”: “3”, “d”: “4”}
unordered, changeable, does not allow duplicates
获取变量类型(type)
x = 5
s = “geeksforgeeks”
y = [1,2,3]
print(type(x)) # class ‘int’
print(type(s)) # class ‘str’
print(type(y)) # class ‘list’
参考文献
Python Data Types type and isinstance in Python – GeeksforGeeks Python Sets / Python Lists / Python Dictionaries / Python Tuples[……]
「Python」- 字典操作(学习笔记)
问题描述
该笔记将记录:常用的 Python Dictionary 操作
解决方案
d = {‘1’: ‘one’, ‘3’: ‘three’, ‘2’: ‘two’, ‘5’: ‘five’, ‘4’: ‘four’}
# 判断是否包含某个 Value
‘one’ in d.values()
# 从字典中取值,
dictionary[“Name”]
dictionary.get(“Name”) # 推荐,该方法能够设置默认值,不会 rasie KeyError
参考文献
How to check if a value exists in a dictionary (python) python – Why dict.get(key) instead of dict[key]? – Stack Overflow How to fix Python KeyError Exceptions in simple steps?[……]
「Python」- int
解决方案
进制转换
bytes <=> hex
>>> b’\xde\xad\xbe\xef’.hex() # bytes => hex
‘deadbeef’
>>> bytes.fromhex(‘deadbeef’) # hex => bytes
b’\xde\xad\xbe\xef’
int <=> hex
int(“deadbeef”, 16) # 3735928559
int(“0xdeadbeef”, 0) # 如果包含 0x 前缀,则无需指定进制
>>> hex(16)
‘0x10’
参考文献
What’s the correct way to convert bytes to a hex string in Python 3? – Stack Overflow[……]
「Python」- 常用列表操作(学习笔记)
问题描述
该笔记将记录:在 Python 中,List(列表)的常用操作;
解决方案
最常用的列表操作
# 定义:创建 list 结构
color_list = [“Red”,”Green”,”Blue”, “Black”, “White”, “Yellow”]
empty_list = list()
# 增加
color_list.append(“Pink”)
color_list.extend([“Pink”])
# 删除
color_list.remove(“Black”)
color_list.pop(3)
# 修改
color_list.sort()
color_list.reverse()
# 长度:计算 list 长度
len(color_list)
# 截取:子列表
sub_list = color_list[0:4] # [“Red”,”Green”,”Blue”, “Black”]
合并列表
c1 = [“Red”,”Green”,”Blue”]
c2 = [“Orange”,”Yellow”,”Indigo”]
c3 = c1 + c2
交集、并集、差集
python获得两个数组交集、并集、差集的方法
set_a = set(foo_a)
set_b = set(foo_b)
# 并集
set_a.union(set_b)
# 差集
set_a.difference(set_b) # 仅存与a中的元素
# 交集
set_a.intersection(set_b)
深拷 与 浅拷
list1 = [1,2,3,4]
list2 = list1 # 浅拷贝,即引用同个内存地址;
list2 = list1.copy() # 深拷贝,即完全复制原始数据;
参考文献
Python将两个数组合并成一个数组,多维数组变成一维数组 Declare an empty List in Python – GeeksforGeeks[……]
「Python」- 常用字符串操作(学习笔记)
最常用的字符串操作
# 长度:计算某个字符串长度
len(“foo”) # 3
# 截取:截取字符串的某段
str = “foo-bar”
sub_str1 = str[0:4] # foo-
sub_str2 = str[-4:] # -bar
# 分割:使用字符串切割字符串
txt = “127.0.0.1:8080”
txt.split(“:”) # [‘127.0.0.1’, ‘8080’]
# 替换:替换字符串的某些内容
str = “This is string example….wow!!! this is really string”
str.replace(“is”, “was”)
判断字符串为空
python – How to check if the string is empty? – Stack Overflow
if not myString:
# do stuff
两边去空白字符
“”.strip()
“”.lstrip()
“”.rstrip()
格式化字符串
print(“%s %s” % (“foo”, “bar”))
编码转换
urllib.parse.quote(query) # 该函数不转码斜线
urllib.parse.quote_plus(query) # 转码空格到加号的所有字符
# Unicode decode
str.encode(“utf-8”).decode(“unicode_escape”)
二进制 ⇔ 普通字符串
b’bin string’.decode(‘ascii’)
Base64, Endcoding and Decoding
Encoding and Decoding Base64 Strings in Python
import base64
message = “Python is fun”
message_bytes = message.encode(‘ascii’)
base64_bytes =[……]
「Python」- 读取文件与写入文件
问题描述
该笔记将记录:在 Python 中,常用文件操作,以及常见问题处理。
解决方案
WIP
输入输出
username = input(“Username:”)
password = input(“Password:”)
文件操作
读取文件
# open and read the file after the appending:
f = open(“demofile2.txt”, “r”)
file_content = f.read()
f.close()
# with open()
with open(“demofile2.txt”, “r”) as f:
file_content = f.read()
print(file_content)
写入文件
f = open(“demofile2.txt”, “a”)
f.write(“Now the file has more content!”)
f.close()
常用文件操作
################################################################################################################################################################
# Read only the first line of a file?
# https://stackoverflow.com/questions/1904394/read-only-the-first-line-of-a-file
################################################################################################################################################################
infile = open(‘filename.txt’, ‘r’)
firstLine = infile.readline()
infile.readline() # String
infile.readlines() # List
infile.writelines([“”]) #
##############################################################################################################################[……]
「Python」- 正则表达式
使用 re.match 匹配中文
#!/usr/bin/python2.7
# encoding=utf8
import re
testString = u”–story=10000 –user=风清扬 测试”
testString = unicode(“–story=10000 –user=风清扬 测试”, “utf-8″)
matched = re.match(ur”–story=(\d+)\s+–user=([\u4e00-\u9fa5 ]+)\s*$”, testString)
print(matched.group()) # –story=10000 –user=风清扬 测试
print(matched.group(0)) # –story=10000 –user=风清扬 测试
参考文献
Python: Check if a string contains chinese character? Find all Chinese text in a string using Python and Regex 参考Python2.7的re库 How to convert a string to utf-8 in Python Python 3/Regular Expression HOWTO[……]
「Python」- 常用调试方法汇总
问题描述
在调试代码或者学习新框架时,我们需要通过调试的方式,以追踪代码的执行路径。毕竟,我们不能指望每种框架、每个应用都有相关的说明文档,来让我们学习。所以,我们需要掌握常用的调试方法,用于代码调试、框架学习、追踪执行路径。
该笔记将记录:在 Python 中,常用的调试方法、代码执行路径追踪等等方法,以及常见问题处理。
解决方案
通过 traceback.print_stack() 追踪
import traceback
traceback.print_stack()
通过 sys.setprofile(tracefunc) 追踪
def tracefunc(frame, event, arg, indent=[0]):
if event == “call”:
indent[0] += 2
print(“-” * indent[0] + “> call function”, frame.f_code.co_name)
elif event == “return”:
print(“<” + “-” * indent[0], “exit function”, frame.f_code.co_name)
indent[0] -= 2
return tracefunc
import sys
sys.setprofile(tracefunc)
# sys.settrace(tracefunc) # settrace() 的粒度更细,比如在每行调用时,将执行 tracefunc 函数
通过 trace 模块
python -m trace –listfuncs foo.py # 但是,只会显示一次,而且是在执行结束后。
python -m trace –trace foo.py # 在执行的过程中,显示函数调用
python -m trace –trackcalls foo.py # 显示每一行
参考文献
traceback — Print or retrieve a stack traceback — Python 3.9.2 documentation debugging – print python stack trace without exception being raised – Stack Overflow sys — System-specific parameters and functions — Python 3.9.2 documentation python – How do I print functions as[……]