Python 实现将文档文件中的同一种字符交替替换成不同的字符(0.1 版)

图 1. 符号约定,使用 https://carbon.now.sh 生成

如果图 1 显示不正常(由于对 SVG 格式的兼容性问题,在有些浏览器中会出现这种情况),你可以点击这里查看本文符号约定的 PNG 格式版

需求分析

最近我开始在博客上分享一些考研数学题的解题过程,因此,自然少不了要输入数学公式。我写文章的习惯是,首先,使用 Markdown 把文章写好,然后再复制到博客里发布,由于包括 WordPress 在内的许多博客平台都是支持 Markdown 的,因此这么做一直没有什么问题。

不过,在 Markdown 中输入数学公式的语法是类似这样的:

$\sqrt{2}$

可是,我在 WordPress 中使用的显示数学公式的插件要求的语法是类似这样的:

【latex】\sqrt{2}【/latex】

这样一来,每当我要在我的个人网站发布一篇带有数学公式的文章时,我都需要把一个公式两边的 “$” 分别替换成 “【latex】” 和 “【/latex】”.

手动替换很慢,所以我写了一段 Python 代码实现自动替换。

代码实现

注:以下代码在 Windows 10 中文家庭版 64 位系统下的 Python 3.7.0 环境中测试成功。

编写该程序需要注意的一点是必须实现对文件内容的逐字符读取和替换,如果是逐行读取替换的话,那么一次遍历就会把整行的所有 “$” 都替换成 “【latex】”, 不符合要求。

无注释版代码:

a=2  
with open(('1.md'), 'r',encoding='UTF-8') as f:
    for line in f:
        for ch in line:
            if ch=='$':
                if a % 2 == 0:
                    ch='【latex】'
                    a = a + 1
                elif a % 2 != 0:
                    ch = '【/latex】'
                    a = a + 1
            print (ch,end='')

有注释版代码:

a=2  
with open(('1.md'), 'r',encoding='UTF-8') as f:
# 读取 1.md 文件中的内容,可以读取中文。
    for line in f:
    # 遍历一行
        for ch in line:
        # 遍历一行中的每一个字符
            if ch=='$':
                if a % 2 == 0:
                # 如果 a 为偶数,把 $ 换成 【latex】
                    ch='【latex】'
                    a = a + 1
                    # 操作完成,改变 a 的值
                elif a % 2 != 0:
                # 如果 a 为奇数,把 $ 换成 【/latex】
                    ch = '【/latex】'
                    a = a + 1
                    # 操作完成,改变 a 的值
            print (ch,end='')
            # 输出本行的操作结果(end='' 保证了输出完一整行后再换行)

EOF

Python实现猜数字游戏1.0版

"""
功能:
随机生成一个数字,最多有3次猜测机会,如果第一次没有猜对,则从第二次猜测开始会提示玩家所猜的数字是大了还是小了。
运行环境:
Python 3
"""
import random    #调用生成随机数的模块random
secret = random.randint(1,10)    #调用random模块中生成整型随机数的函数randint,生成的随机数范围在1到10之间,包括1和10.
print('-----猜数字游戏1.0版--------')
temp = input("猜一下我现在想的是哪个数字吧,你只有3次机会哦:")
guess = int(temp)
i = 0
if (guess == secret):
    print("第一次就猜对了,好厉害!!!")
while (guess != secret) and (i < 2):
    temp = input("猜错啦,再猜一次吧:")
    guess = int(temp)
    if guess == secret:
        print("Wow!你猜的真准!")
    else:
        if guess < secret:
            print("猜的小了")
        else:
            print("猜的大了")
    i = i+1

Python报错:SyntaxError: Non-ASCII character ‘\xe5’ in file 1.py on line 6, but no encoding declared…

具体报错内容:

File "1.py", line 6
SyntaxError: Non-ASCII character '\xe5' in file 1.py on line 6, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

继续阅读“Python报错:SyntaxError: Non-ASCII character ‘\xe5’ in file 1.py on line 6, but no encoding declared…”

远程代码仓库URL地址变更后本地仓库的配置方法

作者:荒原之梦
今天修改了一个远程仓库的项目名称,导致Git仓库的地址发生了变化,Push代码时显示”Git仓库找不到“。
下面是远程仓库地址变更后本地仓库的配置方法:
进入本地仓库根目录,右键打开Git Bash,输入:
git remote set-url origin <new url>
至此,本地仓库完成仓库地址配置更新。

Git Push:error: Couldn’t set refs/remotes/origin/master;error: update_ref failed for ref ‘refs/remotes/origin/master’:

作者:荒原之梦

今天使用Git Push代码时产生错误:

Rename from 'XXXX/.git/refs/remotes/origin/master.lock' to 'XXX/.git/refs/remotes/origin/master' failed. 
Should I try again? (y/n)
输入y 还会重复出现上述提示,输入n 则会出现下面的错误提示:
error: Couldn't set refs/remotes/origin/master error: update_ref failed for ref 'refs/remotes/origin/master':
不过,虽然出现了如上错误提示,但是代码是可以正确Push到远程仓库的。

问题解决过程:

进入.git/refs/remotes/origin 目录:
cd .git/refs/remotes/origin
发现并没有master.lock 这个文件,所以想到是否可以通过创建master.lock 这个文件解决问题,输入:
echo ref: refs/remotes/origin >master.lock
创建master.lock .
经测试,问题解决。

Windows上使用Git托管代码到Coding

作者:荒原之梦

Git简介:

Git是一款分布式版本控制系统,可用于项目的版本管理。Git可以管理本地代码仓库与远程代码仓库间的连接以及进行版本控制,使得我们可以在本地离线进行修改等操作,之后再将代码提交到远程代码仓库,方便团队协作。

Git官网:

https://git-scm.com/

Git百度百科:

https://baike.baidu.com/item/GIT/12647237?fr=aladdin

Git Github主页:

https://github.com/git

在使用Git与远程仓库进行代码交互的时候会遇到一些操作动作,如“克隆”、“推送”和“拉取”等,这些动作的英文名称以及对应的含义如下:

名称
功能
Clone(克隆) 将远程仓库里面的代码复制一份到本地
Push(推送) 将代码推送到远程仓库中
Fetch(获取) 获取远程仓库中发生变化的代码
Merge(合并) 将远程仓库中发生变化的代码与本地存储的没有发生变化的代码合并以使本地仓库和远程仓库代码保持一致
Pull(拉取) 功能等同于“fetch+merge”
Commit(提交) 将修改推送到本地仓库中
Fork 将代码从别人的远程仓库复制到自己的远程仓库
Pull request 将自己远程仓库中的代码复制一份到别人的远程仓库(该操作将会询问对方是否接受)

如果要将修改Push到别人的远程仓库,必须首先Fork别人的代码到自己的远程仓库,修改完再Push. 而不能直接Clone别人的代码到本地,这样再想Push到别人的远程仓库是不行的。另外,经实践发现,直接Clone自己的远程仓库到本地再Push到自己的远程仓库也是不行的。

具体步骤如下:

1 下载并安装Git

如无自定义需要,使用默认配置安装即可。

2 在Coding上添加一个项目

在我的这篇文章 使用Coding Pages托管网站中有在Coding上添加一个项目的介绍,可以参考。

3 配置SSH

生成SSH公钥,输入:

ssh-keygen -t rsa -C XXX@XXX.XXX

XXX@XXX.XXX 为注册Coding时使用的邮箱。

之后会提示输入用于保存公钥的文件:

Enter file in which to save the key (/c/Users/Master/.ssh/id_rsa):

这里直接回车,使用默认的文件id_rsa 保存即可。

接下来会提示:

Enter passphrase (empty for no passphrase):

这里是提示我们是否要为提交代码的操作设置密码。 如果设置密码则在提交项目时就需要使用密码。回车表示密码为空,即不设置密码。

之后提示:

Enter same passphrase again:

再次回车或输入刚才设置的密码。

之后会看到公钥成功创建的提示:

Your public key has been saved in /c/Users/Master/.ssh/id_rsa.pub.

查看公钥,输入:

cat /c/Users/Master/.ssh/id_rsa.pub

将公钥复制下来,登陆Coding,在我的账户->SSH公钥 处粘贴刚才生成的公钥,之后点击添加 。

如果粘贴后公钥末尾有空白行或空格要删掉它们。

4 创建本地代码仓库并Clone远程代码仓库

在本地新建一个文件夹A。

 “A”为远程仓库的仓库名

进入A,右键点击Git Bash Here .

初始化仓库,输入:

git init

之后会在A里面产生一个.git 隐藏文件夹。

Clone远程仓库(远程仓库中没有代码也可以这样执行),在本地仓库中输入:

git clone A https://git.coding.net/XXXXXX.git

“A”为远程仓库的仓库名

其中https://git.coding.net/XXXXXX.git  为远程仓库的HTTPS地址,可以在项目的代码 标签处找到:

图 1

之后会弹出登录凭证验证窗口:

图 2

输入Coding的用户名(一般为邮箱)和登陆密码点击确定 即可。

如果远程仓库里面有代码,Clone执行完毕后我们就可以在本地看到远程仓库中的代码了。

5 将本地代码仓库的更改推送到远程代码仓库

现在假设我们在本地代码仓库新建了一个文件1.txt . 下面演示如何将这个更改推送到远程代码仓库:

进入本地代码仓库中,查看代码状态,输入:

git status

这时Git会用红色字体显示1.txt ,说明这个文件是和远程仓库中的内容不一致的。

将所有更改都加入到暂存区域,准备上传:

git add .

也可以使用

git add 文件名

指定加入到暂存区域的文件。

但是当我们输入:

git commit

准备提交代码时,回车却出现了下面的警示信息:

*** Please tell me who you are.

Run

git config --global user.email "you@example.com"

git config --global user.name "Your Name"

to set your account's default identity.

Omit --global to set the identity only in this repository.

根据上述提示,输入:

git config --global user.email "you@example.com"

回车。

输入:

git config --global user.name "Your Name"

回车。

再次执行:

git commit

这次没有出现错误提示,而是打开了一个文本。按下i 开始输入所提交代码的备注,之后保存并退出。

之后输入:

git push origin master

这时我们在浏览器上再刷新Coding账号中的该项目就可以看到刚才推送过来的1.txt 文件了。

输入:

git status

会看到:

nothing to commit, working directory clean

至此,本地更改已经全部推送到远程仓库。

使用Coding Pages托管网站

作者:荒原之梦

Coding官网:https://coding.net

Coding Pages官网页面:https://coding.net/pages/

具体过程如下:

1 注册Coding账户

可以先使用邮箱注册,之后再绑定手机号(如果不想升级成银牌会员也可以不绑定手机号)。

2 完善资料,升级成银牌会员

普通会员没有自定义域名的权限,银牌会员可以绑定自定义域名。

3 创建一个项目

图 1

项目名称一栏填写:

username.coding.me

其中username 必须是当前Coding账号的用户名。

项目属性设置为私有 。

勾选启用README.md文件初始化项目 复选框。

点击创建项目 。

4 上传网页文件

点击代码->上传文件 开始上传网页文件。

选中并打开网页文件。

填写提交说明 。

点击提交到master分支 。

提交代码时,不会上传文件夹。因此如果本地中在一个文件夹里面还有其他文件夹,要注意单独上传这些文件夹里面的内容,如果其他文件中引用了该文件夹中的内容要注意修改路径。

5 开启Coding Pages服务

Pages服务提供有“静态Pages”和“动态Pages”两种模式,下面的过程使用的是静态Pages.

点击Pages服务 。

部署来源 中选中master分支点击保存 。

这时我们就可以看到Coding Pages成功运行的提示:

图 2

6 绑定自定义域名

Coding帮助文档:绑定自定义域名

在域名注册商的域名管理页面将自己购买的域名的CNAME 记录到pages.coding.me .

图 3

图 4

添加解析记录时要添加@www 两个主机纪录,绑定域名时也要绑定XXX.XXX 和WWW.XXX.XXX 两个。这是为了保证无论用户在输入我们的网址时是否输入了www. 都可以打开网站。如果不添加www 主机纪录,输入WWW.XXX.XXX 是打不开我们的网站的。

图 5
图 5

Pages服务 页面分别将XXX.XXX 和WWW.XXX.XX 输入自定义域名 框,点击绑定 。

图 6

www.daohanggou.wang 是“完全限定域名FQDN”(即“网址”),而dohanggou.wang 是“域名”。

7 开启强制HTTPS访问

使用HTTPS加密传输网站文件可以在很大程度上防止中间人攻击。为了最大程度的确保全站HTTPS加密,网站中使用的外链也应该是HTTPS加密的URL,例如图片的URL。

8 添加Hosted by Coding Pages信息

Hosted by Coding Pages有文字版和图片版两种,文字版代码如下:

<p>Hosted by <a href="https://pages.coding.me" style="font-weight: bold">Coding Pages</a></p>

如果没有购买Coding会员,可以将上面的代码(或Hosted by Coding Pages图片)添加到网站首页,之后选中已放置 Hosted by Coding Pages 复选框就会自动提交审核,如果审核通过则我们的Coding Pages在被访问时就不会加载Pages跳转页。

C语言实现计算双基回文数详解

作者:荒原之梦

双基回文数的定义:

如果一个正整数n至少在两个不同的进位制(二进制<=进制=<十进制)b1和b2下都是回文数,则称n是双基回文数。
根据定义,简单的说就是在二进制到十进制之间(包括十进制和二进制),如果n在这其中任意两个进制上是回文数,则n就是双基回文数。

程序功能:

输入正整数S<10^6,输出比S大的最小双基回文数

源代码及注释:

#include<stdio.h>

//把主函数放前面比较好看
int main()
{
int n;
//定义n作为sjHuiWen函数中形式参数s的实际参数
int count=0; //count用于计数,初始值为0
printf("Enter a number:");

scanf("%d",&n);
//读取要处理的数字 ,如2200,该数字不一定为回文数,因为我们想要求的只是比该数字大的最小回文数
int a=n;//使用a先把n的值保存一下

bool sjHuiWen(int m,int base); //定义base代表进制
//下面会调用sjHuiWen函数,调用之前要先声明一下

while(count!=2)
{
n++;
count=0;
for(int base=2;base<=10;base++)
{
if(sjHuiWen(n,base))
//if判断只会在括号内为true时才会执行下一步操作,如果sjHuiWen函数返回true,则表示n是回文数
{
count++; //n是回文数则+1
}
if(count==2) break;
//调用sjHuiWen函数判断n是不是回文数,如果在两个进制下都是回文数,则跳出循环

}
}
printf("比%d大的最小双基回文数为:%d\n",a,n);

return 0;
}

//定义sjHuiWen函数 ,功能是判断数字n在进制base下是不是回文数
bool sjHuiWen(int m,int base)//m是形式参数,n是实际参数
//定义一个函数sjHuiWen,函数类型为布尔类型(由于return返回的值flag是布尔类型,所以函数就是布尔类型)
{
int str[10],i = 0; //定义一个数组str,长度为40
bool flag = true; //定义一个布尔类型的变量flag,赋初值为true
while(m) //m是一个整型变量,当m还是一个整型变量时就继续循环,直到m不是一个整型变量
{
str[i++] = m%base;//取余,从m的个位开始将每一位上的数字变成base位进制并依次存入数组
m /= base; //每取一次余数,就把最后一位的数字去掉
}

for(int j = 0;j <= i/2;j++)
{
if(str[j] != str[i-j-1]){
flag = false;
}else
return true;
}
return flag;
}

运行截图:

图 1

解决C语言程序报错:return type defaults to‘int’

下面是通过自定义一个函数printN,之后在main函数中调用printN,使得可以通过输入整数N,将从1到N的全部整数都打印出来的程序。
但是在编译过程中却报错:

return type defaults to ‘int’

产生报错的原因:

printN的默认返回值类型是int类型的,这样调用printN函数的main函数就需要定义为:

int main()

而不是:

main()

产生报错的程序:

#include<stdio.h>

//自定义printN函数
void printN (int N){
    int i;
    for(i = 1; i <= N; i++){
        printf("%d\n",i);
        }
        return;
    }

//声明printN函数
void printN(int N);

main(void)
{
    int N;
    printf("请输入N:");
    scanf("%d",&N);//传入参数
    printN(N);//调用printN函数
return 0;
    }

改正之后的程序:

#include<stdio.h>

//自定义printN函数
void printN (int N){
    int i;
    for(i = 1; i <= N; i++){
        printf("%d\n",i);
        }
        return;
    }

//声明printN函数
void printN(int N);

int main(void)
{
    int N;
    printf("请输入N:");
    scanf("%d",&N);//传入参数
    printN(N);//调用printN函数
return 0;
    }

在Windows下同时安装Python2.x和Python3.x

作者:荒原之梦

前言:

Python现在是两个版本共存,Python2.x和Python3.x都同时在更新。但是Python2.x和Python3.x的区别还是很多的(以后我可能会写一篇文章列举一下Python2.x和Python3.x的具体区别)。如果是刚开始学习Python的话,那么使用Python3.x更好,但是目前(2017年10月8日)很多服务(例如SQLMap)依赖的Python环境都是Python2.x才能提供的,为了解决这个问题我们可以同时安装两个版本的python,即把python2.x和python3.x都安装上,在使用过程中根据需要调用不同的Python环境。

操作环境:

Python-2.7.14

Python-3.6.3

Windows10专业版

操作前的准备:

在安装Python2.x和Python3.x之前,我们需要在磁盘根目录下建一个文件夹,命名为“Python”,在Python文件夹下面再建两个文件夹,分别命名为“Python2”和“Python3”。其实这么做不是必须的,只是将Python2.x和Python3.x分别对应安装在这两个路径下会方便我们今后寻找(需要注意的是,Python的安装路径中不允许有空格,如果在你的安装路径中一定要将不同单词分隔开来的话,可以使用大小写字母区分,或者使用下划线“_”。另外,安装路径中最好不要出现中文)。

Python的官网地址:https://www.python.org/

Python官网上提供有Python2.x和Python3.x for Windows的下载。其中Python2.x是以Microsoft Installer(微软格式安装包)的形式提供的,文件后缀为.msi,Python3.x是以.exe可执行程序的形式提供的,安装的第一步都是双击运行。

一、安装Python2.x

双击之后就是按照提示点击就可以了,都是常规的安装方法。唯一需要改动的地方就是变一下安装路径,方便我们下一步的配置Path环境变量。

配置环境变量:

a.Windows上Python Path环境变量配置

此电脑->右键属性->高级系统设置->环境变量->系统变量->Path:

图 1

之后编辑环境变量,将Python2.x的安装目录粘贴上,一路点击确定就完成了Python2.x的Path环境变量配置:

图 2 可以看到Windows10的Path环境变量是分栏显示的

图 3

b.Win/8.1/8/7/XP上Python Path环境变量配置

Win/8.1/8/7/XP配置环境变量的操作都比较类似,而且和在Windows10上的步骤也相似(下面的Path环境变量截图使用的是Windows7):

计算机->右键属性->高级系统设置->环境变量->系统变量->Path:

之后编辑Path环境变量。不过这里需要注意的是,由于Win/8.1/8/7/XP的环境变量并没有像Windows10一样分栏显示,因此再添加Path环境变量时不要忘记用英文分号“;”将新添加的环境变量与原有的环境变量分隔开:

图 4

配置好环境变量后重更新打开DOS窗口(可以用cmd,也可以用powershell,但一定要是配置好环境变量后重新打开的,不能用配置好环境变量之前打开的DOS窗口)输入python即可检查Python是否安装成功:

图 5

二、安装Python3.x

Python3.x已经不需要我们在手动配置环境变量,我们只需要在安装时做一些调整,改默认安装路径到我们刚才建立的Python3文件夹里就可以了。关于如何在电脑里安装Python3.x,可以查看我之前的一篇博文Python基础之Windows下Python3.x环境搭建.

三、区分Python2.x和Python3.x

在Python2.x和Python3.x的安装路径里都有一个名为python.exe的文件(下图所示为Python3.x安装目录里的python.exe):

图 6

为了能根据我们的需求调用不同的Python环境,我们需要在安装目录里把python.exe改名,只改Python2.x和Python3.x的其中一个就可以了(为了运行sqlmap不要把python2.x 的python.exe文件改名成python2.exe,这样做会使sqlmap在调用python2.x的时候显示拒绝访问,直接用原名称python.exe即可)但是卸载时需要把名字改回来,否则会报错,无法卸载。

我把Python3.x的python.exe重命名为python3.exe,Python2.x的python.exe保持不变,这样我在DOS窗口A输入” python3”就调用了Python3.x:

图 7

在另一个DOS窗口B(不能和刚才DOS窗口A是一个窗口)输入python就调用了Python2.x:

图 8

Python基础之Windows下Python3.x环境搭建

作者:荒原之梦

前言:本文介绍使用Python3.x搭建Python环境,文章最后将使用Windows自带的cmd写一个简单的Python程序。

一、下载Python环境安装包

在https:/www.python.org/下载Python3.x环境安装包。

二、安装

Python3.x的版本已经支持在安装时自动添加到Path环境变量中去了,只需要在安装时打上勾就可以。

图 1

默认安装路径是:C:\Users\windows7\AppData\Local\Programs\Python\Python35-32

图 2

安装完成后可以使用python命令在cmd中测试一下,如下的返回结果说明安装成功:

图 3

我们可以输入python(‘saxa’)写第一个python程序:

图 4