From d6a2ef4566b218d964b914920b0f6b36c62cbbc2 Mon Sep 17 00:00:00 2001 From: TRHX Date: Thu, 28 Mar 2019 23:28:47 +0800 Subject: [PATCH] Site updated: 2019-03-28 23:28:43 --- content.json | 2 +- friends/index.html | 21 +++++++++++++++++++-- sitemap.xml | 8 ++++---- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/content.json b/content.json index 86e75977e..8de73d496 100644 --- a/content.json +++ b/content.json @@ -1 +1 @@ -{"meta":{"title":"TRHX'S BLOG","subtitle":"求知若饥 虚心若愚","description":"一个大学生用于自学的个人博客","author":"TRHX'BLOG","url":"https://itrhx.com"},"pages":[{"title":"我的朋友们","date":"2019-03-17T05:37:32.612Z","updated":"2019-03-17T05:37:32.612Z","comments":true,"path":"friends/index.html","permalink":"https://itrhx.com/friends/index.html","excerpt":"","text":"海内存知己,天涯若比邻,相见即是缘分,欢迎各位大佬留言互换友链,必须要有名称、头像链接、至少一个标签或者一个简介哦~ 名称:TRHX’S BLOG主页:https://itrhx.com头像:https://itrhx.com/images/trhx.png标签:Python、Java简介:求知若饥 虚心若愚"}],"posts":[{"title":"免费CDN:jsDeliver+Github","slug":"Free-CDN-jsDeliver+Github","date":"2019-02-10T14:31:31.283Z","updated":"2019-03-12T13:03:31.300Z","comments":true,"path":"2019/02/10/Free-CDN-jsDeliver+Github/","link":"","permalink":"https://itrhx.com/2019/02/10/Free-CDN-jsDeliver+Github/","excerpt":"","text":"本文有参考《jsDeliver+github使用教程,免费好用的cdn》—— By hojun CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。——百度百科 放在Github的资源在国内加载速度比较慢,因此需要使用CDN加速来优化网站打开速度,jsDeliver + Github便是免费且好用的CDN,非常适合博客网站使用。 1、新建Github仓库 2、克隆Github仓库到本地 点击 Clone or download,一键复制仓库地址 在本地目录右键 Git Bash Here,执行以下命令: 1git clone 一键复制的仓库地址 3、上传资源 复制需要上传的资源到本地git仓库(注:jsDeliver不支持加载超过20M的资源),在本地git仓库目录下右键 Git Bash Here,执行以下命令:1234git status //查看状态git add . //添加所有文件到暂存区git commit -m '第一次提交' //把文件提交到仓库git push //推送至远程仓库 4、发布仓库 点击release发布 自定义发布版本号 5、通过jsDeliver引用资源 使用方法:https://cdn.jsdelivr.net/gh/你的用户名/你的仓库名@发布的版本号/文件路径例如:https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@1.0/images/trhx.png","categories":[{"name":"CDN","slug":"CDN","permalink":"https://itrhx.com/categories/CDN/"}],"tags":[{"name":"jsDeliver","slug":"jsDeliver","permalink":"https://itrhx.com/tags/jsDeliver/"},{"name":"CDN","slug":"CDN","permalink":"https://itrhx.com/tags/CDN/"}]},{"title":"新年快乐!","slug":"Happy-new-year","date":"2019-02-04T17:18:06.030Z","updated":"2019-02-04T18:20:38.517Z","comments":true,"path":"2019/02/05/Happy-new-year/","link":"","permalink":"https://itrhx.com/2019/02/05/Happy-new-year/","excerpt":"C printf("2019,祝大家"); C++ cout<<"一帆风顺"; C# System.Console.WriteLine("二龙腾飞") VB Msg("三羊开泰") VC MessageBox("四季平安"); Java System.out.println("五福临门"); JavaScript alert("六六大顺") PHP echo "七星高照"; Python print("八方来财") Html <br/>九运当头<br/> Objectivec NSLog(@"十全十美"); QBasic Print "阖家幸福" Asp Response.Write "心想事成" Ruby puts "财源广进" VBScript MsgBox "幸福安康" XML <TextView android:text="大展宏图" /> LUA print("学业有成") Delphi ShowMessage('万事如意'); shell echo 步步高升 perl print '鸿案齐眉' LISP (format t "身体健康~%") powerBuilder messagebox("龙马精神") COBOL DISPLAY '笑口常开' aswing JOptionPane.showMessageDialog("happy","好运连连") Android Toast.makeText(getApplicationContext(),"年年有余",Toast.LENGTH_SHORT).show() flex Alert.show("大吉大利"); Foxpro ?[家庭幸福!] iapp tw("瑞气盈门") DOS批处理 echo 鹏程万里 易语言 调试输出(“万事亨通”) Clojure (println "年年有今昔") verilog/systemverilog/e $display("岁岁有今朝") as trace("祝大家新年快乐!");","text":"C printf("2019,祝大家"); C++ cout<<"一帆风顺"; C# System.Console.WriteLine("二龙腾飞") VB Msg("三羊开泰") VC MessageBox("四季平安"); Java System.out.println("五福临门"); JavaScript alert("六六大顺") PHP echo "七星高照"; Python print("八方来财") Html <br/>九运当头<br/> Objectivec NSLog(@"十全十美"); QBasic Print "阖家幸福" Asp Response.Write "心想事成" Ruby puts "财源广进" VBScript MsgBox "幸福安康" XML <TextView android:text="大展宏图" /> LUA print("学业有成") Delphi ShowMessage('万事如意'); shell echo 步步高升 perl print '鸿案齐眉' LISP (format t "身体健康~%") powerBuilder messagebox("龙马精神") COBOL DISPLAY '笑口常开' aswing JOptionPane.showMessageDialog("happy","好运连连") Android Toast.makeText(getApplicationContext(),"年年有余",Toast.LENGTH_SHORT).show() flex Alert.show("大吉大利"); Foxpro ?[家庭幸福!] iapp tw("瑞气盈门") DOS批处理 echo 鹏程万里 易语言 调试输出(“万事亨通”) Clojure (println "年年有今昔") verilog/systemverilog/e $display("岁岁有今朝") as trace("祝大家新年快乐!");","categories":[{"name":"BLOG","slug":"BLOG","permalink":"https://itrhx.com/categories/BLOG/"}],"tags":[{"name":"BLOG","slug":"BLOG","permalink":"https://itrhx.com/tags/BLOG/"}]},{"title":"一台电脑使用两个/多个GitHub账号部署两个/多个Hexo博客","slug":"One-computer-deploys-two-or-more-Hexo-blogs","date":"2019-01-18T11:42:54.900Z","updated":"2019-01-21T16:35:16.923Z","comments":true,"path":"2019/01/18/One-computer-deploys-two-or-more-Hexo-blogs/","link":"","permalink":"https://itrhx.com/2019/01/18/One-computer-deploys-two-or-more-Hexo-blogs/","excerpt":"由于个人原因需要在一台电脑上分别用两个GitHub账号部署两个Hexo博客,本来以为挺简单,没想到问题重重,首先是一个GitHub账号只能搭建一个Hexo博客,其次是一台电脑绑定两个GitHub账号,则需要两对公钥,在处理第二个问题时遇到的问题比较多,因为对这方面一窍不通,还是小白,所以折腾了一下午才解决,网上好多教程我都看不懂,觉得不(自)够(己)详(太)细(笨),因此详细记录一下","text":"由于个人原因需要在一台电脑上分别用两个GitHub账号部署两个Hexo博客,本来以为挺简单,没想到问题重重,首先是一个GitHub账号只能搭建一个Hexo博客,其次是一台电脑绑定两个GitHub账号,则需要两对公钥,在处理第二个问题时遇到的问题比较多,因为对这方面一窍不通,还是小白,所以折腾了一下午才解决,网上好多教程我都看不懂,觉得不(自)够(己)详(太)细(笨),因此详细记录一下 原理分析: SSH的公钥是GitHub作为本地仓库和远程仓库连接的唯一标识,一个公钥只能对应一个GitHub账户,如果将一个相同的公钥上传到不同的GitHub账户,GitHub则无法做出辨识,进而导致错误 一台电脑,可以生成多对公私钥,可以通过配置,将不同的公钥上传到不同的GitHub账号,那么就不存在单个公钥绑定多个GitHub账号的情况存在了 相关问题报错: 同一台电脑部署第二个Hexo博客执行hexo g -d时报错:ERROR: Permission to xxxxxx/xxxxxx.github.io.git denied to xxxxxx. 添加新的 SSH 密钥 到 SSH agent 执行ssh-add xxx时报错:Could not open a connection to your authentication agent. 单独设置用户名/邮箱时报错:fatal: not in a git directory 以下是详细过程:前提:假设你的第二个博客相关配置操作已经顺利完成,但使用hexo g -d命令部署到 GitHub 上时报错:ERROR: Permission to xxxxxx/xxxxxx.github.io.git denied to xxxxxx. - 查看当前密钥首先我们打开终端输入ls ~/.ssh/可以查看当前已有的密钥,显示id_rsa 与 id_rsa_pub说明已经有一对密钥 - 创建新的密钥首先使用以下命令进入 SSH根目录下:1cd ~/.ssh/ 方法一直接使用以下命令创建新密钥,然后两次回车即可:1ssh-keygen -t rsa -f ~/.ssh/这里是新密钥名称 -C \"这里是你的邮箱\" 注意区别新密钥名称和旧密钥名称,不要相同!!! 方法二使用下面命令行创建新密钥:1ssh-keygen -t rsa -C \"这里是你的邮箱\" 回车后会出现:12Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): 注意此时需要你输入新密钥的名称,同样要注意区别新密钥名称和旧密钥名称,不要相同!!!之后再两次回车,新密钥创建完毕! - 配置config查看你的.ssh/根路径下, 有没有config文件,( 比如我的路径为C:\\Users\\Lenovo.ssh)没有则使用以下命令创建一个config文件:1touch config 用记事本或者其他工具打开config文件(注意config文件是没有任何后缀名的),写入以下配置: 1234567891011#第一个账号,默认使用的账号,不用做任何更改Host github.com HostName github.com User git IdentityFile ~/.ssh/id_rsa #第二个新账号,#\"xxxxxx\"为前缀名,可以任意设置,要记住,后面需要用到Host xxxxxx.github.com HostName github.com User git IdentityFile ~/.ssh/这里是你创建的新密钥的名称 - 设置新GitHub账户SSH key输入以下命令复制你创建的公钥:1clip < ~/.ssh/这里是你创建的新密钥的名称.pub 也可以直接在.ssh目录下找到你创建的新的公钥,文件名为新密钥的名称.pub,(比如我的是trhx_rsa.pub),用记事本打开,复制里面的内容,然后打开你的新GitHub账号主页,依次进入Settings —> SSH and GPG keys —> New SSH key,将刚复制的内容粘贴到Key那里,Title可以随便填,点击Add Key保存。 - 清空本地的 SSH 缓存,添加新的 SSH 密钥 到 SSH agent中使用命令cd ~/.sshcd到.ssh根目录下,依次执行以下命令: 123ssh-add -Dssh-add xxxxxx #旧密钥名称,一般是id_rsassh-add xxxxxx #新创建的密钥名称 如果执行以上命令出现错误:Could not open a connection to your authentication agent.,那么就需要先执行ssh-agent bash,再执行以上命令 - 验证配置是否成功依次执行以下命令,第一个为默认ssh_key验证;第二个为新的ssh_key验证,其中“xxxxxx”为你先前在config文件中的命名12ssh -T git@github.comssh -T git@xxxxxxx.github.com 依次显示以下信息, 则说明配置成功:1Hi 你的用户名! You've successfully authenticated, but GitHub does not provide shell access. - 取消全局用户名/邮箱配置,单独设置用户名/邮箱执行如下命令,取消全局用户名和邮箱配置(如果已经设置了全局的话): 12git config --global --unset user.namegit config --global --unset user.email 分别进入你的两个Hexo博客.git目录下执行以下命令单独设置用户名/邮箱:12git config user.name \"这里是用户名\"git config user.email \"这里是你的邮箱\" 如果此时报错:fatal: not in a git directory,说明你没有进入.git目录下,具体路径:\\Hexo\\.deploy_git\\.git,.git目录是隐藏的,需要你设置隐藏目录可见 执行以下命令可以查看设置是否成功1git config --list - hexo 配置文件修改git地址打开你的第二个博客Hexo目录下的_config.yml文件,找到deploy关键字,写入以下配置并保存:1234deploy: type: git repository: git@xxxxxx.github.com:你的用户名/你的用户名.github.io.git branch: master 比如我的配置:1234deploy: type: git repository: git@love109.github.com:love109/love109.github.io.git branch: master 大功告成,再次执行hexo g -d就能成功将新的博客部署到 Github 上了","categories":[{"name":"实用教程","slug":"实用教程","permalink":"https://itrhx.com/categories/实用教程/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://itrhx.com/tags/Hexo/"},{"name":"Github","slug":"Github","permalink":"https://itrhx.com/tags/Github/"}]},{"title":"Python3 自学笔记 C09","slug":"Python3-Self-study-Notes-C09","date":"2018-11-15T16:37:26.503Z","updated":"2018-11-15T16:48:05.385Z","comments":true,"path":"2018/11/16/Python3-Self-study-Notes-C09/","link":"","permalink":"https://itrhx.com/2018/11/16/Python3-Self-study-Notes-C09/","excerpt":"","text":"Python3 自学笔记第九章【文件和异常】 - 9.1 从文件中读取数据 - 9.1.1 读取整个文件 有一个文件,包含精确到小数点后30位的圆周率值,且在小数点后每10位处都换行:12345Circumference rate.txt----------3.1415926535 8979323846 2643383279 以下两个程序将打开并读取这个文件,再将其内容显示到屏幕上:12345#file_reader.pywith open('Circumference rate.txt') as file_object: contents = file_object.read() print(contents) 12345#file_reader2.pycontents = open ('Circumference rate.txt')print(contents.read())contents.close() 函数open()接受一个参数:要打开的文件的名称,Python在当前执行的文件所在的目录中查找指定的文件;关键字with在不再需要访问文件后将其关闭;也可以调用open()和close()来打开和关闭文件,如果使用这种方法,当程序存在bug时,close()语句未执行,文件将不会被关闭;方法read()将读取这个文件的全部内容,并将其作为一个长长的字符串储存在变量contents中,通过打印contents的值,就可以将这个文本文件的全部内容打印出来:1233.1415926535 8979323846 2643383279 输出结果末尾有一空行,这是因为read()到达末尾时返回一个空字符串,而将这个空字符串显示出来就是一个空行,如果要删除末尾的空行,可在print语句中使用rstrip():12345#file_reader.pywith open('Circumference rate.txt') as file_object: contents = file_object.read() print(contents.rstrip()) 输出结果如下:1233.1415926535 8979323846 2643383279 - 9.1.2 文件路径 相对文件路径:假定程序文件位于python_work文件夹中,程序文件操作的文本文件位于python_work文件夹的子文件夹text_files中,此时可以使用相对文件路径来打开该文本文件,相对文件路径让Python到指定的位置去查找,而该位置是相对于当前运行的程序所在目录的 在Linux和OS X中,相对路径类似于如下:1with open('text_files/filename.txt') as file_object: 在Windows系统中,文件路径中使用反斜杠(\\)而不是斜杠(/):1with open('text_files\\filename.txt') as file_object: 绝对文件路径:不用关心当前运行的程序储存在什么地方,直接将文件在计算机中的准确位置告诉Python,这称为绝对文件路径,绝对路径通常比相对路径更长,因此将其储存在一个变量中,再将变量传递给open()会有所帮助 在Linux和OS X中,绝对路径类似于如下:12file_path = '/home/ehmatthes/other_files/text_files/filename.txt'with open(file_path) as file_object: 在Windows系统中,绝对路径类似于如下:12file_path = 'C:\\Users\\ehmatthes\\other_files\\text_files\\filename.txt'with open(file_path) as file_object: - 9.1.3 逐行读取 要以每次一行的方式检查文件,可对文件对象使用for循环:123456#file_reader.pyfilename = 'Circumference rate.txt'with open(filename) as file_object: for line in file_object: print(line) 在文件中每行的末尾都有一个看不见的换行符,而print语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,一个来自print语句,输出结果如下:123453.1415926535 8979323846 2643383279 要消除这些多余的空白行,可以使用rstrip():123456#file_reader.pyfilename = 'Circumference rate.txt'with open(filename) as file_object: for line in file_object: print(line.rstrip()) 输出结果如下:1233.1415926535 8979323846 2643383279 - 9.1.4 创建一个包含文件各行内容的列表 使用关键字with时,open()返回的文件对象只在with代码块内可用,如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行储存在一个列表当中,并在with代码块外使用该列表:12345678#file_reader.pyfilename = 'Circumference rate.txt'with open(filename) as file_object: lines = file_object.readlines() for line in lines: print(line.rstrip()) 输出结果与文件内容完全一致 - 9.1.5 使用文件的内容 创建一个字符串,它包含文件中储存的所有数字,且没有任何空格:123456789101112#pi_string.pyfilename = 'Circumference rate.txt'with open(filename) as file_object: lines = file_object.readlines()pi_string = ''for line in lines: pi_string += line.rstrip() print(pi_string)print(len(pi_string)) 打印该字符串以及其长度:123.1415926535 8979323846 264338327936 由于原文件每行左边都有空格,我们可以使用strip()而不是rstrip()来删除它:123456789101112#pi_string.pyfilename = 'Circumference rate.txt'with open(filename) as file_object: lines = file_object.readlines()pi_string = ''for line in lines: pi_string += line.strip() print(pi_string)print(len(pi_string)) 输出结果如下:123.14159265358979323846264338327932 Python中有三个去除头尾字符、空白符的函数,它们依次为: strip:用来去除头尾字符、空白符(包括\\n、\\r、\\t、’ ‘,即:换行、回车、制表符、空格) lstrip:用来去除开头字符、空白符(包括\\n、\\r、\\t、’ ‘,即:换行、回车、制表符、空格) rstrip:用来去除结尾字符、空白符(包括\\n、\\r、\\t、’ ‘,即:换行、回车、制表符、空格)注意:这些函数都只会删除头和尾的字符,中间的不会删除。用法分别为:string.strip([chars])string.lstrip([chars])string.rstrip([chars])参数chars是可选的,当chars为空,默认删除string头尾的空白符(包括\\n、\\r、\\t、’ ‘)当chars不为空时,函数会被chars解成一个个的字符,然后将这些字符去掉它返回的是去除头尾字符(或空白符)的string副本,string本身不会发生改变 - 9.2 写入文件 将一条简单的消息储存到文件中:12345#write_message.pyfilename = 'programming.txt'with open(filename,'w') as file_object: file_object.write(\"I love programming!\") 调用open()时提供了两个实参,第一个实参也是要打开文件的名称,第二个实参(’w’)告诉Python,我们要以写入模式打开这个文件,打开文件时,可指定读取模式(’r’)、写入模式(’w’)、附加模式(’a’)或者让我们能够读取和写入文件的模式(’r+’),如果省略模式实参,则默认以只读模式打开文件 附表:Python读写文件各种模式区别 模式 可做操作 若文件不存在 是否覆盖 r 打开一个文件用于只读 报错 - rb 以二进制格式打开一个文件用于只读 报错 - r+ 打开一个文件用于读和写 报错 是 rb+ 以二进制格式打开一个文件用于读和写 报错 是 w 打开一个文件用于只写 创建 是 wb 以二进制格式打开一个文件只用于只写 创建 是 w+ 打开一个文件用于读和写 创建 是 wb+ 以二进制格式打开一个文件用于读和写 创建 是 a 打开一个文件用于追加 创建 否,追加写 ab 以二进制格式打开一个文件用于追加 创建 否,追加写 a+ 打开一个文件用于读和写 创建 否,追加写 ab+ 以二进制格式打开一个文件用于追加 创建 否,追加写 - 9.3 使用 try-except 代码块处理异常 当我们尝试将一个数字除以0时,会发生ZeroDivisionError异常:12345>>> print(5/0)Traceback (most recent call last): File \"<pyshell#0>\", line 1, in <module> print(5/0)ZeroDivisionError: division by zero 此时我们可以编写一个try-except代码块来处理该异常:1234try: print(5/0)except ZeroDivisionError: print(\"You can't divide by zero!\") 当我们运行该程序时,会出现提示:1You can't divide by zero! 在try-except代码块中加入else,编写一个只执行除法运算的简单计算器:12345678910111213141516print(\"Give me two numbers,and I'll divide them.\")print(\"Enter 'q' to quit.\")while True: first_number = input(\"\\nFirst number:\") if first_number == 'q': break second_number = input(\"\\nSecond number:\") if second_number == 'q': break try: answer = int(first_number)/int(second_number) except ZeroDivisionError: print(\"You can't divide by 0!\") else: print(answer) 运行程序:1234567891011121314Give me two numbers,and I'll divide them.Enter 'q' to quit.First number:45Second number:0You can't divide by 0!First number:36Second number:84.5First number:q 若不加入try-except代码块,我们在输入0时,程序就会出现异常而崩溃,而try-except代码块很好的解决了这种问题,而且还起到了提示的作用,同样的,try-except代码块也可以处理其他异常,如FileNotFoundError等 - 9.4 储存数据 - 9.4.1 使用 json.dump() 和 json.load() 模块json能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据;编写一个储存一组数字的简短程序,再编写一个将这些数字读取到内存中的程序,第一个程序将使用 json.dump()来储存这组数据,而第二个程序将使用 json.load()。函数 json.dump()接受两个实参:要储存的数据以及可用于储存数据的文件对象:123456789#number_writer.pyimport jsonnumbers = [2,3,5,7,11,13]filename = 'numbers.json'with open(filename,'w') as f_obj: json.dump(numbers,f_obj) 先导入模块json,再创建一个数字列表, 通常用文件扩展名.json来指出文件储存的数据为JSON格式,然后以写入模式打开该文件,使用函数json.dump()将数字列表储存到文件numbers.json中,打开该文件,数据的储存格式与Python一样:1[2, 3, 5, 7, 11, 13] 再编写一个程序,使用json.load()将这个列表读取到内存中:12345678#number_reader.pyimport jsonfilename = 'numbers.json'with open(filename) as f_obj: numbers = json.load(f_obj)print(numbers) 输出结果与number_writer.py中创建的数字列表相同:1[2, 3, 5, 7, 11, 13] 进阶:在同一个程序中使用 json.dump() 和 json.load():创建文件username.json储存用户名,从该文件中获取用户名,如果这个文件不存在,就在except代码块中提示用户输入用户名,并将其储存在username.json中:1234567891011121314151617#remember_me.pyimport json#如果以前储存了用户名,就加载它#否则就提示用户输入用户名并储存它filename = 'numbers.json'try: with open(filename) as f_obj: username = json.load(f_obj)except FileNotFoundError: username = input(\"What's your name?\") with open(filename,'w') as f_obj: json.dump(username,f_obj) print(\"We'll remember you when you come back, \" + username + \"!\")else: print(\"Welcome back, \" + username + \"!\") 以前没有储存用户名,第一次运行程序:12What's your name?TRHXWe'll remember you when you come back, TRHX! 再次运行程序:1Welcome back, TRHX! - 9.4.2 重构 代码能够正确运行,但可以做进一步的改进——将代码划分为一系列完成具体工作的函数,这样的过程称为重构,重构让代码更清晰、更易于理解、更容易扩展重构remember_me.py,将大部分逻辑放到一个或者多个函数中:12345678910111213141516171819#remember_me.pyimport jsondef greet_user(): #问候用户,并指出其名字 filename = 'numbers.json' try: with open(filename) as f_obj: username = json.load(f_obj) except FileNotFoundError: username = input(\"What's your name?\") with open(filename,'w') as f_obj: json.dump(username,f_obj) print(\"We'll remember you when you come back, \" + username + \"!\") else: print(\"Welcome back, \" + username + \"!\")greet_user() 重构greet_user(),让它不执行这么多任务——将获取储存的用户名的代码移到另一个函数中:12345678910111213141516171819202122232425262728#remember_me.pyimport jsondef get_stored_username(): #如果储存了用户名,就获取它 filename = 'numbers.json' try: with open(filename) as f_obj: username = json.load(f_obj) except FileNotFoundError: return None else: return usernamedef greet_user(): #问候用户,并指出其名字 username = get_stored_username() if username: print(\"Welcome back, \" + username + \"!\") else: username = input(\"What's your name?\") filename = 'username.json' with open(filename,'w') as f_obj: json.dump(username,f_obj) print(\"We'll remember you when you come back, \" + username + \"!\") greet_user() 将greet_user()中的另一个代码块提取出来:将没有储存用户名时提示用户输入的代码放在一个独立的函数中:12345678910111213141516171819202122232425262728293031323334#remember_me.pyimport jsondef get_stored_username(): #如果储存了用户名,就获取它 filename = 'numbers.json' try: with open(filename) as f_obj: username = json.load(f_obj) except FileNotFoundError: return None else: return usernamedef get_new_username(): #提示输入用户名 username = input(\"What's your name?\") filename = 'username.json' with open(filename,'w') as f_obj: json.dump(username,f_obj) return username def greet_user(): #问候用户,并指出其名字 username = get_stored_username() if username: print(\"Welcome back, \" + username + \"!\") else: username = get_new_username() print(\"We'll remember you when you come back, \" + username + \"!\") greet_user() 最终版本实现了每个函数只负责单一而清晰的任务,我们在编写程序时也要像这样,要写出清晰而易于维护和扩展的代码","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"文件","slug":"文件","permalink":"https://itrhx.com/tags/文件/"},{"name":"异常","slug":"异常","permalink":"https://itrhx.com/tags/异常/"}]},{"title":"Python3 自学笔记 C08","slug":"Python3-Self-study-Notes-C08","date":"2018-11-10T11:51:55.481Z","updated":"2018-11-14T08:36:49.184Z","comments":true,"path":"2018/11/10/Python3-Self-study-Notes-C08/","link":"","permalink":"https://itrhx.com/2018/11/10/Python3-Self-study-Notes-C08/","excerpt":"","text":"Python3 自学笔记第八章【类】 - 8.1 创建类和使用类 创建一个表示小狗的简单类Dog,根据Dog类创建的每个实例都将储存名字和年龄,赋予每条小狗蹲下(sit())和打滚(roll_over())的能力: 1234567891011121314class Dog(): def __init__(self,name,age): #初始化属性name和age self.name = name self.age = age def sit(self): #模拟小狗被命令时蹲下 print(self.name.title() + \" is now sitting.\") def roll_over(self): #模拟小狗被命令时打滚 print(self.name.title() + \" rolled over!\") 方法init():类中的函数称为方法,本例中方法init()是一个特殊的方法,每当我们根据Dog类创建新实例时,Python都会自动运行它,在方法的名称中,开头和结尾各有两个下划线,这是一种约定,避免Python默认方法与普通方法发生名称冲突,例子中将方法init()定义成了包含三个形参:self、name和age,在这个方法的定义中,形参self必不可少,还必须位于其他形参的前面,Python调用方法init()来创建Dog实例时,将自动传入实参self,每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法,我们创建Dog实例时,Python将调用Dog类的方法init(),我们将通过实参向Dog()传递名字和年龄;self会自动传递,因此我们不需要传递它,每当我们根据Dog类创建实例时,都只需要给最后两个形参(name和age)提供值;定义的两个变量都有前缀self,以self为前缀的变量都可以供类中的所有方法使用,还可以通过类的任何实例来访问这些变量。self.name = name 获取储存在形参name中的值,并将其储存到变量name中,然后该变量被关联到当前创建的实例。self.age = age 的作用与此类似,像这样可通过实例访问的变量称为属性;Dog还定义了另外两种方法:sit() 和 roll_over() ,由于这些方法不需要额外的信息,如名字和年龄,因此它们只有一个形参self 在Python 2.7中创建类时,需要在括号内包含单词object:12class ClassName(object): ---snip--- - 8.2 根据类创建实例访问属性:创建一个表示特定小狗的实例: 123456789101112131415161718class Dog(): def __init__(self,name,age): #初始化属性name和age self.name = name self.age = age def sit(self): #模拟小狗被命令时蹲下 print(self.name.title() + \" is now sitting.\") def roll_over(self): #模拟小狗被命令时打滚 print(self.name.title() + \" rolled over!\")my_dog = Dog('willie',6)print(\"My dog's name is \" + my_dog.name.title() + \".\")print(\"My dog is \" + str(my_dog.age) + \" years old.\") 让Python创建一条名字为’willie’,年龄为6的小狗,Python使用实参’willie’和6调用Dog类中的方法init()。方法init()创建一个表示特定小狗的示例,并使用我们提供的值来设置属性name和age;在访问实例的属性时,可使用句点表示法,比如该例子中的 my_dog.name;最终程序输出结果如下: 12My dog's name is Willie.My dog is 6 years old. 调用方法:根据Dog类创建实例后,就可以使用句点表示法来调用Dog类中定义的任何方法:123456789101112131415161718class Dog(): def __init__(self,name,age): #初始化属性name和age self.name = name self.age = age def sit(self): #模拟小狗被命令时蹲下 print(self.name.title() + \" is now sitting.\") def roll_over(self): #模拟小狗被命令时打滚 print(self.name.title() + \" rolled over!\")my_dog = Dog('willie',6)my_dog.sit()my_dog.roll_over() 输出结果如下:12Willie is now sitting.Willie rolled over! 创建多个实例:可按需求根据类创建任意数量的实例:12345678910111213141516171819202122232425class Dog(): def __init__(self,name,age): #初始化属性name和age self.name = name self.age = age def sit(self): #模拟小狗被命令时蹲下 print(self.name.title() + \" is now sitting.\") def roll_over(self): #模拟小狗被命令时打滚 print(self.name.title() + \" rolled over!\")my_dog = Dog('willie',6)your_dog = Dog('lucy',8)print(\"My dog's name is \" + my_dog.name.title() + \".\")print(\"My dog is \" + str(my_dog.age) + \" years old.\")my_dog.sit()print(\"\\nYour dog's name is \" + your_dog.name.title() + \".\")print(\"Your dog is \" + str(your_dog.age) + \" years old.\")your_dog.roll_over() 输出结果如下:1234567My dog's name is Willie.My dog is 6 years old.Willie is now sitting.Your dog's name is Lucy.Your dog is 8 years old.Lucy rolled over! - 8.3 使用类和实例 创建一个表示汽车的类,其中储存了有关汽车的信息,还有一个汇总这些信息的方法:12345678910111213class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() my_new_car = Car('audi','a9','2018')print(my_new_car.get_descriptive_name()) 输出结果如下:12018 Audi A9 - 8.3.1 给属性指定默认值 类中的每个属性都必须有初始值,如果我们设置了默认值,就无需包含为它提供初始值的形参,下面为8.3的例子添加一个 odometer_reading 的属性,其初值是0,添加一个 odometer_reading() 方法,用于读取汽车的里程表: 123456789101112131415161718 class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odomter(self): print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\")my_new_car = Car('audi','a9','2018')print(my_new_car.get_descriptive_name())my_new_car.read_odomter() 输出结果如下:122018 Audi A9This car has 0 miles on it. - 8.3.2 修改属性的值 可以以三种不同的方式修改属性的值:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值) 直接修改属性的值:要修改属性的值,最简单的方法就是通过实例直接访问它,将8.3.1中的例子第7行代码 self.odometer_reading = 0 改为 self.odometer_reading = 66,输出结果如下:12 2018 Audi A9This car has 66 miles on it. 通过方法修改属性的值:1234567891011121314151617181920212223class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odomter(self): print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\") def update_odometer(self,mileage): self.odometer_reading = mileage my_new_car = Car('audi','a9','2018')print(my_new_car.get_descriptive_name())my_new_car.update_odometer(66)my_new_car.read_odomter() 对Car类所做的唯一修改就是在第17、18行添加了方法 update_odometer(),这个方法接受一个里程值,并将其储存到 self.odometer_reading 中,在倒数第二行,调用了 update_odometer(),并向它提供了一个实参(该实参对应于方法定义中的形参mileage),它将里程数设置为66,而方法 read_odomter() 打印该读数:122018 Audi A9This car has 66 miles on it. 可对方法 update_odometer() 进行扩展,使其能够在修改里程表读数时做一些额外的工作,添加一些逻辑,禁止任何人将里程表读数往回调:1234567891011121314151617181920212223242526class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 50 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odomter(self): print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\") def update_odometer(self,mileage): if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print(\"You can't roll back an odometer!\") my_new_car = Car('audi','a9','2018')print(my_new_car.get_descriptive_name())my_new_car.update_odometer(33)my_new_car.read_odomter() 修改 self.odometer_reading 的默认值为50,当我们再次尝试修改其值为33时,由于小于原来的里程,因此无法修改: 1232018 Audi A9You can't roll back an odometer!This car has 50 miles on it. 通过方法对属性的值进行递增:有时候需要将属性值递增到特定的量,而不是将其设置为全新的值,假设我们购买了一辆二手车,从购买到登记期间增加了100英里的里程,下面的方法让我们能够传递这个增量,并相应地增加里程表读数:123456789101112131415161718192021222324252627282930313233class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odomter(self): print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\") def update_odometer(self,mileage): if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print(\"You can't roll back an odometer!\") def increment_odometer(self,miles): #将里程表读数增加指定的量 self.odometer_reading += miles my_new_car = Car('audi','a9','2018')print(my_new_car.get_descriptive_name())my_new_car.update_odometer(6600)my_new_car.read_odomter()my_new_car.increment_odometer(100)my_new_car.read_odomter() 输出结果如下:1232018 Audi A9This car has 6600 miles on it.This car has 6700 miles on it. - 8.4 继承 编写类时,并非总是要从空白开始,如果要编写的类是另一个现成类的特殊版本,可使用继承,一个类继承另一个类时,它自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类,子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法;继承的通用语法大致如下: 12345678class ClassName1(object): def __init__(self,name1,name2,name3): --snip--class ClassName2(ClassName1): def __init__(self,name1,name2,name3): super().__init__(name1,name2,name3) --snip-- - 8.4.1 子类的方法init() 1234567891011121314151617181920 class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title()class ElectricCar(Car): #电动车的独特之处 def __init__(self,make,model,year): #初始化父类的属性 super().__init__(make,model,year)my_new_car = ElectricCar('tesla','model s','2016')print(my_new_car.get_descriptive_name()) 创建子类时,父类必须包含在当前文件中,且位于子类前面,定义了子类 ElectricCar,定义子类时,必须在括号内指定父类名称,方法 __init__()接受创建Car实例所需信息,super() 是一个特殊的函数,帮助Python将父类和子类关联起来,让Python调用 ElectricCar 的父类的方法 __init__(),让 ElectricCar 实例包含父类的所有属性,父类也称为超类(superclass),程序输出结果如下:12016 Tesla Model S - 8.4.2 Python 2.7 中的继承 在Python 2.7中,ElectricCar类的定义类似于下面这样:12345678class Car(object): def __init__(self,make,model,year): --snip--class ElectricCar(Car): def __init__(self,make,model,year): super(ElectricCar,self).__init__(make,model,year) --snip-- - 8.4.3 给子类定义属性和方法 让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法,下面添加一个电动车特有的属性(battery),以及一个描述该属性的方法: 1234567891011121314151617181920212223class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title()class ElectricCar(Car): def __init__(self,make,model,year): super().__init__(make,model,year) self.battery_size = 80 def describe_battery(self): print(\"This car has a \" + str(self.battery_size) + \"-KWh battery.\")my_new_car = ElectricCar('tesla','model s','2016')print(my_new_car.get_descriptive_name())my_new_car.describe_battery() 输出结果如下:122016 Tesla Model SThis car has a 80-KWh battery. - 8.4.4 重写父类的方法 要重写父类的方法,只需要在子类中定义一个与要重写的父类方法同名的方法即可,这样,Python将不会考虑这个父类的方法,而只关心在子类中定义的相应方法,假设Car类有一个名为 fill_gas_tank() 的方法,对于电动车来说毫无意义,因此可以重写它:12345class ElectricCar(Car): --snip-- def fill_gas_tank(self): print(\"This car doesn't need a gas tank!\") - 8.4.5 将实例用作属性 123456789101112131415161718192021222324252627282930class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title()class Battery(): #一次模拟电动车电瓶的简单尝试 def __init__(self,battery_size=70): #初始化电瓶的属性 self.battery_size = battery_size def describe_battery(self): #打印一条描述电瓶容量的消息 print(\"This car has a \" + str(self.battery_size) + \"-KWh battery.\")class ElectricCar(Car): def __init__(self,make,model,year): super().__init__(make,model,year) self.battery = Battery()my_new_car = ElectricCar('tesla','model s','2016')print(my_new_car.get_descriptive_name())my_new_car.battery.describe_battery() 输出结果如下: 122016 Tesla Model SThis car has a 70-KWh battery. 看起来似乎做了多余的工作,但现在我们可以对电瓶添加更多的描述,而且不会导致 ElectricCar 类混乱不堪,下面再给Battery添加一个方法,使其能够根据电瓶容量报告汽车的续航里程:1234567891011121314151617181920212223242526272829303132333435363738394041class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title()class Battery(): #一次模拟电动车电瓶的简单尝试 def __init__(self,battery_size=70): #初始化电瓶的属性 self.battery_size = battery_size def describe_battery(self): #打印一条描述电瓶容量的消息 print(\"This car has a \" + str(self.battery_size) + \"-KWh battery.\") def get_range(self): #打印一条消息,指出电瓶的续航里程 if self.battery_size == 70: range = 240 elif self.battery_size == 90: range = 280 message = \"This car can go approximately \" + str(range) message += \" miles on a full charge.\" print(message) class ElectricCar(Car): def __init__(self,make,model,year): super().__init__(make,model,year) self.battery = Battery()my_new_car = ElectricCar('tesla','model s','2016')print(my_new_car.get_descriptive_name())my_new_car.battery.describe_battery()my_new_car.battery.get_range() 输出结果如下:1232016 Tesla Model SThis car has a 70-KWh battery.This car can go approximately 240 miles on a full charge. - 8.5 导入类 Python允许将类储存在模块中,然后在主程序中导入所需的模块 - 8.5.1 导入单个类 12345678910111213141516171819202122232425262728293031#car.py#一个用于表示汽车的类class Car(): def __init__(self,make,model,year): #初始化描述汽车的属性 self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): #返回整洁的描述性名称 long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odomter(self): #打印一条消息,指出汽车的里程 print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\") def update_odometer(self): #将里程表读数设置为指定的值,拒绝将里程表往回拨 if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print(\"You can't roll back an odometer!\") def increment_odometer(self,miles): #将里程表读数增加指定的量 self.odometer_reading += miles 创建另一个文件——my_car.py,在其中导入Car类并创建其实例:123456789#my_car.pyfrom car import Carmy_new_car = Car('audi','a9','2018')print(my_new_car.get_descriptive_name())my_new_car.odometer_reading = 23my_new_car.read_odometer() import语句让Python打开模块car,并导入其中的Car类,输出结果如下: 122018 Audi A9This car has 23 miles on it. - 8.5.2 在一个模块中储存多个类 将类Battery和ElectricCar都加入到模块car.py中: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#car.py#一组用于表示燃油汽车和电动汽车的类class Car(): def __init__(self,make,model,year): #初始化描述汽车的属性 self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): #返回整洁的描述性名称 long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odometer(self): #打印一条消息,指出汽车的里程 print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\") def update_odometer(self): #将里程表读数设置为指定的值,拒绝将里程表往回拨 if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print(\"You can't roll back an odometer!\") def increment_odometer(self,miles): #将里程表读数增加指定的量 self.odometer_reading += milesclass Battery(): #一次模拟电动车电瓶的简单尝试 def __init__(self,battery_size=70): #初始化电瓶的属性 self.battery_size = battery_size def describe_battery(self): #打印一条描述电瓶容量的消息 print(\"This car has a \" + str(self.battery_size) + \"-KWh battery.\") def get_range(self): #打印一条消息,指出电瓶的续航里程 if self.battery_size == 70: range = 240 elif self.battery_size == 90: range = 280 message = \"This car can go approximately \" + str(range) message += \" miles on a full charge.\" print(message)class ElectricCar(Car): #模拟电动车的独特之处 def __init__(self,make,model,year): #初始化父类的属性,再初始化电动车特有的属性 super().__init__(make,model,year) self.battery = Battery() 新建一个my_electric_car.py的文件,导入ElectricCar类,并创建一辆电动车:123456789#my_electric_car.pyfrom car import ElectricCarmy_tesla = ElectricCar('tesla','model s','2016')print(my_tesla.get_descriptive_name())my_tesla.battery.describe_battery()my_tesla.battery.get_range() 输出结果如下:1232016 Tesla Model SThis car has a 70-KWh battery.This car can go approximately 240 miles on a full charge. - 8.5.3 从一个模块中导入多个类 可根据需要在程序文件中导入任意数量的类,假如我们要在同一个程序中创建普通汽车和电动汽车,就需要将类Car和ElectricCar类都导入,多个类之间用逗号进行分隔: 123456789 #my_car.pyfrom car import Car,ElectricCarmy_audi = Car('audi','a9','2018')print(my_audi.get_descriptive_name())my_tesla = ElectricCar('tesla','model s','2016')print(my_tesla.get_descriptive_name()) 输出结果如下:122018 Audi A92016 Tesla Model S - 8.5.4 导入整个模块 导入整个模块后,需要使用句点表示法访问需要的类:123456789#my_car.pyimport carmy_audi = car.Car('audi','a9','2018')print(my_audi.get_descriptive_name())my_tesla = car.ElectricCar('tesla','model s','2016')print(my_tesla.get_descriptive_name()) 我们导入了整个car模块,需要使用语法 module_name.class_name 访问需要的类,程序输出结果与8.5.3一致:122018 Audi A92016 Tesla Model S - 8.5.5 导入模块中的所有类 要导入模块中的所有类,可使用以下语法:1from module_name import * 这种导入方法是不推荐的,没有明确指出你使用了模块中的哪些类,还可能引发名称方面的困惑,需要从一个模块中导入很多类时,最好导入整个模块,并使用 module_name.class_name 语法来访问类 - 8.5.6 在一个模块中导入另一个模块 有时候需要将类分散到多个模块当中,以免模块太大,或者在同一个模块中储存不相关的类,将类储存在多个模块中时,一个模块中的类可能会依赖于另一个模块中的类,这种情况下,我们可以在前一个模块中导入必要的类,以下例子中,将Car类储存在一个模块当中,并将ElectricCar和Battery类储存在另一个模块当中,将第二个模块命名为electric_car.py,并将ElectricCar和Battery类复制到这个模块中:12345678910111213141516171819202122232425262728293031#electric_car.py#一组可用于表示电动汽车的类from car import Carclass Battery(): #一次模拟电动车电瓶的简单尝试 def __init__(self,battery_size=70): #初始化电瓶的属性 self.battery_size = battery_size def describe_battery(self): #打印一条描述电瓶容量的消息 print(\"This car has a \" + str(self.battery_size) + \"-KWh battery.\") def get_range(self): #打印一条消息,指出电瓶的续航里程 if self.battery_size == 70: range = 240 elif self.battery_size == 90: range = 280 message = \"This car can go approximately \" + str(range) message += \" miles on a full charge.\" print(message)class ElectricCar(Car): #模拟电动车的独特之处 def __init__(self,make,model,year): #初始化父类的属性,再初始化电动车特有的属性 super().__init__(make,model,year) self.battery = Battery() 12345678910111213141516171819202122232425262728293031#car.py#一个可用于表示汽车的类class Car(): def __init__(self,make,model,year): #初始化描述汽车的属性 self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): #返回整洁的描述性名称 long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odometer(self): #打印一条消息,指出汽车的里程 print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\") def update_odometer(self): #将里程表读数设置为指定的值,拒绝将里程表往回拨 if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print(\"You can't roll back an odometer!\") def increment_odometer(self,miles): #将里程表读数增加指定的量 self.odometer_reading += miles 现在可以分别从每个模块中导入类:12345678910#my_car.pyfrom car import Carfrom electric_car import ElectricCarmy_audi = Car('audi','a9','2018')print(my_audi.get_descriptive_name())my_tesla = ElectricCar('tesla','model s','2016')print(my_tesla.get_descriptive_name()) 输出结果如下:122018 Audi A92016 Tesla Model S - 8.6 Python标准库 Python标准库是一组模块,安装的Python都包含它,我们可以使用标准库中的任何函数和类,只需要在程序的开头包含一条简单的import语句,下面以模块collections中的一个类——OrderedDict(创建字典并记录其中的键-值对的添加顺序)为例:1234567891011121314#favorite_languages.pyfrom collections import OrderedDictfavorite_languages = OrderedDict()favorite_languages ['jen'] = 'python'favorite_languages ['sarah'] = 'c'favorite_languages ['edward'] = 'java'favorite_languages ['anly'] = 'python'for name,language in favorite_languages.items(): print(name.title() + \"'s favorite languages is \" + language.title() + \".\") 输出结果如下:1234Jen's favorite languages is Python.Sarah's favorite languages is C.Edward's favorite languages is Java.Anly's favorite languages is Python.","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"类","slug":"类","permalink":"https://itrhx.com/tags/类/"},{"name":"继承","slug":"继承","permalink":"https://itrhx.com/tags/继承/"}]},{"title":"Python3 自学笔记 C07","slug":"Python3-Self-study-Notes-C07","date":"2018-11-03T14:08:10.447Z","updated":"2018-11-03T14:11:58.456Z","comments":true,"path":"2018/11/03/Python3-Self-study-Notes-C07/","link":"","permalink":"https://itrhx.com/2018/11/03/Python3-Self-study-Notes-C07/","excerpt":"","text":"Python3 自学笔记第七章【函数】 - 7.1 定义函数 一个简单的函数,命名为 example(),其中,关键字 def 来告诉Python我们要定义一个函数,这就是函数定义 123def example(): print(\"Hello world!\")example() 输出结果如下: 1Hello world! - 7.1.1 向函数传递信息 在函数定义 def example() 的括号中添加 username,可以让函数接受我们给 username 指定的任何值,在调用函数时给 username 指定一个值,调用 example() 时,可将一个名字传递给它: 123def example(username): print(\"Hello , \" + username + '!')example('TRHX') 输出结果如下: 1Hello , TRHX! - 7.1.2 实参和形参 在 7.1.1 的例子中,函数 example() 的定义中,变量 username 是一个形参——函数完成其工作所需的一项信息,在代码 example(‘TRHX’) 中,值’TRHX’是一个实参,实参是调用函数时传递给函数的信息,调用函数时,将要让函数使用的信息放在括号内。在 example(‘TRHX’) 中,将实参 ‘TRHX’ 传递给了函数 example,这个值被储存在形参 username 中 - 7.2 传递实参 鉴于函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多,可使用位置实参,这要求实参的顺序与形参的顺序相同;也可以使用关键字实参,其中每个实参都由变量和值组成;还可以使用列表和字典 - 7.2.1 位置实参 调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此,最简单的方法是基于实参的顺序,这种关联方式被称为位置实参 1234def describe_pet(animal_type , pet_name): print(\"I have a \" + animal_type + \".\") print(\"My \" + animal_type + \"'s name is \" + pet_name.title() + \".\")describe_pet('hamster' , 'harry') 输出结果如下: 12I have a hamster.My hamster's name is Harry. 调用函数多次:我们可以根据需要调用函数任意次,要再描述一个宠物,只需要再次调用 123456describe_pet() 即可def describe_pet(animal_type , pet_name): print(\"I have a \" + animal_type + \".\") print(\"My \" + animal_type + \"'s name is \" + pet_name.title() + \".\")describe_pet('hamster' , 'harry')describe_pet('dog' , 'willi') 输出结果如下: 1234I have a hamster.Myhamster's name is Harry.I have a dog.My dog's name is Willi. - 7.2.2 关键字实参 关键字实参是传递给函数的名称-值对。直接在实参中将名称和值关联起来,不用考虑函数调用中的实参顺序 12345def describe_pet(animal_type , pet_name): print(\"I have a \" + animal_type + \".\") print(\"My \" + animal_type + \"'s name is \" + pet_name.title() + \".\")describe_pet(animal_type = 'hamster' , pet_name = 'harry')describe_pet(pet_name = 'willi' , animal_type = 'dog' ) 输出结果如下: 1234I have a hamster.Myhamster's name is Harry.I have a dog.My dog's name is Willi. - 7.2.3 默认值 编写函数时,可给每个形参指定默认值,在调用函数中给形参提供了实参时,Python将使用指定的实参值,否则将使用形参的默认值 1234def describe_pet(pet_name , animal_type = 'dog'): print(\"I have a \" + animal_type + \".\") print(\"My \" + animal_type + \"'s name is \" + pet_name.title() + \".\")describe_pet(pet_name = 'willi') 输出结果如下: 12I have a dog.My dog's name is Willi. 在这个函数定义中,修改了形参的排列顺序,由于给 animal_type 指定了默认值,无需通过实参来指定动物类型,因此在函数调用中只包含一个实参——宠物的名字,然而Python依然将这个实参视为位置实参,因此如果函数调用中只包含宠物的名字,这个实参将关联到函数定义中的第一个形参,这就是需要将 pet_name 放在形参列表开头的原因所在 注意:使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参,这让Python依然能够准确地解读位置实参 - 7.3 返回值 函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值,函数返回的值被称为返回值,在函数中,可使用 return 语句将值返回到函数调用的代码行 - 7.3.1 返回简单值 12345def name(first_name , last_name): full_name = first_name + ' ' + last_name return full_name.title()student = name('jimi' , 'hendrix')print(student) 输出结果如下: 1Jimi Hendrix - 7.3.2 让实参变成可选的 对 7.3.1 的例子进行改进,扩展函数 name,使其还能够处理中间名: 12345def name(first_name , middle_name , last_name): full_name = first_name + ' ' + middle_name + ' ' + last_name return full_name.title()student = name('jimi' , 'lee' , 'hendrix')print(student) 输出结果如下: 1Jimi Lee Hendrix 然而,如果一个人没有中间名,那么在调用这个函数时就会出错,为了让中间名变成可选的,可以给实参 middle_name 指定一个默认值——空字符串,并在用户没有提供中间名时不使用这个实参,注意需要将 middle_name 移到形参列表的末尾: 12345678910def name(first_name , last_name , middle_name = ' '): if middle_name: full_name = first_name + ' ' + middle_name + ' ' + last_name else: full_name = first_name + ' ' + last_name return full_name.title()student = name('jimi' , 'hendrix')print(student)student = name('jimi' , 'hendrix' , 'lee' )print(student) 输出结果如下: 12Jimi HendrixJimi Lee Hendrix - 7.3.3 返回字典 函数可返回任何类型的值,包括列表和字典等较复杂的数据结构: 12345def name(first_name , last_name): full_name = {'first' : first_name , 'last' : last_name} return full_namestudent = name('jimi' , 'hendrix')print(student) 输出结果如下: 1{'first': 'jimi', 'last': 'hendrix'} - 7.3.4 结合使用函数和 while 循环 123456789101112131415def name(first_name , last_name): full_name = first_name + ' ' + last_name return full_namewhile True: print(\"\\nPlease input your name:\") print(\"(Enter 'exit' to quit)\") f_name = input(\"First_name:\") if f_name == 'exit': break l_name = input(\"Last_name:\") if l_name == 'exit': break student = name(f_name , l_name) print(student) print(\"Hello, \" + student.title() + \"!\") 运行程序: 1234567891011Please input your name:(Enter 'exit' to quit)First_name:jimiLast_name:hendrixjimi hendrixHello, Jimi Hendrix!Please input your name:(Enter 'exit' to quit)First_name:exit - 7.4 传递列表 123456def users(names): for name in names: message = \"Hello, \" + name.title() + \"!\" print(message)usernames = ['hannah' , 'tony' , 'margot']users(usernames) 输出结果如下: 123Hello, Hannah!Hello, Tony!Hello, Margot! - 7.4.1 在函数中修改列表 将列表传递给函数后,函数就可以对其进行修改,在函数中对这个列表所做的任何修改都是永久性的 #首先创造一个列表,其中包含一些要打印的设计 12345678910111213141516unprinted_designs = ['iphone case' , 'robot pendannt' , 'dodecahedron']completed_models = []#模拟打印每个设计,直到没有未打印的设计为止#打印每个设计后,都将其移到列表completed_models中while unprinted_designs: current_design = unprinted_designs.pop() #模拟根据设计制作3D打印模型的过程 print(\"Printing model: \" + current_design) completed_models.append(current_design) #显示打印好的所有模型print(\"\\nThe following models have been printed: \")for completed_model in completed_models: print(completed_model) 输出结果如下: 12345678Printing model: dodecahedronPrinting model: robot pendanntPrinting model: iphone caseThe following models have been printed: dodecahedronrobot pendanntiphone case 编写两个函数重新组织这些代码,每一个函数都做一件具体的工作,输出结果与原程序相同: 123456789101112131415161718192021def print_models(unprinted_designs , completed_models):#模拟打印每个设计,直到没有未打印的设计为止#打印每个设计后,都将其移到列表completed_models中 while unprinted_designs: current_design = unprinted_designs.pop() #模拟根据设计制作3D打印模型的过程 print(\"Printing model: \" + current_design) completed_models.append(current_design)def show_completed_models(completed_models): #显示打印好的所有模型 print(\"\\nThe following models have been printed: \") for completed_model in completed_models: print(completed_model)unprinted_designs = ['iphone case' , 'robot pendannt' , 'dodecahedron']completed_models = []print_models(unprinted_designs , completed_models)show_completed_models(completed_models) - 7.4.2 禁止函数修改列表 有时候需要禁止函数修改列表,拿 7.4.1 的例子来说,我们打印了所有设计后,也要保留原来的未打印的设计列表,以供备案,但由于我们将所有的设计都移出了 unprinted_designs,这个列表变成了空的,原来的列表没有了,为了解决这个问题,可向函数传递列表的副本而不是原件;这样函数所做的任何修改都只影响副本,而丝毫不影响原件,要将列表的副本传递给函数,可以像下面这样做: 1function_name(list_name[:]) 切片表示法 [:] 创建列表的副本,在 7.4.1 的例子中如果不想清空未打印的设计列表,可像下面这样调用 print_models(): 1print_models(unprinted_designs[:] , completed_models) - 7.5 传递任意数量的实参 Python允许函数从调用语句中收集任意数量的实参 1234def make_pizza(*toppings): print(toppings)make_pizza('pepperoni')make_pizza('mushrooms' , 'green peppers' , 'extra cheese') 形参名 *toppings 中的星号让Python创建一个名为 toppings 的空元组,并将收到的所有值都封装到这个元组中,函数体内的print语句通过生成输出来证明Python能够处理使用一个值调用函数的情形,也能处理使用三个值来调用函数的情形,输出结果如下: 12('pepperoni',)('mushrooms', 'green peppers', 'extra cheese') 使用循环语句: 123456def make_pizza(*toppings): print(\"\\nMaking a pizza with the followiing toppings: \") for topping in toppings: print(\"- \" + topping)make_pizza('pepperoni')make_pizza('mushrooms' , 'green peppers' , 'extra cheese') 输出结果如下: 12345678Making a pizza with the followiing toppings: - pepperoniMaking a pizza with the followiing toppings: - mushrooms- green peppers- extra cheese - 7.5.1 结合使用位置实参和任意数量实参 如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中: 123456def make_pizza(size , *toppings): print(\"\\nMaking a \" + str(size) + \"-inch pizza with the followiing toppings: \") for topping in toppings: print(\"- \" + topping)make_pizza(16 , 'pepperoni')make_pizza(18 , 'mushrooms' , 'green peppers' , 'extra cheese') 输出结果如下: 12345678Making a 16-inch pizza with the followiing toppings: - pepperoniMaking a 18-inch pizza with the followiing toppings: - mushrooms- green peppers- extra cheese - 7.5.2 使用任意数量的关键字实参 有时候,需要接受任何数量的实参,但预先我们不知道传递给函数的会是什么样的信息,在这种情况下,可以将函数编写成能够接受任意数量的键-值对——调用语句提供了多少就接受多少: 12345678910def build_profile(first , last , **user_info): #创建一个字典,其中包括我们知道的有关用户的一切 profile = {} profile['first_name'] = first profile['last_name'] = last for key , value in user_info.items(): profile[key] = value return profileuser_profile = build_profile('albert' , 'einstein' , location = 'princeton' , field = 'physics')print(user_profile) 形参 **user_info 中的两个星号让Python创建一个名为 user_info 的空字典,并将收到的所有名称-值对都封装到这个字典中,在这个函数中,可以像访问其他字典那样访问 user_info 中的名字-值对,程序运行结果如下: 1{'first_name': 'albert', 'last_name': 'einstein', 'location': 'princeton', 'field': 'physics'} - 7.6 将函数储存在模块中 更进一步,我们可以把函数储存在被称为模块的独立文件中,再将模块导入到主程序中,import 语句运行在当前运行的程序文件中使用模块中的代码 - 7.6.1 导入整个模块 要让函数是可导入的,得先创建模块,模块是扩展名为.py的文件,包含要导入到程序中的代码,下面将创建一个包含函数 make_pizza() 的模块 1234567#pizza.pydef make_pizza(size , *toppings): #概述要制作的比萨 print(\"\\nMaking a \" + str(size) + \"-inch pizza with the followiing toppings: \") for topping in toppings: print(\"- \" + topping) 接下来,我们在 pizza.py 所在的目录中创建另一个名为 making_pizzas.py 的文件,在这个文件中导入刚刚创建的模块,在调用 make_pizza() 两次: 12345#making_pizzas.pyimport pizzapizza.make_pizza(16 , 'pepperoni')pizza.make_pizza(18 , 'mushrooms' , 'green peppers' , 'extra cheese') Python在读取这个文件时,代码行 import pizza 让Python打开文件 pizza.py,并在幕后将其中所有函数都复制到这个程序中,在 making_pizzas.py 中,可以使用 pizza.py 中定义的所有函数,要调用被导入的模块中的函数,可指定导入的模块的名称 pizza 和函数名 make_pizza(),并使用句点分隔它们,最终运行结果与原程序相同: 12345678Making a 16-inch pizza with the followiing toppings: - pepperoniMaking a 18-inch pizza with the followiing toppings: - mushrooms- green peppers- extra cheese - 7.6.2 导入特定的函数 导入模块中特定的函数,可以使用以下语法: 1from module_name import function_name 通过用逗号分隔函数名,可根据需要从模块中导入任意数量的函数:1from module_name import function_0 , function_1 , function_2 以前面的 making_pizzas.py 为例,如果只想导入要使用的函数,代码类似于下面这样:1234from pizza import make_pizzamake_pizza(16 , 'pepperoni')make_pizza(18 , 'mushrooms' , 'green peppers' , 'extra cheese') - 7.6.3 使用 as 给函数指定别名 如果要导入的函数名称可能与程序中现有的名称冲突,或者函数的名称太长,可指定简短而独一无二的别名,要给函数指定别名,需要在导入它的时候这样做,通用语法为:1from module_name import function_name as fn 同样以前面的 making_pizzas.py 为例:1234from pizza import make_pizza as mpmp(16 , 'pepperoni')mp(18 , 'mushrooms' , 'green peppers' , 'extra cheese') - 7.6.4 使用 as 给模块指定别名 我们还可以给模块指定别名,通用语法为:1import module_name as mn 同样以前面的 making_pizzas.py 为例:1234import pizza as pp.make_pizza(16 , 'pepperoni')p.make_pizza(18 , 'mushrooms' , 'green peppers' , 'extra cheese') - 7.6.5 导入模块中的所有函数 导入模块中所有函数的通用语法为:1from module_name import * 同样以前面的 making_pizzas.py 为例:1234from pizza import *make_pizza(16 , 'pepperoni')make_pizza(18 , 'mushrooms' , 'green peppers' , 'extra cheese') import 语句中的星号让Python将模块 pizza 中的每个函数都复制到这个程序中,由于导入了每个函数,可通过名称来调用每个函数,而不需要用句点表示法,然而,如果模块中有函数的名称与项目中的名称相同,就有可能导致意想不到的结果,最佳的做法是,要么只导入我们需要使用的函数,要么导入整个模块并使用句点表示法","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"函数","slug":"函数","permalink":"https://itrhx.com/tags/函数/"},{"name":"模块","slug":"模块","permalink":"https://itrhx.com/tags/模块/"}]},{"title":"Python3 自学笔记 C06","slug":"Python3-Self-study-Notes-C06","date":"2018-10-30T05:38:20.264Z","updated":"2018-10-30T05:44:13.126Z","comments":true,"path":"2018/10/30/Python3-Self-study-Notes-C06/","link":"","permalink":"https://itrhx.com/2018/10/30/Python3-Self-study-Notes-C06/","excerpt":"","text":"Python3 自学笔记第六章【用户输入和 while 循环】 - 6.1 函数 input() 的工作原理 函数 input() 让程序暂停运行,等待用户输入一些文本。获取用户输入后,Python将其储存在一个变量当中,以方便你使用;函数 input() 返回为 string 类型 12message = input(\"Please tell me your name:\")print(\"Hello , \" + message + \"!\") 输出结果如下: 12Please tell me your name:anliyHello , anliy! 进阶: 1234message = \"Please tell me your name so that we can personalize the messages you see.\"message += \"\\nWhat's your first name?\"name = input(message)print(\"\\nHello , \" + name + \"!\") 输出结果如下: 1234Please tell me your name so that we can personalize the messages you see.What's your first name?trhxHello , trhx! - 6.1.1 使用 int() 来获取数值输入 使用函数 input() 时,Python会将用户输入解读为字符串: 1234>>> age = input(\"How old are you?\")How old are you?19>>> age'19' 为了解决这个问题,可以使用函数 int() ,它让Python将输入视为数值: 12345>>> age = input(\"How old are you?\")How old are you?19>>> age = int(age)>>> age19 实例: 123456age = input(\"Please tell me your age:\")age = int(age)if age >= 18: print(\"You are old enough to go to the Internet bar!\")else: print(\"You are not old enough to go to Internet bar!\") 输出结果如下: 12Please tell me your age:17You are not old enough to go to Internet bar! - 6.1.2 求模运算符 处理数值信息时,求模运算符(%)是一个很有用的工具,它将两个数相除并返回余数: 12345678>>> 4 % 31>>> 5 % 32>>> 8 % 20>>> 7 % 31 - 6.1.3 在 Python 2.7 中获取输入 如果使用 Python 2.7,应该使用函数 raw_input() 来提示用户输入,这个函数与 Python 3 中的 input() 一样,也将输入解读为字符串;Python 2.7 也包含函数 input(),但它将用户输入解读为Python代码,并尝试运行它们 - 6.2 while 循环 for 循环用于针对集合中的每一个元素的一个代码块,而 while 循环不断地运行,直到指定的条件不满足为止 - 6.2.1 使用 while 循环 一个简单的 while 循环: 1234num = 1while num < 5: print(num) num += 1 输出结果如下: 12341234 - 6.2.2 让用户选择退出循环 123456prompt = \"\\nTell me something, and I will repeat it back to you:\"prompt += \"\\nEnter 'quit' to end the program.\"message = \" \"while message != 'quit': message = input(prompt) print(message) 运行程序: 123456789101112Tell me something, and I will repeat it back to you:Enter 'quit' to end the program.Hello everyone!Hello everyone!Tell me something, and I will repeat it back to you:Enter 'quit' to end the program.Hello again!Hello again!Tell me something, and I will repeat it back to you:Enter 'quit' to end the program.quitquit - 6.2.3 使用标志 在要求很多条件都满足才继续运行的程序中,可以定义一个变量,用于判断整个程序是否处于活动状态,这个变量称为标志 123456789prompt = \"\\nTell me something, and I will repeat it back to you:\"prompt += \"\\nEnter 'quit' to end the program.\"active = Truewhile active: message = input(prompt) if message == 'quit': active = False else: print(message) 运行结果与6.2.2一致 - 6.2.4 使用 break 退出循环 要立即退出 while 循环,不再运行循环中余下的代码,也不管条件测试的结果如何,可使用 break 语句,break 语句用于控制程序流程,可使用它来控制哪些代码将执行,哪些代码不执行 123456789prompt = \"\\nPlease enter the name of a city you have visited:\"prompt += \"\\nEnter 'quit' when you are finished.\"active = Truewhile active: city = input(prompt) if city == 'quit': break else: print(\"I'd love to go to \" + city.title() + \"!\") 运行程序: 1234567891011Please enter the name of a city you have visited:Enter 'quit' when you are finished.ShanghaiI'd love to go to Shanghai!Please enter the name of a city you have visited:Enter 'quit' when you are finished.BeijingI'd love to go to Beijing!Please enter the name of a city you have visited:Enter 'quit' when you are finished.quit 在任何Python循环中都可以使用break语句,例如,可以使用break语句来退出遍历列表或字典 - 6.2.5 在循环中使用 continue 要返回到循环开头,并根据条件测试结果决定是否继续执行循环,可使用 continue 语句,它不像 break 语句那样不再执行余下的代码并退出整个循环,例如,从1到10只打印其中奇数: 123456number =0while number < 10: number += 1 if number % 2 == 0: continue print(number) 输出结果如下:1234513579 - 6.3 使用 while 循环来处理列表和字典 for循环是一种遍历列表的有效方式,但在for循环中不应修改列表,否则将导致Python难以跟踪其中的元素,要在遍历列表的同时对其进行修改,可使用while循环 - 6.3.1 在列表之间移动元素 123456789unconfirmed_users = ['alice' , 'brian' , 'candace']confirmed_users = []while unconfirmed_users: current_user = unconfirmed_users.pop() print(\"Verifying user: \" + current_user.title()) confirmed_users.append(current_user)print(\"\\nThe following users have been confirmed:\")for confirmed_user in confirmed_users: print(confirmed_user.title()) 首先创建一个未验证用户列表,其中包含用户Alice、Brian和Candace,还创建了一个空列表,用于存储已验证的用户,程序中的 while 循环将不断地运行,直到列表 unconfirmed_users 变成空的。在这个循环中,函数pop() 以每次一个的方式从列表 unconfirmed_users 末尾删除未验证的用户。由于Candace位于列表 unconfirmed_users 的末尾,因此其名字将首先被删除、存储到变量 current_user 中并加入到列表 confirmed_users 中。接下来是Brian,然后是Alice 为模拟用户验证过程,我们打印一条验证消息并将用户加入到已验证用户列表中。未验证用户列表越来越短,而已验证用户列表越来越长。未验证用户列表为空后结束循环,再打印已验证用户列表: 12345678Verifying user: CandaceVerifying user: BrianVerifying user: AliceThe following users have been confirmed:CandaceBrianAlice - 6.3.2 删除包含特定值的所有列表元素 可以使用方法 remove() 来删除列表中特定的值,但如果要删除的值在列表中出现了多次,方法 remove() 就不管用了,如果要删除列表中所有包含特定值的元素则可以使用 while 循环: 12345names = ['alice' , 'candace' , 'alice' , 'brian' , 'alix' , 'candace' , 'heliy']print(names)while 'candace' in names: names.remove('candace')print(names) 输出结果如下: 12['alice', 'candace', 'alice', 'brian', 'alix', 'candace', 'heliy']['alice', 'alice', 'brian', 'alix', 'heliy'] 使用方法 remove() 做对比: 1234names = ['alice' , 'candace' , 'alice' , 'brian' , 'alix' , 'candace' , 'heliy']print(names)names.remove('candace')print(names) 输出结果如下: 12['alice', 'candace', 'alice', 'brian', 'alix', 'candace', 'heliy']['alice', 'alice', 'brian', 'alix', 'candace', 'heliy'] - 6.3.3 使用用户输入来填充字典 12345678910111213141516171819202122responses = {}#设置一个标志,指出调查是否继续polling_active = Truewhile polling_active: #提示输入被调查者的姓名和回答 name = input(\"\\nWhat's your name?\") response = input(\"What kind of fruit do you like?\") #将答卷储存在字典中 responses[name] = response #询问是否还有其他人要参与回答 repeat = input(\"Would you like to let another person respond?(Yes/No)\") if repeat == 'No': polling_active = False#调查结束,显示结果print(\"\\n------ Poll Results ------\")for name , response in responses.items(): print(name + \" like \" + response + \".\") 运行程序: 1234567891011What's your name?TRHXWhat kind of fruit do you like?appleWould you like to let another person respond?(Yes/No)YesWhat's your name?TRHXCCWhat kind of fruit do you like?bananaWould you like to let another person respond?(Yes/No)No------ Poll Results ------TRHX like apple.TRHXCC like banana.","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"input()函数","slug":"input-函数","permalink":"https://itrhx.com/tags/input-函数/"},{"name":"while循环","slug":"while循环","permalink":"https://itrhx.com/tags/while循环/"}]},{"title":"Python3 自学笔记 C05","slug":"Python3-Self-study-Notes-C05","date":"2018-10-27T10:46:22.942Z","updated":"2018-10-27T10:46:23.044Z","comments":true,"path":"2018/10/27/Python3-Self-study-Notes-C05/","link":"","permalink":"https://itrhx.com/2018/10/27/Python3-Self-study-Notes-C05/","excerpt":"","text":"Python3 自学笔记第五章【字典】 - 5.1 一个简单的字典 123fruits = {'apple' : 'red' , 'number' : 5}print(fruits['apple'])print(fruits['number']) 输出结果如下: 12red5 在Python中,字典是一系列键-值对。每个键都与一个值相关联,你可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可以将任何Python对象用作字典中的值。键-值对是两个相关联的值。在指定键时,Python将返回与之相关联的值。键和值之间用冒号分隔,而键-值对之间用逗号分隔。在字典中,想储存多少个键-值对都可以 - 5.1.1 访问字典中的值 要获取与键相关联的值,可依次指定字典名和放在方括号内的键: 123fruits = {'apple' : 'red' , 'number' : 5}number_fruits = fruits['number']print(\"The number of apple is \" + str(number_fruits) + \"!\") 输出结果如下: 1The number of apple is 5! - 5.1.2 添加键-值对 字典是一种动态结构,可随时在其中添加键-值对。要添加键-值对,可依次指定字典名、用方括号括起来的键和相关联的值 12345fruits = {'apple' : 'red' , 'number1' : 5}print(fruits)fruits['banana'] = 'yellow'fruits['number2'] = 13print(fruits) 输出结果如下: 12{'apple': 'red', 'number1': 5}{'apple': 'red', 'number1': 5, 'banana': 'yellow', 'number2': 13} 注意:键-值对的排列顺序与添加顺序不同。Python不关心键-值对的添加顺序,而只关心键和值之间的关联关系 有时候为了方便也可以先使用一对空的花括号定义一个字典,再分行添加各个键-值对: 1234fruits = {}fruits['banana'] = 'yellow'fruits['number2'] = 13print(fruits) 输出结果如下: 1{'banana': 'yellow', 'number2': 13} - 5.1.3 修改字典中的值 要修改字典中的值,可依次指定字典名、用方括号括起来的键以及与该键相关联的新值 1234fruits = {'color' : 'red'}print(\"The color of the fruits is \" + fruits['color'] + \"!\")fruits['color'] = 'yellow'print(\"The color of the fruits is \" + fruits['color'] + \" now!\") 输出结果如下: 12The color of the fruits is red!The color of the fruits is yellow now! 进阶:对一个能够以不同速度移动的外星人的位置进行跟踪,为此,我们将储存该外星人的当前速度,并据此确定该外星人将向右移动多远: 1234567891011121314alien = {'x_position': 0, 'y_position': 25, 'speed': 'medium'}print(\"Original x-position: \" + str(alien['x_position']))#向右移动外星人,据外星人当前速度决定将其移动多远if alien['speed'] == 'slow': x_increment = 1elif alien['speed'] == 'medium': x_increment = 2else: x_increment = 3#新位置等于老位置加上增量alien['x_position'] = alien['x_position'] + x_incrementprint(\"New x_position: \" + str(alien['x_position'])) 输出结果如下: 12Original x-position: 0New x_position: 2 - 5.1.4 删除键-值对 对于字典中不再需要的信息,可使用del语句将相应的键-值对彻底删除。使用del语句时,必须指定字典名和要删除的键 1234fruits = {'apple' : 'red' , 'number' : 5}print(fruits)del fruits['number']print(fruits) 输出结果如下: 12{'apple': 'red', 'number': 5}{'apple': 'red'} - 5.1.5 由类似对象组成的字典 字典储存的可以是一个对象的多种信息,也可以储存众多对象的同一种信息,例如要调查很多人最喜欢的编程语言: 1234567favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'java' , }print(\"Sarah's favorite languages is \" + favorite_languages['sarah'].title() + \"!\") 输出结果如下: 1Sarah's favorite languages is C! - 5.2 遍历字典 - 5.2.1 方法 items() 遍历所有的键-值对 使用for循环来遍历字典:12345678name = { 'username' : 'efermi' , 'first' : 'enrico' , 'last' : 'fermi' , }for key , value in name.items(): print(\"\\nKey: \" + key) print(\"Value: \" + value) 输出结果如下:123456789Key: usernameValue: efermiKey: firstValue: enricoKey: lastValue: fermi for语句的第二部分包含字典和方法items(),它返回一个键-值对列表。接下来,for循环依次将每个键-值对储存到指定的两个变量中 12345678favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'java' , }for name, language in favorite_languages.items(): print(name.title() + \"'s favorite language is \" + language.title() + \".\") 输出结果如下: 1234Jen's favorite language is Python.Sarah's favorite language is C.Edward's favorite language is Ruby.Phil's favorite language is Java. - 5.2.2 方法 keys() 遍历字典中所有的键 在不需要使用字典中的值时,方法key()很有用,下面来遍历字典favorite_languages,并将每个被调查者的名字都打印出来: 12345678favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'java' , }for name in favorite_languages.keys(): print(name.title()) 输出结果如下: 1234JenSarahEdwardPhil 遍历字典时,会默认遍历所有的键,因此,如果将上述代码中的for name in favorite_languages.keys():替换为for name in favorite_languages:输出结果将不变进阶: 1234567891011favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'java' , }friends = ['phil', 'sarah']for name in favorite_languages.keys(): print(name.title()) if name in friends: print(\"Hi \" + name + \", I see your favorite languages is \" + favorite_languages[name].title() + \"!\") 输出结果如下: 123456JenSarahHi sarah, I see your favorite languages is C!EdwardPhilHi phil, I see your favorite languages is Java! - 5.2.3 函数 sorted() 按顺序遍历字典中的所有键 字典总是明确地记录键和值之间的关联关系,但获取字典的元素时,获取顺序是不可预测的,要以特定的顺序返回元素,一种办法是在for循环中对返回的键进行排序,为此,可以使用函数sorted()来获得按特定顺序排列的键列表的副本: 12345678favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'java' , }for name in sorted(favorite_languages.keys()): print(name.title()) 输出结果如下: 1234EdwardJenPhilSarah - 5.2.4 方法 values() 遍历字典中的所有值 12345678favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'java' , }for languages in favorite_languages.values(): print(languages.title()) 输出结果如下: 1234PythonCRubyJava 这种做法提取字典中所有的值,而没有考虑是否重复,为剔除重复项,可使用集合(set),集合类似于列表,但每个元素都必须是独一无二的: 12345678favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'python' , }for languages in set(favorite_languages.values()): print(languages.title()) 输出结果如下: 123CPythonRuby - 5.3 嵌套 有时候,需要将一系列字典储存在列表中,或将列表作为值储存在字典中,这称为嵌套。可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典 - 5.3.1 字典列表 下面代码创建三个字典,每个字典都表示一个个学生,将这三个字典都放到一个名为students的列表当中,遍历列表将每个学生都打印出来: 123456student_0 = {'name' : 'anily' , 'class' : 2}student_1 = {'name' : 'nikey' , 'class' : 5}student_2 = {'name' : 'heyk' , 'class' : 3}students = [student_0 , student_1 , student_2]for student in students: print(student) 输出结果如下: 123{'name': 'anily', 'class': 2}{'name': 'nikey', 'class': 5}{'name': 'heyk', 'class': 3} 进阶:使用 range() 自动生成三十个外星人: 123456789101112131415#创建一个用于存储外星人的空列表aliens = []#创建三十个绿色的外星人for alien_number in range(30): new_alien = {'color' : 'green' , 'points' : 5 , 'speed' : 'slow'} aliens.append(new_alien)#显示前五个外星人for alien in aliens[:5]: print(alien)print(\"......\")#显示创建了多少外星人print(\"Total number of aliens: \" + str(len(aliens))) 输出结果如下: 1234567{'color': 'green', 'points': 5, 'speed': 'slow'}{'color': 'green', 'points': 5, 'speed': 'slow'}{'color': 'green', 'points': 5, 'speed': 'slow'}{'color': 'green', 'points': 5, 'speed': 'slow'}{'color': 'green', 'points': 5, 'speed': 'slow'}......Total number of aliens: 30 在上述例子中,虽然每个外星人都具有相同特征,但在Python看来,每个外星人都是独立的,我们可以独立地修改每个外星人: 12345678910111213aliens = []for alien_number in range(30): new_alien = {'color' : 'green' , 'points' : 5 , 'speed' : 'slow'} aliens.append(new_alien)for alien in aliens[0:3]: if alien['color'] == 'green': alien['color'] = 'yellow' alien['points'] = 10 alien['speed'] = 'medium'for alien in aliens[:5]: print(alien)print(\"......\")print(\"Total number of aliens: \" + str(len(aliens))) 输出结果如下: 1234567{'color': 'yellow', 'points': 10, 'speed': 'medium'}{'color': 'yellow', 'points': 10, 'speed': 'medium'}{'color': 'yellow', 'points': 10, 'speed': 'medium'}{'color': 'green', 'points': 5, 'speed': 'slow'}{'color': 'green', 'points': 5, 'speed': 'slow'}......Total number of aliens: 30 - 5.3.2 在字典中存储列表 有时候需要将列表储存在字典中,而不是将字典储存在列表中:例一: 12345678910#储存所点比萨的信息pizza = { 'crust' : 'thick' , 'toppings' : ['mushrooms' , 'extra chees'] , }#概述所点的比萨print(\"You ordered a \" + pizza['crust'] + \"-crust pizza\" + \"with the following toppings :\" )for topping in pizza['toppings']: print(\"\\t\" + topping) 输出结果如下: 123You ordered a thick-crust pizzawith the following toppings : mushrooms extra chees 例二: 12345678910favorite_languages = { 'jen' : ['python' , 'ruby'] , 'sarah' : ['c'] , 'edward' : ['go' , 'ruby'] , 'phil' : ['python' , 'java'] , }for name , languages in favorite_languages.items(): print(\"\\n\" + name.title() + \"'s favorite languages are:\") for language in languages: print(\"\\t\" + language.title()) 输出结果如下: 123456789101112131415Jen's favorite languages are: Python RubySarah's favorite languages are: CEdward's favorite languages are: Go RubyPhil's favorite languages are: Python Java - 5.3.3 在字典中存储字典 123456789101112131415161718users = { 'aeinstein' : { 'first' : 'albert' , 'last' : 'einstein' , 'location' : 'princeton' , } , 'mcurie' : { 'first' : 'marie' , 'last' : 'curie' , 'location' : 'paris' , } , }for username , user_info in users.items(): print(\"\\nUsername : \" + username) full_name = user_info['first'] + \" \" + user_info['last'] location = user_info['location'] print(\"\\tFull name : \" + full_name.title()) print(\"\\tlocation : \" + location .title()) 输出结果如下: 12345678Username : aeinstein Full name : Albert Einstein location : PrincetonUsername : mcurie Full name : Marie Curie location : Paris","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"字典","slug":"字典","permalink":"https://itrhx.com/tags/字典/"}]},{"title":"Python3 自学笔记 C04","slug":"Python3-Self-study-Notes-C04","date":"2018-10-23T14:52:48.396Z","updated":"2018-10-23T15:05:23.396Z","comments":true,"path":"2018/10/23/Python3-Self-study-Notes-C04/","link":"","permalink":"https://itrhx.com/2018/10/23/Python3-Self-study-Notes-C04/","excerpt":"","text":"Python3 自学笔记第四章【if语句】 - 4.1 一个简单的数列 给定一个汽车列表,将其中每一辆汽车的名称打印出来,要求打印 ‘bmw’ 时所有字母都要大写,其余名称只需要首字母大写: 123456cars = ['audi' , 'bmw' , 'subaru' , 'toyota']for car in cars: if car == 'bmw': print(car.upper())else: print(car.title()) 输出结果如下: 1234AudiBMWSubaruToyota - 4.1.1 检查特定值是否包含在列表当中 要判断特定的值是否已包含在列表当中,可使用关键字 in 1234user_names = ['andia' , 'david' , 'liwa']user = 'andia'if user in user_names: print(user.title() + \"is in user_name.\") 输出结果如下: 1Andiais in user_name. 要判断特定的值是否不包含在列表当中,可使用关键字 not in 1234user_names = ['andia' , 'david' , 'liwa']user = 'kivle'if user not in user_names: print(user.title() + \"is not in user_name.\") 输出结果如下: 1Kivleis not in user_name. - 4.2 if-else 语句 1234567age = input(\"请输入你的年龄查看是否可以去网吧:\")if int(age) >= 18: print(\"You are old enough to go to the net bar!\") print(\"You should go to net bar less,study more!\")else: print(\"You are too young to go to the net bar!\") print(\"Wait until you are 18 to go to the net bar!\") 分别输入19和15,输出结果如下: 123请输入你的年龄查看是否可以去网吧:19You are old enough to go to the net bar!You should go to net bar less,study more! 123请输入你的年龄查看是否可以去网吧:15You are too young to go to the net bar!Wait until you are 18 to go to the net bar! - 4.3 if-elif-else 结构 12345678age = 12if age < 4: price = 0elif age < 18: price = 5else: price = 10print(\"Your admission cost is $\" + str(price) + \".\") 输出结果如下: 1Your admission cost is $5. - 4.3.1 使用多个 elif 代码块 12345678910age = 20if age < 4: price = 0elif age < 18: price = 5elif age < 65: price = 15else: price = 10print(\"Your admission cost is $\" + str(price) + \".\") 输出结果如下: 1Your admission cost is $15. - 4.3.2 省略 else 代码块 Python并不要求 if-elif 结构后面必须有 else 代码块: 12345678910age = 20if age < 4: price = 0elif age < 18: price = 5elif age < 65: price = 15elif age >= 65: price = 10print(\"Your admission cost is $\" + str(price) + \".\") 输出结果仍与3.3.1一样 - 4.4 测试多个条件 if-elif-else结构功能强大,但仅适用于只有一个条件满足的情况:遇到通过了的测试后,Python就会跳过余下的测试: 12345678 names = ['Zhangshan' , 'Wanger']if 'Zhangshan' in names: print(\"Zhangshan is here!\")if 'Wanger' in names: print(\"Wanger is here!\")if 'Xiaoming' in names: print(\"Xiaoming is here!\")print(\"All the students are here!\") 输出结果如下: 123Zhangshan is here!Wanger is here!All the students are here! 相同的程序,如果使用 if-elif-else 结构,代码将不能正确运行: 12345678names = ['Zhangshan' , 'Wanger']if 'Zhangshan' in names: print(\"Zhangshan is here!\")elif 'Wanger' in names: print(\"Wanger is here!\")elif 'Xiaoming' in names: print(\"Xiaoming is here!\")print(\"All the students are here!\") 输出结果如下:12Zhangshan is here!All the students are here! 总之,如果我们只想执行一个代码块,就使用 if-elif-else 结构;如果要运行多个代码块,就必须使用一系列独立的 if 语句! - 4.5 使用 if 语句处理列表 - 4.5.1 检查特殊元素对3.4例子改版,加入姓名 ‘Xiaoming’,当检索到Xiaoming时告诉他,他妈妈叫他回家吃饭1234567names = ['Zhangshan' , 'Wanger' , 'Xiaoming']for name in names: if name == 'Xiaoming': print(\"Xiaoming,Your mother told you to go home for dinner!\") else: print(name +\"is here!\")print(\"All the students are here!\") 输出结果如下: 1234Zhangshanis here!Wangeris here!Xiaoming,Your mother told you to go home for dinner!All the students are here! - 4.5.2 确定列表不是空的 在检索姓名前检查姓名是否为空,不为空则打印出所有姓名,为空则提示没有姓名: 1234567names = []if names: for name in names: print(name +\" is here!\") print(\"All the students are here!\")else: print(\"There is no students!\") 输出结果如下: 1There is no students! 在if语句中将列表名用在条件表达式中时,Python将在列表至少包含一个元素时返回Ture,并在列表为空时返回False - 4.5.3 使用多个列表 两个列表names_1和names_2,要求输出既在names_2中又在names_1中的元素: 123456names_1 = ['Zhangshan' , 'Liyang' , 'Wanger' , 'Tangyang' , 'Xiaoming']names_2 = ['Liyang' , 'Zhangwei' , 'Tangyang']for names in names_2: if names in names_1: print(names +\" is here!\")print(\"All the students are here!\") 输出结果如下: 123Liyang is here!Tangyang is here!All the students are here!","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"if语句","slug":"if语句","permalink":"https://itrhx.com/tags/if语句/"}]},{"title":"Python3 自学笔记 C03","slug":"Python3-Self-study-Notes-C03","date":"2018-10-11T14:49:52.286Z","updated":"2018-10-11T14:49:52.314Z","comments":true,"path":"2018/10/11/Python3-Self-study-Notes-C03/","link":"","permalink":"https://itrhx.com/2018/10/11/Python3-Self-study-Notes-C03/","excerpt":"","text":"Python3 自学笔记第三章【操作列表】 - 3.1遍历整个列表 使用 for 循环来遍历整个列表: 123names = ['alice' , 'david' , 'liwei']for name in names:print(name) 输出结果如下: 123alicedavidliwei for循环让Python从列表names中取出一个名字,并将其储存在变量name中,最后 让Python打印前面储存到变量name中的名字,对于列表中的每个名字,Python都将 重复执行后两行代码,将列表names中的每个名字都打印出来 - 3.1.1在for循环中执行更多的操作 在for循环中,可对每个元素执行任何操作,下面对前面的示例进行扩展: 例一:123names = ['alice' , 'david' , 'liwei']for name in names: print(name.title() + \", that was a good man!\") 输出结果如下: 123Alice, that was a good man!David, that was a good man!Liwei, that was a good man! 例二: 12345names = ['alice' , 'david' , 'liwei']for name in names: print(name.title() + \", that was a good man!\") print(\"I can't wait to see you again,\" + name.title() + \".\\n\")print(\"Nice to meet you!\") 输出结果如下: 12345678910Alice, that was a good man!I can't wait to see you again,Alice.David, that was a good man!I can't wait to see you again,David.Liwei, that was a good man!I can't wait to see you again,Liwei.Nice to meet you! - 3.2 range()函数 Python使用range()函数能够轻松地生成一系列的数字 Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表; Python3 list() 函数是对象迭代器,可以把range()返回的可迭代对象转为一个列表,返回的变量类型为列表; Python2 range() 函数返回的是列表 例一:12for i in range(1,5): print(i) 输出结果如下: 12341234 例二:12for i in range(5): print(i) 输出结果如下:1234501234 例三:123456789101112>>> list(range(5))[0, 1, 2, 3, 4]>>> list(range(0))[]>>>list(range(0, 30, 5))[0, 5, 10, 15, 20, 25]>>> list(range(0, 10, 2))[0, 2, 4, 6, 8]>>> list(range(0, -10, -1))[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]>>> list(range(1, 0))[] 例四: 12345squares = []for value in range(1,11): square = value ** 2 squares.append(square)print(squares) 输出结果如下: 1[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] - 3.2.1 对数字列表执行简单的统计计算 1234567>>> digits = [1, 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0]>>> min(digits)0>>>max(digits)9>>>sum(digits)45 - 3.2.2 列表解析 列表解析能够让比如3.2中的例四更加简化,只需要一行代码就能生成这样的列表,列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素: 12squares = [value ** 2 for value in range(1,11)]print(squares) 在这个示例中,for循环为for value in range(1,11),它将值1~10提供给表达式value ** 2输出结果如下: 1[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] - 3.3 使用列表的一部分 处理列表的部分元素——Python称之为切片 - 3.3.1 切片 1234567891011list = ['a','b','c','d','e','f']print(list[:]) #省略全部,代表截取全部内容,可以用来将一个列表拷给另一个列表print(list[:3]) #省略起始位置的索引,默认起始位置从头开始,结束位置索引为2print(list[3:]) #省略结束位置的索引,默认结束位置为最后一个,开始位置索引为3print(list[1:4]) #开始位置索引为1,结束位置索引为3,顾头不顾尾print(list[4:1]) #从左到右索引,因此为空值print(list[-1:-3]) #从左到右索引,因此为空值print(list[-3:-1]) #开始位置索引为倒数第三个,结束位置索引为倒数第二个print(list[1:5:2]) #开始位置索引为1,结束位置索引为4,间隔2print(list[5:1:-1]) #反向取值,开始位置索引为5,结束位置索引为2print(list[::-1]) #反向取值,反向输出列表 - 3.3.2 遍历列表 1234players = ['charles' , 'martina' , 'michael' , 'florence' , 'eli']print(\"Here are the first three players on my team:\")for player in players[:3]: print(player.title()) 输出结果如下: 1234Here are the first three players on my team:CharlesMartinaMichael - 3.3.3 复制列表 要复制列表,可以创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:]),这让Python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表: 123456my_foods = ['pizza' , 'falafel' , 'carrot cake']friend_foods = my_foods[:]print(\"My favorite foods are:\")print(my_foods)print(\"\\nMy friend's favorite foods are:\")print(friend_foods) 输出结果如下: 12345My favorite foods are:['pizza', 'falafel', 'carrot cake']My friend's favorite foods are:['pizza', 'falafel', 'carrot cake'] 为核实我们的确有两个列表,下面在每个列表中都添加一种食品,并核实每个列表都记录了相应人员喜欢的食品:12345678910my_foods = ['pizza' , 'falafel' , 'carrot cake']friend_foods = my_foods[:]my_foods.append('cannoli')friend_foods.append('ice cream')print(\"My favorite foods are:\")print(my_foods)print(\"\\nMy friend's favorite foods are:\")print(friend_foods) 输出结果如下: 12345My favorite foods are:['pizza', 'falafel', 'carrot cake', 'cannoli']My friend's favorite foods are:['pizza', 'falafel', 'carrot cake', 'ice cream'] 输出结果表明,’cannoli’包含在我喜欢的食品列表中,而’ice cream’没有;’ice cream’包含在我朋友喜欢的食品中,而’cannoli’没有,假如我们只是简单的将my_foods赋给friend_foods,就不能得到两个列表。下面是错误示例: 12345678910my_foods = ['pizza' , 'falafel' , 'carrot cake']friend_foods = my_foods #错误写法my_foods.append('cannoli')friend_foods.append('ice cream')print(\"My favorite foods are:\")print(my_foods)print(\"\\nMy friend's favorite foods are:\")print(friend_foods) 错误示例输出结果如下: 12345My favorite foods are:['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']My friend's favorite foods are:['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream'] - 3.4 元组 Python将不能修改的值称为不可变的,而不可变的列表被称为元组 - 3.4.1 定义元组 元组看起来就像是列表,但元组使用圆括号而不是方括号来标识,定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样: 123dimensions = (200,50)print(dimensions[0])print(dimensions[1]) 输出结果如下: 1220050 如果尝试修改元组中元素的值,将会导致Python返回类型错误消息,由于试图修改元组的操作是被禁止的,因此Python指出不能给元组的元素赋值: 12dimensions = (200,50)dimensions[0] = 300 将会报错: 1234Traceback (most recent call last): File \"dimensions.py\", line 2, in <module> dimensions[0] = 300TypeError: 'tuple' object does not support item assignment - 3.4.2 遍历元组中所有的值 像列表一样,元组也可以使用for循环来遍历元组中的所有值: 例一:123dimensions = (200,100,50,6)for dimension in dimensions: print(dimension) 输出结果如下: 1234200100506 例二: 123dimensions = (200,100,50,6)for dimension in dimensions[:3]: print(dimension) 输出结果如下: 12320010050 - 3.4.3 修改元组变量 虽然不能修改元组元素,但是可以给储存元组的变量赋值: 123456789dimensions = (200,50)print(\"Original dimensions:\")for dimension in dimensions: print(dimension) dimensions = (400,100)print(\"\\nModified dimensions:\")for dimension in dimensions: print(dimension) 输出结果如下: 1234567Original dimensions:20050Modified dimensions:400100 我们首先定义了一个元组,并将其储存的尺寸打印了出来;然后将一个新元组储存到变量dimensions中,打印新的尺寸;相比于列表,元组是更简单的数据结构。如果需要储存的一组值在程序的整个生命周期内都不变,可使用元组","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"操作列表","slug":"操作列表","permalink":"https://itrhx.com/tags/操作列表/"}]},{"title":"Python3 自学笔记 C02","slug":"Python3-Self-study-Notes-C02","date":"2018-09-14T17:41:46.929Z","updated":"2018-09-15T17:09:42.760Z","comments":true,"path":"2018/09/15/Python3-Self-study-Notes-C02/","link":"","permalink":"https://itrhx.com/2018/09/15/Python3-Self-study-Notes-C02/","excerpt":"","text":"Python3 自学笔记第二章【列表】 - 2.1列表是什么 列表由一系列按特定顺序的元素组成,在 Python 中用方括号( [ ] )来表示列表,并用逗号来分隔其中的元素,例: 12345list1 = ['a','b','c','d','e','f']list2 = ['abc', 'xyz', 2018, 2020]list3 = [1, 2, 3, 4, 5 ,6]list4 = [\"a\", \"b\", \"c\", \"d\"]print(list1, list2, list3 ,list4) 输出结果如下: 1['a', 'b', 'c', 'd', 'e', 'f'] ['abc', 'xyz', 2018, 2020] [1, 2, 3, 4, 5, 6] ['a', 'b', 'c', 'd'] - 2.1.1访问列表元素 列表是有序集合,因此要访问列表的元素,只需要将该元素的位置或索引告诉Python即可,注意:在Python中的第一个列表元素的索引为0,而不是1 12345list = ['a','b','c','d','e','f']print(list[0])print(list[3])print(list[-1]) #Python为访问最后一个列表元素提供了一种特殊语法,通过将索引指定为-1,可以让Python返回最后一个列表元素print(list[-3]) 输出结果如下: 1234adfd - 2.1.2列表切片 1234567891011list = ['a','b','c','d','e','f']print(list[:]) #省略全部,代表截取全部内容,可以用来将一个列表拷给另一个列表print(list[:3]) #省略起始位置的索引,默认起始位置从头开始,结束位置索引为2print(list[3:]) #省略结束位置的索引,默认结束位置为最后一个,开始位置索引为3print(list[1:4]) #开始位置索引为1,结束位置索引为3,顾头不顾尾print(list[4:1]) #从左到右索引,因此为空值print(list[-1:-3]) #从左到右索引,因此为空值print(list[-3:-1]) #开始位置索引为倒数第三个,结束位置索引为倒数第二个print(list[1:5:2]) #开始位置索引为1,结束位置索引为4,间隔2print(list[5:1:-1]) #反向取值,开始位置索引为5,结束位置索引为2print(list[::-1]) #反向取值,反向输出列表 输出结果如下: 12345678910['a', 'b', 'c', 'd', 'e', 'f']['a', 'b', 'c']['d', 'e', 'f']['b', 'c', 'd'][][]['d', 'e']['b', 'd']['f', 'e', 'd', 'c']['f', 'e', 'd', 'c', 'b', 'a'] - 2.1.3使用列表中的各个值 可像使用其他变量一样使用列表中的各个值,例如,我们可以使用拼接根据列表中的值来创建消息: 123list = ['python', 'c', 'c++', 'java', 'php']message = \"My favorite language is \" + list[0].title() + \"!\"print(message) 输出结果如下: 1My favorite language is Python! - 2.1.4修改元素 修改列表元素的语法与访问列表元素的语法类似,要修改列表元素,可指定列表名和要修改的元素的索引,再次指定该元素的新值: 1234names = ['zhangsan', 'lishi', 'wanger', 'liming', 'xiaowang']print(names)names[1] = 'lifang'print(names) 输出结果如下: 12['zhangsan', 'lishi', 'wanger', 'liming', 'xiaowang']['zhangsan', 'lifang', 'wanger', 'liming', 'xiaowang'] - 2.1.5添加元素 - 使用方法 append() 在列表末尾添加元素 1234list = ['a', 'b', 'c', 'd', 'e', 'f']print(list)list.append('g')print(list)输出结果如下:12['a', 'b', 'c', 'd', 'e', 'f']['a', 'b', 'c', 'd', 'e', 'f', 'g'] - 使用方法 insert() 在列表指定位置添加元素 1234list = ['a', 'b', 'c', 'd', 'e', 'f']print(list)list.insert(2,\"h\") #其中括号里的数字表示要插入的位置,此后面的元素将右移一个位置print(list) 输出结果如下: 12['a', 'b', 'c', 'd', 'e', 'f']['a', 'b', 'h', 'c', 'd', 'e', 'f', 'g'] - 2.1.6删除元素 - 使用 del 语句删除元素 1234list = ['a', 'b', 'c', 'd', 'e', 'f']print(list)del list[3]print(list) 输出结果如下: 12list = ['a', 'b', 'c', 'd', 'e', 'f']list = ['a', 'b', 'c', 'e', 'f'] - 使用方法 pop() 删除最后一个元素方法 pop() 可以删除列表末尾的元素,并让你能够接着使用它。术语弹出(pop)源自这样的类比:列表就像是一个栈,而删除列表末尾的元素就相当于弹出栈顶元素:12345list = ['a', 'b', 'c', 'd', 'e', 'f']print(list)new_list = list.pop()print(list)print(new_list)输出结果如下:123['a', 'b', 'c', 'd', 'e', 'f']['a', 'b', 'c', 'd', 'e']f - 使用方法 pop() 删除任意位置元素可以使用 pop() 来删除列表中任何位置的元素,只需要在括号中指定要删除的元素的索引即可:12345list = ['a', 'b', 'c', 'd', 'e', 'f']print(list)new_list = list.pop(1)print(list)print(new_list)输出结果如下:123['a', 'b', 'c', 'd', 'e', 'f']['a', 'c', 'd', 'e', 'f']b - 使用方法 remove() 删除未知位置元素当我们不知道元素的位置,只知道元素的值的时候,就可以使用方法 remove()1234list = ['a', 'b', 'c', 'd', 'e', 'f']print(list)list.remove('d')print(list)输出结果如下:12['a', 'b', 'c', 'd', 'e', 'f']['a', 'b', 'c', 'e', 'f'] # - 2.1.7使用方法 index() 查找指定元素位置 12list = [\"a\", \"b\", \"c\", \"d\", \"e\", \"a\"]print(list.index('c')) 输出结果如下: 12 - 2.1.8使用方法 count() 统计指定元素数量 12list = [\"a\", \"b\", \"c\", \"d\", \"e\", \"a\"]print(list.count('a')) 输出结果如下: 12 - 2.1.9清空列表 123list = [\"a\", \"b\", \"c\", \"d\", \"e\", \"a\"]list.clear()print(list) 输出结果如下: 1[] - 2.2组织列表 在创建的列表中,元素的排列顺序常常是无法预测的,因为我们并非总能控制用户提供数据的顺序。有时候,我们希望保留列表元素最初的排列顺序,而有时候又需要调整排列顺序。Python提供了很多组织列表的方式,可根据具体情况选用 - 2.2.1使用方法 sort() 对列表进行永久排序 使用方法 sort() 可以对列表按照特殊符号,数字,大写字母,小写字母顺序进行永久排序: 123cars = ['bmw', 'audi', 'toyota', 'subaru']cars.sort()print(cars) 输出结果如下: 1['audi', 'bmw', 'subaru', 'toyota'] 还可以按与字母顺序相反的顺序排列列表元素,只需要向 sort() 方法传递参数 reverse = True 就可以了: 123cars = ['bmw', 'audi', 'toyota', 'subaru']cars.sort(reverse = True)print(cars) 输出结果如下: 1['toyota', 'subaru', 'bmw', 'audi'] - 2.2.2使用函数 sorted() 对列表进行临时排序 要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可使用函数sorted()。函数sorted()让你能够按特定顺序显示列表元素,同时不影响它们在列表中的原始排列顺序: 123456789cars = ['bmw', 'audi', 'toyota', 'subaru']print(\"Here is the original list:\")print(cars)print(\"\\nHere is the sorted list:\")print(sorted(cars))print(\"\\nHere is the sorted reverse list:\")print(sorted(cars, reverse=True))print(\"\\nHere is the original list again:\")print(cars) 输出结果如下: 1234567891011Here is the original list:['bmw', 'audi', 'toyota', 'subaru']Here is the sorted list:['audi', 'bmw', 'subaru', 'toyota']Here is the sorted reverse list:['toyota', 'subaru', 'bmw', 'audi']Here is the original list again:['bmw', 'audi', 'toyota', 'subaru'] - 2.2.3使用方法 reverse() 对列表进行反向排序 要反转列表元素的排列顺序,可使用方法 reverse() 123cars = ['bmw', 'audi', 'toyota', 'subaru']cars.reverse()print(cars) 输出结果如下: 1['subaru', 'toyota', 'audi', 'bmw'] - 2.2.4确定列表的长度 使用函数 len() 可以快速获悉列表的长度: 123>>>cars = ['bmw', 'audi', 'toyota', 'subaru']>>>len(cars)4 - 2.2.5合并列表 - 使用方法 extend() 合并列表 12345list1 = [1, 2, 3, 4]list2 = ['a', 'b', 'c', 'd']list1.extend(list2) #将列表list2添加到list1当中去print(list1)print(list2) 输出结果如下: 12[1, 2, 3, 4, 'a', 'b', 'c', 'd']['a', 'b', 'c', 'd'] - 使用 “+” 号合并列表 1234list1 = [1, 2, 3, 4]list2 = ['a', 'b', 'c', 'd']print(list1 + list2)print(list2 + list1) 输出结果如下: 12[1, 2, 3, 4, 'a', 'b', 'c', 'd']['a', 'b', 'c', 'd', 1, 2, 3, 4] - 使用切片合并列表 1234567891011121314list1 = [1, 2, 3, 4]list2 = ['a', 'b', 'c', 'd']list1[len(list1) : len(list1)] = list2 #len(list1)代表要将list2插入list1中的位置print(list1)list1 = [1, 2, 3, 4]list2 = ['a', 'b', 'c', 'd']list1[0 :0] = list2print(list1)list1 = [1, 2, 3, 4]list2 = ['a', 'b', 'c', 'd']list1[1:1] = list2print(list1) 输出结果如下: 123[1, 2, 3, 4, 'a', 'b', 'c', 'd']['a', 'b', 'c', 'd', 1, 2, 3, 4][1, 'a', 'b', 'c', 'd', 2, 3, 4]","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"列表","slug":"列表","permalink":"https://itrhx.com/tags/列表/"}]},{"title":"Python3 自学笔记 C01","slug":"Python3-Self-study-Notes-C01","date":"2018-09-10T15:55:00.947Z","updated":"2018-09-15T17:09:09.035Z","comments":true,"path":"2018/09/10/Python3-Self-study-Notes-C01/","link":"","permalink":"https://itrhx.com/2018/09/10/Python3-Self-study-Notes-C01/","excerpt":"","text":"Python3 自学笔记第一章【变量和简单数据类型】 - 1.1变量的命名和使用 变量名只能包含字母、数字和下划线。变量名可以字母或者下划线打头,但不能以数字开头,例如,可以将变量命名为message_1,但不能将其命名为1_message 变量名不能包含空格,但可使用下划线来分割其中的单词,例如,变量名greeting_message可行,但变量名greeting message会引发错误 不要将Python关键字和函数名用作变量名,即不要使用Python保留用于特殊用途的单词,如print 变量名应既简短又具有描述性,例如,name比n好,student_name比s_n好,name_length比length_of_persons_name好 慎用小写字母l和大写字母O,因为它们可能被人看错成数字1和0 - 1.2字符串 字符串就是一系列字符,在Python中,用引号括起来的都是字符串,其中的引号可以是单引号也可以双引号: 12\"This is a string.\"'This is also a string.' 这种灵活性让我们能够在字符串中包含引号和撇号: 123'I told my friend,\"Python is my favorite language!\"'\"The language 'Python' is named er Monty Python,not the snake.\"\"One of Python's strengths is i diverse and supportive community.\" - 1.2.1使用方法修改字符串的大小写三种处理方法如下:123title() #将字符串每个单词的首字母都改为大写upper() #将字符串的每个字母都改为大写lower() #将字符串的每个字母都改为小写 例如:1234message = \"I love you!\"print(name.title())print(name.upper())print(name.lower()) 输出结果如下:123I Love You!I LOVE YOU!i love you! - 1.2.2合并(拼接)字符串Python使用加号(+)来合并字符串,举例说明: 12345first_name = \"I\"second_name = \"love\"third_name = \"python\"full_name = first_name + \" \" + second_name + \" \" + third_timeprint(full_name.title() + \"!\") 输出结果如下: 1I Love Python! - 1.2.3使用制表符或换行符来添加空白添加横向制表符: 12>>>print(\"\\tPython\") Python 添加换行符: 12345>>>print(\"C\\nC++\\nPython\\nJavaScript\")CC++PythonJavaScript 附表:Python转义符 - 1.2.4删除空白在Python中可用 lstrip()、rstrip()、strip() 分别删除字符串开头、结尾、全部的空白,举例说明: 123456789>>>message = ' python '>>>message' python '>>>message.lstrip()'python '>>>message.rstrip()' python'>>>message.strip()'python' 如果要永久删除字符串中的空白,必须将删除操作的结果存回到变量中: 1234>>>message = ' python '>>>message = message.strip()>>>message'python' - 1.3数字在编程中,经常使用数字来记录游戏得分、表示可视化数据、储存Web应用信息等。Python根据数字的用法以不同的方式处理它们 - 1.3.1整数在Python中,可对整数执行加(+)减(-)乘(*)除(/)乘方(**)运算,同时也支持运算次序: 12345678910111213141516>>>3 + 25>>>3 - 21>>>3 * 26>>>3 \\ 21.5>>>3 ** 29>>>3 ** 327>>>2 + 3 * 414>>>(2 + 3) * 420 - 1.3.2浮点数Python将带小数点的数字都称为浮点数: 1234>>>0.1 + 0.10.2>>>2 * 0.20.4 需要注意的是,结果包含的小数位可能是不确定的,就现在而言,暂时忽略多余的小数位即可: 1234>>>0.2 + 0.10.30000000000000004>>>3 * 0.10.30000000000000004 - 1.3.3使用函数 str() 避免错误错误例子: 123age = 23message = \"Happy \" + age + \"rd Birthday!\"print(message) 运行时会报错: 1234Traceback (most recent call last): File \"birthday.py\", line 2, in <module> message = \"Happy \" + age + \"rd Birthday!\"TypeError: must be str, not int 这是一个类型错误,意味着Python无法识别我们使用的信息。在这个例子中,Python发现我们使用了一个值为整数(int)的变量,但它不知道该如何解读这个值,这个变量表示的可能是数值23,也可能是字符2和3。像上面这样的字符串中使用整数时,需要显式地指出我们希望Python将这个整数用作字符串。为此,可调用函数 str(),它让Python将非字符串值表示为字符串: 123age = 23message = \"Happy \" + str(age) + \"rd Birthday!\"print(message) 输出结果如下: 1Happy 23rd Birthday! - 1.4注释注释让我们能够使用自然语言在程序中添加说明,Python中注释有三种方法: 123456789print(\"Hello Python!\")#这是单行注释'''这是多行注释这是多行注释'''\"\"\"这也是多行注释这也是多行注释\"\"\"","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"数据类型","slug":"数据类型","permalink":"https://itrhx.com/tags/数据类型/"},{"name":"变量","slug":"变量","permalink":"https://itrhx.com/tags/变量/"}]},{"title":"VMware Pro 14 安装 Ubuntu 18.04 详细教程","slug":"VMwarePro-14-Installation-Ubuntu-18.04-Detailed-Tutorial","date":"2018-09-09T13:14:29.532Z","updated":"2018-09-09T13:23:38.708Z","comments":true,"path":"2018/09/09/VMwarePro-14-Installation-Ubuntu-18.04-Detailed-Tutorial/","link":"","permalink":"https://itrhx.com/2018/09/09/VMwarePro-14-Installation-Ubuntu-18.04-Detailed-Tutorial/","excerpt":"","text":"1.下载安装 VMware Workstation Pro 14 进入 VMware 官网或者在软件商店下载最新版VMware虚拟机并安装 2.下载 Ubuntu 18.04 系统 进入 Ubuntu 官网,下载最新版 Ubuntu 系统镜像 3.在 VMware 中创建虚拟机打开安装好的 VMware Workstation Pro 14,选择创建新的虚拟机 在新建虚拟机向导中选择自定义(高级) 默认直接下一步,直到出现下图,再选择稍后安装操作系统 选择客户机操作系统为 Linux ,如果你电脑是32位就选择 Ubuntu 版本,64位就选择 Ubuntu 64 位版本 更改虚拟机名称及存放位置 为虚拟机指定处理器数量,默认即可 为虚拟机分配内存,太大了可能会导致卡顿,太小了也不好,推荐内存大小即可 以下均选择默认即可 选择创建新虚拟磁盘 选择将虚拟磁盘储存为单个文件 默认下一步 点击完成 此时我们就可以在虚拟机左侧“我的计算机”下面看到刚刚创建的虚拟机 Ubuntu 64 位,单击 Ubuntu 64 位,选择“编辑虚拟机设置”, 再选择“CD/DVD(SATA)”,选择“使用ISO映像文件”,点击“浏览”,找到先前我们下载好的 Ubuntu 64 位镜像文件,点击“确定” 4.在虚拟机上安装 Ubuntu 系统单击 Ubuntu 64 位,选择“开启此虚拟机” 来到欢迎界面,选择好语言,点击“安装 Ubuntu” 选择键盘布局为“汉语” 更新和其他软件默认选择即可 安装类型选择“清除整个磁盘并安装 Ubuntu”,PS: 因为我们是新安装的系统,且在虚拟机中,所以可以选择清除整个磁盘,这个操作不会清除你原来电脑里面的东西 地区随便,在中国就行,默认即可 之后设置计算机名,密码 点击继续稍等一会就安装完成啦 安装过程中可能会出现的一些问题 1.在虚拟机上安装 Ubuntu 系统的过程中卡死不动 解决方法:关闭网络,重新安装即可 2.Ubuntu 不能全屏显示解决方法:方法①:安装 open-vm-tools: 1sudo apt-get install open-vm-tools 然后执行: 1sudo apt-get install open-vm* 重启即可全屏显示 方法②:在终端输入xrandr,并回车,我们就可以看到很多可以修改的分辨率,选择好分辨率后,比如我们要修改分辨率为 1920x1440 ,则在终端输入 xrandr -s 1920x1440,回车即可,注意 1920x1440 中间是小写字母 x,本人亲测此方法并不是很完美,不能完全适应屏幕 方法③:安装 VMware Tools:1、进入 Ubuntu 系统后,点击虚拟机上的【虚拟机】—>【安装 VMware Tools】,回到桌面即可看到一个 VMware Tools 的 图标2、复制 VMwareTools-10.0.10-4301679.tar.gz(版本根据自己的实际情况而定)到 home 目录下, 用命令 tar -xzvf VMwareTools-10.0.10-4301679.tar.gz 进行解压3、解压后 cd vmware_tools_distrib,打开终端4、输入“sudo ./vmware-install.pl”,输入用户密码后开始安装5、接下来会有很多地方需要你按 Enter或者 Yes6、当你看到出现 —the vmware team 的字样后就可以关闭窗口了,此时窗口就会自动全屏了,如果没有全屏,重启过后就可以了7、若还没有全屏显示,则将虚拟机的【查看】—>【自动调整大小】—>【自适应客户机】,都选上,即可实现全屏","categories":[{"name":"实用教程","slug":"实用教程","permalink":"https://itrhx.com/categories/实用教程/"}],"tags":[{"name":"VMware","slug":"VMware","permalink":"https://itrhx.com/tags/VMware/"},{"name":"Ubuntu","slug":"Ubuntu","permalink":"https://itrhx.com/tags/Ubuntu/"}]},{"title":"主流 Markdown 编辑器推荐","slug":"Markdown-Editor","date":"2018-08-29T15:02:46.857Z","updated":"2018-08-30T15:05:11.494Z","comments":true,"path":"2018/08/29/Markdown-Editor/","link":"","permalink":"https://itrhx.com/2018/08/29/Markdown-Editor/","excerpt":"","text":"Markdown ,2004年由 John Gruberis 设计和开发,是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式,以下将介绍目前比较流行的一些 Markdown 编辑器(排名不分先后) - MarkdownPad 目前分为 MarkdownPad2 和 MarkdownPad Pro 版本,后者收费,我们使用前者足矣,用户可以通过键盘快捷键和工具栏按钮来使用或者移除 Markdown 各种语法格式,支持自定义配色方案、字体、大小和布局 、即时HTML预览、HTML和PDF导出,被很多人称赞为 Windows 平台最好用的 Markdown 编辑器,实用性强,仅支持 Windows 系统,个人觉得在 Windows 10 系统上界面并不是很好看,有时候添加音乐什么的,资源多了,实时预览会显示资源加载失败,点击此处访问 MarkdownPad 官网 - BookPad 无意间在 Microsoft Store 上发现的,完美搭配 Win10 系统,界面非常简洁漂亮,2017年9月份发布,大小30.82 MB,官方网站:https://sosfos.wordpress.com/ ,收费13人民币,可免费使用7天,各种功能应有尽有,和其他编辑器不相上下,本来想着百度百度看看有没有破解版,结果全网看不见 BookPad 的影子,估计是新出来的还不为人所知吧,可以直接在 Microsoft Store 搜索下载,或者点击链接获取:https://www.microsoft.com/store/apps/9N6P5ZH2SJSX - 小书匠 分为免费版和收费版,收费版¥20/年,其实免费版的功能已经足够强大了,多种编辑模式、多种主题选择、多种编辑器实现、丰富的语法支持、第三方同步、强大的文件管理功能,让人使用一次就爱上了它,支持 Windows 和 Web,推荐使用,点击此处访问小书匠官网 - Sublime Text 3Sublime Text 3 是基于 Vim 开发的跨平台代码编辑器,收费80美元,好像可以免费试用,支持 OS X、Windows、Ubuntu 等 UNIX 及 Linux 操作系统,由于其功能的多样性而广受好评,界面简约大方,定位专业,原生支持的编程语言就多达十几种,通过第三方插件,还能实现更多语法的支持,其中就包括 Markdown ,但也有个缺点,就是不能实时预览,但是用户可以通过 Markdown Preview 的插件实现对 Markdown 的预览,具体教程请点击此处查看,点击此处访问 Sublime Text 官网 - Mou Mou 是一款由国人独立开发者罗晨开发的实时预览型 Markdown 编辑器,仅支持 OS X操作系统,是目前同类应用中对汉字兼容性最好的作品,也是目前最好用的免费 Markdown 编辑器,提供语法高亮、在线预览、同步滚动、全屏模式,支持自定保存、自动匹配,允许自定义主题,支持 CSS,HTML 和 PDF 导出等功能,点击此处访问 Mou 官网 - AtomAtom 是 Github 专门为程序员推出的一个跨平台文本编辑器,具有简洁和直观的图形用户界面,并有很多有趣的特点:支持CSS,HTML,JavaScript等网页编程语言,当然也支持 Markdown ,支持宏,自动完成分屏功能,集成了文件管理器,点击此处访问 Atom 官网 - Smark国人编写的开源软件,Windows / Linux 等主流系统跨平台支持,完美支持 LaTex 数学公式、脚注、尾注等,支持使用本地 MathJax 调用,不需要在线访问 MathJax CDN,用户可配置的 Markdown 语法高亮显示,美观整洁,多种格式文件导出支持,简洁友好的界面布局,完备的各类快捷键,能极大地提高工作效率,点击此处访问 Smark 官网 - HaroopadHaroopad 覆盖三大主流桌面系统,支持 Windows、OS X 和 Linux,多种主题样式供你选择,语法标亮支持 54 种编程语言,该工具重点推荐 Ubuntu/Linux 用户使用,点击此处访问 Haroopad 官网 - TyporaTypora 同样支持 Windows、OS X 和 Linux,Typora 支持即时渲染技术,这也是与其他 Markdown 编辑器最显著的区别,支持数学编辑,可与 Word 直接格式转换,在 Pandoc 的支持下进行多种文档格式转换,Typora 适合那些对码字手速和排版顺畅度有要求的人群,譬如码农、网站小编等,点击此处访问 Typora 官网 - CuteMarkEdCuteMarkEd 是一个基于qt5的跨平台的 Markdown 编辑器,开源的, 提供实时 HTML 预览、数学表达式、源码高亮和PDF导出,点击此处 访问 CuteMarkEd 官网 - MarkPadMarkPad 是款开源的 Markdown 编辑器,与 Window 8 风格和谐友好的界面,可以直接在你的博客或者 GitHub 中打开、保存文档,直接将图片粘贴到 Markdown 文档中,点击此处访问 MarkPad 官网 - Cmd Markdown作业部落出品,是一款不错的工具和博客平台兼顾的产品,同时支持 Linux、Mac 和 Windows 操作系统,此外还提供 Web 在线创作,社交化批注、智能云同步,最简单的方法,满足多种写作需要,点击此处访问 Cmd Markdown 官网 - FarBox同样是一款不错的 Markdown 编辑器和博客平台兼顾的产品,让用户通过Dropbox(现在默认是自己的同步服务器)直接建立个人网站。FarBox编辑器免费,同时支持 Linux、Mac 和 Windows 操作系统,Farbox服务可以免费试用,在本地编辑器内写作自动同步发布在个人博客,对于希望有个人博客但却不愿折腾的小白来说,是个不错的选择,点击此处访问 FarBox 官网 - MiuMiu 是一款 Windows 下的 Markdown 编辑器,支持 Markdown 高亮、代码高亮、即时预览,以及可以快速发布到 Github Gist,小众软件,界面美观,已经找不到官网了,小众软件网有提供百度云下载,Miu 下载地址 - MacDownMacDown 引用了许多 Mou 的设计方式,仅支持 Mac ,开源免费,点击此处访问 MacDown 官网 - Ulysses一款由国外开发商 The Soulmen 制作的 Markdown 编辑器。与其它同类应用相比,Ulysses 最大的不同在于,它能根据内置的文件管理器,以及与 iCloud 云服务器的实时同步方案,达到最快捷的文章整理效率,支持OS X , iPad,26人民币每月,14天免费试用,点击此处访问 Ulysses 官网 - Byword一款轻量级的 Markdown 编辑器,支持Mac,iPhone和iPad,界面极简,功能强大,貌似要付费使用,点击此处 访问 Byword 官网 - Visual Studio CodeVisual Studio Code 是微软推出一款轻量级的文本编辑工具,类似于 Sublime,它已经默认集成 Markdown 文档编辑插件,原生就支持高亮 Markdown 的语法,但想要实时预览还需要选择 Markdown: Open Preview to the Side 命令实现,相关教程请点击此处,点击此处 访问 Visual Studio Code 官网 - MarxicoMarxico 中文名马克飞象,提供桌面客户端以及离线 Chrome App,支持移动端 Web,可以直接把文本存到印象笔记,点击此处访问 Marxico,点击此处访问 马克飞象 - MaHua一个在线编辑 Markdown 文档的编辑器,小众软件,VIM 快捷键支持,完美兼容 Github 的 Markdown 语法,界面稍许简陋,点击此处访问 MaHua - Dillinger来自国外的 Markdown 编辑器,漂亮强大,支持md、 html、pdf 文件导出,支持Dropbox、Github、Google Drive、Onedrive 一键保存,点击此处访问 Dillinger - 简书简书是一个优质的创作社区,你可以在线创作并发表到社区,是国内优质原创内容输出平台,简书从一开始就已经支持 Markdown 和富文本编辑,是一个为专门为作者打造的平台,点击此处访问简书官网 要细数 Markdown 编辑器的话,可能永远也数不尽,但最有质量的也就那么几个,而且每个人的看法也不同,正所谓萝卜白菜各有所爱,什么编辑器不是最重要的,重要的是我们能写出优质的文章,不断学习进步!不断提升自我! 参考资料:《好用的Markdown编辑器一览》(By:月光)《10款流行的Markdown编辑器,总有一款适合你》(By:xiaoxiao_engineer)《解决作者们的焦虑:7 款优秀 Markdown 编辑工具推荐》(By:JailJT)","categories":[{"name":"实用教程","slug":"实用教程","permalink":"https://itrhx.com/categories/实用教程/"}],"tags":[{"name":"Markdown","slug":"Markdown","permalink":"https://itrhx.com/tags/Markdown/"},{"name":"编辑器","slug":"编辑器","permalink":"https://itrhx.com/tags/编辑器/"}]},{"title":"Hexo 博客主题个性化","slug":"Hexo-blog-topic-personalization","date":"2018-08-27T13:25:24.452Z","updated":"2019-03-12T13:09:57.487Z","comments":true,"path":"2018/08/27/Hexo-blog-topic-personalization/","link":"","permalink":"https://itrhx.com/2018/08/27/Hexo-blog-topic-personalization/","excerpt":"","text":"本文将讲述一些博客主题的美化、实用功能的添加,不同主题可能方法有些不同(本文以作者 luuman 的 spfk 主题和作者 xaoxuu 的 Material X 主题为例),本文章会不定时进行更新。文章涉及有关参考资料、教程、链接如有侵权请联系我删除! – 添加评论系统 主流的评论系统有很多,比如:网易云跟帖、多说、友言、畅言、来必力(LiveRe)、Disqus、Valine、Gitment等等,目前网易云跟帖、多说、友言都已经关闭了,还有些可能需要翻墙,比较麻烦,百度了一下,最后还是选择了来必力评论系统 进入来必力官网,注册一个账号(注册时可能需要翻墙) 注册完毕之后,登录,进入安装页面,选择 City 免费版安装,安装之后你会得到一段代码 我们打开主题文件下的 _config.yml 文件,添加如下代码: 在 \\themes\\hexo-theme-spfk\\layout\\_partial\\comments 文件夹下新建一个 livere.ejs 的文件,在里面填写来必力提供的代码: 123456789101112131415161718<!-- 来必力City版安装代码 --><div id=\"lv-container\" data-id=\"city\" data-uid=\"这里是你的uid\"> <script type=\"text/javascript\"> (function(d, s) { var j, e = d.getElementsByTagName(s)[0]; if (typeof LivereTower === 'function') { return; } j = d.createElement(s); j.src = 'https://cdn-city.livere.com/js/embed.dist.js'; j.async = true; e.parentNode.insertBefore(j, e); })(document, 'script'); </script> <noscript>为正常使用来必力评论功能请激活JavaScript</noscript></div><!-- City版安装代码已完成 --> 打开 \\themes\\hexo-theme-spfk\\layout\\_partial\\article.ejs 文件,在适当位置添加如下红框中的代码: 完成以上操作之后,我们就可以使用来必力评论系统了 – 添加卡通人物 我在逛别人博客的时候偶然发现右下角居然有一个萌萌的卡通人物,还能根据你鼠标位置摇头,瞬间被吸引到了,赶紧也给自己博客添加一个吧!点击此处进入该项目地址 输入如下命令获取 live2d : 1$ npm install --save hexo-helper-live2d 输入以下命令,下载相应的模型,将 packagename 更换成模型名称即可,更多模型选择请点击此处,各个模型的预览请访问原作者的博客 1$ npm install packagename 打开站点目录下的 _config.yml 文件,添加如下代码:1234567891011live2d: enable: true scriptFrom: local model: use: live2d-widget-model-haruto #模型选择 display: position: right #模型位置 width: 150 #模型宽度 height: 300 #模型高度 mobile: show: false #是否在手机端显示 设置好过后我们就拥有了一个卡通人物 – 自定义鼠标指针样式 在 \\themes\\material-x\\source\\less\\_main.less 文件里写入如下代码:1cursor: url('https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@1.0/images/mouse.cur'),auto; 不同主题放的地方不同,确保在博客主体CSS文件中即可,其中的鼠标指针链接可替换成自己的,首先尝试加载 https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@1.0/images/mouse.cur ,如果该文件不存在或由于其他原因无效,那么 auto 会被使用,也就是自动默认效果,图片格式为.ico、.ani、.cur,建议使用.cur,如果使用.ani或者其他格式无效,原因是浏览器兼容问题,请阅读参考文档或者参考以下兼容表: 浏览器 最低版本 格式 Internet Explorer 6.0 .cur / .ani Firefox (Gecko), Windows and Linux 1.5 (1.8) .cur / .png / .gif / .jpg Firefox (Gecko) 4.0 (2.0) .cur / .png / .gif / .jpg / .svg Opera — — Safari (Webkit) 3.0 (522-523) .cur / .png / .gif / .jpg 拓展阅读:《CSS 鼠标样式 cursor属性》 (By:歪脖先生的博客) – 添加鼠标点击爱心效果 在 /themes/hexo-theme-spfk/source/js 下新建文件 love.js,在 love.js 文件中添加以下代码: 1!function(e,t,a){function n(){c(\".heart{width: 10px;height: 10px;position: fixed;background: #f00;transform: rotate(45deg);-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);}.heart:after,.heart:before{content: '';width: inherit;height: inherit;background: inherit;border-radius: 50%;-webkit-border-radius: 500%;-moz-border-radius: 50%;position: fixed;}.heart:after{top: -5px;}.heart:before{left: -5px;}\"),o(),r()}function r(){for(var e=0;e<d.length;e++)d[e].alpha<=0?(t.body.removeChild(d[e].el),d.splice(e,1)):(d[e].y--,d[e].scale+=.004,d[e].alpha-=.013,d[e].el.style.cssText=\"left:\"+d[e].x+\"px;top:\"+d[e].y+\"px;opacity:\"+d[e].alpha+\";transform:scale(\"+d[e].scale+\",\"+d[e].scale+\") rotate(45deg);background:\"+d[e].color+\";z-index:99999\");requestAnimationFrame(r)}function o(){var t=\"function\"==typeof e.onclick&&e.onclick;e.onclick=function(e){t&&t(),i(e)}}function i(e){var a=t.createElement(\"div\");a.className=\"heart\",d.push({el:a,x:e.clientX-5,y:e.clientY-5,scale:1,alpha:1,color:s()}),t.body.appendChild(a)}function c(e){var a=t.createElement(\"style\");a.type=\"text/css\";try{a.appendChild(t.createTextNode(e))}catch(t){a.styleSheet.cssText=e}t.getElementsByTagName(\"head\")[0].appendChild(a)}function s(){return\"rgb(\"+~~(255*Math.random())+\",\"+~~(255*Math.random())+\",\"+~~(255*Math.random())+\")\"}var d=[];e.requestAnimationFrame=function(){return e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(e){setTimeout(e,1e3/60)}}(),n()}(window,document); 在 \\themes\\hexo-theme-spfk\\layout\\layout.ejs 文件末尾添加以下代码: 12<!-- 页面点击小红心 --><script type=\"text/javascript\" src=\"/js/love.js\"></script> 完成以上操作后,当我们点击鼠标的时候就可以看见爱心的特效了 – 添加鼠标点击显示字体效果 在 /themes/hexo-theme-spfk/source/js 下新建文件 click_show_text.js,在 click_show_text.js 文件中添加以下代码: 123456789101112131415161718192021222324252627282930313233var a_idx = 0;jQuery(document).ready(function($) { $(\"body\").click(function(e) { var a = new Array (\"富强\", \"民主\", \"文明\", \"和谐\", \"自由\", \"平等\", \"公正\", \"法治\", \"爱国\", \"敬业\", \"诚信\", \"友善\"); var $i = $(\"<span/>\").text(a[a_idx]); a_idx = (a_idx + 1) % a.length; var x = e.pageX, y = e.pageY; $i.css({ \"z-index\": 5, \"top\": y - 20, \"left\": x, \"position\": \"absolute\", \"font-weight\": \"bold\", \"color\": \"#FF0000\" }); $(\"body\").append($i); $i.animate({ \"top\": y - 180, \"opacity\": 0 }, 3000, function() { $i.remove(); }); }); setTimeout('delay()', 2000);});function delay() { $(\".buryit\").removeAttr(\"onclick\");} 其中的社会主义核心价值观可以根据你自己的创意替换为其他文字,然后在 \\themes\\hexo-theme-spfk\\layout\\layout.ejs 文件末尾添加以下代码: 12<!--单击显示文字--><script type=\"text/javascript\" src=\"/js/click_show_text.js\"></script> 最终实现效果如下: – 添加鼠标点击烟花爆炸效果 在 \\themes\\material-x\\source\\js 目录下新建一个 fireworks.js 的文件,里面写入以下代码:1\"use strict\";function updateCoords(e){pointerX=(e.clientX||e.touches[0].clientX)-canvasEl.getBoundingClientRect().left,pointerY=e.clientY||e.touches[0].clientY-canvasEl.getBoundingClientRect().top}function setParticuleDirection(e){var t=anime.random(0,360)*Math.PI/180,a=anime.random(50,180),n=[-1,1][anime.random(0,1)]*a;return{x:e.x+n*Math.cos(t),y:e.y+n*Math.sin(t)}}function createParticule(e,t){var a={};return a.x=e,a.y=t,a.color=colors[anime.random(0,colors.length-1)],a.radius=anime.random(16,32),a.endPos=setParticuleDirection(a),a.draw=function(){ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.fillStyle=a.color,ctx.fill()},a}function createCircle(e,t){var a={};return a.x=e,a.y=t,a.color=\"#F00\",a.radius=0.1,a.alpha=0.5,a.lineWidth=6,a.draw=function(){ctx.globalAlpha=a.alpha,ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.lineWidth=a.lineWidth,ctx.strokeStyle=a.color,ctx.stroke(),ctx.globalAlpha=1},a}function renderParticule(e){for(var t=0;t<e.animatables.length;t++){e.animatables[t].target.draw()}}function animateParticules(e,t){for(var a=createCircle(e,t),n=[],i=0;i<numberOfParticules;i++){n.push(createParticule(e,t))}anime.timeline().add({targets:n,x:function(e){return e.endPos.x},y:function(e){return e.endPos.y},radius:0.1,duration:anime.random(1200,1800),easing:\"easeOutExpo\",update:renderParticule}).add({targets:a,radius:anime.random(80,160),lineWidth:0,alpha:{value:0,easing:\"linear\",duration:anime.random(600,800)},duration:anime.random(1200,1800),easing:\"easeOutExpo\",update:renderParticule,offset:0})}function debounce(e,t){var a;return function(){var n=this,i=arguments;clearTimeout(a),a=setTimeout(function(){e.apply(n,i)},t)}}var canvasEl=document.querySelector(\".fireworks\");if(canvasEl){var ctx=canvasEl.getContext(\"2d\"),numberOfParticules=30,pointerX=0,pointerY=0,tap=\"mousedown\",colors=[\"#FF1461\",\"#18FF92\",\"#5A87FF\",\"#FBF38C\"],setCanvasSize=debounce(function(){canvasEl.width=2*window.innerWidth,canvasEl.height=2*window.innerHeight,canvasEl.style.width=window.innerWidth+\"px\",canvasEl.style.height=window.innerHeight+\"px\",canvasEl.getContext(\"2d\").scale(2,2)},500),render=anime({duration:1/0,update:function(){ctx.clearRect(0,0,canvasEl.width,canvasEl.height)}});document.addEventListener(tap,function(e){\"sidebar\"!==e.target.id&&\"toggle-sidebar\"!==e.target.id&&\"A\"!==e.target.nodeName&&\"IMG\"!==e.target.nodeName&&(render.play(),updateCoords(e),animateParticules(pointerX,pointerY))},!1),setCanvasSize(),window.addEventListener(\"resize\",setCanvasSize,!1)}\"use strict\";function updateCoords(e){pointerX=(e.clientX||e.touches[0].clientX)-canvasEl.getBoundingClientRect().left,pointerY=e.clientY||e.touches[0].clientY-canvasEl.getBoundingClientRect().top}function setParticuleDirection(e){var t=anime.random(0,360)*Math.PI/180,a=anime.random(50,180),n=[-1,1][anime.random(0,1)]*a;return{x:e.x+n*Math.cos(t),y:e.y+n*Math.sin(t)}}function createParticule(e,t){var a={};return a.x=e,a.y=t,a.color=colors[anime.random(0,colors.length-1)],a.radius=anime.random(16,32),a.endPos=setParticuleDirection(a),a.draw=function(){ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.fillStyle=a.color,ctx.fill()},a}function createCircle(e,t){var a={};return a.x=e,a.y=t,a.color=\"#F00\",a.radius=0.1,a.alpha=0.5,a.lineWidth=6,a.draw=function(){ctx.globalAlpha=a.alpha,ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.lineWidth=a.lineWidth,ctx.strokeStyle=a.color,ctx.stroke(),ctx.globalAlpha=1},a}function renderParticule(e){for(var t=0;t<e.animatables.length;t++){e.animatables[t].target.draw()}}function animateParticules(e,t){for(var a=createCircle(e,t),n=[],i=0;i<numberOfParticules;i++){n.push(createParticule(e,t))}anime.timeline().add({targets:n,x:function(e){return e.endPos.x},y:function(e){return e.endPos.y},radius:0.1,duration:anime.random(1200,1800),easing:\"easeOutExpo\",update:renderParticule}).add({targets:a,radius:anime.random(80,160),lineWidth:0,alpha:{value:0,easing:\"linear\",duration:anime.random(600,800)},duration:anime.random(1200,1800),easing:\"easeOutExpo\",update:renderParticule,offset:0})}function debounce(e,t){var a;return function(){var n=this,i=arguments;clearTimeout(a),a=setTimeout(function(){e.apply(n,i)},t)}}var canvasEl=document.querySelector(\".fireworks\");if(canvasEl){var ctx=canvasEl.getContext(\"2d\"),numberOfParticules=30,pointerX=0,pointerY=0,tap=\"mousedown\",colors=[\"#FF1461\",\"#18FF92\",\"#5A87FF\",\"#FBF38C\"],setCanvasSize=debounce(function(){canvasEl.width=2*window.innerWidth,canvasEl.height=2*window.innerHeight,canvasEl.style.width=window.innerWidth+\"px\",canvasEl.style.height=window.innerHeight+\"px\",canvasEl.getContext(\"2d\").scale(2,2)},500),render=anime({duration:1/0,update:function(){ctx.clearRect(0,0,canvasEl.width,canvasEl.height)}});document.addEventListener(tap,function(e){\"sidebar\"!==e.target.id&&\"toggle-sidebar\"!==e.target.id&&\"A\"!==e.target.nodeName&&\"IMG\"!==e.target.nodeName&&(render.play(),updateCoords(e),animateParticules(pointerX,pointerY))},!1),setCanvasSize(),window.addEventListener(\"resize\",setCanvasSize,!1)}; 然后在 \\themes\\material-x\\layout\\layout.ejs 文件中写入以下代码: 123<canvas class=\"fireworks\" style=\"position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;\" ></canvas> <script type=\"text/javascript\" src=\"//cdn.bootcss.com/animejs/2.2.0/anime.min.js\"></script> <script type=\"text/javascript\" src=\"/js/fireworks.js\"></script> 最终效果: – 添加彩色滚动变换字体 在你想要添加彩色滚动变换字体的地方写入以下代码即可,其中文字可自行更改:123456789101112131415161718192021222324252627282930313233343536373839404142<div id=\"binft\"></div> <script> var binft = function (r) { function t() { return b[Math.floor(Math.random() * b.length)] } function e() { return String.fromCharCode(94 * Math.random() + 33) } function n(r) { for (var n = document.createDocumentFragment(), i = 0; r > i; i++) { var l = document.createElement(\"span\"); l.textContent = e(), l.style.color = t(), n.appendChild(l) } return n } function i() { var t = o[c.skillI]; c.step ? c.step-- : (c.step = g, c.prefixP < l.length ? (c.prefixP >= 0 && (c.text += l[c.prefixP]), c.prefixP++) : \"forward\" === c.direction ? c.skillP < t.length ? (c.text += t[c.skillP], c.skillP++) : c.delay ? c.delay-- : (c.direction = \"backward\", c.delay = a) : c.skillP > 0 ? (c.text = c.text.slice(0, -1), c.skillP--) : (c.skillI = (c.skillI + 1) % o.length, c.direction = \"forward\")), r.textContent = c.text, r.appendChild(n(c.prefixP < l.length ? Math.min(s, s + c.prefixP) : Math.min(s, t.length - c.skillP))), setTimeout(i, d) } var l = \"\", o = [\"青青陵上柏,磊磊涧中石。\", \"人生天地间,忽如远行客。\",\"斗酒相娱乐,聊厚不为薄。\", \"驱车策驽马,游戏宛与洛。\",\"洛中何郁郁,冠带自相索。\",\"长衢罗夹巷,王侯多第宅。\",\"两宫遥相望,双阙百余尺。\",\"极宴娱心意,戚戚何所迫?\"].map(function (r) { return r + \"\" }), a = 2, g = 1, s = 5, d = 75, b = [\"rgb(110,64,170)\", \"rgb(150,61,179)\", \"rgb(191,60,175)\", \"rgb(228,65,157)\", \"rgb(254,75,131)\", \"rgb(255,94,99)\", \"rgb(255,120,71)\", \"rgb(251,150,51)\", \"rgb(226,183,47)\", \"rgb(198,214,60)\", \"rgb(175,240,91)\", \"rgb(127,246,88)\", \"rgb(82,246,103)\", \"rgb(48,239,130)\", \"rgb(29,223,163)\", \"rgb(26,199,194)\", \"rgb(35,171,216)\", \"rgb(54,140,225)\", \"rgb(76,110,219)\", \"rgb(96,84,200)\"], c = { text: \"\", prefixP: -s, skillI: 0, skillP: 0, direction: \"forward\", delay: a, step: g }; i() }; binft(document.getElementById('binft')); </script> 最终效果: – 添加字数统计和阅读时长 先在博客目录下执行以下命令安装 hexo-wordcount 插件: 1$ npm i --save hexo-wordcount 之后在 \\themes\\hexo-theme-spfk\\layout\\_partial\\post 目录下创建 word.ejs 文件,在 word.ejs 文件中写入以下代码: 123456789101112131415161718<div style=\"margin-top:10px;\"> <span class=\"post-time\"> <span class=\"post-meta-item-icon\"> <i class=\"fa fa-keyboard-o\"></i> <span class=\"post-meta-item-text\"> 字数统计: </span> <span class=\"post-count\"><%= wordcount(post.content) %>字</span> </span> </span> <span class=\"post-time\"> &nbsp; | &nbsp; <span class=\"post-meta-item-icon\"> <i class=\"fa fa-hourglass-half\"></i> <span class=\"post-meta-item-text\"> 阅读时长: </span> <span class=\"post-count\"><%= min2read(post.content) %>分</span> </span> </span></div> 然后在 \\themes\\hexo-theme-spfk\\layout\\_partial\\article.ejs 中适当位置添加以下代码: 最后在主题目录下的 _config.yml 添加以下配置 1word_count: true 如果显示的位置不好,可以自行更改其位置,成功配置后的效果如下: 另外:要在博客底部显示所有文章的总字数,可以点击此处,根据你博客底部文件的类型选择相应的代码放在适当的位置即可,前提是要安装好 hexo-wordcount 插件,例如我使用 Material X 主题,在 \\themes\\material-x\\layout\\_partial 目录下的 footer.ejs 文件中添加如下代码:12<i class=\"fas fa-chart-area\"></i><span class=\"post-count\">字数统计:<%= totalcount(site) %></span> 实现效果如下: – 添加背景音乐 打开网页版网易云音乐,选择你准备添加的背景音乐,点击生成外链播放器,前提是要有版权,不然是无法生成外链播放器的,复制底下的HTML代码 然后将此代码放到你想要放的地方,比如放在博客的左侧,则打开 \\themes\\hexo-theme-spfk\\layout\\_partial\\left-col.ejs 文件,将复制的HTML代码粘贴进去,再进行适当的位置设置让播放器更美观,其中 auto=1 表示打开网页自动播放音乐,auto=0 表示关闭自动播放音乐 最后效果如下: – 添加网站运行时间 一个比较好的小功能,可以看见自己的博客运行多久了,时间一天天的增加,成就感也会一天天增加的在 \\themes\\hexo-theme-spfk\\layout\\_partial\\footer.ejs 文件下添加以下代码: 1234567891011121314151617<span id=\"timeDate\">载入天数...</span><span id=\"times\">载入时分秒...</span><script> var now = new Date(); function createtime() { var grt= new Date(\"08/10/2018 17:38:00\");//在此处修改你的建站时间 now.setTime(now.getTime()+250); days = (now - grt ) / 1000 / 60 / 60 / 24; dnum = Math.floor(days); hours = (now - grt ) / 1000 / 60 / 60 - (24 * dnum); hnum = Math.floor(hours); if(String(hnum).length ==1 ){hnum = \"0\" + hnum;} minutes = (now - grt ) / 1000 /60 - (24 * 60 * dnum) - (60 * hnum); mnum = Math.floor(minutes); if(String(mnum).length ==1 ){mnum = \"0\" + mnum;} seconds = (now - grt ) / 1000 - (24 * 60 * 60 * dnum) - (60 * 60 * hnum) - (60 * mnum); snum = Math.round(seconds); if(String(snum).length ==1 ){snum = \"0\" + snum;} document.getElementById(\"timeDate\").innerHTML = \"本站已安全运行 \"+dnum+\" 天 \"; document.getElementById(\"times\").innerHTML = hnum + \" 小时 \" + mnum + \" 分 \" + snum + \" 秒\"; } setInterval(\"createtime()\",250);</script> 最后效果如下: – 添加百度统计 百度统计是百度推出的一款免费的专业网站流量分析工具,能够告诉用户访客是如何找到并浏览用户的网站,在网站上做了些什么,非常有趣,接下来我们把百度统计添加到自己博客当中 访问百度统计首页,注册一个账号后登陆,添加你的博客网站 接着点击代码获取,复制该代码 然后到目录 \\Hexo\\themes\\hexo-theme-spfk\\layout\\_partial 下新建一个 baidu-analytics.ejs 文件,里面粘贴你刚刚复制的代码 修改主题文件夹下的 _config.yml 文件,将你的key(图中涂掉部分)填写进去: 所有操作完成后可以在百度统计管理页面检查代码是否安装成功,如果代码安装正确,一般20分钟后,可以查看网站分析数据 另外推荐:友盟,2010年4月在北京成立,安全、可靠、公正、第三方的网站流量统计分析系统 – 浏览器网页标题恶搞 当用户访问你的博客时点击到了其他网页,我们可以恶搞一下网页标题,呼唤用户回来,首先在目录 \\Hexo\\themes\\hexo-theme-spfk\\source\\js 下新建一个 FunnyTitle.js 文件,在里面填写如下代码: 1234567891011121314151617<!--浏览器搞笑标题--> var OriginTitle = document.title; var titleTime; document.addEventListener('visibilitychange', function () { if (document.hidden) { $('[rel=\"icon\"]').attr('href', \"/img/trhx2.png\"); document.title = 'ヽ(●-`Д´-)ノ你丑你就走!'; clearTimeout(titleTime); } else { $('[rel=\"icon\"]').attr('href', \"/img/trhx2.png\"); document.title = 'ヾ(Ő∀Ő3)ノ你帅就回来!' + OriginTitle; titleTime = setTimeout(function () { document.title = OriginTitle; }, 2000); } }); 然后在 \\Hexo\\themes\\hexo-theme-spfk\\layout\\layout.ejs 文件中添加如下代码: 12<!--浏览器搞笑标题--><script type=\"text/javascript\" src=\"\\js\\FunnyTitle.js\"></script> 再次部署博客后就可以看见标题搞笑的效果了: – 背景添加动态线条效果 在 \\Hexo\\themes\\hexo-theme-spfk\\layout\\layout.ejs 文件中添加如下代码: 1234<!--动态线条背景--><script type=\"text/javascript\"color=\"220,220,220\" opacity='0.7' zIndex=\"-2\" count=\"200\" src=\"//cdn.bootcss.com/canvas-nest.js/1.0.0/canvas-nest.min.js\"></script> 其中: color:表示线条颜色,三个数字分别为(R,G,B),默认:(0,0,0) opacity:表示线条透明度(0~1),默认:0.5 count:表示线条的总数量,默认:150 zIndex:表示背景的z-index属性,css属性用于控制所在层的位置,默认:-1 最终实现效果: – 添加人体时钟 无意中发现了个有趣的人体时钟 HONE HONE CLOCK,作者是个日本人,点击此处访问作者博客,点击此处在作者原博客上查看动态样式,点击此处查看动态大图,如果你的博客上有合适的地方,加上一个人体时钟会很有趣的 实现代码: 12345<!--人体时钟背景透明--><script charset=\"Shift_JIS\" src=\"http://chabudai.sakura.ne.jp/blogparts/honehoneclock/honehone_clock_tr.js\"></script><!--人体时钟背景白--><script charset=\"Shift_JIS\" src=\"http://chabudai.sakura.ne.jp/blogparts/honehoneclock/honehone_clock_wh.js\"></script> 其他网页小挂件推荐: http://abowman.com/ 里面有很多有趣的小挂件,可以养养鱼、龟、狗、仓鼠等各式各样的虚拟宠物,能根据你的鼠标指针位置移动,直接复制代码就可以用 http://www.revolvermaps.com/ 它提供网站访客地理信息,可以以2D、3D等形式显示 http://www.amazingcounters.com/ 免费网站计数器,有非常多的样式供你选择,可以设置计数器初始数值,可以设置按访问量计数,也可以按独立访问者计数 https://www.seniverse.com/widget/get 心知天气提供基于Web的免费天气插件,可以为你的网站添加一项简洁美观的天气预报功能,并自动适配PC和手机上的浏览 – 添加RSS订阅 RSS订阅是站点用来和其他站点之间共享内容的一种简易方式,即Really Simple Syndication(简易信息聚合),如果不会使用,可以参见百度百科:https://baike.baidu.com/item/RSS%E8%AE%A2%E9%98%85/663114 ;首先我们安装feed插件,在本地hexo目录下右键git bash here,输入以下命令: 1$ npm install hexo-generator-feed 等待安装完成后,打开hexo目录下配置文件的_config.yml,在末尾添加以下配置: 12345678910# Extensions## Plugins: http://hexo.io/plugins/#RSS订阅plugin:- hexo-generator-feed#Feed Atomfeed:type: atompath: atom.xmllimit: 20 随后打开主题配置文件_config.yml,添加以下配置: 1rss: /atom.xml 至此,RSS订阅功能添加完成 – 添加网站雪花飘落效果 样式一和样式二分别如下: 实现方法:在 \\Hexo\\themes\\hexo-theme-spfk\\source\\js 目录下新建一个 snow.js 文件,粘贴以下代码:123456789101112131415161718192021222324252627282930313233343536373839404142/*样式一*/(function($){ $.fn.snow = function(options){ var $flake = $('<div id=\"snowbox\" />').css({'position': 'absolute','z-index':'9999', 'top': '-50px'}).html('&#10052;'), documentHeight = $(document).height(), documentWidth = $(document).width(), defaults = { minSize : 10, maxSize : 20, newOn : 1000, flakeColor : \"#AFDAEF\" /* 此处可以定义雪花颜色,若要白色可以改为#FFFFFF */ }, options = $.extend({}, defaults, options); var interval= setInterval( function(){ var startPositionLeft = Math.random() * documentWidth - 100, startOpacity = 0.5 + Math.random(), sizeFlake = options.minSize + Math.random() * options.maxSize, endPositionTop = documentHeight - 200, endPositionLeft = startPositionLeft - 500 + Math.random() * 500, durationFall = documentHeight * 10 + Math.random() * 5000; $flake.clone().appendTo('body').css({ left: startPositionLeft, opacity: startOpacity, 'font-size': sizeFlake, color: options.flakeColor }).animate({ top: endPositionTop, left: endPositionLeft, opacity: 0.2 },durationFall,'linear',function(){ $(this).remove() }); }, options.newOn); };})(jQuery);$(function(){ $.fn.snow({ minSize: 5, /* 定义雪花最小尺寸 */ maxSize: 50,/* 定义雪花最大尺寸 */ newOn: 300 /* 定义密集程度,数字越小越密集 */ });}); 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128/*样式二*//* 控制下雪 */function snowFall(snow) { /* 可配置属性 */ snow = snow || {}; this.maxFlake = snow.maxFlake || 200; /* 最多片数 */ this.flakeSize = snow.flakeSize || 10; /* 雪花形状 */ this.fallSpeed = snow.fallSpeed || 1; /* 坠落速度 */}/* 兼容写法 */requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || window.oRequestAnimationFrame || function(callback) { setTimeout(callback, 1000 / 60); };cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame || window.oCancelAnimationFrame;/* 开始下雪 */snowFall.prototype.start = function(){ /* 创建画布 */ snowCanvas.apply(this); /* 创建雪花形状 */ createFlakes.apply(this); /* 画雪 */ drawSnow.apply(this)}/* 创建画布 */function snowCanvas() { /* 添加Dom结点 */ var snowcanvas = document.createElement(\"canvas\"); snowcanvas.id = \"snowfall\"; snowcanvas.width = window.innerWidth; snowcanvas.height = document.body.clientHeight; snowcanvas.setAttribute(\"style\", \"position:absolute; top: 0; left: 0; z-index: 1; pointer-events: none;\"); document.getElementsByTagName(\"body\")[0].appendChild(snowcanvas); this.canvas = snowcanvas; this.ctx = snowcanvas.getContext(\"2d\"); /* 窗口大小改变的处理 */ window.onresize = function() { snowcanvas.width = window.innerWidth; /* snowcanvas.height = window.innerHeight */ }}/* 雪运动对象 */function flakeMove(canvasWidth, canvasHeight, flakeSize, fallSpeed) { this.x = Math.floor(Math.random() * canvasWidth); /* x坐标 */ this.y = Math.floor(Math.random() * canvasHeight); /* y坐标 */ this.size = Math.random() * flakeSize + 2; /* 形状 */ this.maxSize = flakeSize; /* 最大形状 */ this.speed = Math.random() * 1 + fallSpeed; /* 坠落速度 */ this.fallSpeed = fallSpeed; /* 坠落速度 */ this.velY = this.speed; /* Y方向速度 */ this.velX = 0; /* X方向速度 */ this.stepSize = Math.random() / 30; /* 步长 */ this.step = 0 /* 步数 */}flakeMove.prototype.update = function() { var x = this.x, y = this.y; /* 左右摆动(余弦) */ this.velX *= 0.98; if (this.velY <= this.speed) { this.velY = this.speed } this.velX += Math.cos(this.step += .05) * this.stepSize; this.y += this.velY; this.x += this.velX; /* 飞出边界的处理 */ if (this.x >= canvas.width || this.x <= 0 || this.y >= canvas.height || this.y <= 0) { this.reset(canvas.width, canvas.height) }};/* 飞出边界-放置最顶端继续坠落 */flakeMove.prototype.reset = function(width, height) { this.x = Math.floor(Math.random() * width); this.y = 0; this.size = Math.random() * this.maxSize + 2; this.speed = Math.random() * 1 + this.fallSpeed; this.velY = this.speed; this.velX = 0;};// 渲染雪花-随机形状(此处可修改雪花颜色!!!)flakeMove.prototype.render = function(ctx) { var snowFlake = ctx.createRadialGradient(this.x, this.y, 0, this.x, this.y, this.size); snowFlake.addColorStop(0, \"rgba(255, 255, 255, 0.9)\"); /* 此处是雪花颜色,默认是白色 */ snowFlake.addColorStop(.5, \"rgba(255, 255, 255, 0.5)\"); /* 若要改为其他颜色,请自行查 */ snowFlake.addColorStop(1, \"rgba(255, 255, 255, 0)\"); /* 找16进制的RGB 颜色代码。 */ ctx.save(); ctx.fillStyle = snowFlake; ctx.beginPath(); ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2); ctx.fill(); ctx.restore();};/* 创建雪花-定义形状 */function createFlakes() { var maxFlake = this.maxFlake, flakes = this.flakes = [], canvas = this.canvas; for (var i = 0; i < maxFlake; i++) { flakes.push(new flakeMove(canvas.width, canvas.height, this.flakeSize, this.fallSpeed)) }}/* 画雪 */function drawSnow() { var maxFlake = this.maxFlake, flakes = this.flakes; ctx = this.ctx, canvas = this.canvas, that = this; /* 清空雪花 */ ctx.clearRect(0, 0, canvas.width, canvas.height); for (var e = 0; e < maxFlake; e++) { flakes[e].update(); flakes[e].render(ctx); } /* 一帧一帧的画 */ this.loop = requestAnimationFrame(function() { drawSnow.apply(that); });}/* 调用及控制方法 */var snow = new snowFall({maxFlake:60});snow.start(); 然后在 \\Hexo\\themes\\hexo-theme-spfk\\layout\\layout.ejs 文件里引用即可: 12<!-- 雪花特效 --><script type=\"text/javascript\" src=\"\\js\\snow.js\"></script> 如果没效果,请确认网页是否已载入JQurey,如果没有请在下雪代码之前引入JQ即可: 12<script type=\"text/javascript\" src=\"http://libs.baidu.com/jquery/1.8.3/jquery.js\"></script><script type=\"text/javascript\" src=\"http://libs.baidu.com/jquery/1.8.3/jquery.min.js\"></script> 原文链接:《分享两种圣诞节雪花特效JS代码(网站下雪效果)》 – 添加 Fork me on GitHub 效果 效果图:点击此处可以查看更多样式,将相应样式的代码复制到你想要放的地方就OK了,代码里的链接也要替换成你的,更多创意,比如 Follow me on CSDN ,只需要用PS改掉图片里的文字,替换掉相应链接即可 未完待续……","categories":[{"name":"实用教程","slug":"实用教程","permalink":"https://itrhx.com/categories/实用教程/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://itrhx.com/tags/Hexo/"},{"name":"主题个性化","slug":"主题个性化","permalink":"https://itrhx.com/tags/主题个性化/"}]},{"title":"Markdown 语法&技巧总结","slug":"Summary-of-Markdown-Grammar-and-Skills","date":"2018-08-25T09:57:16.879Z","updated":"2019-01-18T13:20:00.396Z","comments":true,"path":"2018/08/25/Summary-of-Markdown-Grammar-and-Skills/","link":"","permalink":"https://itrhx.com/2018/08/25/Summary-of-Markdown-Grammar-and-Skills/","excerpt":"","text":"在写博客的时候,我们不希望都是千篇一律的没有色彩,多了解一些 Markdown 语法技巧有利于丰富我们的博客,看起来更有 feel ! – 插入图片 如果你使用 MarkdownPad 的话就比较方便,可以直接选择插入本地图片或者是网络图片,实质是通过以下代码实现的,小括号里面就是你的图片地址,中括号里面是图片的替代文字,比如上面的图片代码如下:1![车](https://i.imgur.com/UyEXrBi.jpg) – 插入音乐 打开网页版网易云音乐,选择你准备插入的音乐,点击生成外链播放器,前提是要有版权,不然是无法生成外链播放器的,复制底下的HTML代码 然后将此HTML代码粘贴到你想要放的地方,可自行调节播放器的大小,其中 auto=1 表示打开网页自动播放音乐,auto=0 表示关闭自动播放音乐,比如See You Again (中英文版) - 罗艺恒这首歌曲代码如下: 1<iframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=330 height=86 src=\"//music.163.com/outchain/player?type=2&id=32405683&auto=1&height=66\"></iframe> – 插入视频 高考毕业了我们为下一届的学弟学妹们录制高考加油视频,我担任后期制作,在这里就以该视频为例٩(๑❛ᴗ❛๑)۶,在腾讯视频播放页面找到分享按钮,复制该视频的通用代码(其他视频播放平台也一样),粘贴到文章中对应位置即可,可根据情况调整视频播放器的大小 1<iframe frameborder=\"0\" width=\"840\" height=\"500\" src=\"https://v.qq.com/txp/iframe/player.html?vid=x0643zvgtf7\" allowFullScreen=\"true\"></iframe> 未完待续……","categories":[{"name":"实用教程","slug":"实用教程","permalink":"https://itrhx.com/categories/实用教程/"}],"tags":[{"name":"Markdown","slug":"Markdown","permalink":"https://itrhx.com/tags/Markdown/"},{"name":"技巧","slug":"技巧","permalink":"https://itrhx.com/tags/技巧/"}]},{"title":"使用 Github Pages 和 Hexo 搭建自己的独立博客","slug":"Build-your-own-independent-blog-using-GithubPages-and-Hexo","date":"2018-08-15T13:34:58.325Z","updated":"2019-03-25T16:46:24.249Z","comments":true,"path":"2018/08/15/Build-your-own-independent-blog-using-GithubPages-and-Hexo/","link":"","permalink":"https://itrhx.com/2018/08/15/Build-your-own-independent-blog-using-GithubPages-and-Hexo/","excerpt":"","text":"– 前言 首先感谢您能访问我的博客:TRHX’S BLOG 这是一篇有关如何使用 Github Pages 和 Hexo 搭建属于自己独立博客的详尽教程,本人是软件工程专业本科生,目前只学习了C和C++编程语言,对网站开发的有关知识几乎为零,这也是我搭建好自己的博客之后写的第一篇博客,刚开始搭建博客的时候自己也是网上各种百度,由于自己属于小白那种,历经了千辛万苦才弄好,所以借这个机会写一篇小白真正能看懂的博客搭建教程,教你一步一步走向成功的彼岸! 推荐文章: 《我为什么写博客》 (By 知明所以) 《为什么你应该(从现在开始就)写博客》 (By 刘未鹏 | Mind Hacks) – 入门 Github Pages Github Pages可以被认为是用户编写的、托管在github上的静态网页。使用Github Pages可以为你提供一个免费的服务器,免去了自己搭建服务器和写数据库的麻烦。此外还可以绑定自己的域名。 Hexo Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 – 安装 Node.js点击此处访问官网,按需下载相应版本,默认安装可以了 注:本人在安装过程中出现了Warning 1909,无法创建快捷方式,这种情况很少出现,如果在安装过程中也有这种情况请参考百度文库(win10系统实测可行):《Win7安装程序警告1909无法创建快捷方式》 – 安装 Git点击此处访问官网,按需下载相应版本,默认安装即可参考资料:《如何在windows下安装GIT》 (By 俊雨廷休) 《Pro Git(中文版)》 – 检验软件是否安装成功同时按下 Win 键和 R 键打开运行窗口,输入 cmd ,然后输入以下命令,有相应版本信息显示则安装成功,若不正确可以卸载软件重新安装,此外若安装成功,在桌面右键鼠标,可以看到菜单里多了 Git GUI Here 和 Git Bash Here两个选项,第一个是图形界面的Git操作,另一个是命令行123$ git --version$ node -v$ npm -v – Hexo 安装选择一个磁盘,新建一个文件夹,自己重命名文件夹(如:我的文件夹为:E\\TRHX_Blog),博客相关文件将储存在此文件夹下,在该文件夹下右键鼠标,点击 Git Bash Here,输入以下 npm 命令即可安装,第一个命令表示安装 hexo,第二个命令表示安装 hexo 部署到 git page 的 deployer,如图所示即为安装成功12$ npm install hexo-cli -g$ npm install hexo-deployer-git --save – Hexo 初始化配置在刚才新建的文件夹里面再次新建一个 Hexo 文件夹(如:我的文件夹为:E\\TRHX_Blog\\Hexo),进入该 Hexo 文件夹右键鼠标,点击 Git Bash Here,输入以下命令,如图所示则安装成功1$ hexo init Hexo 安装完成后,将会在指定文件夹中新建所需要的文件,Hexo 文件夹下的目录如下: – 本地查看效果执行以下命令,执行完即可登录 http://localhost:4000/ 查看效果12$ hexo generate$ hexo server 显示以下信息说明操作成功:1INFO Hexo is running at http://0.0.0.0:4000/. Press Ctrl+C to stop. 登录 http://localhost:4000/ 查看效果: – 将博客部署到 Github Pages 上到目前为止,我们的本地博客就成功搭建了,但是现在我们只能通过本地连接查看博客,我们要做的是让其他人也能够访问我们的博客,这就需要我们将博客部署到Github Pages上 一、注册 Github 账户:点击此处访问 Github 官网,点击 Sign Up 注册账户 二、创建项目代码库:点击 New repository 开始创建,步骤及注意事项见图: 三、配置 SSH 密钥:只有配置好 SSH 密钥后,我们才可以通过 git 操作实现本地代码库与 Github 代码库同步,在你第一次新建的文件夹里面(如:我的文件夹为:E\\TRHX_Blog) Git Bash Here 输入以下命令:12$ ssh-keygen -t rsa -C \"your email@example.com\"//引号里面填写你的邮箱地址,比如我的是tanrenhou@126.com 之后会出现:123Generating public/private rsa key pair.Enter file in which to save the key (/c/Users/you/.ssh/id_rsa)://到这里可以直接回车将密钥按默认文件进行存储 然后会出现:123Enter passphrase (empty for no passphrase)://这里是要你输入密码,其实不需要输什么密码,直接回车就行Enter same passphrase again: 接下来屏幕会显示:123456Your identification has been saved in /c/Users/you/.ssh/id_rsa.Your public key has been saved in /c/Users/you/.ssh/id_rsa.pub.The key fingerprint is:这里是各种字母数字组成的字符串,结尾是你的邮箱The key's randomart image is:这里也是各种字母数字符号组成的字符串 运行以下命令,将公钥的内容复制到系统粘贴板上1$ clip < ~/.ssh/id_rsa.pub 四、在 GitHub 账户中添加你的公钥 1.登陆 GitHub,进入 Settings: 2.点击 SSH and GPG Keys: 3.选择 New SSH key: 4.粘贴密钥: 五、测试 输入以下命令:注意:git@github.com不要做任何更改!1$ ssh -T git@github.com 之后会显示: 输入 yes 后会显示:此时表示设置正确 六、配置 Git 个人信息 Git 会根据用户的名字和邮箱来记录提交,GitHub 也是用这些信息来做权限的处理,输入以下命令进行个人信息的设置,把名称和邮箱替换成你自己的,名字可以不是 GitHub 的昵称,但为了方便记忆,建议与 GitHub 一致12$ git config --global user.name \"此处填你的用户名\"$ git config --global user.email \"此处填你的邮箱\" 到此为止 SSH Key 配置成功,本机已成功连接到 Github – 将本地的 Hexo 文件更新到 Github 的库中一、登录 Github 打开自己的项目 yourname.github.io 二、鼠标移到 Clone or download 按钮,选择 Use SSH 三、一键复制地址 四、打开你创建的 Hexo 文件夹(如:E:\\TRHX_Blog\\Hexo),右键用记事本(或者Notepad++、Vs Code等)打开该文件夹下的 _config.yml 文件 五、按下图修改 _config.yml 文件并保存 六、在 Hexo 文件夹下分别执行以下命令12$ hexo g$ hexo d 或者直接执行1$ hexo g -d 执行完之后会让你输入你的 Github 的账号和密码,如果此时报以下错误,说明你的 deployer 没有安装成功1ERROR Deployer not found: git 需要执行以下命令再安装一次:1npm install hexo-deployer-git --save 再执行 hexo g -d,你的博客就会部署到 Github 上了 七、访问博客 你的博客地址:https://你的用户名.github.io,比如我的是:https://trhx.github.io ,现在每个人都可以通过此链接访问你的博客了 – 如何在博客上发表文章博客已经成功搭建了,但是我们该怎么写博客呢? 一、新建一个空文章,输入以下命令,会在项目 \\Hexo\\source\\_posts 中生成 文章标题.md 文件,文章标题根据需要命名1$ hexo n \"文章标题\" 也可以直接在 \\Hexo\\source\\_posts 目录下右键鼠标新建文本文档,改后缀为 .md 即可,这种方法比较方便 二、用编辑器编写文章 md 全称 Markdown, Markdown 是 2004 年由 John Gruberis 设计和开发的纯文本格式的语法,非常的简单实用,常用的标记符号屈指可数,几分钟即可学会, .md 文件可以使用支持 Markdown 语法的编辑器编辑,然后将写好的文章(.md文件)保存到 \\Hexo\\source\\_posts 文件夹下即可推荐 Windows 上使用 MarkdownPad2 或者 小书匠 编辑器,macOS 上使用 Mou 编辑器,Linux 上使用 Remarkable 编辑器,Web 端上使用 简书 ,另外可以参考我的另一篇文章:《主流 Markdown 编辑器推荐》当我们用编辑器写好文章后,可以使用以下命令将其推送到服务器上12$ hexo g$ hexo d或者将两个命令合二为一输入以下命令:1$ hexo d -g现在访问你的博客就可以看见写好的文章啦!参考资料:《10款流行的Markdown编辑器》 (By xiaoxiao_engineer) 《献给写作者的 Markdown 新手指南》 (By 简书) 《认识与入门 Markdown》 (By Te_Lee) 《markdown简明语法》 (By 不如) 《markdown基本语法》 (By 高鸿祥) 《Markdown 公式指导手册》 (By Harries)# – 如何为博客更换自己喜欢的主题 博客也搭建好了,文章也会写了,但是!!!默认的主题并不喜欢怎么办?现在,我们就来为自己的博客更换自己喜欢的主题 点击此处进入 Hexo 官网的主题专栏,我们可以看见有许多的主题供我们选择 我们要做的就是把主题克隆过来,在此我们以主题 Aero-Dual 为例,点进去我们就可以看见该主题作者的博客,鼠标滑到底,我们可以看见 Theme By Levblanc 的字样(其他主题类似),点击作者 Levblanc ,页面就会跳转到该主题所有的相关文件在 Github 上的地址,复制该地址 再打开 Hexo 文件夹下的 themes 目录(如:E:\\TRHX_Blog\\Hexo\\themes),右键 Git Bash Here,输入以下命令:1$ git clone 此处填写你刚才复制的主题地址 比如要安装 Aero-Dual 主题,则输入命令:1$ git clone https://github.com/levblanc/hexo-theme-aero-dual 等待下载完成后即可在 themes 目录下生成 hexo-theme-aero-dual 文件夹,然后打开 Hexo 文件夹下的配置文件 _config.yml ,找到关键字 theme,修改参数为:theme:hexo-theme-aero-dual (其他主题修改成相应名称即可),再次注意冒号后面有一个空格! 返回 Hexo 目录,右键 Git Bash Here ,输入以下命令开始部署主题:12$ hexo g $ hexo s 此时打开浏览器,访问 http://localhost:4000/ 就可看见我们的主题已经更换了,如果感觉效果满意,我们就可以把它部署到Github上了 打开 Hexo 文件夹,右键 Git Bash Here ,输入以下命令:123$ hexo clean //该命令的作用是清除缓存,若不输入此命令,服务器有可能更新不了主题$ hexo g -d 此时访问自己的博客即可看见更换后的主题,但我们仍然需要对主题的相关配置进行修改,比如网站标题,图标等等,Hexo 中有两份主要的配置文件,名称都是 _config.yml ,它们均是用于站点配置使用的。其中,一份位于站点根目录下(比如我的:E:\\TRHX_Blog\\Hexo\\_config.yml),主要包含 Hexo 本身整站的配置;另一份位于主题目录下(比如我的:E:\\TRHX_Blog\\Hexo\\themes\\hexo-theme-aero-dual\\_config.yml),这份配置由主题作者提供,主要用于配置主题相关的选项,一般 _config.yml 文件里都有相关注释,按需修改即可 参考资料:《有哪些好看的 Hexo 主题?》 (知乎) 《Hexo | 配置》 (Hexo官方文档) 《hexo常用命令笔记》 (By 小弟调调) – 为你的 Hexo 博客配置个性域名本人在配置域名的时候问题百出,百度的各种方法都不管用,打开网站总是 404,可能是我太笨了 o(╥﹏╥)o ,不过好在后来终于解决了这个问题 首先我们要购买域名,阿里云,腾讯云都可以,也不贵,一年几十块钱,最便宜几块钱也能买到,以阿里云为例,我购买的域名是 itrhx.com,购买过程就不赘述了,选择阿里云的解析平台,来到阿里云的管理控制台,点击进入域名解析列表或者直接点击域名后面的解析 方法一:点击添加记录,需要添加两个记录,两个记录类型都是 CNAME ,第一个主机记录为 @ ,第二个主机记录为 www,记录值都是填你自己的博客地址(比如我的是:trhx.github.io),保存之后域名解析就完成了!方法二:两个记录类型为 A ,第一个主机记录为 @ ,第二个主机记录为 www,记录值都为博客的 IP 地址,IP 地址可以 cmd 中输入 ping 你的博客地址 获得(比如我的:ping trhx.github.io),保存之后域名解析就完成了!有关解析记录类型的区别可以参考《域名解析中A记录、CNAME、MX记录、NS记录的区别和联系》 为了使 GitHub 接收我们的域名,还需要在博客的根目录下添加一个名为 CNAME 的文件(注意不要加.txt,没有任何后缀名!),这个文件放到 Hexo 文件夹的 source 里面,(比如我的是:E:\\TRHX_Blog\\Hexo\\source),文件里面填写你的域名(加不加www都行),比如要填写我的域名,文件里面就写:www.itrhx.com 或者 itrhx.com,经过以上操作,别人就可以通过 www.itrhx.com 、itrhx.com 、trhx.github.io 三个当中任意一个访问我的博客了!你的也一样! 有关加不加www的问题有以下区别: 如果你填写的是没有www的,比如 itrhx.com,那么无论是访问 https://www.itrhx.com 还是 https://itrhx.com ,都会自动跳转到 https://itrhx.com 如果你填写的是带www的,比如 www.itrhx.com ,那么无论是访问 https://www.itrhx.com 还是 https://itrhx.com ,都会自动跳转到 http://www.itrhx.com 如果你在其他平台购买域名,或者选择 DNSPod 等其他域名解析,操作方法大同小异,遇到问题可自行百度解决! 参考资料:《推荐几家域名注册服务商》 (By Jelly Bool) 《盘点十大免费DNS域名解析服务:稳定、可靠》 – 结语一顿操作下来虽然有点儿累,但看见拥有了自己的博客还是非常有成就感的,人生就是需要折腾,那么现在就开始你的创作之旅吧!文章的不断积累,你会从中受益很多的!另外,这是一篇小白写的适用于小白的博客搭建教程,比较详细,有这方面基础的可以百度有简略一点儿的教程,文中如有错误还请大佬指出改正!文中涉及参考资料如有侵权请联系我删除!","categories":[{"name":"实用教程","slug":"实用教程","permalink":"https://itrhx.com/categories/实用教程/"}],"tags":[{"name":"Github Pages","slug":"Github-Pages","permalink":"https://itrhx.com/tags/Github-Pages/"},{"name":"Hexo","slug":"Hexo","permalink":"https://itrhx.com/tags/Hexo/"}]},{"title":"Hello World!","slug":"Hello-World","date":"2018-08-10T09:38:00.000Z","updated":"2019-02-04T18:20:33.650Z","comments":true,"path":"2018/08/10/Hello-World/","link":"","permalink":"https://itrhx.com/2018/08/10/Hello-World/","excerpt":"","text":"人类的幸福和欢乐在于奋斗,而最有价值的是为理想而奋斗! ——— 苏格拉底 Human happiness and joy lie in struggle, and what is most valuable is striving for ideals! ——— Socrates","categories":[{"name":"BLOG","slug":"BLOG","permalink":"https://itrhx.com/categories/BLOG/"}],"tags":[{"name":"BLOG","slug":"BLOG","permalink":"https://itrhx.com/tags/BLOG/"}]}]} \ No newline at end of file +{"meta":{"title":"TRHX'S BLOG","subtitle":"求知若饥 虚心若愚","description":"一个大学生用于自学的个人博客","author":"TRHX'BLOG","url":"https://itrhx.com"},"pages":[{"title":"我的朋友们","date":"2019-03-28T15:27:34.828Z","updated":"2019-03-28T15:27:34.828Z","comments":true,"path":"friends/index.html","permalink":"https://itrhx.com/friends/index.html","excerpt":"","text":"海内存知己,天涯若比邻,相见即是缘分,欢迎各位大佬留言互换友链,必须要有名称、头像链接、至少一个标签或者一个简介哦~ 名称:TRHX’S BLOG主页:https://itrhx.com头像:https://itrhx.com/images/trhx.png标签:Python、Java简介:求知若饥 虚心若愚"}],"posts":[{"title":"免费CDN:jsDeliver+Github","slug":"Free-CDN-jsDeliver+Github","date":"2019-02-10T14:31:31.283Z","updated":"2019-03-12T13:03:31.300Z","comments":true,"path":"2019/02/10/Free-CDN-jsDeliver+Github/","link":"","permalink":"https://itrhx.com/2019/02/10/Free-CDN-jsDeliver+Github/","excerpt":"","text":"本文有参考《jsDeliver+github使用教程,免费好用的cdn》—— By hojun CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。——百度百科 放在Github的资源在国内加载速度比较慢,因此需要使用CDN加速来优化网站打开速度,jsDeliver + Github便是免费且好用的CDN,非常适合博客网站使用。 1、新建Github仓库 2、克隆Github仓库到本地 点击 Clone or download,一键复制仓库地址 在本地目录右键 Git Bash Here,执行以下命令: 1git clone 一键复制的仓库地址 3、上传资源 复制需要上传的资源到本地git仓库(注:jsDeliver不支持加载超过20M的资源),在本地git仓库目录下右键 Git Bash Here,执行以下命令:1234git status //查看状态git add . //添加所有文件到暂存区git commit -m '第一次提交' //把文件提交到仓库git push //推送至远程仓库 4、发布仓库 点击release发布 自定义发布版本号 5、通过jsDeliver引用资源 使用方法:https://cdn.jsdelivr.net/gh/你的用户名/你的仓库名@发布的版本号/文件路径例如:https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@1.0/images/trhx.png","categories":[{"name":"CDN","slug":"CDN","permalink":"https://itrhx.com/categories/CDN/"}],"tags":[{"name":"jsDeliver","slug":"jsDeliver","permalink":"https://itrhx.com/tags/jsDeliver/"},{"name":"CDN","slug":"CDN","permalink":"https://itrhx.com/tags/CDN/"}]},{"title":"新年快乐!","slug":"Happy-new-year","date":"2019-02-04T17:18:06.030Z","updated":"2019-02-04T18:20:38.517Z","comments":true,"path":"2019/02/05/Happy-new-year/","link":"","permalink":"https://itrhx.com/2019/02/05/Happy-new-year/","excerpt":"C printf("2019,祝大家"); C++ cout<<"一帆风顺"; C# System.Console.WriteLine("二龙腾飞") VB Msg("三羊开泰") VC MessageBox("四季平安"); Java System.out.println("五福临门"); JavaScript alert("六六大顺") PHP echo "七星高照"; Python print("八方来财") Html <br/>九运当头<br/> Objectivec NSLog(@"十全十美"); QBasic Print "阖家幸福" Asp Response.Write "心想事成" Ruby puts "财源广进" VBScript MsgBox "幸福安康" XML <TextView android:text="大展宏图" /> LUA print("学业有成") Delphi ShowMessage('万事如意'); shell echo 步步高升 perl print '鸿案齐眉' LISP (format t "身体健康~%") powerBuilder messagebox("龙马精神") COBOL DISPLAY '笑口常开' aswing JOptionPane.showMessageDialog("happy","好运连连") Android Toast.makeText(getApplicationContext(),"年年有余",Toast.LENGTH_SHORT).show() flex Alert.show("大吉大利"); Foxpro ?[家庭幸福!] iapp tw("瑞气盈门") DOS批处理 echo 鹏程万里 易语言 调试输出(“万事亨通”) Clojure (println "年年有今昔") verilog/systemverilog/e $display("岁岁有今朝") as trace("祝大家新年快乐!");","text":"C printf("2019,祝大家"); C++ cout<<"一帆风顺"; C# System.Console.WriteLine("二龙腾飞") VB Msg("三羊开泰") VC MessageBox("四季平安"); Java System.out.println("五福临门"); JavaScript alert("六六大顺") PHP echo "七星高照"; Python print("八方来财") Html <br/>九运当头<br/> Objectivec NSLog(@"十全十美"); QBasic Print "阖家幸福" Asp Response.Write "心想事成" Ruby puts "财源广进" VBScript MsgBox "幸福安康" XML <TextView android:text="大展宏图" /> LUA print("学业有成") Delphi ShowMessage('万事如意'); shell echo 步步高升 perl print '鸿案齐眉' LISP (format t "身体健康~%") powerBuilder messagebox("龙马精神") COBOL DISPLAY '笑口常开' aswing JOptionPane.showMessageDialog("happy","好运连连") Android Toast.makeText(getApplicationContext(),"年年有余",Toast.LENGTH_SHORT).show() flex Alert.show("大吉大利"); Foxpro ?[家庭幸福!] iapp tw("瑞气盈门") DOS批处理 echo 鹏程万里 易语言 调试输出(“万事亨通”) Clojure (println "年年有今昔") verilog/systemverilog/e $display("岁岁有今朝") as trace("祝大家新年快乐!");","categories":[{"name":"BLOG","slug":"BLOG","permalink":"https://itrhx.com/categories/BLOG/"}],"tags":[{"name":"BLOG","slug":"BLOG","permalink":"https://itrhx.com/tags/BLOG/"}]},{"title":"一台电脑使用两个/多个GitHub账号部署两个/多个Hexo博客","slug":"One-computer-deploys-two-or-more-Hexo-blogs","date":"2019-01-18T11:42:54.900Z","updated":"2019-01-21T16:35:16.923Z","comments":true,"path":"2019/01/18/One-computer-deploys-two-or-more-Hexo-blogs/","link":"","permalink":"https://itrhx.com/2019/01/18/One-computer-deploys-two-or-more-Hexo-blogs/","excerpt":"由于个人原因需要在一台电脑上分别用两个GitHub账号部署两个Hexo博客,本来以为挺简单,没想到问题重重,首先是一个GitHub账号只能搭建一个Hexo博客,其次是一台电脑绑定两个GitHub账号,则需要两对公钥,在处理第二个问题时遇到的问题比较多,因为对这方面一窍不通,还是小白,所以折腾了一下午才解决,网上好多教程我都看不懂,觉得不(自)够(己)详(太)细(笨),因此详细记录一下","text":"由于个人原因需要在一台电脑上分别用两个GitHub账号部署两个Hexo博客,本来以为挺简单,没想到问题重重,首先是一个GitHub账号只能搭建一个Hexo博客,其次是一台电脑绑定两个GitHub账号,则需要两对公钥,在处理第二个问题时遇到的问题比较多,因为对这方面一窍不通,还是小白,所以折腾了一下午才解决,网上好多教程我都看不懂,觉得不(自)够(己)详(太)细(笨),因此详细记录一下 原理分析: SSH的公钥是GitHub作为本地仓库和远程仓库连接的唯一标识,一个公钥只能对应一个GitHub账户,如果将一个相同的公钥上传到不同的GitHub账户,GitHub则无法做出辨识,进而导致错误 一台电脑,可以生成多对公私钥,可以通过配置,将不同的公钥上传到不同的GitHub账号,那么就不存在单个公钥绑定多个GitHub账号的情况存在了 相关问题报错: 同一台电脑部署第二个Hexo博客执行hexo g -d时报错:ERROR: Permission to xxxxxx/xxxxxx.github.io.git denied to xxxxxx. 添加新的 SSH 密钥 到 SSH agent 执行ssh-add xxx时报错:Could not open a connection to your authentication agent. 单独设置用户名/邮箱时报错:fatal: not in a git directory 以下是详细过程:前提:假设你的第二个博客相关配置操作已经顺利完成,但使用hexo g -d命令部署到 GitHub 上时报错:ERROR: Permission to xxxxxx/xxxxxx.github.io.git denied to xxxxxx. - 查看当前密钥首先我们打开终端输入ls ~/.ssh/可以查看当前已有的密钥,显示id_rsa 与 id_rsa_pub说明已经有一对密钥 - 创建新的密钥首先使用以下命令进入 SSH根目录下:1cd ~/.ssh/ 方法一直接使用以下命令创建新密钥,然后两次回车即可:1ssh-keygen -t rsa -f ~/.ssh/这里是新密钥名称 -C \"这里是你的邮箱\" 注意区别新密钥名称和旧密钥名称,不要相同!!! 方法二使用下面命令行创建新密钥:1ssh-keygen -t rsa -C \"这里是你的邮箱\" 回车后会出现:12Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): 注意此时需要你输入新密钥的名称,同样要注意区别新密钥名称和旧密钥名称,不要相同!!!之后再两次回车,新密钥创建完毕! - 配置config查看你的.ssh/根路径下, 有没有config文件,( 比如我的路径为C:\\Users\\Lenovo.ssh)没有则使用以下命令创建一个config文件:1touch config 用记事本或者其他工具打开config文件(注意config文件是没有任何后缀名的),写入以下配置: 1234567891011#第一个账号,默认使用的账号,不用做任何更改Host github.com HostName github.com User git IdentityFile ~/.ssh/id_rsa #第二个新账号,#\"xxxxxx\"为前缀名,可以任意设置,要记住,后面需要用到Host xxxxxx.github.com HostName github.com User git IdentityFile ~/.ssh/这里是你创建的新密钥的名称 - 设置新GitHub账户SSH key输入以下命令复制你创建的公钥:1clip < ~/.ssh/这里是你创建的新密钥的名称.pub 也可以直接在.ssh目录下找到你创建的新的公钥,文件名为新密钥的名称.pub,(比如我的是trhx_rsa.pub),用记事本打开,复制里面的内容,然后打开你的新GitHub账号主页,依次进入Settings —> SSH and GPG keys —> New SSH key,将刚复制的内容粘贴到Key那里,Title可以随便填,点击Add Key保存。 - 清空本地的 SSH 缓存,添加新的 SSH 密钥 到 SSH agent中使用命令cd ~/.sshcd到.ssh根目录下,依次执行以下命令: 123ssh-add -Dssh-add xxxxxx #旧密钥名称,一般是id_rsassh-add xxxxxx #新创建的密钥名称 如果执行以上命令出现错误:Could not open a connection to your authentication agent.,那么就需要先执行ssh-agent bash,再执行以上命令 - 验证配置是否成功依次执行以下命令,第一个为默认ssh_key验证;第二个为新的ssh_key验证,其中“xxxxxx”为你先前在config文件中的命名12ssh -T git@github.comssh -T git@xxxxxxx.github.com 依次显示以下信息, 则说明配置成功:1Hi 你的用户名! You've successfully authenticated, but GitHub does not provide shell access. - 取消全局用户名/邮箱配置,单独设置用户名/邮箱执行如下命令,取消全局用户名和邮箱配置(如果已经设置了全局的话): 12git config --global --unset user.namegit config --global --unset user.email 分别进入你的两个Hexo博客.git目录下执行以下命令单独设置用户名/邮箱:12git config user.name \"这里是用户名\"git config user.email \"这里是你的邮箱\" 如果此时报错:fatal: not in a git directory,说明你没有进入.git目录下,具体路径:\\Hexo\\.deploy_git\\.git,.git目录是隐藏的,需要你设置隐藏目录可见 执行以下命令可以查看设置是否成功1git config --list - hexo 配置文件修改git地址打开你的第二个博客Hexo目录下的_config.yml文件,找到deploy关键字,写入以下配置并保存:1234deploy: type: git repository: git@xxxxxx.github.com:你的用户名/你的用户名.github.io.git branch: master 比如我的配置:1234deploy: type: git repository: git@love109.github.com:love109/love109.github.io.git branch: master 大功告成,再次执行hexo g -d就能成功将新的博客部署到 Github 上了","categories":[{"name":"实用教程","slug":"实用教程","permalink":"https://itrhx.com/categories/实用教程/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://itrhx.com/tags/Hexo/"},{"name":"Github","slug":"Github","permalink":"https://itrhx.com/tags/Github/"}]},{"title":"Python3 自学笔记 C09","slug":"Python3-Self-study-Notes-C09","date":"2018-11-15T16:37:26.503Z","updated":"2018-11-15T16:48:05.385Z","comments":true,"path":"2018/11/16/Python3-Self-study-Notes-C09/","link":"","permalink":"https://itrhx.com/2018/11/16/Python3-Self-study-Notes-C09/","excerpt":"","text":"Python3 自学笔记第九章【文件和异常】 - 9.1 从文件中读取数据 - 9.1.1 读取整个文件 有一个文件,包含精确到小数点后30位的圆周率值,且在小数点后每10位处都换行:12345Circumference rate.txt----------3.1415926535 8979323846 2643383279 以下两个程序将打开并读取这个文件,再将其内容显示到屏幕上:12345#file_reader.pywith open('Circumference rate.txt') as file_object: contents = file_object.read() print(contents) 12345#file_reader2.pycontents = open ('Circumference rate.txt')print(contents.read())contents.close() 函数open()接受一个参数:要打开的文件的名称,Python在当前执行的文件所在的目录中查找指定的文件;关键字with在不再需要访问文件后将其关闭;也可以调用open()和close()来打开和关闭文件,如果使用这种方法,当程序存在bug时,close()语句未执行,文件将不会被关闭;方法read()将读取这个文件的全部内容,并将其作为一个长长的字符串储存在变量contents中,通过打印contents的值,就可以将这个文本文件的全部内容打印出来:1233.1415926535 8979323846 2643383279 输出结果末尾有一空行,这是因为read()到达末尾时返回一个空字符串,而将这个空字符串显示出来就是一个空行,如果要删除末尾的空行,可在print语句中使用rstrip():12345#file_reader.pywith open('Circumference rate.txt') as file_object: contents = file_object.read() print(contents.rstrip()) 输出结果如下:1233.1415926535 8979323846 2643383279 - 9.1.2 文件路径 相对文件路径:假定程序文件位于python_work文件夹中,程序文件操作的文本文件位于python_work文件夹的子文件夹text_files中,此时可以使用相对文件路径来打开该文本文件,相对文件路径让Python到指定的位置去查找,而该位置是相对于当前运行的程序所在目录的 在Linux和OS X中,相对路径类似于如下:1with open('text_files/filename.txt') as file_object: 在Windows系统中,文件路径中使用反斜杠(\\)而不是斜杠(/):1with open('text_files\\filename.txt') as file_object: 绝对文件路径:不用关心当前运行的程序储存在什么地方,直接将文件在计算机中的准确位置告诉Python,这称为绝对文件路径,绝对路径通常比相对路径更长,因此将其储存在一个变量中,再将变量传递给open()会有所帮助 在Linux和OS X中,绝对路径类似于如下:12file_path = '/home/ehmatthes/other_files/text_files/filename.txt'with open(file_path) as file_object: 在Windows系统中,绝对路径类似于如下:12file_path = 'C:\\Users\\ehmatthes\\other_files\\text_files\\filename.txt'with open(file_path) as file_object: - 9.1.3 逐行读取 要以每次一行的方式检查文件,可对文件对象使用for循环:123456#file_reader.pyfilename = 'Circumference rate.txt'with open(filename) as file_object: for line in file_object: print(line) 在文件中每行的末尾都有一个看不见的换行符,而print语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,一个来自print语句,输出结果如下:123453.1415926535 8979323846 2643383279 要消除这些多余的空白行,可以使用rstrip():123456#file_reader.pyfilename = 'Circumference rate.txt'with open(filename) as file_object: for line in file_object: print(line.rstrip()) 输出结果如下:1233.1415926535 8979323846 2643383279 - 9.1.4 创建一个包含文件各行内容的列表 使用关键字with时,open()返回的文件对象只在with代码块内可用,如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行储存在一个列表当中,并在with代码块外使用该列表:12345678#file_reader.pyfilename = 'Circumference rate.txt'with open(filename) as file_object: lines = file_object.readlines() for line in lines: print(line.rstrip()) 输出结果与文件内容完全一致 - 9.1.5 使用文件的内容 创建一个字符串,它包含文件中储存的所有数字,且没有任何空格:123456789101112#pi_string.pyfilename = 'Circumference rate.txt'with open(filename) as file_object: lines = file_object.readlines()pi_string = ''for line in lines: pi_string += line.rstrip() print(pi_string)print(len(pi_string)) 打印该字符串以及其长度:123.1415926535 8979323846 264338327936 由于原文件每行左边都有空格,我们可以使用strip()而不是rstrip()来删除它:123456789101112#pi_string.pyfilename = 'Circumference rate.txt'with open(filename) as file_object: lines = file_object.readlines()pi_string = ''for line in lines: pi_string += line.strip() print(pi_string)print(len(pi_string)) 输出结果如下:123.14159265358979323846264338327932 Python中有三个去除头尾字符、空白符的函数,它们依次为: strip:用来去除头尾字符、空白符(包括\\n、\\r、\\t、’ ‘,即:换行、回车、制表符、空格) lstrip:用来去除开头字符、空白符(包括\\n、\\r、\\t、’ ‘,即:换行、回车、制表符、空格) rstrip:用来去除结尾字符、空白符(包括\\n、\\r、\\t、’ ‘,即:换行、回车、制表符、空格)注意:这些函数都只会删除头和尾的字符,中间的不会删除。用法分别为:string.strip([chars])string.lstrip([chars])string.rstrip([chars])参数chars是可选的,当chars为空,默认删除string头尾的空白符(包括\\n、\\r、\\t、’ ‘)当chars不为空时,函数会被chars解成一个个的字符,然后将这些字符去掉它返回的是去除头尾字符(或空白符)的string副本,string本身不会发生改变 - 9.2 写入文件 将一条简单的消息储存到文件中:12345#write_message.pyfilename = 'programming.txt'with open(filename,'w') as file_object: file_object.write(\"I love programming!\") 调用open()时提供了两个实参,第一个实参也是要打开文件的名称,第二个实参(’w’)告诉Python,我们要以写入模式打开这个文件,打开文件时,可指定读取模式(’r’)、写入模式(’w’)、附加模式(’a’)或者让我们能够读取和写入文件的模式(’r+’),如果省略模式实参,则默认以只读模式打开文件 附表:Python读写文件各种模式区别 模式 可做操作 若文件不存在 是否覆盖 r 打开一个文件用于只读 报错 - rb 以二进制格式打开一个文件用于只读 报错 - r+ 打开一个文件用于读和写 报错 是 rb+ 以二进制格式打开一个文件用于读和写 报错 是 w 打开一个文件用于只写 创建 是 wb 以二进制格式打开一个文件只用于只写 创建 是 w+ 打开一个文件用于读和写 创建 是 wb+ 以二进制格式打开一个文件用于读和写 创建 是 a 打开一个文件用于追加 创建 否,追加写 ab 以二进制格式打开一个文件用于追加 创建 否,追加写 a+ 打开一个文件用于读和写 创建 否,追加写 ab+ 以二进制格式打开一个文件用于追加 创建 否,追加写 - 9.3 使用 try-except 代码块处理异常 当我们尝试将一个数字除以0时,会发生ZeroDivisionError异常:12345>>> print(5/0)Traceback (most recent call last): File \"<pyshell#0>\", line 1, in <module> print(5/0)ZeroDivisionError: division by zero 此时我们可以编写一个try-except代码块来处理该异常:1234try: print(5/0)except ZeroDivisionError: print(\"You can't divide by zero!\") 当我们运行该程序时,会出现提示:1You can't divide by zero! 在try-except代码块中加入else,编写一个只执行除法运算的简单计算器:12345678910111213141516print(\"Give me two numbers,and I'll divide them.\")print(\"Enter 'q' to quit.\")while True: first_number = input(\"\\nFirst number:\") if first_number == 'q': break second_number = input(\"\\nSecond number:\") if second_number == 'q': break try: answer = int(first_number)/int(second_number) except ZeroDivisionError: print(\"You can't divide by 0!\") else: print(answer) 运行程序:1234567891011121314Give me two numbers,and I'll divide them.Enter 'q' to quit.First number:45Second number:0You can't divide by 0!First number:36Second number:84.5First number:q 若不加入try-except代码块,我们在输入0时,程序就会出现异常而崩溃,而try-except代码块很好的解决了这种问题,而且还起到了提示的作用,同样的,try-except代码块也可以处理其他异常,如FileNotFoundError等 - 9.4 储存数据 - 9.4.1 使用 json.dump() 和 json.load() 模块json能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据;编写一个储存一组数字的简短程序,再编写一个将这些数字读取到内存中的程序,第一个程序将使用 json.dump()来储存这组数据,而第二个程序将使用 json.load()。函数 json.dump()接受两个实参:要储存的数据以及可用于储存数据的文件对象:123456789#number_writer.pyimport jsonnumbers = [2,3,5,7,11,13]filename = 'numbers.json'with open(filename,'w') as f_obj: json.dump(numbers,f_obj) 先导入模块json,再创建一个数字列表, 通常用文件扩展名.json来指出文件储存的数据为JSON格式,然后以写入模式打开该文件,使用函数json.dump()将数字列表储存到文件numbers.json中,打开该文件,数据的储存格式与Python一样:1[2, 3, 5, 7, 11, 13] 再编写一个程序,使用json.load()将这个列表读取到内存中:12345678#number_reader.pyimport jsonfilename = 'numbers.json'with open(filename) as f_obj: numbers = json.load(f_obj)print(numbers) 输出结果与number_writer.py中创建的数字列表相同:1[2, 3, 5, 7, 11, 13] 进阶:在同一个程序中使用 json.dump() 和 json.load():创建文件username.json储存用户名,从该文件中获取用户名,如果这个文件不存在,就在except代码块中提示用户输入用户名,并将其储存在username.json中:1234567891011121314151617#remember_me.pyimport json#如果以前储存了用户名,就加载它#否则就提示用户输入用户名并储存它filename = 'numbers.json'try: with open(filename) as f_obj: username = json.load(f_obj)except FileNotFoundError: username = input(\"What's your name?\") with open(filename,'w') as f_obj: json.dump(username,f_obj) print(\"We'll remember you when you come back, \" + username + \"!\")else: print(\"Welcome back, \" + username + \"!\") 以前没有储存用户名,第一次运行程序:12What's your name?TRHXWe'll remember you when you come back, TRHX! 再次运行程序:1Welcome back, TRHX! - 9.4.2 重构 代码能够正确运行,但可以做进一步的改进——将代码划分为一系列完成具体工作的函数,这样的过程称为重构,重构让代码更清晰、更易于理解、更容易扩展重构remember_me.py,将大部分逻辑放到一个或者多个函数中:12345678910111213141516171819#remember_me.pyimport jsondef greet_user(): #问候用户,并指出其名字 filename = 'numbers.json' try: with open(filename) as f_obj: username = json.load(f_obj) except FileNotFoundError: username = input(\"What's your name?\") with open(filename,'w') as f_obj: json.dump(username,f_obj) print(\"We'll remember you when you come back, \" + username + \"!\") else: print(\"Welcome back, \" + username + \"!\")greet_user() 重构greet_user(),让它不执行这么多任务——将获取储存的用户名的代码移到另一个函数中:12345678910111213141516171819202122232425262728#remember_me.pyimport jsondef get_stored_username(): #如果储存了用户名,就获取它 filename = 'numbers.json' try: with open(filename) as f_obj: username = json.load(f_obj) except FileNotFoundError: return None else: return usernamedef greet_user(): #问候用户,并指出其名字 username = get_stored_username() if username: print(\"Welcome back, \" + username + \"!\") else: username = input(\"What's your name?\") filename = 'username.json' with open(filename,'w') as f_obj: json.dump(username,f_obj) print(\"We'll remember you when you come back, \" + username + \"!\") greet_user() 将greet_user()中的另一个代码块提取出来:将没有储存用户名时提示用户输入的代码放在一个独立的函数中:12345678910111213141516171819202122232425262728293031323334#remember_me.pyimport jsondef get_stored_username(): #如果储存了用户名,就获取它 filename = 'numbers.json' try: with open(filename) as f_obj: username = json.load(f_obj) except FileNotFoundError: return None else: return usernamedef get_new_username(): #提示输入用户名 username = input(\"What's your name?\") filename = 'username.json' with open(filename,'w') as f_obj: json.dump(username,f_obj) return username def greet_user(): #问候用户,并指出其名字 username = get_stored_username() if username: print(\"Welcome back, \" + username + \"!\") else: username = get_new_username() print(\"We'll remember you when you come back, \" + username + \"!\") greet_user() 最终版本实现了每个函数只负责单一而清晰的任务,我们在编写程序时也要像这样,要写出清晰而易于维护和扩展的代码","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"文件","slug":"文件","permalink":"https://itrhx.com/tags/文件/"},{"name":"异常","slug":"异常","permalink":"https://itrhx.com/tags/异常/"}]},{"title":"Python3 自学笔记 C08","slug":"Python3-Self-study-Notes-C08","date":"2018-11-10T11:51:55.481Z","updated":"2018-11-14T08:36:49.184Z","comments":true,"path":"2018/11/10/Python3-Self-study-Notes-C08/","link":"","permalink":"https://itrhx.com/2018/11/10/Python3-Self-study-Notes-C08/","excerpt":"","text":"Python3 自学笔记第八章【类】 - 8.1 创建类和使用类 创建一个表示小狗的简单类Dog,根据Dog类创建的每个实例都将储存名字和年龄,赋予每条小狗蹲下(sit())和打滚(roll_over())的能力: 1234567891011121314class Dog(): def __init__(self,name,age): #初始化属性name和age self.name = name self.age = age def sit(self): #模拟小狗被命令时蹲下 print(self.name.title() + \" is now sitting.\") def roll_over(self): #模拟小狗被命令时打滚 print(self.name.title() + \" rolled over!\") 方法init():类中的函数称为方法,本例中方法init()是一个特殊的方法,每当我们根据Dog类创建新实例时,Python都会自动运行它,在方法的名称中,开头和结尾各有两个下划线,这是一种约定,避免Python默认方法与普通方法发生名称冲突,例子中将方法init()定义成了包含三个形参:self、name和age,在这个方法的定义中,形参self必不可少,还必须位于其他形参的前面,Python调用方法init()来创建Dog实例时,将自动传入实参self,每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法,我们创建Dog实例时,Python将调用Dog类的方法init(),我们将通过实参向Dog()传递名字和年龄;self会自动传递,因此我们不需要传递它,每当我们根据Dog类创建实例时,都只需要给最后两个形参(name和age)提供值;定义的两个变量都有前缀self,以self为前缀的变量都可以供类中的所有方法使用,还可以通过类的任何实例来访问这些变量。self.name = name 获取储存在形参name中的值,并将其储存到变量name中,然后该变量被关联到当前创建的实例。self.age = age 的作用与此类似,像这样可通过实例访问的变量称为属性;Dog还定义了另外两种方法:sit() 和 roll_over() ,由于这些方法不需要额外的信息,如名字和年龄,因此它们只有一个形参self 在Python 2.7中创建类时,需要在括号内包含单词object:12class ClassName(object): ---snip--- - 8.2 根据类创建实例访问属性:创建一个表示特定小狗的实例: 123456789101112131415161718class Dog(): def __init__(self,name,age): #初始化属性name和age self.name = name self.age = age def sit(self): #模拟小狗被命令时蹲下 print(self.name.title() + \" is now sitting.\") def roll_over(self): #模拟小狗被命令时打滚 print(self.name.title() + \" rolled over!\")my_dog = Dog('willie',6)print(\"My dog's name is \" + my_dog.name.title() + \".\")print(\"My dog is \" + str(my_dog.age) + \" years old.\") 让Python创建一条名字为’willie’,年龄为6的小狗,Python使用实参’willie’和6调用Dog类中的方法init()。方法init()创建一个表示特定小狗的示例,并使用我们提供的值来设置属性name和age;在访问实例的属性时,可使用句点表示法,比如该例子中的 my_dog.name;最终程序输出结果如下: 12My dog's name is Willie.My dog is 6 years old. 调用方法:根据Dog类创建实例后,就可以使用句点表示法来调用Dog类中定义的任何方法:123456789101112131415161718class Dog(): def __init__(self,name,age): #初始化属性name和age self.name = name self.age = age def sit(self): #模拟小狗被命令时蹲下 print(self.name.title() + \" is now sitting.\") def roll_over(self): #模拟小狗被命令时打滚 print(self.name.title() + \" rolled over!\")my_dog = Dog('willie',6)my_dog.sit()my_dog.roll_over() 输出结果如下:12Willie is now sitting.Willie rolled over! 创建多个实例:可按需求根据类创建任意数量的实例:12345678910111213141516171819202122232425class Dog(): def __init__(self,name,age): #初始化属性name和age self.name = name self.age = age def sit(self): #模拟小狗被命令时蹲下 print(self.name.title() + \" is now sitting.\") def roll_over(self): #模拟小狗被命令时打滚 print(self.name.title() + \" rolled over!\")my_dog = Dog('willie',6)your_dog = Dog('lucy',8)print(\"My dog's name is \" + my_dog.name.title() + \".\")print(\"My dog is \" + str(my_dog.age) + \" years old.\")my_dog.sit()print(\"\\nYour dog's name is \" + your_dog.name.title() + \".\")print(\"Your dog is \" + str(your_dog.age) + \" years old.\")your_dog.roll_over() 输出结果如下:1234567My dog's name is Willie.My dog is 6 years old.Willie is now sitting.Your dog's name is Lucy.Your dog is 8 years old.Lucy rolled over! - 8.3 使用类和实例 创建一个表示汽车的类,其中储存了有关汽车的信息,还有一个汇总这些信息的方法:12345678910111213class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() my_new_car = Car('audi','a9','2018')print(my_new_car.get_descriptive_name()) 输出结果如下:12018 Audi A9 - 8.3.1 给属性指定默认值 类中的每个属性都必须有初始值,如果我们设置了默认值,就无需包含为它提供初始值的形参,下面为8.3的例子添加一个 odometer_reading 的属性,其初值是0,添加一个 odometer_reading() 方法,用于读取汽车的里程表: 123456789101112131415161718 class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odomter(self): print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\")my_new_car = Car('audi','a9','2018')print(my_new_car.get_descriptive_name())my_new_car.read_odomter() 输出结果如下:122018 Audi A9This car has 0 miles on it. - 8.3.2 修改属性的值 可以以三种不同的方式修改属性的值:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值) 直接修改属性的值:要修改属性的值,最简单的方法就是通过实例直接访问它,将8.3.1中的例子第7行代码 self.odometer_reading = 0 改为 self.odometer_reading = 66,输出结果如下:12 2018 Audi A9This car has 66 miles on it. 通过方法修改属性的值:1234567891011121314151617181920212223class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odomter(self): print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\") def update_odometer(self,mileage): self.odometer_reading = mileage my_new_car = Car('audi','a9','2018')print(my_new_car.get_descriptive_name())my_new_car.update_odometer(66)my_new_car.read_odomter() 对Car类所做的唯一修改就是在第17、18行添加了方法 update_odometer(),这个方法接受一个里程值,并将其储存到 self.odometer_reading 中,在倒数第二行,调用了 update_odometer(),并向它提供了一个实参(该实参对应于方法定义中的形参mileage),它将里程数设置为66,而方法 read_odomter() 打印该读数:122018 Audi A9This car has 66 miles on it. 可对方法 update_odometer() 进行扩展,使其能够在修改里程表读数时做一些额外的工作,添加一些逻辑,禁止任何人将里程表读数往回调:1234567891011121314151617181920212223242526class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 50 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odomter(self): print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\") def update_odometer(self,mileage): if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print(\"You can't roll back an odometer!\") my_new_car = Car('audi','a9','2018')print(my_new_car.get_descriptive_name())my_new_car.update_odometer(33)my_new_car.read_odomter() 修改 self.odometer_reading 的默认值为50,当我们再次尝试修改其值为33时,由于小于原来的里程,因此无法修改: 1232018 Audi A9You can't roll back an odometer!This car has 50 miles on it. 通过方法对属性的值进行递增:有时候需要将属性值递增到特定的量,而不是将其设置为全新的值,假设我们购买了一辆二手车,从购买到登记期间增加了100英里的里程,下面的方法让我们能够传递这个增量,并相应地增加里程表读数:123456789101112131415161718192021222324252627282930313233class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odomter(self): print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\") def update_odometer(self,mileage): if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print(\"You can't roll back an odometer!\") def increment_odometer(self,miles): #将里程表读数增加指定的量 self.odometer_reading += miles my_new_car = Car('audi','a9','2018')print(my_new_car.get_descriptive_name())my_new_car.update_odometer(6600)my_new_car.read_odomter()my_new_car.increment_odometer(100)my_new_car.read_odomter() 输出结果如下:1232018 Audi A9This car has 6600 miles on it.This car has 6700 miles on it. - 8.4 继承 编写类时,并非总是要从空白开始,如果要编写的类是另一个现成类的特殊版本,可使用继承,一个类继承另一个类时,它自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类,子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法;继承的通用语法大致如下: 12345678class ClassName1(object): def __init__(self,name1,name2,name3): --snip--class ClassName2(ClassName1): def __init__(self,name1,name2,name3): super().__init__(name1,name2,name3) --snip-- - 8.4.1 子类的方法init() 1234567891011121314151617181920 class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title()class ElectricCar(Car): #电动车的独特之处 def __init__(self,make,model,year): #初始化父类的属性 super().__init__(make,model,year)my_new_car = ElectricCar('tesla','model s','2016')print(my_new_car.get_descriptive_name()) 创建子类时,父类必须包含在当前文件中,且位于子类前面,定义了子类 ElectricCar,定义子类时,必须在括号内指定父类名称,方法 __init__()接受创建Car实例所需信息,super() 是一个特殊的函数,帮助Python将父类和子类关联起来,让Python调用 ElectricCar 的父类的方法 __init__(),让 ElectricCar 实例包含父类的所有属性,父类也称为超类(superclass),程序输出结果如下:12016 Tesla Model S - 8.4.2 Python 2.7 中的继承 在Python 2.7中,ElectricCar类的定义类似于下面这样:12345678class Car(object): def __init__(self,make,model,year): --snip--class ElectricCar(Car): def __init__(self,make,model,year): super(ElectricCar,self).__init__(make,model,year) --snip-- - 8.4.3 给子类定义属性和方法 让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法,下面添加一个电动车特有的属性(battery),以及一个描述该属性的方法: 1234567891011121314151617181920212223class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title()class ElectricCar(Car): def __init__(self,make,model,year): super().__init__(make,model,year) self.battery_size = 80 def describe_battery(self): print(\"This car has a \" + str(self.battery_size) + \"-KWh battery.\")my_new_car = ElectricCar('tesla','model s','2016')print(my_new_car.get_descriptive_name())my_new_car.describe_battery() 输出结果如下:122016 Tesla Model SThis car has a 80-KWh battery. - 8.4.4 重写父类的方法 要重写父类的方法,只需要在子类中定义一个与要重写的父类方法同名的方法即可,这样,Python将不会考虑这个父类的方法,而只关心在子类中定义的相应方法,假设Car类有一个名为 fill_gas_tank() 的方法,对于电动车来说毫无意义,因此可以重写它:12345class ElectricCar(Car): --snip-- def fill_gas_tank(self): print(\"This car doesn't need a gas tank!\") - 8.4.5 将实例用作属性 123456789101112131415161718192021222324252627282930class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title()class Battery(): #一次模拟电动车电瓶的简单尝试 def __init__(self,battery_size=70): #初始化电瓶的属性 self.battery_size = battery_size def describe_battery(self): #打印一条描述电瓶容量的消息 print(\"This car has a \" + str(self.battery_size) + \"-KWh battery.\")class ElectricCar(Car): def __init__(self,make,model,year): super().__init__(make,model,year) self.battery = Battery()my_new_car = ElectricCar('tesla','model s','2016')print(my_new_car.get_descriptive_name())my_new_car.battery.describe_battery() 输出结果如下: 122016 Tesla Model SThis car has a 70-KWh battery. 看起来似乎做了多余的工作,但现在我们可以对电瓶添加更多的描述,而且不会导致 ElectricCar 类混乱不堪,下面再给Battery添加一个方法,使其能够根据电瓶容量报告汽车的续航里程:1234567891011121314151617181920212223242526272829303132333435363738394041class Car(): def __init__(self,make,model,year): self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title()class Battery(): #一次模拟电动车电瓶的简单尝试 def __init__(self,battery_size=70): #初始化电瓶的属性 self.battery_size = battery_size def describe_battery(self): #打印一条描述电瓶容量的消息 print(\"This car has a \" + str(self.battery_size) + \"-KWh battery.\") def get_range(self): #打印一条消息,指出电瓶的续航里程 if self.battery_size == 70: range = 240 elif self.battery_size == 90: range = 280 message = \"This car can go approximately \" + str(range) message += \" miles on a full charge.\" print(message) class ElectricCar(Car): def __init__(self,make,model,year): super().__init__(make,model,year) self.battery = Battery()my_new_car = ElectricCar('tesla','model s','2016')print(my_new_car.get_descriptive_name())my_new_car.battery.describe_battery()my_new_car.battery.get_range() 输出结果如下:1232016 Tesla Model SThis car has a 70-KWh battery.This car can go approximately 240 miles on a full charge. - 8.5 导入类 Python允许将类储存在模块中,然后在主程序中导入所需的模块 - 8.5.1 导入单个类 12345678910111213141516171819202122232425262728293031#car.py#一个用于表示汽车的类class Car(): def __init__(self,make,model,year): #初始化描述汽车的属性 self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): #返回整洁的描述性名称 long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odomter(self): #打印一条消息,指出汽车的里程 print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\") def update_odometer(self): #将里程表读数设置为指定的值,拒绝将里程表往回拨 if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print(\"You can't roll back an odometer!\") def increment_odometer(self,miles): #将里程表读数增加指定的量 self.odometer_reading += miles 创建另一个文件——my_car.py,在其中导入Car类并创建其实例:123456789#my_car.pyfrom car import Carmy_new_car = Car('audi','a9','2018')print(my_new_car.get_descriptive_name())my_new_car.odometer_reading = 23my_new_car.read_odometer() import语句让Python打开模块car,并导入其中的Car类,输出结果如下: 122018 Audi A9This car has 23 miles on it. - 8.5.2 在一个模块中储存多个类 将类Battery和ElectricCar都加入到模块car.py中: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#car.py#一组用于表示燃油汽车和电动汽车的类class Car(): def __init__(self,make,model,year): #初始化描述汽车的属性 self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): #返回整洁的描述性名称 long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odometer(self): #打印一条消息,指出汽车的里程 print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\") def update_odometer(self): #将里程表读数设置为指定的值,拒绝将里程表往回拨 if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print(\"You can't roll back an odometer!\") def increment_odometer(self,miles): #将里程表读数增加指定的量 self.odometer_reading += milesclass Battery(): #一次模拟电动车电瓶的简单尝试 def __init__(self,battery_size=70): #初始化电瓶的属性 self.battery_size = battery_size def describe_battery(self): #打印一条描述电瓶容量的消息 print(\"This car has a \" + str(self.battery_size) + \"-KWh battery.\") def get_range(self): #打印一条消息,指出电瓶的续航里程 if self.battery_size == 70: range = 240 elif self.battery_size == 90: range = 280 message = \"This car can go approximately \" + str(range) message += \" miles on a full charge.\" print(message)class ElectricCar(Car): #模拟电动车的独特之处 def __init__(self,make,model,year): #初始化父类的属性,再初始化电动车特有的属性 super().__init__(make,model,year) self.battery = Battery() 新建一个my_electric_car.py的文件,导入ElectricCar类,并创建一辆电动车:123456789#my_electric_car.pyfrom car import ElectricCarmy_tesla = ElectricCar('tesla','model s','2016')print(my_tesla.get_descriptive_name())my_tesla.battery.describe_battery()my_tesla.battery.get_range() 输出结果如下:1232016 Tesla Model SThis car has a 70-KWh battery.This car can go approximately 240 miles on a full charge. - 8.5.3 从一个模块中导入多个类 可根据需要在程序文件中导入任意数量的类,假如我们要在同一个程序中创建普通汽车和电动汽车,就需要将类Car和ElectricCar类都导入,多个类之间用逗号进行分隔: 123456789 #my_car.pyfrom car import Car,ElectricCarmy_audi = Car('audi','a9','2018')print(my_audi.get_descriptive_name())my_tesla = ElectricCar('tesla','model s','2016')print(my_tesla.get_descriptive_name()) 输出结果如下:122018 Audi A92016 Tesla Model S - 8.5.4 导入整个模块 导入整个模块后,需要使用句点表示法访问需要的类:123456789#my_car.pyimport carmy_audi = car.Car('audi','a9','2018')print(my_audi.get_descriptive_name())my_tesla = car.ElectricCar('tesla','model s','2016')print(my_tesla.get_descriptive_name()) 我们导入了整个car模块,需要使用语法 module_name.class_name 访问需要的类,程序输出结果与8.5.3一致:122018 Audi A92016 Tesla Model S - 8.5.5 导入模块中的所有类 要导入模块中的所有类,可使用以下语法:1from module_name import * 这种导入方法是不推荐的,没有明确指出你使用了模块中的哪些类,还可能引发名称方面的困惑,需要从一个模块中导入很多类时,最好导入整个模块,并使用 module_name.class_name 语法来访问类 - 8.5.6 在一个模块中导入另一个模块 有时候需要将类分散到多个模块当中,以免模块太大,或者在同一个模块中储存不相关的类,将类储存在多个模块中时,一个模块中的类可能会依赖于另一个模块中的类,这种情况下,我们可以在前一个模块中导入必要的类,以下例子中,将Car类储存在一个模块当中,并将ElectricCar和Battery类储存在另一个模块当中,将第二个模块命名为electric_car.py,并将ElectricCar和Battery类复制到这个模块中:12345678910111213141516171819202122232425262728293031#electric_car.py#一组可用于表示电动汽车的类from car import Carclass Battery(): #一次模拟电动车电瓶的简单尝试 def __init__(self,battery_size=70): #初始化电瓶的属性 self.battery_size = battery_size def describe_battery(self): #打印一条描述电瓶容量的消息 print(\"This car has a \" + str(self.battery_size) + \"-KWh battery.\") def get_range(self): #打印一条消息,指出电瓶的续航里程 if self.battery_size == 70: range = 240 elif self.battery_size == 90: range = 280 message = \"This car can go approximately \" + str(range) message += \" miles on a full charge.\" print(message)class ElectricCar(Car): #模拟电动车的独特之处 def __init__(self,make,model,year): #初始化父类的属性,再初始化电动车特有的属性 super().__init__(make,model,year) self.battery = Battery() 12345678910111213141516171819202122232425262728293031#car.py#一个可用于表示汽车的类class Car(): def __init__(self,make,model,year): #初始化描述汽车的属性 self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): #返回整洁的描述性名称 long_name = str(self.year) + ' ' + self.make + ' ' +self.model return long_name.title() def read_odometer(self): #打印一条消息,指出汽车的里程 print(\"This car has \" + str(self.odometer_reading) + \" miles on it.\") def update_odometer(self): #将里程表读数设置为指定的值,拒绝将里程表往回拨 if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print(\"You can't roll back an odometer!\") def increment_odometer(self,miles): #将里程表读数增加指定的量 self.odometer_reading += miles 现在可以分别从每个模块中导入类:12345678910#my_car.pyfrom car import Carfrom electric_car import ElectricCarmy_audi = Car('audi','a9','2018')print(my_audi.get_descriptive_name())my_tesla = ElectricCar('tesla','model s','2016')print(my_tesla.get_descriptive_name()) 输出结果如下:122018 Audi A92016 Tesla Model S - 8.6 Python标准库 Python标准库是一组模块,安装的Python都包含它,我们可以使用标准库中的任何函数和类,只需要在程序的开头包含一条简单的import语句,下面以模块collections中的一个类——OrderedDict(创建字典并记录其中的键-值对的添加顺序)为例:1234567891011121314#favorite_languages.pyfrom collections import OrderedDictfavorite_languages = OrderedDict()favorite_languages ['jen'] = 'python'favorite_languages ['sarah'] = 'c'favorite_languages ['edward'] = 'java'favorite_languages ['anly'] = 'python'for name,language in favorite_languages.items(): print(name.title() + \"'s favorite languages is \" + language.title() + \".\") 输出结果如下:1234Jen's favorite languages is Python.Sarah's favorite languages is C.Edward's favorite languages is Java.Anly's favorite languages is Python.","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"类","slug":"类","permalink":"https://itrhx.com/tags/类/"},{"name":"继承","slug":"继承","permalink":"https://itrhx.com/tags/继承/"}]},{"title":"Python3 自学笔记 C07","slug":"Python3-Self-study-Notes-C07","date":"2018-11-03T14:08:10.447Z","updated":"2018-11-03T14:11:58.456Z","comments":true,"path":"2018/11/03/Python3-Self-study-Notes-C07/","link":"","permalink":"https://itrhx.com/2018/11/03/Python3-Self-study-Notes-C07/","excerpt":"","text":"Python3 自学笔记第七章【函数】 - 7.1 定义函数 一个简单的函数,命名为 example(),其中,关键字 def 来告诉Python我们要定义一个函数,这就是函数定义 123def example(): print(\"Hello world!\")example() 输出结果如下: 1Hello world! - 7.1.1 向函数传递信息 在函数定义 def example() 的括号中添加 username,可以让函数接受我们给 username 指定的任何值,在调用函数时给 username 指定一个值,调用 example() 时,可将一个名字传递给它: 123def example(username): print(\"Hello , \" + username + '!')example('TRHX') 输出结果如下: 1Hello , TRHX! - 7.1.2 实参和形参 在 7.1.1 的例子中,函数 example() 的定义中,变量 username 是一个形参——函数完成其工作所需的一项信息,在代码 example(‘TRHX’) 中,值’TRHX’是一个实参,实参是调用函数时传递给函数的信息,调用函数时,将要让函数使用的信息放在括号内。在 example(‘TRHX’) 中,将实参 ‘TRHX’ 传递给了函数 example,这个值被储存在形参 username 中 - 7.2 传递实参 鉴于函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多,可使用位置实参,这要求实参的顺序与形参的顺序相同;也可以使用关键字实参,其中每个实参都由变量和值组成;还可以使用列表和字典 - 7.2.1 位置实参 调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此,最简单的方法是基于实参的顺序,这种关联方式被称为位置实参 1234def describe_pet(animal_type , pet_name): print(\"I have a \" + animal_type + \".\") print(\"My \" + animal_type + \"'s name is \" + pet_name.title() + \".\")describe_pet('hamster' , 'harry') 输出结果如下: 12I have a hamster.My hamster's name is Harry. 调用函数多次:我们可以根据需要调用函数任意次,要再描述一个宠物,只需要再次调用 123456describe_pet() 即可def describe_pet(animal_type , pet_name): print(\"I have a \" + animal_type + \".\") print(\"My \" + animal_type + \"'s name is \" + pet_name.title() + \".\")describe_pet('hamster' , 'harry')describe_pet('dog' , 'willi') 输出结果如下: 1234I have a hamster.Myhamster's name is Harry.I have a dog.My dog's name is Willi. - 7.2.2 关键字实参 关键字实参是传递给函数的名称-值对。直接在实参中将名称和值关联起来,不用考虑函数调用中的实参顺序 12345def describe_pet(animal_type , pet_name): print(\"I have a \" + animal_type + \".\") print(\"My \" + animal_type + \"'s name is \" + pet_name.title() + \".\")describe_pet(animal_type = 'hamster' , pet_name = 'harry')describe_pet(pet_name = 'willi' , animal_type = 'dog' ) 输出结果如下: 1234I have a hamster.Myhamster's name is Harry.I have a dog.My dog's name is Willi. - 7.2.3 默认值 编写函数时,可给每个形参指定默认值,在调用函数中给形参提供了实参时,Python将使用指定的实参值,否则将使用形参的默认值 1234def describe_pet(pet_name , animal_type = 'dog'): print(\"I have a \" + animal_type + \".\") print(\"My \" + animal_type + \"'s name is \" + pet_name.title() + \".\")describe_pet(pet_name = 'willi') 输出结果如下: 12I have a dog.My dog's name is Willi. 在这个函数定义中,修改了形参的排列顺序,由于给 animal_type 指定了默认值,无需通过实参来指定动物类型,因此在函数调用中只包含一个实参——宠物的名字,然而Python依然将这个实参视为位置实参,因此如果函数调用中只包含宠物的名字,这个实参将关联到函数定义中的第一个形参,这就是需要将 pet_name 放在形参列表开头的原因所在 注意:使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参,这让Python依然能够准确地解读位置实参 - 7.3 返回值 函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值,函数返回的值被称为返回值,在函数中,可使用 return 语句将值返回到函数调用的代码行 - 7.3.1 返回简单值 12345def name(first_name , last_name): full_name = first_name + ' ' + last_name return full_name.title()student = name('jimi' , 'hendrix')print(student) 输出结果如下: 1Jimi Hendrix - 7.3.2 让实参变成可选的 对 7.3.1 的例子进行改进,扩展函数 name,使其还能够处理中间名: 12345def name(first_name , middle_name , last_name): full_name = first_name + ' ' + middle_name + ' ' + last_name return full_name.title()student = name('jimi' , 'lee' , 'hendrix')print(student) 输出结果如下: 1Jimi Lee Hendrix 然而,如果一个人没有中间名,那么在调用这个函数时就会出错,为了让中间名变成可选的,可以给实参 middle_name 指定一个默认值——空字符串,并在用户没有提供中间名时不使用这个实参,注意需要将 middle_name 移到形参列表的末尾: 12345678910def name(first_name , last_name , middle_name = ' '): if middle_name: full_name = first_name + ' ' + middle_name + ' ' + last_name else: full_name = first_name + ' ' + last_name return full_name.title()student = name('jimi' , 'hendrix')print(student)student = name('jimi' , 'hendrix' , 'lee' )print(student) 输出结果如下: 12Jimi HendrixJimi Lee Hendrix - 7.3.3 返回字典 函数可返回任何类型的值,包括列表和字典等较复杂的数据结构: 12345def name(first_name , last_name): full_name = {'first' : first_name , 'last' : last_name} return full_namestudent = name('jimi' , 'hendrix')print(student) 输出结果如下: 1{'first': 'jimi', 'last': 'hendrix'} - 7.3.4 结合使用函数和 while 循环 123456789101112131415def name(first_name , last_name): full_name = first_name + ' ' + last_name return full_namewhile True: print(\"\\nPlease input your name:\") print(\"(Enter 'exit' to quit)\") f_name = input(\"First_name:\") if f_name == 'exit': break l_name = input(\"Last_name:\") if l_name == 'exit': break student = name(f_name , l_name) print(student) print(\"Hello, \" + student.title() + \"!\") 运行程序: 1234567891011Please input your name:(Enter 'exit' to quit)First_name:jimiLast_name:hendrixjimi hendrixHello, Jimi Hendrix!Please input your name:(Enter 'exit' to quit)First_name:exit - 7.4 传递列表 123456def users(names): for name in names: message = \"Hello, \" + name.title() + \"!\" print(message)usernames = ['hannah' , 'tony' , 'margot']users(usernames) 输出结果如下: 123Hello, Hannah!Hello, Tony!Hello, Margot! - 7.4.1 在函数中修改列表 将列表传递给函数后,函数就可以对其进行修改,在函数中对这个列表所做的任何修改都是永久性的 #首先创造一个列表,其中包含一些要打印的设计 12345678910111213141516unprinted_designs = ['iphone case' , 'robot pendannt' , 'dodecahedron']completed_models = []#模拟打印每个设计,直到没有未打印的设计为止#打印每个设计后,都将其移到列表completed_models中while unprinted_designs: current_design = unprinted_designs.pop() #模拟根据设计制作3D打印模型的过程 print(\"Printing model: \" + current_design) completed_models.append(current_design) #显示打印好的所有模型print(\"\\nThe following models have been printed: \")for completed_model in completed_models: print(completed_model) 输出结果如下: 12345678Printing model: dodecahedronPrinting model: robot pendanntPrinting model: iphone caseThe following models have been printed: dodecahedronrobot pendanntiphone case 编写两个函数重新组织这些代码,每一个函数都做一件具体的工作,输出结果与原程序相同: 123456789101112131415161718192021def print_models(unprinted_designs , completed_models):#模拟打印每个设计,直到没有未打印的设计为止#打印每个设计后,都将其移到列表completed_models中 while unprinted_designs: current_design = unprinted_designs.pop() #模拟根据设计制作3D打印模型的过程 print(\"Printing model: \" + current_design) completed_models.append(current_design)def show_completed_models(completed_models): #显示打印好的所有模型 print(\"\\nThe following models have been printed: \") for completed_model in completed_models: print(completed_model)unprinted_designs = ['iphone case' , 'robot pendannt' , 'dodecahedron']completed_models = []print_models(unprinted_designs , completed_models)show_completed_models(completed_models) - 7.4.2 禁止函数修改列表 有时候需要禁止函数修改列表,拿 7.4.1 的例子来说,我们打印了所有设计后,也要保留原来的未打印的设计列表,以供备案,但由于我们将所有的设计都移出了 unprinted_designs,这个列表变成了空的,原来的列表没有了,为了解决这个问题,可向函数传递列表的副本而不是原件;这样函数所做的任何修改都只影响副本,而丝毫不影响原件,要将列表的副本传递给函数,可以像下面这样做: 1function_name(list_name[:]) 切片表示法 [:] 创建列表的副本,在 7.4.1 的例子中如果不想清空未打印的设计列表,可像下面这样调用 print_models(): 1print_models(unprinted_designs[:] , completed_models) - 7.5 传递任意数量的实参 Python允许函数从调用语句中收集任意数量的实参 1234def make_pizza(*toppings): print(toppings)make_pizza('pepperoni')make_pizza('mushrooms' , 'green peppers' , 'extra cheese') 形参名 *toppings 中的星号让Python创建一个名为 toppings 的空元组,并将收到的所有值都封装到这个元组中,函数体内的print语句通过生成输出来证明Python能够处理使用一个值调用函数的情形,也能处理使用三个值来调用函数的情形,输出结果如下: 12('pepperoni',)('mushrooms', 'green peppers', 'extra cheese') 使用循环语句: 123456def make_pizza(*toppings): print(\"\\nMaking a pizza with the followiing toppings: \") for topping in toppings: print(\"- \" + topping)make_pizza('pepperoni')make_pizza('mushrooms' , 'green peppers' , 'extra cheese') 输出结果如下: 12345678Making a pizza with the followiing toppings: - pepperoniMaking a pizza with the followiing toppings: - mushrooms- green peppers- extra cheese - 7.5.1 结合使用位置实参和任意数量实参 如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中: 123456def make_pizza(size , *toppings): print(\"\\nMaking a \" + str(size) + \"-inch pizza with the followiing toppings: \") for topping in toppings: print(\"- \" + topping)make_pizza(16 , 'pepperoni')make_pizza(18 , 'mushrooms' , 'green peppers' , 'extra cheese') 输出结果如下: 12345678Making a 16-inch pizza with the followiing toppings: - pepperoniMaking a 18-inch pizza with the followiing toppings: - mushrooms- green peppers- extra cheese - 7.5.2 使用任意数量的关键字实参 有时候,需要接受任何数量的实参,但预先我们不知道传递给函数的会是什么样的信息,在这种情况下,可以将函数编写成能够接受任意数量的键-值对——调用语句提供了多少就接受多少: 12345678910def build_profile(first , last , **user_info): #创建一个字典,其中包括我们知道的有关用户的一切 profile = {} profile['first_name'] = first profile['last_name'] = last for key , value in user_info.items(): profile[key] = value return profileuser_profile = build_profile('albert' , 'einstein' , location = 'princeton' , field = 'physics')print(user_profile) 形参 **user_info 中的两个星号让Python创建一个名为 user_info 的空字典,并将收到的所有名称-值对都封装到这个字典中,在这个函数中,可以像访问其他字典那样访问 user_info 中的名字-值对,程序运行结果如下: 1{'first_name': 'albert', 'last_name': 'einstein', 'location': 'princeton', 'field': 'physics'} - 7.6 将函数储存在模块中 更进一步,我们可以把函数储存在被称为模块的独立文件中,再将模块导入到主程序中,import 语句运行在当前运行的程序文件中使用模块中的代码 - 7.6.1 导入整个模块 要让函数是可导入的,得先创建模块,模块是扩展名为.py的文件,包含要导入到程序中的代码,下面将创建一个包含函数 make_pizza() 的模块 1234567#pizza.pydef make_pizza(size , *toppings): #概述要制作的比萨 print(\"\\nMaking a \" + str(size) + \"-inch pizza with the followiing toppings: \") for topping in toppings: print(\"- \" + topping) 接下来,我们在 pizza.py 所在的目录中创建另一个名为 making_pizzas.py 的文件,在这个文件中导入刚刚创建的模块,在调用 make_pizza() 两次: 12345#making_pizzas.pyimport pizzapizza.make_pizza(16 , 'pepperoni')pizza.make_pizza(18 , 'mushrooms' , 'green peppers' , 'extra cheese') Python在读取这个文件时,代码行 import pizza 让Python打开文件 pizza.py,并在幕后将其中所有函数都复制到这个程序中,在 making_pizzas.py 中,可以使用 pizza.py 中定义的所有函数,要调用被导入的模块中的函数,可指定导入的模块的名称 pizza 和函数名 make_pizza(),并使用句点分隔它们,最终运行结果与原程序相同: 12345678Making a 16-inch pizza with the followiing toppings: - pepperoniMaking a 18-inch pizza with the followiing toppings: - mushrooms- green peppers- extra cheese - 7.6.2 导入特定的函数 导入模块中特定的函数,可以使用以下语法: 1from module_name import function_name 通过用逗号分隔函数名,可根据需要从模块中导入任意数量的函数:1from module_name import function_0 , function_1 , function_2 以前面的 making_pizzas.py 为例,如果只想导入要使用的函数,代码类似于下面这样:1234from pizza import make_pizzamake_pizza(16 , 'pepperoni')make_pizza(18 , 'mushrooms' , 'green peppers' , 'extra cheese') - 7.6.3 使用 as 给函数指定别名 如果要导入的函数名称可能与程序中现有的名称冲突,或者函数的名称太长,可指定简短而独一无二的别名,要给函数指定别名,需要在导入它的时候这样做,通用语法为:1from module_name import function_name as fn 同样以前面的 making_pizzas.py 为例:1234from pizza import make_pizza as mpmp(16 , 'pepperoni')mp(18 , 'mushrooms' , 'green peppers' , 'extra cheese') - 7.6.4 使用 as 给模块指定别名 我们还可以给模块指定别名,通用语法为:1import module_name as mn 同样以前面的 making_pizzas.py 为例:1234import pizza as pp.make_pizza(16 , 'pepperoni')p.make_pizza(18 , 'mushrooms' , 'green peppers' , 'extra cheese') - 7.6.5 导入模块中的所有函数 导入模块中所有函数的通用语法为:1from module_name import * 同样以前面的 making_pizzas.py 为例:1234from pizza import *make_pizza(16 , 'pepperoni')make_pizza(18 , 'mushrooms' , 'green peppers' , 'extra cheese') import 语句中的星号让Python将模块 pizza 中的每个函数都复制到这个程序中,由于导入了每个函数,可通过名称来调用每个函数,而不需要用句点表示法,然而,如果模块中有函数的名称与项目中的名称相同,就有可能导致意想不到的结果,最佳的做法是,要么只导入我们需要使用的函数,要么导入整个模块并使用句点表示法","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"函数","slug":"函数","permalink":"https://itrhx.com/tags/函数/"},{"name":"模块","slug":"模块","permalink":"https://itrhx.com/tags/模块/"}]},{"title":"Python3 自学笔记 C06","slug":"Python3-Self-study-Notes-C06","date":"2018-10-30T05:38:20.264Z","updated":"2018-10-30T05:44:13.126Z","comments":true,"path":"2018/10/30/Python3-Self-study-Notes-C06/","link":"","permalink":"https://itrhx.com/2018/10/30/Python3-Self-study-Notes-C06/","excerpt":"","text":"Python3 自学笔记第六章【用户输入和 while 循环】 - 6.1 函数 input() 的工作原理 函数 input() 让程序暂停运行,等待用户输入一些文本。获取用户输入后,Python将其储存在一个变量当中,以方便你使用;函数 input() 返回为 string 类型 12message = input(\"Please tell me your name:\")print(\"Hello , \" + message + \"!\") 输出结果如下: 12Please tell me your name:anliyHello , anliy! 进阶: 1234message = \"Please tell me your name so that we can personalize the messages you see.\"message += \"\\nWhat's your first name?\"name = input(message)print(\"\\nHello , \" + name + \"!\") 输出结果如下: 1234Please tell me your name so that we can personalize the messages you see.What's your first name?trhxHello , trhx! - 6.1.1 使用 int() 来获取数值输入 使用函数 input() 时,Python会将用户输入解读为字符串: 1234>>> age = input(\"How old are you?\")How old are you?19>>> age'19' 为了解决这个问题,可以使用函数 int() ,它让Python将输入视为数值: 12345>>> age = input(\"How old are you?\")How old are you?19>>> age = int(age)>>> age19 实例: 123456age = input(\"Please tell me your age:\")age = int(age)if age >= 18: print(\"You are old enough to go to the Internet bar!\")else: print(\"You are not old enough to go to Internet bar!\") 输出结果如下: 12Please tell me your age:17You are not old enough to go to Internet bar! - 6.1.2 求模运算符 处理数值信息时,求模运算符(%)是一个很有用的工具,它将两个数相除并返回余数: 12345678>>> 4 % 31>>> 5 % 32>>> 8 % 20>>> 7 % 31 - 6.1.3 在 Python 2.7 中获取输入 如果使用 Python 2.7,应该使用函数 raw_input() 来提示用户输入,这个函数与 Python 3 中的 input() 一样,也将输入解读为字符串;Python 2.7 也包含函数 input(),但它将用户输入解读为Python代码,并尝试运行它们 - 6.2 while 循环 for 循环用于针对集合中的每一个元素的一个代码块,而 while 循环不断地运行,直到指定的条件不满足为止 - 6.2.1 使用 while 循环 一个简单的 while 循环: 1234num = 1while num < 5: print(num) num += 1 输出结果如下: 12341234 - 6.2.2 让用户选择退出循环 123456prompt = \"\\nTell me something, and I will repeat it back to you:\"prompt += \"\\nEnter 'quit' to end the program.\"message = \" \"while message != 'quit': message = input(prompt) print(message) 运行程序: 123456789101112Tell me something, and I will repeat it back to you:Enter 'quit' to end the program.Hello everyone!Hello everyone!Tell me something, and I will repeat it back to you:Enter 'quit' to end the program.Hello again!Hello again!Tell me something, and I will repeat it back to you:Enter 'quit' to end the program.quitquit - 6.2.3 使用标志 在要求很多条件都满足才继续运行的程序中,可以定义一个变量,用于判断整个程序是否处于活动状态,这个变量称为标志 123456789prompt = \"\\nTell me something, and I will repeat it back to you:\"prompt += \"\\nEnter 'quit' to end the program.\"active = Truewhile active: message = input(prompt) if message == 'quit': active = False else: print(message) 运行结果与6.2.2一致 - 6.2.4 使用 break 退出循环 要立即退出 while 循环,不再运行循环中余下的代码,也不管条件测试的结果如何,可使用 break 语句,break 语句用于控制程序流程,可使用它来控制哪些代码将执行,哪些代码不执行 123456789prompt = \"\\nPlease enter the name of a city you have visited:\"prompt += \"\\nEnter 'quit' when you are finished.\"active = Truewhile active: city = input(prompt) if city == 'quit': break else: print(\"I'd love to go to \" + city.title() + \"!\") 运行程序: 1234567891011Please enter the name of a city you have visited:Enter 'quit' when you are finished.ShanghaiI'd love to go to Shanghai!Please enter the name of a city you have visited:Enter 'quit' when you are finished.BeijingI'd love to go to Beijing!Please enter the name of a city you have visited:Enter 'quit' when you are finished.quit 在任何Python循环中都可以使用break语句,例如,可以使用break语句来退出遍历列表或字典 - 6.2.5 在循环中使用 continue 要返回到循环开头,并根据条件测试结果决定是否继续执行循环,可使用 continue 语句,它不像 break 语句那样不再执行余下的代码并退出整个循环,例如,从1到10只打印其中奇数: 123456number =0while number < 10: number += 1 if number % 2 == 0: continue print(number) 输出结果如下:1234513579 - 6.3 使用 while 循环来处理列表和字典 for循环是一种遍历列表的有效方式,但在for循环中不应修改列表,否则将导致Python难以跟踪其中的元素,要在遍历列表的同时对其进行修改,可使用while循环 - 6.3.1 在列表之间移动元素 123456789unconfirmed_users = ['alice' , 'brian' , 'candace']confirmed_users = []while unconfirmed_users: current_user = unconfirmed_users.pop() print(\"Verifying user: \" + current_user.title()) confirmed_users.append(current_user)print(\"\\nThe following users have been confirmed:\")for confirmed_user in confirmed_users: print(confirmed_user.title()) 首先创建一个未验证用户列表,其中包含用户Alice、Brian和Candace,还创建了一个空列表,用于存储已验证的用户,程序中的 while 循环将不断地运行,直到列表 unconfirmed_users 变成空的。在这个循环中,函数pop() 以每次一个的方式从列表 unconfirmed_users 末尾删除未验证的用户。由于Candace位于列表 unconfirmed_users 的末尾,因此其名字将首先被删除、存储到变量 current_user 中并加入到列表 confirmed_users 中。接下来是Brian,然后是Alice 为模拟用户验证过程,我们打印一条验证消息并将用户加入到已验证用户列表中。未验证用户列表越来越短,而已验证用户列表越来越长。未验证用户列表为空后结束循环,再打印已验证用户列表: 12345678Verifying user: CandaceVerifying user: BrianVerifying user: AliceThe following users have been confirmed:CandaceBrianAlice - 6.3.2 删除包含特定值的所有列表元素 可以使用方法 remove() 来删除列表中特定的值,但如果要删除的值在列表中出现了多次,方法 remove() 就不管用了,如果要删除列表中所有包含特定值的元素则可以使用 while 循环: 12345names = ['alice' , 'candace' , 'alice' , 'brian' , 'alix' , 'candace' , 'heliy']print(names)while 'candace' in names: names.remove('candace')print(names) 输出结果如下: 12['alice', 'candace', 'alice', 'brian', 'alix', 'candace', 'heliy']['alice', 'alice', 'brian', 'alix', 'heliy'] 使用方法 remove() 做对比: 1234names = ['alice' , 'candace' , 'alice' , 'brian' , 'alix' , 'candace' , 'heliy']print(names)names.remove('candace')print(names) 输出结果如下: 12['alice', 'candace', 'alice', 'brian', 'alix', 'candace', 'heliy']['alice', 'alice', 'brian', 'alix', 'candace', 'heliy'] - 6.3.3 使用用户输入来填充字典 12345678910111213141516171819202122responses = {}#设置一个标志,指出调查是否继续polling_active = Truewhile polling_active: #提示输入被调查者的姓名和回答 name = input(\"\\nWhat's your name?\") response = input(\"What kind of fruit do you like?\") #将答卷储存在字典中 responses[name] = response #询问是否还有其他人要参与回答 repeat = input(\"Would you like to let another person respond?(Yes/No)\") if repeat == 'No': polling_active = False#调查结束,显示结果print(\"\\n------ Poll Results ------\")for name , response in responses.items(): print(name + \" like \" + response + \".\") 运行程序: 1234567891011What's your name?TRHXWhat kind of fruit do you like?appleWould you like to let another person respond?(Yes/No)YesWhat's your name?TRHXCCWhat kind of fruit do you like?bananaWould you like to let another person respond?(Yes/No)No------ Poll Results ------TRHX like apple.TRHXCC like banana.","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"input()函数","slug":"input-函数","permalink":"https://itrhx.com/tags/input-函数/"},{"name":"while循环","slug":"while循环","permalink":"https://itrhx.com/tags/while循环/"}]},{"title":"Python3 自学笔记 C05","slug":"Python3-Self-study-Notes-C05","date":"2018-10-27T10:46:22.942Z","updated":"2018-10-27T10:46:23.044Z","comments":true,"path":"2018/10/27/Python3-Self-study-Notes-C05/","link":"","permalink":"https://itrhx.com/2018/10/27/Python3-Self-study-Notes-C05/","excerpt":"","text":"Python3 自学笔记第五章【字典】 - 5.1 一个简单的字典 123fruits = {'apple' : 'red' , 'number' : 5}print(fruits['apple'])print(fruits['number']) 输出结果如下: 12red5 在Python中,字典是一系列键-值对。每个键都与一个值相关联,你可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可以将任何Python对象用作字典中的值。键-值对是两个相关联的值。在指定键时,Python将返回与之相关联的值。键和值之间用冒号分隔,而键-值对之间用逗号分隔。在字典中,想储存多少个键-值对都可以 - 5.1.1 访问字典中的值 要获取与键相关联的值,可依次指定字典名和放在方括号内的键: 123fruits = {'apple' : 'red' , 'number' : 5}number_fruits = fruits['number']print(\"The number of apple is \" + str(number_fruits) + \"!\") 输出结果如下: 1The number of apple is 5! - 5.1.2 添加键-值对 字典是一种动态结构,可随时在其中添加键-值对。要添加键-值对,可依次指定字典名、用方括号括起来的键和相关联的值 12345fruits = {'apple' : 'red' , 'number1' : 5}print(fruits)fruits['banana'] = 'yellow'fruits['number2'] = 13print(fruits) 输出结果如下: 12{'apple': 'red', 'number1': 5}{'apple': 'red', 'number1': 5, 'banana': 'yellow', 'number2': 13} 注意:键-值对的排列顺序与添加顺序不同。Python不关心键-值对的添加顺序,而只关心键和值之间的关联关系 有时候为了方便也可以先使用一对空的花括号定义一个字典,再分行添加各个键-值对: 1234fruits = {}fruits['banana'] = 'yellow'fruits['number2'] = 13print(fruits) 输出结果如下: 1{'banana': 'yellow', 'number2': 13} - 5.1.3 修改字典中的值 要修改字典中的值,可依次指定字典名、用方括号括起来的键以及与该键相关联的新值 1234fruits = {'color' : 'red'}print(\"The color of the fruits is \" + fruits['color'] + \"!\")fruits['color'] = 'yellow'print(\"The color of the fruits is \" + fruits['color'] + \" now!\") 输出结果如下: 12The color of the fruits is red!The color of the fruits is yellow now! 进阶:对一个能够以不同速度移动的外星人的位置进行跟踪,为此,我们将储存该外星人的当前速度,并据此确定该外星人将向右移动多远: 1234567891011121314alien = {'x_position': 0, 'y_position': 25, 'speed': 'medium'}print(\"Original x-position: \" + str(alien['x_position']))#向右移动外星人,据外星人当前速度决定将其移动多远if alien['speed'] == 'slow': x_increment = 1elif alien['speed'] == 'medium': x_increment = 2else: x_increment = 3#新位置等于老位置加上增量alien['x_position'] = alien['x_position'] + x_incrementprint(\"New x_position: \" + str(alien['x_position'])) 输出结果如下: 12Original x-position: 0New x_position: 2 - 5.1.4 删除键-值对 对于字典中不再需要的信息,可使用del语句将相应的键-值对彻底删除。使用del语句时,必须指定字典名和要删除的键 1234fruits = {'apple' : 'red' , 'number' : 5}print(fruits)del fruits['number']print(fruits) 输出结果如下: 12{'apple': 'red', 'number': 5}{'apple': 'red'} - 5.1.5 由类似对象组成的字典 字典储存的可以是一个对象的多种信息,也可以储存众多对象的同一种信息,例如要调查很多人最喜欢的编程语言: 1234567favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'java' , }print(\"Sarah's favorite languages is \" + favorite_languages['sarah'].title() + \"!\") 输出结果如下: 1Sarah's favorite languages is C! - 5.2 遍历字典 - 5.2.1 方法 items() 遍历所有的键-值对 使用for循环来遍历字典:12345678name = { 'username' : 'efermi' , 'first' : 'enrico' , 'last' : 'fermi' , }for key , value in name.items(): print(\"\\nKey: \" + key) print(\"Value: \" + value) 输出结果如下:123456789Key: usernameValue: efermiKey: firstValue: enricoKey: lastValue: fermi for语句的第二部分包含字典和方法items(),它返回一个键-值对列表。接下来,for循环依次将每个键-值对储存到指定的两个变量中 12345678favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'java' , }for name, language in favorite_languages.items(): print(name.title() + \"'s favorite language is \" + language.title() + \".\") 输出结果如下: 1234Jen's favorite language is Python.Sarah's favorite language is C.Edward's favorite language is Ruby.Phil's favorite language is Java. - 5.2.2 方法 keys() 遍历字典中所有的键 在不需要使用字典中的值时,方法key()很有用,下面来遍历字典favorite_languages,并将每个被调查者的名字都打印出来: 12345678favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'java' , }for name in favorite_languages.keys(): print(name.title()) 输出结果如下: 1234JenSarahEdwardPhil 遍历字典时,会默认遍历所有的键,因此,如果将上述代码中的for name in favorite_languages.keys():替换为for name in favorite_languages:输出结果将不变进阶: 1234567891011favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'java' , }friends = ['phil', 'sarah']for name in favorite_languages.keys(): print(name.title()) if name in friends: print(\"Hi \" + name + \", I see your favorite languages is \" + favorite_languages[name].title() + \"!\") 输出结果如下: 123456JenSarahHi sarah, I see your favorite languages is C!EdwardPhilHi phil, I see your favorite languages is Java! - 5.2.3 函数 sorted() 按顺序遍历字典中的所有键 字典总是明确地记录键和值之间的关联关系,但获取字典的元素时,获取顺序是不可预测的,要以特定的顺序返回元素,一种办法是在for循环中对返回的键进行排序,为此,可以使用函数sorted()来获得按特定顺序排列的键列表的副本: 12345678favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'java' , }for name in sorted(favorite_languages.keys()): print(name.title()) 输出结果如下: 1234EdwardJenPhilSarah - 5.2.4 方法 values() 遍历字典中的所有值 12345678favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'java' , }for languages in favorite_languages.values(): print(languages.title()) 输出结果如下: 1234PythonCRubyJava 这种做法提取字典中所有的值,而没有考虑是否重复,为剔除重复项,可使用集合(set),集合类似于列表,但每个元素都必须是独一无二的: 12345678favorite_languages = { 'jen' : 'python' , 'sarah' : 'c' , 'edward' : 'ruby' , 'phil' : 'python' , }for languages in set(favorite_languages.values()): print(languages.title()) 输出结果如下: 123CPythonRuby - 5.3 嵌套 有时候,需要将一系列字典储存在列表中,或将列表作为值储存在字典中,这称为嵌套。可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典 - 5.3.1 字典列表 下面代码创建三个字典,每个字典都表示一个个学生,将这三个字典都放到一个名为students的列表当中,遍历列表将每个学生都打印出来: 123456student_0 = {'name' : 'anily' , 'class' : 2}student_1 = {'name' : 'nikey' , 'class' : 5}student_2 = {'name' : 'heyk' , 'class' : 3}students = [student_0 , student_1 , student_2]for student in students: print(student) 输出结果如下: 123{'name': 'anily', 'class': 2}{'name': 'nikey', 'class': 5}{'name': 'heyk', 'class': 3} 进阶:使用 range() 自动生成三十个外星人: 123456789101112131415#创建一个用于存储外星人的空列表aliens = []#创建三十个绿色的外星人for alien_number in range(30): new_alien = {'color' : 'green' , 'points' : 5 , 'speed' : 'slow'} aliens.append(new_alien)#显示前五个外星人for alien in aliens[:5]: print(alien)print(\"......\")#显示创建了多少外星人print(\"Total number of aliens: \" + str(len(aliens))) 输出结果如下: 1234567{'color': 'green', 'points': 5, 'speed': 'slow'}{'color': 'green', 'points': 5, 'speed': 'slow'}{'color': 'green', 'points': 5, 'speed': 'slow'}{'color': 'green', 'points': 5, 'speed': 'slow'}{'color': 'green', 'points': 5, 'speed': 'slow'}......Total number of aliens: 30 在上述例子中,虽然每个外星人都具有相同特征,但在Python看来,每个外星人都是独立的,我们可以独立地修改每个外星人: 12345678910111213aliens = []for alien_number in range(30): new_alien = {'color' : 'green' , 'points' : 5 , 'speed' : 'slow'} aliens.append(new_alien)for alien in aliens[0:3]: if alien['color'] == 'green': alien['color'] = 'yellow' alien['points'] = 10 alien['speed'] = 'medium'for alien in aliens[:5]: print(alien)print(\"......\")print(\"Total number of aliens: \" + str(len(aliens))) 输出结果如下: 1234567{'color': 'yellow', 'points': 10, 'speed': 'medium'}{'color': 'yellow', 'points': 10, 'speed': 'medium'}{'color': 'yellow', 'points': 10, 'speed': 'medium'}{'color': 'green', 'points': 5, 'speed': 'slow'}{'color': 'green', 'points': 5, 'speed': 'slow'}......Total number of aliens: 30 - 5.3.2 在字典中存储列表 有时候需要将列表储存在字典中,而不是将字典储存在列表中:例一: 12345678910#储存所点比萨的信息pizza = { 'crust' : 'thick' , 'toppings' : ['mushrooms' , 'extra chees'] , }#概述所点的比萨print(\"You ordered a \" + pizza['crust'] + \"-crust pizza\" + \"with the following toppings :\" )for topping in pizza['toppings']: print(\"\\t\" + topping) 输出结果如下: 123You ordered a thick-crust pizzawith the following toppings : mushrooms extra chees 例二: 12345678910favorite_languages = { 'jen' : ['python' , 'ruby'] , 'sarah' : ['c'] , 'edward' : ['go' , 'ruby'] , 'phil' : ['python' , 'java'] , }for name , languages in favorite_languages.items(): print(\"\\n\" + name.title() + \"'s favorite languages are:\") for language in languages: print(\"\\t\" + language.title()) 输出结果如下: 123456789101112131415Jen's favorite languages are: Python RubySarah's favorite languages are: CEdward's favorite languages are: Go RubyPhil's favorite languages are: Python Java - 5.3.3 在字典中存储字典 123456789101112131415161718users = { 'aeinstein' : { 'first' : 'albert' , 'last' : 'einstein' , 'location' : 'princeton' , } , 'mcurie' : { 'first' : 'marie' , 'last' : 'curie' , 'location' : 'paris' , } , }for username , user_info in users.items(): print(\"\\nUsername : \" + username) full_name = user_info['first'] + \" \" + user_info['last'] location = user_info['location'] print(\"\\tFull name : \" + full_name.title()) print(\"\\tlocation : \" + location .title()) 输出结果如下: 12345678Username : aeinstein Full name : Albert Einstein location : PrincetonUsername : mcurie Full name : Marie Curie location : Paris","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"字典","slug":"字典","permalink":"https://itrhx.com/tags/字典/"}]},{"title":"Python3 自学笔记 C04","slug":"Python3-Self-study-Notes-C04","date":"2018-10-23T14:52:48.396Z","updated":"2018-10-23T15:05:23.396Z","comments":true,"path":"2018/10/23/Python3-Self-study-Notes-C04/","link":"","permalink":"https://itrhx.com/2018/10/23/Python3-Self-study-Notes-C04/","excerpt":"","text":"Python3 自学笔记第四章【if语句】 - 4.1 一个简单的数列 给定一个汽车列表,将其中每一辆汽车的名称打印出来,要求打印 ‘bmw’ 时所有字母都要大写,其余名称只需要首字母大写: 123456cars = ['audi' , 'bmw' , 'subaru' , 'toyota']for car in cars: if car == 'bmw': print(car.upper())else: print(car.title()) 输出结果如下: 1234AudiBMWSubaruToyota - 4.1.1 检查特定值是否包含在列表当中 要判断特定的值是否已包含在列表当中,可使用关键字 in 1234user_names = ['andia' , 'david' , 'liwa']user = 'andia'if user in user_names: print(user.title() + \"is in user_name.\") 输出结果如下: 1Andiais in user_name. 要判断特定的值是否不包含在列表当中,可使用关键字 not in 1234user_names = ['andia' , 'david' , 'liwa']user = 'kivle'if user not in user_names: print(user.title() + \"is not in user_name.\") 输出结果如下: 1Kivleis not in user_name. - 4.2 if-else 语句 1234567age = input(\"请输入你的年龄查看是否可以去网吧:\")if int(age) >= 18: print(\"You are old enough to go to the net bar!\") print(\"You should go to net bar less,study more!\")else: print(\"You are too young to go to the net bar!\") print(\"Wait until you are 18 to go to the net bar!\") 分别输入19和15,输出结果如下: 123请输入你的年龄查看是否可以去网吧:19You are old enough to go to the net bar!You should go to net bar less,study more! 123请输入你的年龄查看是否可以去网吧:15You are too young to go to the net bar!Wait until you are 18 to go to the net bar! - 4.3 if-elif-else 结构 12345678age = 12if age < 4: price = 0elif age < 18: price = 5else: price = 10print(\"Your admission cost is $\" + str(price) + \".\") 输出结果如下: 1Your admission cost is $5. - 4.3.1 使用多个 elif 代码块 12345678910age = 20if age < 4: price = 0elif age < 18: price = 5elif age < 65: price = 15else: price = 10print(\"Your admission cost is $\" + str(price) + \".\") 输出结果如下: 1Your admission cost is $15. - 4.3.2 省略 else 代码块 Python并不要求 if-elif 结构后面必须有 else 代码块: 12345678910age = 20if age < 4: price = 0elif age < 18: price = 5elif age < 65: price = 15elif age >= 65: price = 10print(\"Your admission cost is $\" + str(price) + \".\") 输出结果仍与3.3.1一样 - 4.4 测试多个条件 if-elif-else结构功能强大,但仅适用于只有一个条件满足的情况:遇到通过了的测试后,Python就会跳过余下的测试: 12345678 names = ['Zhangshan' , 'Wanger']if 'Zhangshan' in names: print(\"Zhangshan is here!\")if 'Wanger' in names: print(\"Wanger is here!\")if 'Xiaoming' in names: print(\"Xiaoming is here!\")print(\"All the students are here!\") 输出结果如下: 123Zhangshan is here!Wanger is here!All the students are here! 相同的程序,如果使用 if-elif-else 结构,代码将不能正确运行: 12345678names = ['Zhangshan' , 'Wanger']if 'Zhangshan' in names: print(\"Zhangshan is here!\")elif 'Wanger' in names: print(\"Wanger is here!\")elif 'Xiaoming' in names: print(\"Xiaoming is here!\")print(\"All the students are here!\") 输出结果如下:12Zhangshan is here!All the students are here! 总之,如果我们只想执行一个代码块,就使用 if-elif-else 结构;如果要运行多个代码块,就必须使用一系列独立的 if 语句! - 4.5 使用 if 语句处理列表 - 4.5.1 检查特殊元素对3.4例子改版,加入姓名 ‘Xiaoming’,当检索到Xiaoming时告诉他,他妈妈叫他回家吃饭1234567names = ['Zhangshan' , 'Wanger' , 'Xiaoming']for name in names: if name == 'Xiaoming': print(\"Xiaoming,Your mother told you to go home for dinner!\") else: print(name +\"is here!\")print(\"All the students are here!\") 输出结果如下: 1234Zhangshanis here!Wangeris here!Xiaoming,Your mother told you to go home for dinner!All the students are here! - 4.5.2 确定列表不是空的 在检索姓名前检查姓名是否为空,不为空则打印出所有姓名,为空则提示没有姓名: 1234567names = []if names: for name in names: print(name +\" is here!\") print(\"All the students are here!\")else: print(\"There is no students!\") 输出结果如下: 1There is no students! 在if语句中将列表名用在条件表达式中时,Python将在列表至少包含一个元素时返回Ture,并在列表为空时返回False - 4.5.3 使用多个列表 两个列表names_1和names_2,要求输出既在names_2中又在names_1中的元素: 123456names_1 = ['Zhangshan' , 'Liyang' , 'Wanger' , 'Tangyang' , 'Xiaoming']names_2 = ['Liyang' , 'Zhangwei' , 'Tangyang']for names in names_2: if names in names_1: print(names +\" is here!\")print(\"All the students are here!\") 输出结果如下: 123Liyang is here!Tangyang is here!All the students are here!","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"if语句","slug":"if语句","permalink":"https://itrhx.com/tags/if语句/"}]},{"title":"Python3 自学笔记 C03","slug":"Python3-Self-study-Notes-C03","date":"2018-10-11T14:49:52.286Z","updated":"2018-10-11T14:49:52.314Z","comments":true,"path":"2018/10/11/Python3-Self-study-Notes-C03/","link":"","permalink":"https://itrhx.com/2018/10/11/Python3-Self-study-Notes-C03/","excerpt":"","text":"Python3 自学笔记第三章【操作列表】 - 3.1遍历整个列表 使用 for 循环来遍历整个列表: 123names = ['alice' , 'david' , 'liwei']for name in names:print(name) 输出结果如下: 123alicedavidliwei for循环让Python从列表names中取出一个名字,并将其储存在变量name中,最后 让Python打印前面储存到变量name中的名字,对于列表中的每个名字,Python都将 重复执行后两行代码,将列表names中的每个名字都打印出来 - 3.1.1在for循环中执行更多的操作 在for循环中,可对每个元素执行任何操作,下面对前面的示例进行扩展: 例一:123names = ['alice' , 'david' , 'liwei']for name in names: print(name.title() + \", that was a good man!\") 输出结果如下: 123Alice, that was a good man!David, that was a good man!Liwei, that was a good man! 例二: 12345names = ['alice' , 'david' , 'liwei']for name in names: print(name.title() + \", that was a good man!\") print(\"I can't wait to see you again,\" + name.title() + \".\\n\")print(\"Nice to meet you!\") 输出结果如下: 12345678910Alice, that was a good man!I can't wait to see you again,Alice.David, that was a good man!I can't wait to see you again,David.Liwei, that was a good man!I can't wait to see you again,Liwei.Nice to meet you! - 3.2 range()函数 Python使用range()函数能够轻松地生成一系列的数字 Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表; Python3 list() 函数是对象迭代器,可以把range()返回的可迭代对象转为一个列表,返回的变量类型为列表; Python2 range() 函数返回的是列表 例一:12for i in range(1,5): print(i) 输出结果如下: 12341234 例二:12for i in range(5): print(i) 输出结果如下:1234501234 例三:123456789101112>>> list(range(5))[0, 1, 2, 3, 4]>>> list(range(0))[]>>>list(range(0, 30, 5))[0, 5, 10, 15, 20, 25]>>> list(range(0, 10, 2))[0, 2, 4, 6, 8]>>> list(range(0, -10, -1))[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]>>> list(range(1, 0))[] 例四: 12345squares = []for value in range(1,11): square = value ** 2 squares.append(square)print(squares) 输出结果如下: 1[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] - 3.2.1 对数字列表执行简单的统计计算 1234567>>> digits = [1, 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0]>>> min(digits)0>>>max(digits)9>>>sum(digits)45 - 3.2.2 列表解析 列表解析能够让比如3.2中的例四更加简化,只需要一行代码就能生成这样的列表,列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素: 12squares = [value ** 2 for value in range(1,11)]print(squares) 在这个示例中,for循环为for value in range(1,11),它将值1~10提供给表达式value ** 2输出结果如下: 1[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] - 3.3 使用列表的一部分 处理列表的部分元素——Python称之为切片 - 3.3.1 切片 1234567891011list = ['a','b','c','d','e','f']print(list[:]) #省略全部,代表截取全部内容,可以用来将一个列表拷给另一个列表print(list[:3]) #省略起始位置的索引,默认起始位置从头开始,结束位置索引为2print(list[3:]) #省略结束位置的索引,默认结束位置为最后一个,开始位置索引为3print(list[1:4]) #开始位置索引为1,结束位置索引为3,顾头不顾尾print(list[4:1]) #从左到右索引,因此为空值print(list[-1:-3]) #从左到右索引,因此为空值print(list[-3:-1]) #开始位置索引为倒数第三个,结束位置索引为倒数第二个print(list[1:5:2]) #开始位置索引为1,结束位置索引为4,间隔2print(list[5:1:-1]) #反向取值,开始位置索引为5,结束位置索引为2print(list[::-1]) #反向取值,反向输出列表 - 3.3.2 遍历列表 1234players = ['charles' , 'martina' , 'michael' , 'florence' , 'eli']print(\"Here are the first three players on my team:\")for player in players[:3]: print(player.title()) 输出结果如下: 1234Here are the first three players on my team:CharlesMartinaMichael - 3.3.3 复制列表 要复制列表,可以创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:]),这让Python创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表: 123456my_foods = ['pizza' , 'falafel' , 'carrot cake']friend_foods = my_foods[:]print(\"My favorite foods are:\")print(my_foods)print(\"\\nMy friend's favorite foods are:\")print(friend_foods) 输出结果如下: 12345My favorite foods are:['pizza', 'falafel', 'carrot cake']My friend's favorite foods are:['pizza', 'falafel', 'carrot cake'] 为核实我们的确有两个列表,下面在每个列表中都添加一种食品,并核实每个列表都记录了相应人员喜欢的食品:12345678910my_foods = ['pizza' , 'falafel' , 'carrot cake']friend_foods = my_foods[:]my_foods.append('cannoli')friend_foods.append('ice cream')print(\"My favorite foods are:\")print(my_foods)print(\"\\nMy friend's favorite foods are:\")print(friend_foods) 输出结果如下: 12345My favorite foods are:['pizza', 'falafel', 'carrot cake', 'cannoli']My friend's favorite foods are:['pizza', 'falafel', 'carrot cake', 'ice cream'] 输出结果表明,’cannoli’包含在我喜欢的食品列表中,而’ice cream’没有;’ice cream’包含在我朋友喜欢的食品中,而’cannoli’没有,假如我们只是简单的将my_foods赋给friend_foods,就不能得到两个列表。下面是错误示例: 12345678910my_foods = ['pizza' , 'falafel' , 'carrot cake']friend_foods = my_foods #错误写法my_foods.append('cannoli')friend_foods.append('ice cream')print(\"My favorite foods are:\")print(my_foods)print(\"\\nMy friend's favorite foods are:\")print(friend_foods) 错误示例输出结果如下: 12345My favorite foods are:['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']My friend's favorite foods are:['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream'] - 3.4 元组 Python将不能修改的值称为不可变的,而不可变的列表被称为元组 - 3.4.1 定义元组 元组看起来就像是列表,但元组使用圆括号而不是方括号来标识,定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样: 123dimensions = (200,50)print(dimensions[0])print(dimensions[1]) 输出结果如下: 1220050 如果尝试修改元组中元素的值,将会导致Python返回类型错误消息,由于试图修改元组的操作是被禁止的,因此Python指出不能给元组的元素赋值: 12dimensions = (200,50)dimensions[0] = 300 将会报错: 1234Traceback (most recent call last): File \"dimensions.py\", line 2, in <module> dimensions[0] = 300TypeError: 'tuple' object does not support item assignment - 3.4.2 遍历元组中所有的值 像列表一样,元组也可以使用for循环来遍历元组中的所有值: 例一:123dimensions = (200,100,50,6)for dimension in dimensions: print(dimension) 输出结果如下: 1234200100506 例二: 123dimensions = (200,100,50,6)for dimension in dimensions[:3]: print(dimension) 输出结果如下: 12320010050 - 3.4.3 修改元组变量 虽然不能修改元组元素,但是可以给储存元组的变量赋值: 123456789dimensions = (200,50)print(\"Original dimensions:\")for dimension in dimensions: print(dimension) dimensions = (400,100)print(\"\\nModified dimensions:\")for dimension in dimensions: print(dimension) 输出结果如下: 1234567Original dimensions:20050Modified dimensions:400100 我们首先定义了一个元组,并将其储存的尺寸打印了出来;然后将一个新元组储存到变量dimensions中,打印新的尺寸;相比于列表,元组是更简单的数据结构。如果需要储存的一组值在程序的整个生命周期内都不变,可使用元组","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"操作列表","slug":"操作列表","permalink":"https://itrhx.com/tags/操作列表/"}]},{"title":"Python3 自学笔记 C02","slug":"Python3-Self-study-Notes-C02","date":"2018-09-14T17:41:46.929Z","updated":"2018-09-15T17:09:42.760Z","comments":true,"path":"2018/09/15/Python3-Self-study-Notes-C02/","link":"","permalink":"https://itrhx.com/2018/09/15/Python3-Self-study-Notes-C02/","excerpt":"","text":"Python3 自学笔记第二章【列表】 - 2.1列表是什么 列表由一系列按特定顺序的元素组成,在 Python 中用方括号( [ ] )来表示列表,并用逗号来分隔其中的元素,例: 12345list1 = ['a','b','c','d','e','f']list2 = ['abc', 'xyz', 2018, 2020]list3 = [1, 2, 3, 4, 5 ,6]list4 = [\"a\", \"b\", \"c\", \"d\"]print(list1, list2, list3 ,list4) 输出结果如下: 1['a', 'b', 'c', 'd', 'e', 'f'] ['abc', 'xyz', 2018, 2020] [1, 2, 3, 4, 5, 6] ['a', 'b', 'c', 'd'] - 2.1.1访问列表元素 列表是有序集合,因此要访问列表的元素,只需要将该元素的位置或索引告诉Python即可,注意:在Python中的第一个列表元素的索引为0,而不是1 12345list = ['a','b','c','d','e','f']print(list[0])print(list[3])print(list[-1]) #Python为访问最后一个列表元素提供了一种特殊语法,通过将索引指定为-1,可以让Python返回最后一个列表元素print(list[-3]) 输出结果如下: 1234adfd - 2.1.2列表切片 1234567891011list = ['a','b','c','d','e','f']print(list[:]) #省略全部,代表截取全部内容,可以用来将一个列表拷给另一个列表print(list[:3]) #省略起始位置的索引,默认起始位置从头开始,结束位置索引为2print(list[3:]) #省略结束位置的索引,默认结束位置为最后一个,开始位置索引为3print(list[1:4]) #开始位置索引为1,结束位置索引为3,顾头不顾尾print(list[4:1]) #从左到右索引,因此为空值print(list[-1:-3]) #从左到右索引,因此为空值print(list[-3:-1]) #开始位置索引为倒数第三个,结束位置索引为倒数第二个print(list[1:5:2]) #开始位置索引为1,结束位置索引为4,间隔2print(list[5:1:-1]) #反向取值,开始位置索引为5,结束位置索引为2print(list[::-1]) #反向取值,反向输出列表 输出结果如下: 12345678910['a', 'b', 'c', 'd', 'e', 'f']['a', 'b', 'c']['d', 'e', 'f']['b', 'c', 'd'][][]['d', 'e']['b', 'd']['f', 'e', 'd', 'c']['f', 'e', 'd', 'c', 'b', 'a'] - 2.1.3使用列表中的各个值 可像使用其他变量一样使用列表中的各个值,例如,我们可以使用拼接根据列表中的值来创建消息: 123list = ['python', 'c', 'c++', 'java', 'php']message = \"My favorite language is \" + list[0].title() + \"!\"print(message) 输出结果如下: 1My favorite language is Python! - 2.1.4修改元素 修改列表元素的语法与访问列表元素的语法类似,要修改列表元素,可指定列表名和要修改的元素的索引,再次指定该元素的新值: 1234names = ['zhangsan', 'lishi', 'wanger', 'liming', 'xiaowang']print(names)names[1] = 'lifang'print(names) 输出结果如下: 12['zhangsan', 'lishi', 'wanger', 'liming', 'xiaowang']['zhangsan', 'lifang', 'wanger', 'liming', 'xiaowang'] - 2.1.5添加元素 - 使用方法 append() 在列表末尾添加元素 1234list = ['a', 'b', 'c', 'd', 'e', 'f']print(list)list.append('g')print(list)输出结果如下:12['a', 'b', 'c', 'd', 'e', 'f']['a', 'b', 'c', 'd', 'e', 'f', 'g'] - 使用方法 insert() 在列表指定位置添加元素 1234list = ['a', 'b', 'c', 'd', 'e', 'f']print(list)list.insert(2,\"h\") #其中括号里的数字表示要插入的位置,此后面的元素将右移一个位置print(list) 输出结果如下: 12['a', 'b', 'c', 'd', 'e', 'f']['a', 'b', 'h', 'c', 'd', 'e', 'f', 'g'] - 2.1.6删除元素 - 使用 del 语句删除元素 1234list = ['a', 'b', 'c', 'd', 'e', 'f']print(list)del list[3]print(list) 输出结果如下: 12list = ['a', 'b', 'c', 'd', 'e', 'f']list = ['a', 'b', 'c', 'e', 'f'] - 使用方法 pop() 删除最后一个元素方法 pop() 可以删除列表末尾的元素,并让你能够接着使用它。术语弹出(pop)源自这样的类比:列表就像是一个栈,而删除列表末尾的元素就相当于弹出栈顶元素:12345list = ['a', 'b', 'c', 'd', 'e', 'f']print(list)new_list = list.pop()print(list)print(new_list)输出结果如下:123['a', 'b', 'c', 'd', 'e', 'f']['a', 'b', 'c', 'd', 'e']f - 使用方法 pop() 删除任意位置元素可以使用 pop() 来删除列表中任何位置的元素,只需要在括号中指定要删除的元素的索引即可:12345list = ['a', 'b', 'c', 'd', 'e', 'f']print(list)new_list = list.pop(1)print(list)print(new_list)输出结果如下:123['a', 'b', 'c', 'd', 'e', 'f']['a', 'c', 'd', 'e', 'f']b - 使用方法 remove() 删除未知位置元素当我们不知道元素的位置,只知道元素的值的时候,就可以使用方法 remove()1234list = ['a', 'b', 'c', 'd', 'e', 'f']print(list)list.remove('d')print(list)输出结果如下:12['a', 'b', 'c', 'd', 'e', 'f']['a', 'b', 'c', 'e', 'f'] # - 2.1.7使用方法 index() 查找指定元素位置 12list = [\"a\", \"b\", \"c\", \"d\", \"e\", \"a\"]print(list.index('c')) 输出结果如下: 12 - 2.1.8使用方法 count() 统计指定元素数量 12list = [\"a\", \"b\", \"c\", \"d\", \"e\", \"a\"]print(list.count('a')) 输出结果如下: 12 - 2.1.9清空列表 123list = [\"a\", \"b\", \"c\", \"d\", \"e\", \"a\"]list.clear()print(list) 输出结果如下: 1[] - 2.2组织列表 在创建的列表中,元素的排列顺序常常是无法预测的,因为我们并非总能控制用户提供数据的顺序。有时候,我们希望保留列表元素最初的排列顺序,而有时候又需要调整排列顺序。Python提供了很多组织列表的方式,可根据具体情况选用 - 2.2.1使用方法 sort() 对列表进行永久排序 使用方法 sort() 可以对列表按照特殊符号,数字,大写字母,小写字母顺序进行永久排序: 123cars = ['bmw', 'audi', 'toyota', 'subaru']cars.sort()print(cars) 输出结果如下: 1['audi', 'bmw', 'subaru', 'toyota'] 还可以按与字母顺序相反的顺序排列列表元素,只需要向 sort() 方法传递参数 reverse = True 就可以了: 123cars = ['bmw', 'audi', 'toyota', 'subaru']cars.sort(reverse = True)print(cars) 输出结果如下: 1['toyota', 'subaru', 'bmw', 'audi'] - 2.2.2使用函数 sorted() 对列表进行临时排序 要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可使用函数sorted()。函数sorted()让你能够按特定顺序显示列表元素,同时不影响它们在列表中的原始排列顺序: 123456789cars = ['bmw', 'audi', 'toyota', 'subaru']print(\"Here is the original list:\")print(cars)print(\"\\nHere is the sorted list:\")print(sorted(cars))print(\"\\nHere is the sorted reverse list:\")print(sorted(cars, reverse=True))print(\"\\nHere is the original list again:\")print(cars) 输出结果如下: 1234567891011Here is the original list:['bmw', 'audi', 'toyota', 'subaru']Here is the sorted list:['audi', 'bmw', 'subaru', 'toyota']Here is the sorted reverse list:['toyota', 'subaru', 'bmw', 'audi']Here is the original list again:['bmw', 'audi', 'toyota', 'subaru'] - 2.2.3使用方法 reverse() 对列表进行反向排序 要反转列表元素的排列顺序,可使用方法 reverse() 123cars = ['bmw', 'audi', 'toyota', 'subaru']cars.reverse()print(cars) 输出结果如下: 1['subaru', 'toyota', 'audi', 'bmw'] - 2.2.4确定列表的长度 使用函数 len() 可以快速获悉列表的长度: 123>>>cars = ['bmw', 'audi', 'toyota', 'subaru']>>>len(cars)4 - 2.2.5合并列表 - 使用方法 extend() 合并列表 12345list1 = [1, 2, 3, 4]list2 = ['a', 'b', 'c', 'd']list1.extend(list2) #将列表list2添加到list1当中去print(list1)print(list2) 输出结果如下: 12[1, 2, 3, 4, 'a', 'b', 'c', 'd']['a', 'b', 'c', 'd'] - 使用 “+” 号合并列表 1234list1 = [1, 2, 3, 4]list2 = ['a', 'b', 'c', 'd']print(list1 + list2)print(list2 + list1) 输出结果如下: 12[1, 2, 3, 4, 'a', 'b', 'c', 'd']['a', 'b', 'c', 'd', 1, 2, 3, 4] - 使用切片合并列表 1234567891011121314list1 = [1, 2, 3, 4]list2 = ['a', 'b', 'c', 'd']list1[len(list1) : len(list1)] = list2 #len(list1)代表要将list2插入list1中的位置print(list1)list1 = [1, 2, 3, 4]list2 = ['a', 'b', 'c', 'd']list1[0 :0] = list2print(list1)list1 = [1, 2, 3, 4]list2 = ['a', 'b', 'c', 'd']list1[1:1] = list2print(list1) 输出结果如下: 123[1, 2, 3, 4, 'a', 'b', 'c', 'd']['a', 'b', 'c', 'd', 1, 2, 3, 4][1, 'a', 'b', 'c', 'd', 2, 3, 4]","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"列表","slug":"列表","permalink":"https://itrhx.com/tags/列表/"}]},{"title":"Python3 自学笔记 C01","slug":"Python3-Self-study-Notes-C01","date":"2018-09-10T15:55:00.947Z","updated":"2018-09-15T17:09:09.035Z","comments":true,"path":"2018/09/10/Python3-Self-study-Notes-C01/","link":"","permalink":"https://itrhx.com/2018/09/10/Python3-Self-study-Notes-C01/","excerpt":"","text":"Python3 自学笔记第一章【变量和简单数据类型】 - 1.1变量的命名和使用 变量名只能包含字母、数字和下划线。变量名可以字母或者下划线打头,但不能以数字开头,例如,可以将变量命名为message_1,但不能将其命名为1_message 变量名不能包含空格,但可使用下划线来分割其中的单词,例如,变量名greeting_message可行,但变量名greeting message会引发错误 不要将Python关键字和函数名用作变量名,即不要使用Python保留用于特殊用途的单词,如print 变量名应既简短又具有描述性,例如,name比n好,student_name比s_n好,name_length比length_of_persons_name好 慎用小写字母l和大写字母O,因为它们可能被人看错成数字1和0 - 1.2字符串 字符串就是一系列字符,在Python中,用引号括起来的都是字符串,其中的引号可以是单引号也可以双引号: 12\"This is a string.\"'This is also a string.' 这种灵活性让我们能够在字符串中包含引号和撇号: 123'I told my friend,\"Python is my favorite language!\"'\"The language 'Python' is named er Monty Python,not the snake.\"\"One of Python's strengths is i diverse and supportive community.\" - 1.2.1使用方法修改字符串的大小写三种处理方法如下:123title() #将字符串每个单词的首字母都改为大写upper() #将字符串的每个字母都改为大写lower() #将字符串的每个字母都改为小写 例如:1234message = \"I love you!\"print(name.title())print(name.upper())print(name.lower()) 输出结果如下:123I Love You!I LOVE YOU!i love you! - 1.2.2合并(拼接)字符串Python使用加号(+)来合并字符串,举例说明: 12345first_name = \"I\"second_name = \"love\"third_name = \"python\"full_name = first_name + \" \" + second_name + \" \" + third_timeprint(full_name.title() + \"!\") 输出结果如下: 1I Love Python! - 1.2.3使用制表符或换行符来添加空白添加横向制表符: 12>>>print(\"\\tPython\") Python 添加换行符: 12345>>>print(\"C\\nC++\\nPython\\nJavaScript\")CC++PythonJavaScript 附表:Python转义符 - 1.2.4删除空白在Python中可用 lstrip()、rstrip()、strip() 分别删除字符串开头、结尾、全部的空白,举例说明: 123456789>>>message = ' python '>>>message' python '>>>message.lstrip()'python '>>>message.rstrip()' python'>>>message.strip()'python' 如果要永久删除字符串中的空白,必须将删除操作的结果存回到变量中: 1234>>>message = ' python '>>>message = message.strip()>>>message'python' - 1.3数字在编程中,经常使用数字来记录游戏得分、表示可视化数据、储存Web应用信息等。Python根据数字的用法以不同的方式处理它们 - 1.3.1整数在Python中,可对整数执行加(+)减(-)乘(*)除(/)乘方(**)运算,同时也支持运算次序: 12345678910111213141516>>>3 + 25>>>3 - 21>>>3 * 26>>>3 \\ 21.5>>>3 ** 29>>>3 ** 327>>>2 + 3 * 414>>>(2 + 3) * 420 - 1.3.2浮点数Python将带小数点的数字都称为浮点数: 1234>>>0.1 + 0.10.2>>>2 * 0.20.4 需要注意的是,结果包含的小数位可能是不确定的,就现在而言,暂时忽略多余的小数位即可: 1234>>>0.2 + 0.10.30000000000000004>>>3 * 0.10.30000000000000004 - 1.3.3使用函数 str() 避免错误错误例子: 123age = 23message = \"Happy \" + age + \"rd Birthday!\"print(message) 运行时会报错: 1234Traceback (most recent call last): File \"birthday.py\", line 2, in <module> message = \"Happy \" + age + \"rd Birthday!\"TypeError: must be str, not int 这是一个类型错误,意味着Python无法识别我们使用的信息。在这个例子中,Python发现我们使用了一个值为整数(int)的变量,但它不知道该如何解读这个值,这个变量表示的可能是数值23,也可能是字符2和3。像上面这样的字符串中使用整数时,需要显式地指出我们希望Python将这个整数用作字符串。为此,可调用函数 str(),它让Python将非字符串值表示为字符串: 123age = 23message = \"Happy \" + str(age) + \"rd Birthday!\"print(message) 输出结果如下: 1Happy 23rd Birthday! - 1.4注释注释让我们能够使用自然语言在程序中添加说明,Python中注释有三种方法: 123456789print(\"Hello Python!\")#这是单行注释'''这是多行注释这是多行注释'''\"\"\"这也是多行注释这也是多行注释\"\"\"","categories":[{"name":"Python","slug":"Python","permalink":"https://itrhx.com/categories/Python/"}],"tags":[{"name":"数据类型","slug":"数据类型","permalink":"https://itrhx.com/tags/数据类型/"},{"name":"变量","slug":"变量","permalink":"https://itrhx.com/tags/变量/"}]},{"title":"VMware Pro 14 安装 Ubuntu 18.04 详细教程","slug":"VMwarePro-14-Installation-Ubuntu-18.04-Detailed-Tutorial","date":"2018-09-09T13:14:29.532Z","updated":"2018-09-09T13:23:38.708Z","comments":true,"path":"2018/09/09/VMwarePro-14-Installation-Ubuntu-18.04-Detailed-Tutorial/","link":"","permalink":"https://itrhx.com/2018/09/09/VMwarePro-14-Installation-Ubuntu-18.04-Detailed-Tutorial/","excerpt":"","text":"1.下载安装 VMware Workstation Pro 14 进入 VMware 官网或者在软件商店下载最新版VMware虚拟机并安装 2.下载 Ubuntu 18.04 系统 进入 Ubuntu 官网,下载最新版 Ubuntu 系统镜像 3.在 VMware 中创建虚拟机打开安装好的 VMware Workstation Pro 14,选择创建新的虚拟机 在新建虚拟机向导中选择自定义(高级) 默认直接下一步,直到出现下图,再选择稍后安装操作系统 选择客户机操作系统为 Linux ,如果你电脑是32位就选择 Ubuntu 版本,64位就选择 Ubuntu 64 位版本 更改虚拟机名称及存放位置 为虚拟机指定处理器数量,默认即可 为虚拟机分配内存,太大了可能会导致卡顿,太小了也不好,推荐内存大小即可 以下均选择默认即可 选择创建新虚拟磁盘 选择将虚拟磁盘储存为单个文件 默认下一步 点击完成 此时我们就可以在虚拟机左侧“我的计算机”下面看到刚刚创建的虚拟机 Ubuntu 64 位,单击 Ubuntu 64 位,选择“编辑虚拟机设置”, 再选择“CD/DVD(SATA)”,选择“使用ISO映像文件”,点击“浏览”,找到先前我们下载好的 Ubuntu 64 位镜像文件,点击“确定” 4.在虚拟机上安装 Ubuntu 系统单击 Ubuntu 64 位,选择“开启此虚拟机” 来到欢迎界面,选择好语言,点击“安装 Ubuntu” 选择键盘布局为“汉语” 更新和其他软件默认选择即可 安装类型选择“清除整个磁盘并安装 Ubuntu”,PS: 因为我们是新安装的系统,且在虚拟机中,所以可以选择清除整个磁盘,这个操作不会清除你原来电脑里面的东西 地区随便,在中国就行,默认即可 之后设置计算机名,密码 点击继续稍等一会就安装完成啦 安装过程中可能会出现的一些问题 1.在虚拟机上安装 Ubuntu 系统的过程中卡死不动 解决方法:关闭网络,重新安装即可 2.Ubuntu 不能全屏显示解决方法:方法①:安装 open-vm-tools: 1sudo apt-get install open-vm-tools 然后执行: 1sudo apt-get install open-vm* 重启即可全屏显示 方法②:在终端输入xrandr,并回车,我们就可以看到很多可以修改的分辨率,选择好分辨率后,比如我们要修改分辨率为 1920x1440 ,则在终端输入 xrandr -s 1920x1440,回车即可,注意 1920x1440 中间是小写字母 x,本人亲测此方法并不是很完美,不能完全适应屏幕 方法③:安装 VMware Tools:1、进入 Ubuntu 系统后,点击虚拟机上的【虚拟机】—>【安装 VMware Tools】,回到桌面即可看到一个 VMware Tools 的 图标2、复制 VMwareTools-10.0.10-4301679.tar.gz(版本根据自己的实际情况而定)到 home 目录下, 用命令 tar -xzvf VMwareTools-10.0.10-4301679.tar.gz 进行解压3、解压后 cd vmware_tools_distrib,打开终端4、输入“sudo ./vmware-install.pl”,输入用户密码后开始安装5、接下来会有很多地方需要你按 Enter或者 Yes6、当你看到出现 —the vmware team 的字样后就可以关闭窗口了,此时窗口就会自动全屏了,如果没有全屏,重启过后就可以了7、若还没有全屏显示,则将虚拟机的【查看】—>【自动调整大小】—>【自适应客户机】,都选上,即可实现全屏","categories":[{"name":"实用教程","slug":"实用教程","permalink":"https://itrhx.com/categories/实用教程/"}],"tags":[{"name":"VMware","slug":"VMware","permalink":"https://itrhx.com/tags/VMware/"},{"name":"Ubuntu","slug":"Ubuntu","permalink":"https://itrhx.com/tags/Ubuntu/"}]},{"title":"主流 Markdown 编辑器推荐","slug":"Markdown-Editor","date":"2018-08-29T15:02:46.857Z","updated":"2018-08-30T15:05:11.494Z","comments":true,"path":"2018/08/29/Markdown-Editor/","link":"","permalink":"https://itrhx.com/2018/08/29/Markdown-Editor/","excerpt":"","text":"Markdown ,2004年由 John Gruberis 设计和开发,是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式,以下将介绍目前比较流行的一些 Markdown 编辑器(排名不分先后) - MarkdownPad 目前分为 MarkdownPad2 和 MarkdownPad Pro 版本,后者收费,我们使用前者足矣,用户可以通过键盘快捷键和工具栏按钮来使用或者移除 Markdown 各种语法格式,支持自定义配色方案、字体、大小和布局 、即时HTML预览、HTML和PDF导出,被很多人称赞为 Windows 平台最好用的 Markdown 编辑器,实用性强,仅支持 Windows 系统,个人觉得在 Windows 10 系统上界面并不是很好看,有时候添加音乐什么的,资源多了,实时预览会显示资源加载失败,点击此处访问 MarkdownPad 官网 - BookPad 无意间在 Microsoft Store 上发现的,完美搭配 Win10 系统,界面非常简洁漂亮,2017年9月份发布,大小30.82 MB,官方网站:https://sosfos.wordpress.com/ ,收费13人民币,可免费使用7天,各种功能应有尽有,和其他编辑器不相上下,本来想着百度百度看看有没有破解版,结果全网看不见 BookPad 的影子,估计是新出来的还不为人所知吧,可以直接在 Microsoft Store 搜索下载,或者点击链接获取:https://www.microsoft.com/store/apps/9N6P5ZH2SJSX - 小书匠 分为免费版和收费版,收费版¥20/年,其实免费版的功能已经足够强大了,多种编辑模式、多种主题选择、多种编辑器实现、丰富的语法支持、第三方同步、强大的文件管理功能,让人使用一次就爱上了它,支持 Windows 和 Web,推荐使用,点击此处访问小书匠官网 - Sublime Text 3Sublime Text 3 是基于 Vim 开发的跨平台代码编辑器,收费80美元,好像可以免费试用,支持 OS X、Windows、Ubuntu 等 UNIX 及 Linux 操作系统,由于其功能的多样性而广受好评,界面简约大方,定位专业,原生支持的编程语言就多达十几种,通过第三方插件,还能实现更多语法的支持,其中就包括 Markdown ,但也有个缺点,就是不能实时预览,但是用户可以通过 Markdown Preview 的插件实现对 Markdown 的预览,具体教程请点击此处查看,点击此处访问 Sublime Text 官网 - Mou Mou 是一款由国人独立开发者罗晨开发的实时预览型 Markdown 编辑器,仅支持 OS X操作系统,是目前同类应用中对汉字兼容性最好的作品,也是目前最好用的免费 Markdown 编辑器,提供语法高亮、在线预览、同步滚动、全屏模式,支持自定保存、自动匹配,允许自定义主题,支持 CSS,HTML 和 PDF 导出等功能,点击此处访问 Mou 官网 - AtomAtom 是 Github 专门为程序员推出的一个跨平台文本编辑器,具有简洁和直观的图形用户界面,并有很多有趣的特点:支持CSS,HTML,JavaScript等网页编程语言,当然也支持 Markdown ,支持宏,自动完成分屏功能,集成了文件管理器,点击此处访问 Atom 官网 - Smark国人编写的开源软件,Windows / Linux 等主流系统跨平台支持,完美支持 LaTex 数学公式、脚注、尾注等,支持使用本地 MathJax 调用,不需要在线访问 MathJax CDN,用户可配置的 Markdown 语法高亮显示,美观整洁,多种格式文件导出支持,简洁友好的界面布局,完备的各类快捷键,能极大地提高工作效率,点击此处访问 Smark 官网 - HaroopadHaroopad 覆盖三大主流桌面系统,支持 Windows、OS X 和 Linux,多种主题样式供你选择,语法标亮支持 54 种编程语言,该工具重点推荐 Ubuntu/Linux 用户使用,点击此处访问 Haroopad 官网 - TyporaTypora 同样支持 Windows、OS X 和 Linux,Typora 支持即时渲染技术,这也是与其他 Markdown 编辑器最显著的区别,支持数学编辑,可与 Word 直接格式转换,在 Pandoc 的支持下进行多种文档格式转换,Typora 适合那些对码字手速和排版顺畅度有要求的人群,譬如码农、网站小编等,点击此处访问 Typora 官网 - CuteMarkEdCuteMarkEd 是一个基于qt5的跨平台的 Markdown 编辑器,开源的, 提供实时 HTML 预览、数学表达式、源码高亮和PDF导出,点击此处 访问 CuteMarkEd 官网 - MarkPadMarkPad 是款开源的 Markdown 编辑器,与 Window 8 风格和谐友好的界面,可以直接在你的博客或者 GitHub 中打开、保存文档,直接将图片粘贴到 Markdown 文档中,点击此处访问 MarkPad 官网 - Cmd Markdown作业部落出品,是一款不错的工具和博客平台兼顾的产品,同时支持 Linux、Mac 和 Windows 操作系统,此外还提供 Web 在线创作,社交化批注、智能云同步,最简单的方法,满足多种写作需要,点击此处访问 Cmd Markdown 官网 - FarBox同样是一款不错的 Markdown 编辑器和博客平台兼顾的产品,让用户通过Dropbox(现在默认是自己的同步服务器)直接建立个人网站。FarBox编辑器免费,同时支持 Linux、Mac 和 Windows 操作系统,Farbox服务可以免费试用,在本地编辑器内写作自动同步发布在个人博客,对于希望有个人博客但却不愿折腾的小白来说,是个不错的选择,点击此处访问 FarBox 官网 - MiuMiu 是一款 Windows 下的 Markdown 编辑器,支持 Markdown 高亮、代码高亮、即时预览,以及可以快速发布到 Github Gist,小众软件,界面美观,已经找不到官网了,小众软件网有提供百度云下载,Miu 下载地址 - MacDownMacDown 引用了许多 Mou 的设计方式,仅支持 Mac ,开源免费,点击此处访问 MacDown 官网 - Ulysses一款由国外开发商 The Soulmen 制作的 Markdown 编辑器。与其它同类应用相比,Ulysses 最大的不同在于,它能根据内置的文件管理器,以及与 iCloud 云服务器的实时同步方案,达到最快捷的文章整理效率,支持OS X , iPad,26人民币每月,14天免费试用,点击此处访问 Ulysses 官网 - Byword一款轻量级的 Markdown 编辑器,支持Mac,iPhone和iPad,界面极简,功能强大,貌似要付费使用,点击此处 访问 Byword 官网 - Visual Studio CodeVisual Studio Code 是微软推出一款轻量级的文本编辑工具,类似于 Sublime,它已经默认集成 Markdown 文档编辑插件,原生就支持高亮 Markdown 的语法,但想要实时预览还需要选择 Markdown: Open Preview to the Side 命令实现,相关教程请点击此处,点击此处 访问 Visual Studio Code 官网 - MarxicoMarxico 中文名马克飞象,提供桌面客户端以及离线 Chrome App,支持移动端 Web,可以直接把文本存到印象笔记,点击此处访问 Marxico,点击此处访问 马克飞象 - MaHua一个在线编辑 Markdown 文档的编辑器,小众软件,VIM 快捷键支持,完美兼容 Github 的 Markdown 语法,界面稍许简陋,点击此处访问 MaHua - Dillinger来自国外的 Markdown 编辑器,漂亮强大,支持md、 html、pdf 文件导出,支持Dropbox、Github、Google Drive、Onedrive 一键保存,点击此处访问 Dillinger - 简书简书是一个优质的创作社区,你可以在线创作并发表到社区,是国内优质原创内容输出平台,简书从一开始就已经支持 Markdown 和富文本编辑,是一个为专门为作者打造的平台,点击此处访问简书官网 要细数 Markdown 编辑器的话,可能永远也数不尽,但最有质量的也就那么几个,而且每个人的看法也不同,正所谓萝卜白菜各有所爱,什么编辑器不是最重要的,重要的是我们能写出优质的文章,不断学习进步!不断提升自我! 参考资料:《好用的Markdown编辑器一览》(By:月光)《10款流行的Markdown编辑器,总有一款适合你》(By:xiaoxiao_engineer)《解决作者们的焦虑:7 款优秀 Markdown 编辑工具推荐》(By:JailJT)","categories":[{"name":"实用教程","slug":"实用教程","permalink":"https://itrhx.com/categories/实用教程/"}],"tags":[{"name":"Markdown","slug":"Markdown","permalink":"https://itrhx.com/tags/Markdown/"},{"name":"编辑器","slug":"编辑器","permalink":"https://itrhx.com/tags/编辑器/"}]},{"title":"Hexo 博客主题个性化","slug":"Hexo-blog-topic-personalization","date":"2018-08-27T13:25:24.452Z","updated":"2019-03-12T13:09:57.487Z","comments":true,"path":"2018/08/27/Hexo-blog-topic-personalization/","link":"","permalink":"https://itrhx.com/2018/08/27/Hexo-blog-topic-personalization/","excerpt":"","text":"本文将讲述一些博客主题的美化、实用功能的添加,不同主题可能方法有些不同(本文以作者 luuman 的 spfk 主题和作者 xaoxuu 的 Material X 主题为例),本文章会不定时进行更新。文章涉及有关参考资料、教程、链接如有侵权请联系我删除! – 添加评论系统 主流的评论系统有很多,比如:网易云跟帖、多说、友言、畅言、来必力(LiveRe)、Disqus、Valine、Gitment等等,目前网易云跟帖、多说、友言都已经关闭了,还有些可能需要翻墙,比较麻烦,百度了一下,最后还是选择了来必力评论系统 进入来必力官网,注册一个账号(注册时可能需要翻墙) 注册完毕之后,登录,进入安装页面,选择 City 免费版安装,安装之后你会得到一段代码 我们打开主题文件下的 _config.yml 文件,添加如下代码: 在 \\themes\\hexo-theme-spfk\\layout\\_partial\\comments 文件夹下新建一个 livere.ejs 的文件,在里面填写来必力提供的代码: 123456789101112131415161718<!-- 来必力City版安装代码 --><div id=\"lv-container\" data-id=\"city\" data-uid=\"这里是你的uid\"> <script type=\"text/javascript\"> (function(d, s) { var j, e = d.getElementsByTagName(s)[0]; if (typeof LivereTower === 'function') { return; } j = d.createElement(s); j.src = 'https://cdn-city.livere.com/js/embed.dist.js'; j.async = true; e.parentNode.insertBefore(j, e); })(document, 'script'); </script> <noscript>为正常使用来必力评论功能请激活JavaScript</noscript></div><!-- City版安装代码已完成 --> 打开 \\themes\\hexo-theme-spfk\\layout\\_partial\\article.ejs 文件,在适当位置添加如下红框中的代码: 完成以上操作之后,我们就可以使用来必力评论系统了 – 添加卡通人物 我在逛别人博客的时候偶然发现右下角居然有一个萌萌的卡通人物,还能根据你鼠标位置摇头,瞬间被吸引到了,赶紧也给自己博客添加一个吧!点击此处进入该项目地址 输入如下命令获取 live2d : 1$ npm install --save hexo-helper-live2d 输入以下命令,下载相应的模型,将 packagename 更换成模型名称即可,更多模型选择请点击此处,各个模型的预览请访问原作者的博客 1$ npm install packagename 打开站点目录下的 _config.yml 文件,添加如下代码:1234567891011live2d: enable: true scriptFrom: local model: use: live2d-widget-model-haruto #模型选择 display: position: right #模型位置 width: 150 #模型宽度 height: 300 #模型高度 mobile: show: false #是否在手机端显示 设置好过后我们就拥有了一个卡通人物 – 自定义鼠标指针样式 在 \\themes\\material-x\\source\\less\\_main.less 文件里写入如下代码:1cursor: url('https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@1.0/images/mouse.cur'),auto; 不同主题放的地方不同,确保在博客主体CSS文件中即可,其中的鼠标指针链接可替换成自己的,首先尝试加载 https://cdn.jsdelivr.net/gh/TRHX/CDN-for-itrhx.com@1.0/images/mouse.cur ,如果该文件不存在或由于其他原因无效,那么 auto 会被使用,也就是自动默认效果,图片格式为.ico、.ani、.cur,建议使用.cur,如果使用.ani或者其他格式无效,原因是浏览器兼容问题,请阅读参考文档或者参考以下兼容表: 浏览器 最低版本 格式 Internet Explorer 6.0 .cur / .ani Firefox (Gecko), Windows and Linux 1.5 (1.8) .cur / .png / .gif / .jpg Firefox (Gecko) 4.0 (2.0) .cur / .png / .gif / .jpg / .svg Opera — — Safari (Webkit) 3.0 (522-523) .cur / .png / .gif / .jpg 拓展阅读:《CSS 鼠标样式 cursor属性》 (By:歪脖先生的博客) – 添加鼠标点击爱心效果 在 /themes/hexo-theme-spfk/source/js 下新建文件 love.js,在 love.js 文件中添加以下代码: 1!function(e,t,a){function n(){c(\".heart{width: 10px;height: 10px;position: fixed;background: #f00;transform: rotate(45deg);-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);}.heart:after,.heart:before{content: '';width: inherit;height: inherit;background: inherit;border-radius: 50%;-webkit-border-radius: 500%;-moz-border-radius: 50%;position: fixed;}.heart:after{top: -5px;}.heart:before{left: -5px;}\"),o(),r()}function r(){for(var e=0;e<d.length;e++)d[e].alpha<=0?(t.body.removeChild(d[e].el),d.splice(e,1)):(d[e].y--,d[e].scale+=.004,d[e].alpha-=.013,d[e].el.style.cssText=\"left:\"+d[e].x+\"px;top:\"+d[e].y+\"px;opacity:\"+d[e].alpha+\";transform:scale(\"+d[e].scale+\",\"+d[e].scale+\") rotate(45deg);background:\"+d[e].color+\";z-index:99999\");requestAnimationFrame(r)}function o(){var t=\"function\"==typeof e.onclick&&e.onclick;e.onclick=function(e){t&&t(),i(e)}}function i(e){var a=t.createElement(\"div\");a.className=\"heart\",d.push({el:a,x:e.clientX-5,y:e.clientY-5,scale:1,alpha:1,color:s()}),t.body.appendChild(a)}function c(e){var a=t.createElement(\"style\");a.type=\"text/css\";try{a.appendChild(t.createTextNode(e))}catch(t){a.styleSheet.cssText=e}t.getElementsByTagName(\"head\")[0].appendChild(a)}function s(){return\"rgb(\"+~~(255*Math.random())+\",\"+~~(255*Math.random())+\",\"+~~(255*Math.random())+\")\"}var d=[];e.requestAnimationFrame=function(){return e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(e){setTimeout(e,1e3/60)}}(),n()}(window,document); 在 \\themes\\hexo-theme-spfk\\layout\\layout.ejs 文件末尾添加以下代码: 12<!-- 页面点击小红心 --><script type=\"text/javascript\" src=\"/js/love.js\"></script> 完成以上操作后,当我们点击鼠标的时候就可以看见爱心的特效了 – 添加鼠标点击显示字体效果 在 /themes/hexo-theme-spfk/source/js 下新建文件 click_show_text.js,在 click_show_text.js 文件中添加以下代码: 123456789101112131415161718192021222324252627282930313233var a_idx = 0;jQuery(document).ready(function($) { $(\"body\").click(function(e) { var a = new Array (\"富强\", \"民主\", \"文明\", \"和谐\", \"自由\", \"平等\", \"公正\", \"法治\", \"爱国\", \"敬业\", \"诚信\", \"友善\"); var $i = $(\"<span/>\").text(a[a_idx]); a_idx = (a_idx + 1) % a.length; var x = e.pageX, y = e.pageY; $i.css({ \"z-index\": 5, \"top\": y - 20, \"left\": x, \"position\": \"absolute\", \"font-weight\": \"bold\", \"color\": \"#FF0000\" }); $(\"body\").append($i); $i.animate({ \"top\": y - 180, \"opacity\": 0 }, 3000, function() { $i.remove(); }); }); setTimeout('delay()', 2000);});function delay() { $(\".buryit\").removeAttr(\"onclick\");} 其中的社会主义核心价值观可以根据你自己的创意替换为其他文字,然后在 \\themes\\hexo-theme-spfk\\layout\\layout.ejs 文件末尾添加以下代码: 12<!--单击显示文字--><script type=\"text/javascript\" src=\"/js/click_show_text.js\"></script> 最终实现效果如下: – 添加鼠标点击烟花爆炸效果 在 \\themes\\material-x\\source\\js 目录下新建一个 fireworks.js 的文件,里面写入以下代码:1\"use strict\";function updateCoords(e){pointerX=(e.clientX||e.touches[0].clientX)-canvasEl.getBoundingClientRect().left,pointerY=e.clientY||e.touches[0].clientY-canvasEl.getBoundingClientRect().top}function setParticuleDirection(e){var t=anime.random(0,360)*Math.PI/180,a=anime.random(50,180),n=[-1,1][anime.random(0,1)]*a;return{x:e.x+n*Math.cos(t),y:e.y+n*Math.sin(t)}}function createParticule(e,t){var a={};return a.x=e,a.y=t,a.color=colors[anime.random(0,colors.length-1)],a.radius=anime.random(16,32),a.endPos=setParticuleDirection(a),a.draw=function(){ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.fillStyle=a.color,ctx.fill()},a}function createCircle(e,t){var a={};return a.x=e,a.y=t,a.color=\"#F00\",a.radius=0.1,a.alpha=0.5,a.lineWidth=6,a.draw=function(){ctx.globalAlpha=a.alpha,ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.lineWidth=a.lineWidth,ctx.strokeStyle=a.color,ctx.stroke(),ctx.globalAlpha=1},a}function renderParticule(e){for(var t=0;t<e.animatables.length;t++){e.animatables[t].target.draw()}}function animateParticules(e,t){for(var a=createCircle(e,t),n=[],i=0;i<numberOfParticules;i++){n.push(createParticule(e,t))}anime.timeline().add({targets:n,x:function(e){return e.endPos.x},y:function(e){return e.endPos.y},radius:0.1,duration:anime.random(1200,1800),easing:\"easeOutExpo\",update:renderParticule}).add({targets:a,radius:anime.random(80,160),lineWidth:0,alpha:{value:0,easing:\"linear\",duration:anime.random(600,800)},duration:anime.random(1200,1800),easing:\"easeOutExpo\",update:renderParticule,offset:0})}function debounce(e,t){var a;return function(){var n=this,i=arguments;clearTimeout(a),a=setTimeout(function(){e.apply(n,i)},t)}}var canvasEl=document.querySelector(\".fireworks\");if(canvasEl){var ctx=canvasEl.getContext(\"2d\"),numberOfParticules=30,pointerX=0,pointerY=0,tap=\"mousedown\",colors=[\"#FF1461\",\"#18FF92\",\"#5A87FF\",\"#FBF38C\"],setCanvasSize=debounce(function(){canvasEl.width=2*window.innerWidth,canvasEl.height=2*window.innerHeight,canvasEl.style.width=window.innerWidth+\"px\",canvasEl.style.height=window.innerHeight+\"px\",canvasEl.getContext(\"2d\").scale(2,2)},500),render=anime({duration:1/0,update:function(){ctx.clearRect(0,0,canvasEl.width,canvasEl.height)}});document.addEventListener(tap,function(e){\"sidebar\"!==e.target.id&&\"toggle-sidebar\"!==e.target.id&&\"A\"!==e.target.nodeName&&\"IMG\"!==e.target.nodeName&&(render.play(),updateCoords(e),animateParticules(pointerX,pointerY))},!1),setCanvasSize(),window.addEventListener(\"resize\",setCanvasSize,!1)}\"use strict\";function updateCoords(e){pointerX=(e.clientX||e.touches[0].clientX)-canvasEl.getBoundingClientRect().left,pointerY=e.clientY||e.touches[0].clientY-canvasEl.getBoundingClientRect().top}function setParticuleDirection(e){var t=anime.random(0,360)*Math.PI/180,a=anime.random(50,180),n=[-1,1][anime.random(0,1)]*a;return{x:e.x+n*Math.cos(t),y:e.y+n*Math.sin(t)}}function createParticule(e,t){var a={};return a.x=e,a.y=t,a.color=colors[anime.random(0,colors.length-1)],a.radius=anime.random(16,32),a.endPos=setParticuleDirection(a),a.draw=function(){ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.fillStyle=a.color,ctx.fill()},a}function createCircle(e,t){var a={};return a.x=e,a.y=t,a.color=\"#F00\",a.radius=0.1,a.alpha=0.5,a.lineWidth=6,a.draw=function(){ctx.globalAlpha=a.alpha,ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.lineWidth=a.lineWidth,ctx.strokeStyle=a.color,ctx.stroke(),ctx.globalAlpha=1},a}function renderParticule(e){for(var t=0;t<e.animatables.length;t++){e.animatables[t].target.draw()}}function animateParticules(e,t){for(var a=createCircle(e,t),n=[],i=0;i<numberOfParticules;i++){n.push(createParticule(e,t))}anime.timeline().add({targets:n,x:function(e){return e.endPos.x},y:function(e){return e.endPos.y},radius:0.1,duration:anime.random(1200,1800),easing:\"easeOutExpo\",update:renderParticule}).add({targets:a,radius:anime.random(80,160),lineWidth:0,alpha:{value:0,easing:\"linear\",duration:anime.random(600,800)},duration:anime.random(1200,1800),easing:\"easeOutExpo\",update:renderParticule,offset:0})}function debounce(e,t){var a;return function(){var n=this,i=arguments;clearTimeout(a),a=setTimeout(function(){e.apply(n,i)},t)}}var canvasEl=document.querySelector(\".fireworks\");if(canvasEl){var ctx=canvasEl.getContext(\"2d\"),numberOfParticules=30,pointerX=0,pointerY=0,tap=\"mousedown\",colors=[\"#FF1461\",\"#18FF92\",\"#5A87FF\",\"#FBF38C\"],setCanvasSize=debounce(function(){canvasEl.width=2*window.innerWidth,canvasEl.height=2*window.innerHeight,canvasEl.style.width=window.innerWidth+\"px\",canvasEl.style.height=window.innerHeight+\"px\",canvasEl.getContext(\"2d\").scale(2,2)},500),render=anime({duration:1/0,update:function(){ctx.clearRect(0,0,canvasEl.width,canvasEl.height)}});document.addEventListener(tap,function(e){\"sidebar\"!==e.target.id&&\"toggle-sidebar\"!==e.target.id&&\"A\"!==e.target.nodeName&&\"IMG\"!==e.target.nodeName&&(render.play(),updateCoords(e),animateParticules(pointerX,pointerY))},!1),setCanvasSize(),window.addEventListener(\"resize\",setCanvasSize,!1)}; 然后在 \\themes\\material-x\\layout\\layout.ejs 文件中写入以下代码: 123<canvas class=\"fireworks\" style=\"position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;\" ></canvas> <script type=\"text/javascript\" src=\"//cdn.bootcss.com/animejs/2.2.0/anime.min.js\"></script> <script type=\"text/javascript\" src=\"/js/fireworks.js\"></script> 最终效果: – 添加彩色滚动变换字体 在你想要添加彩色滚动变换字体的地方写入以下代码即可,其中文字可自行更改:123456789101112131415161718192021222324252627282930313233343536373839404142<div id=\"binft\"></div> <script> var binft = function (r) { function t() { return b[Math.floor(Math.random() * b.length)] } function e() { return String.fromCharCode(94 * Math.random() + 33) } function n(r) { for (var n = document.createDocumentFragment(), i = 0; r > i; i++) { var l = document.createElement(\"span\"); l.textContent = e(), l.style.color = t(), n.appendChild(l) } return n } function i() { var t = o[c.skillI]; c.step ? c.step-- : (c.step = g, c.prefixP < l.length ? (c.prefixP >= 0 && (c.text += l[c.prefixP]), c.prefixP++) : \"forward\" === c.direction ? c.skillP < t.length ? (c.text += t[c.skillP], c.skillP++) : c.delay ? c.delay-- : (c.direction = \"backward\", c.delay = a) : c.skillP > 0 ? (c.text = c.text.slice(0, -1), c.skillP--) : (c.skillI = (c.skillI + 1) % o.length, c.direction = \"forward\")), r.textContent = c.text, r.appendChild(n(c.prefixP < l.length ? Math.min(s, s + c.prefixP) : Math.min(s, t.length - c.skillP))), setTimeout(i, d) } var l = \"\", o = [\"青青陵上柏,磊磊涧中石。\", \"人生天地间,忽如远行客。\",\"斗酒相娱乐,聊厚不为薄。\", \"驱车策驽马,游戏宛与洛。\",\"洛中何郁郁,冠带自相索。\",\"长衢罗夹巷,王侯多第宅。\",\"两宫遥相望,双阙百余尺。\",\"极宴娱心意,戚戚何所迫?\"].map(function (r) { return r + \"\" }), a = 2, g = 1, s = 5, d = 75, b = [\"rgb(110,64,170)\", \"rgb(150,61,179)\", \"rgb(191,60,175)\", \"rgb(228,65,157)\", \"rgb(254,75,131)\", \"rgb(255,94,99)\", \"rgb(255,120,71)\", \"rgb(251,150,51)\", \"rgb(226,183,47)\", \"rgb(198,214,60)\", \"rgb(175,240,91)\", \"rgb(127,246,88)\", \"rgb(82,246,103)\", \"rgb(48,239,130)\", \"rgb(29,223,163)\", \"rgb(26,199,194)\", \"rgb(35,171,216)\", \"rgb(54,140,225)\", \"rgb(76,110,219)\", \"rgb(96,84,200)\"], c = { text: \"\", prefixP: -s, skillI: 0, skillP: 0, direction: \"forward\", delay: a, step: g }; i() }; binft(document.getElementById('binft')); </script> 最终效果: – 添加字数统计和阅读时长 先在博客目录下执行以下命令安装 hexo-wordcount 插件: 1$ npm i --save hexo-wordcount 之后在 \\themes\\hexo-theme-spfk\\layout\\_partial\\post 目录下创建 word.ejs 文件,在 word.ejs 文件中写入以下代码: 123456789101112131415161718<div style=\"margin-top:10px;\"> <span class=\"post-time\"> <span class=\"post-meta-item-icon\"> <i class=\"fa fa-keyboard-o\"></i> <span class=\"post-meta-item-text\"> 字数统计: </span> <span class=\"post-count\"><%= wordcount(post.content) %>字</span> </span> </span> <span class=\"post-time\"> &nbsp; | &nbsp; <span class=\"post-meta-item-icon\"> <i class=\"fa fa-hourglass-half\"></i> <span class=\"post-meta-item-text\"> 阅读时长: </span> <span class=\"post-count\"><%= min2read(post.content) %>分</span> </span> </span></div> 然后在 \\themes\\hexo-theme-spfk\\layout\\_partial\\article.ejs 中适当位置添加以下代码: 最后在主题目录下的 _config.yml 添加以下配置 1word_count: true 如果显示的位置不好,可以自行更改其位置,成功配置后的效果如下: 另外:要在博客底部显示所有文章的总字数,可以点击此处,根据你博客底部文件的类型选择相应的代码放在适当的位置即可,前提是要安装好 hexo-wordcount 插件,例如我使用 Material X 主题,在 \\themes\\material-x\\layout\\_partial 目录下的 footer.ejs 文件中添加如下代码:12<i class=\"fas fa-chart-area\"></i><span class=\"post-count\">字数统计:<%= totalcount(site) %></span> 实现效果如下: – 添加背景音乐 打开网页版网易云音乐,选择你准备添加的背景音乐,点击生成外链播放器,前提是要有版权,不然是无法生成外链播放器的,复制底下的HTML代码 然后将此代码放到你想要放的地方,比如放在博客的左侧,则打开 \\themes\\hexo-theme-spfk\\layout\\_partial\\left-col.ejs 文件,将复制的HTML代码粘贴进去,再进行适当的位置设置让播放器更美观,其中 auto=1 表示打开网页自动播放音乐,auto=0 表示关闭自动播放音乐 最后效果如下: – 添加网站运行时间 一个比较好的小功能,可以看见自己的博客运行多久了,时间一天天的增加,成就感也会一天天增加的在 \\themes\\hexo-theme-spfk\\layout\\_partial\\footer.ejs 文件下添加以下代码: 1234567891011121314151617<span id=\"timeDate\">载入天数...</span><span id=\"times\">载入时分秒...</span><script> var now = new Date(); function createtime() { var grt= new Date(\"08/10/2018 17:38:00\");//在此处修改你的建站时间 now.setTime(now.getTime()+250); days = (now - grt ) / 1000 / 60 / 60 / 24; dnum = Math.floor(days); hours = (now - grt ) / 1000 / 60 / 60 - (24 * dnum); hnum = Math.floor(hours); if(String(hnum).length ==1 ){hnum = \"0\" + hnum;} minutes = (now - grt ) / 1000 /60 - (24 * 60 * dnum) - (60 * hnum); mnum = Math.floor(minutes); if(String(mnum).length ==1 ){mnum = \"0\" + mnum;} seconds = (now - grt ) / 1000 - (24 * 60 * 60 * dnum) - (60 * 60 * hnum) - (60 * mnum); snum = Math.round(seconds); if(String(snum).length ==1 ){snum = \"0\" + snum;} document.getElementById(\"timeDate\").innerHTML = \"本站已安全运行 \"+dnum+\" 天 \"; document.getElementById(\"times\").innerHTML = hnum + \" 小时 \" + mnum + \" 分 \" + snum + \" 秒\"; } setInterval(\"createtime()\",250);</script> 最后效果如下: – 添加百度统计 百度统计是百度推出的一款免费的专业网站流量分析工具,能够告诉用户访客是如何找到并浏览用户的网站,在网站上做了些什么,非常有趣,接下来我们把百度统计添加到自己博客当中 访问百度统计首页,注册一个账号后登陆,添加你的博客网站 接着点击代码获取,复制该代码 然后到目录 \\Hexo\\themes\\hexo-theme-spfk\\layout\\_partial 下新建一个 baidu-analytics.ejs 文件,里面粘贴你刚刚复制的代码 修改主题文件夹下的 _config.yml 文件,将你的key(图中涂掉部分)填写进去: 所有操作完成后可以在百度统计管理页面检查代码是否安装成功,如果代码安装正确,一般20分钟后,可以查看网站分析数据 另外推荐:友盟,2010年4月在北京成立,安全、可靠、公正、第三方的网站流量统计分析系统 – 浏览器网页标题恶搞 当用户访问你的博客时点击到了其他网页,我们可以恶搞一下网页标题,呼唤用户回来,首先在目录 \\Hexo\\themes\\hexo-theme-spfk\\source\\js 下新建一个 FunnyTitle.js 文件,在里面填写如下代码: 1234567891011121314151617<!--浏览器搞笑标题--> var OriginTitle = document.title; var titleTime; document.addEventListener('visibilitychange', function () { if (document.hidden) { $('[rel=\"icon\"]').attr('href', \"/img/trhx2.png\"); document.title = 'ヽ(●-`Д´-)ノ你丑你就走!'; clearTimeout(titleTime); } else { $('[rel=\"icon\"]').attr('href', \"/img/trhx2.png\"); document.title = 'ヾ(Ő∀Ő3)ノ你帅就回来!' + OriginTitle; titleTime = setTimeout(function () { document.title = OriginTitle; }, 2000); } }); 然后在 \\Hexo\\themes\\hexo-theme-spfk\\layout\\layout.ejs 文件中添加如下代码: 12<!--浏览器搞笑标题--><script type=\"text/javascript\" src=\"\\js\\FunnyTitle.js\"></script> 再次部署博客后就可以看见标题搞笑的效果了: – 背景添加动态线条效果 在 \\Hexo\\themes\\hexo-theme-spfk\\layout\\layout.ejs 文件中添加如下代码: 1234<!--动态线条背景--><script type=\"text/javascript\"color=\"220,220,220\" opacity='0.7' zIndex=\"-2\" count=\"200\" src=\"//cdn.bootcss.com/canvas-nest.js/1.0.0/canvas-nest.min.js\"></script> 其中: color:表示线条颜色,三个数字分别为(R,G,B),默认:(0,0,0) opacity:表示线条透明度(0~1),默认:0.5 count:表示线条的总数量,默认:150 zIndex:表示背景的z-index属性,css属性用于控制所在层的位置,默认:-1 最终实现效果: – 添加人体时钟 无意中发现了个有趣的人体时钟 HONE HONE CLOCK,作者是个日本人,点击此处访问作者博客,点击此处在作者原博客上查看动态样式,点击此处查看动态大图,如果你的博客上有合适的地方,加上一个人体时钟会很有趣的 实现代码: 12345<!--人体时钟背景透明--><script charset=\"Shift_JIS\" src=\"http://chabudai.sakura.ne.jp/blogparts/honehoneclock/honehone_clock_tr.js\"></script><!--人体时钟背景白--><script charset=\"Shift_JIS\" src=\"http://chabudai.sakura.ne.jp/blogparts/honehoneclock/honehone_clock_wh.js\"></script> 其他网页小挂件推荐: http://abowman.com/ 里面有很多有趣的小挂件,可以养养鱼、龟、狗、仓鼠等各式各样的虚拟宠物,能根据你的鼠标指针位置移动,直接复制代码就可以用 http://www.revolvermaps.com/ 它提供网站访客地理信息,可以以2D、3D等形式显示 http://www.amazingcounters.com/ 免费网站计数器,有非常多的样式供你选择,可以设置计数器初始数值,可以设置按访问量计数,也可以按独立访问者计数 https://www.seniverse.com/widget/get 心知天气提供基于Web的免费天气插件,可以为你的网站添加一项简洁美观的天气预报功能,并自动适配PC和手机上的浏览 – 添加RSS订阅 RSS订阅是站点用来和其他站点之间共享内容的一种简易方式,即Really Simple Syndication(简易信息聚合),如果不会使用,可以参见百度百科:https://baike.baidu.com/item/RSS%E8%AE%A2%E9%98%85/663114 ;首先我们安装feed插件,在本地hexo目录下右键git bash here,输入以下命令: 1$ npm install hexo-generator-feed 等待安装完成后,打开hexo目录下配置文件的_config.yml,在末尾添加以下配置: 12345678910# Extensions## Plugins: http://hexo.io/plugins/#RSS订阅plugin:- hexo-generator-feed#Feed Atomfeed:type: atompath: atom.xmllimit: 20 随后打开主题配置文件_config.yml,添加以下配置: 1rss: /atom.xml 至此,RSS订阅功能添加完成 – 添加网站雪花飘落效果 样式一和样式二分别如下: 实现方法:在 \\Hexo\\themes\\hexo-theme-spfk\\source\\js 目录下新建一个 snow.js 文件,粘贴以下代码:123456789101112131415161718192021222324252627282930313233343536373839404142/*样式一*/(function($){ $.fn.snow = function(options){ var $flake = $('<div id=\"snowbox\" />').css({'position': 'absolute','z-index':'9999', 'top': '-50px'}).html('&#10052;'), documentHeight = $(document).height(), documentWidth = $(document).width(), defaults = { minSize : 10, maxSize : 20, newOn : 1000, flakeColor : \"#AFDAEF\" /* 此处可以定义雪花颜色,若要白色可以改为#FFFFFF */ }, options = $.extend({}, defaults, options); var interval= setInterval( function(){ var startPositionLeft = Math.random() * documentWidth - 100, startOpacity = 0.5 + Math.random(), sizeFlake = options.minSize + Math.random() * options.maxSize, endPositionTop = documentHeight - 200, endPositionLeft = startPositionLeft - 500 + Math.random() * 500, durationFall = documentHeight * 10 + Math.random() * 5000; $flake.clone().appendTo('body').css({ left: startPositionLeft, opacity: startOpacity, 'font-size': sizeFlake, color: options.flakeColor }).animate({ top: endPositionTop, left: endPositionLeft, opacity: 0.2 },durationFall,'linear',function(){ $(this).remove() }); }, options.newOn); };})(jQuery);$(function(){ $.fn.snow({ minSize: 5, /* 定义雪花最小尺寸 */ maxSize: 50,/* 定义雪花最大尺寸 */ newOn: 300 /* 定义密集程度,数字越小越密集 */ });}); 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128/*样式二*//* 控制下雪 */function snowFall(snow) { /* 可配置属性 */ snow = snow || {}; this.maxFlake = snow.maxFlake || 200; /* 最多片数 */ this.flakeSize = snow.flakeSize || 10; /* 雪花形状 */ this.fallSpeed = snow.fallSpeed || 1; /* 坠落速度 */}/* 兼容写法 */requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || window.oRequestAnimationFrame || function(callback) { setTimeout(callback, 1000 / 60); };cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame || window.oCancelAnimationFrame;/* 开始下雪 */snowFall.prototype.start = function(){ /* 创建画布 */ snowCanvas.apply(this); /* 创建雪花形状 */ createFlakes.apply(this); /* 画雪 */ drawSnow.apply(this)}/* 创建画布 */function snowCanvas() { /* 添加Dom结点 */ var snowcanvas = document.createElement(\"canvas\"); snowcanvas.id = \"snowfall\"; snowcanvas.width = window.innerWidth; snowcanvas.height = document.body.clientHeight; snowcanvas.setAttribute(\"style\", \"position:absolute; top: 0; left: 0; z-index: 1; pointer-events: none;\"); document.getElementsByTagName(\"body\")[0].appendChild(snowcanvas); this.canvas = snowcanvas; this.ctx = snowcanvas.getContext(\"2d\"); /* 窗口大小改变的处理 */ window.onresize = function() { snowcanvas.width = window.innerWidth; /* snowcanvas.height = window.innerHeight */ }}/* 雪运动对象 */function flakeMove(canvasWidth, canvasHeight, flakeSize, fallSpeed) { this.x = Math.floor(Math.random() * canvasWidth); /* x坐标 */ this.y = Math.floor(Math.random() * canvasHeight); /* y坐标 */ this.size = Math.random() * flakeSize + 2; /* 形状 */ this.maxSize = flakeSize; /* 最大形状 */ this.speed = Math.random() * 1 + fallSpeed; /* 坠落速度 */ this.fallSpeed = fallSpeed; /* 坠落速度 */ this.velY = this.speed; /* Y方向速度 */ this.velX = 0; /* X方向速度 */ this.stepSize = Math.random() / 30; /* 步长 */ this.step = 0 /* 步数 */}flakeMove.prototype.update = function() { var x = this.x, y = this.y; /* 左右摆动(余弦) */ this.velX *= 0.98; if (this.velY <= this.speed) { this.velY = this.speed } this.velX += Math.cos(this.step += .05) * this.stepSize; this.y += this.velY; this.x += this.velX; /* 飞出边界的处理 */ if (this.x >= canvas.width || this.x <= 0 || this.y >= canvas.height || this.y <= 0) { this.reset(canvas.width, canvas.height) }};/* 飞出边界-放置最顶端继续坠落 */flakeMove.prototype.reset = function(width, height) { this.x = Math.floor(Math.random() * width); this.y = 0; this.size = Math.random() * this.maxSize + 2; this.speed = Math.random() * 1 + this.fallSpeed; this.velY = this.speed; this.velX = 0;};// 渲染雪花-随机形状(此处可修改雪花颜色!!!)flakeMove.prototype.render = function(ctx) { var snowFlake = ctx.createRadialGradient(this.x, this.y, 0, this.x, this.y, this.size); snowFlake.addColorStop(0, \"rgba(255, 255, 255, 0.9)\"); /* 此处是雪花颜色,默认是白色 */ snowFlake.addColorStop(.5, \"rgba(255, 255, 255, 0.5)\"); /* 若要改为其他颜色,请自行查 */ snowFlake.addColorStop(1, \"rgba(255, 255, 255, 0)\"); /* 找16进制的RGB 颜色代码。 */ ctx.save(); ctx.fillStyle = snowFlake; ctx.beginPath(); ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2); ctx.fill(); ctx.restore();};/* 创建雪花-定义形状 */function createFlakes() { var maxFlake = this.maxFlake, flakes = this.flakes = [], canvas = this.canvas; for (var i = 0; i < maxFlake; i++) { flakes.push(new flakeMove(canvas.width, canvas.height, this.flakeSize, this.fallSpeed)) }}/* 画雪 */function drawSnow() { var maxFlake = this.maxFlake, flakes = this.flakes; ctx = this.ctx, canvas = this.canvas, that = this; /* 清空雪花 */ ctx.clearRect(0, 0, canvas.width, canvas.height); for (var e = 0; e < maxFlake; e++) { flakes[e].update(); flakes[e].render(ctx); } /* 一帧一帧的画 */ this.loop = requestAnimationFrame(function() { drawSnow.apply(that); });}/* 调用及控制方法 */var snow = new snowFall({maxFlake:60});snow.start(); 然后在 \\Hexo\\themes\\hexo-theme-spfk\\layout\\layout.ejs 文件里引用即可: 12<!-- 雪花特效 --><script type=\"text/javascript\" src=\"\\js\\snow.js\"></script> 如果没效果,请确认网页是否已载入JQurey,如果没有请在下雪代码之前引入JQ即可: 12<script type=\"text/javascript\" src=\"http://libs.baidu.com/jquery/1.8.3/jquery.js\"></script><script type=\"text/javascript\" src=\"http://libs.baidu.com/jquery/1.8.3/jquery.min.js\"></script> 原文链接:《分享两种圣诞节雪花特效JS代码(网站下雪效果)》 – 添加 Fork me on GitHub 效果 效果图:点击此处可以查看更多样式,将相应样式的代码复制到你想要放的地方就OK了,代码里的链接也要替换成你的,更多创意,比如 Follow me on CSDN ,只需要用PS改掉图片里的文字,替换掉相应链接即可 未完待续……","categories":[{"name":"实用教程","slug":"实用教程","permalink":"https://itrhx.com/categories/实用教程/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://itrhx.com/tags/Hexo/"},{"name":"主题个性化","slug":"主题个性化","permalink":"https://itrhx.com/tags/主题个性化/"}]},{"title":"Markdown 语法&技巧总结","slug":"Summary-of-Markdown-Grammar-and-Skills","date":"2018-08-25T09:57:16.879Z","updated":"2019-01-18T13:20:00.396Z","comments":true,"path":"2018/08/25/Summary-of-Markdown-Grammar-and-Skills/","link":"","permalink":"https://itrhx.com/2018/08/25/Summary-of-Markdown-Grammar-and-Skills/","excerpt":"","text":"在写博客的时候,我们不希望都是千篇一律的没有色彩,多了解一些 Markdown 语法技巧有利于丰富我们的博客,看起来更有 feel ! – 插入图片 如果你使用 MarkdownPad 的话就比较方便,可以直接选择插入本地图片或者是网络图片,实质是通过以下代码实现的,小括号里面就是你的图片地址,中括号里面是图片的替代文字,比如上面的图片代码如下:1![车](https://i.imgur.com/UyEXrBi.jpg) – 插入音乐 打开网页版网易云音乐,选择你准备插入的音乐,点击生成外链播放器,前提是要有版权,不然是无法生成外链播放器的,复制底下的HTML代码 然后将此HTML代码粘贴到你想要放的地方,可自行调节播放器的大小,其中 auto=1 表示打开网页自动播放音乐,auto=0 表示关闭自动播放音乐,比如See You Again (中英文版) - 罗艺恒这首歌曲代码如下: 1<iframe frameborder=\"no\" border=\"0\" marginwidth=\"0\" marginheight=\"0\" width=330 height=86 src=\"//music.163.com/outchain/player?type=2&id=32405683&auto=1&height=66\"></iframe> – 插入视频 高考毕业了我们为下一届的学弟学妹们录制高考加油视频,我担任后期制作,在这里就以该视频为例٩(๑❛ᴗ❛๑)۶,在腾讯视频播放页面找到分享按钮,复制该视频的通用代码(其他视频播放平台也一样),粘贴到文章中对应位置即可,可根据情况调整视频播放器的大小 1<iframe frameborder=\"0\" width=\"840\" height=\"500\" src=\"https://v.qq.com/txp/iframe/player.html?vid=x0643zvgtf7\" allowFullScreen=\"true\"></iframe> 未完待续……","categories":[{"name":"实用教程","slug":"实用教程","permalink":"https://itrhx.com/categories/实用教程/"}],"tags":[{"name":"Markdown","slug":"Markdown","permalink":"https://itrhx.com/tags/Markdown/"},{"name":"技巧","slug":"技巧","permalink":"https://itrhx.com/tags/技巧/"}]},{"title":"使用 Github Pages 和 Hexo 搭建自己的独立博客","slug":"Build-your-own-independent-blog-using-GithubPages-and-Hexo","date":"2018-08-15T13:34:58.325Z","updated":"2019-03-25T16:46:24.249Z","comments":true,"path":"2018/08/15/Build-your-own-independent-blog-using-GithubPages-and-Hexo/","link":"","permalink":"https://itrhx.com/2018/08/15/Build-your-own-independent-blog-using-GithubPages-and-Hexo/","excerpt":"","text":"– 前言 首先感谢您能访问我的博客:TRHX’S BLOG 这是一篇有关如何使用 Github Pages 和 Hexo 搭建属于自己独立博客的详尽教程,本人是软件工程专业本科生,目前只学习了C和C++编程语言,对网站开发的有关知识几乎为零,这也是我搭建好自己的博客之后写的第一篇博客,刚开始搭建博客的时候自己也是网上各种百度,由于自己属于小白那种,历经了千辛万苦才弄好,所以借这个机会写一篇小白真正能看懂的博客搭建教程,教你一步一步走向成功的彼岸! 推荐文章: 《我为什么写博客》 (By 知明所以) 《为什么你应该(从现在开始就)写博客》 (By 刘未鹏 | Mind Hacks) – 入门 Github Pages Github Pages可以被认为是用户编写的、托管在github上的静态网页。使用Github Pages可以为你提供一个免费的服务器,免去了自己搭建服务器和写数据库的麻烦。此外还可以绑定自己的域名。 Hexo Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 – 安装 Node.js点击此处访问官网,按需下载相应版本,默认安装可以了 注:本人在安装过程中出现了Warning 1909,无法创建快捷方式,这种情况很少出现,如果在安装过程中也有这种情况请参考百度文库(win10系统实测可行):《Win7安装程序警告1909无法创建快捷方式》 – 安装 Git点击此处访问官网,按需下载相应版本,默认安装即可参考资料:《如何在windows下安装GIT》 (By 俊雨廷休) 《Pro Git(中文版)》 – 检验软件是否安装成功同时按下 Win 键和 R 键打开运行窗口,输入 cmd ,然后输入以下命令,有相应版本信息显示则安装成功,若不正确可以卸载软件重新安装,此外若安装成功,在桌面右键鼠标,可以看到菜单里多了 Git GUI Here 和 Git Bash Here两个选项,第一个是图形界面的Git操作,另一个是命令行123$ git --version$ node -v$ npm -v – Hexo 安装选择一个磁盘,新建一个文件夹,自己重命名文件夹(如:我的文件夹为:E\\TRHX_Blog),博客相关文件将储存在此文件夹下,在该文件夹下右键鼠标,点击 Git Bash Here,输入以下 npm 命令即可安装,第一个命令表示安装 hexo,第二个命令表示安装 hexo 部署到 git page 的 deployer,如图所示即为安装成功12$ npm install hexo-cli -g$ npm install hexo-deployer-git --save – Hexo 初始化配置在刚才新建的文件夹里面再次新建一个 Hexo 文件夹(如:我的文件夹为:E\\TRHX_Blog\\Hexo),进入该 Hexo 文件夹右键鼠标,点击 Git Bash Here,输入以下命令,如图所示则安装成功1$ hexo init Hexo 安装完成后,将会在指定文件夹中新建所需要的文件,Hexo 文件夹下的目录如下: – 本地查看效果执行以下命令,执行完即可登录 http://localhost:4000/ 查看效果12$ hexo generate$ hexo server 显示以下信息说明操作成功:1INFO Hexo is running at http://0.0.0.0:4000/. Press Ctrl+C to stop. 登录 http://localhost:4000/ 查看效果: – 将博客部署到 Github Pages 上到目前为止,我们的本地博客就成功搭建了,但是现在我们只能通过本地连接查看博客,我们要做的是让其他人也能够访问我们的博客,这就需要我们将博客部署到Github Pages上 一、注册 Github 账户:点击此处访问 Github 官网,点击 Sign Up 注册账户 二、创建项目代码库:点击 New repository 开始创建,步骤及注意事项见图: 三、配置 SSH 密钥:只有配置好 SSH 密钥后,我们才可以通过 git 操作实现本地代码库与 Github 代码库同步,在你第一次新建的文件夹里面(如:我的文件夹为:E\\TRHX_Blog) Git Bash Here 输入以下命令:12$ ssh-keygen -t rsa -C \"your email@example.com\"//引号里面填写你的邮箱地址,比如我的是tanrenhou@126.com 之后会出现:123Generating public/private rsa key pair.Enter file in which to save the key (/c/Users/you/.ssh/id_rsa)://到这里可以直接回车将密钥按默认文件进行存储 然后会出现:123Enter passphrase (empty for no passphrase)://这里是要你输入密码,其实不需要输什么密码,直接回车就行Enter same passphrase again: 接下来屏幕会显示:123456Your identification has been saved in /c/Users/you/.ssh/id_rsa.Your public key has been saved in /c/Users/you/.ssh/id_rsa.pub.The key fingerprint is:这里是各种字母数字组成的字符串,结尾是你的邮箱The key's randomart image is:这里也是各种字母数字符号组成的字符串 运行以下命令,将公钥的内容复制到系统粘贴板上1$ clip < ~/.ssh/id_rsa.pub 四、在 GitHub 账户中添加你的公钥 1.登陆 GitHub,进入 Settings: 2.点击 SSH and GPG Keys: 3.选择 New SSH key: 4.粘贴密钥: 五、测试 输入以下命令:注意:git@github.com不要做任何更改!1$ ssh -T git@github.com 之后会显示: 输入 yes 后会显示:此时表示设置正确 六、配置 Git 个人信息 Git 会根据用户的名字和邮箱来记录提交,GitHub 也是用这些信息来做权限的处理,输入以下命令进行个人信息的设置,把名称和邮箱替换成你自己的,名字可以不是 GitHub 的昵称,但为了方便记忆,建议与 GitHub 一致12$ git config --global user.name \"此处填你的用户名\"$ git config --global user.email \"此处填你的邮箱\" 到此为止 SSH Key 配置成功,本机已成功连接到 Github – 将本地的 Hexo 文件更新到 Github 的库中一、登录 Github 打开自己的项目 yourname.github.io 二、鼠标移到 Clone or download 按钮,选择 Use SSH 三、一键复制地址 四、打开你创建的 Hexo 文件夹(如:E:\\TRHX_Blog\\Hexo),右键用记事本(或者Notepad++、Vs Code等)打开该文件夹下的 _config.yml 文件 五、按下图修改 _config.yml 文件并保存 六、在 Hexo 文件夹下分别执行以下命令12$ hexo g$ hexo d 或者直接执行1$ hexo g -d 执行完之后会让你输入你的 Github 的账号和密码,如果此时报以下错误,说明你的 deployer 没有安装成功1ERROR Deployer not found: git 需要执行以下命令再安装一次:1npm install hexo-deployer-git --save 再执行 hexo g -d,你的博客就会部署到 Github 上了 七、访问博客 你的博客地址:https://你的用户名.github.io,比如我的是:https://trhx.github.io ,现在每个人都可以通过此链接访问你的博客了 – 如何在博客上发表文章博客已经成功搭建了,但是我们该怎么写博客呢? 一、新建一个空文章,输入以下命令,会在项目 \\Hexo\\source\\_posts 中生成 文章标题.md 文件,文章标题根据需要命名1$ hexo n \"文章标题\" 也可以直接在 \\Hexo\\source\\_posts 目录下右键鼠标新建文本文档,改后缀为 .md 即可,这种方法比较方便 二、用编辑器编写文章 md 全称 Markdown, Markdown 是 2004 年由 John Gruberis 设计和开发的纯文本格式的语法,非常的简单实用,常用的标记符号屈指可数,几分钟即可学会, .md 文件可以使用支持 Markdown 语法的编辑器编辑,然后将写好的文章(.md文件)保存到 \\Hexo\\source\\_posts 文件夹下即可推荐 Windows 上使用 MarkdownPad2 或者 小书匠 编辑器,macOS 上使用 Mou 编辑器,Linux 上使用 Remarkable 编辑器,Web 端上使用 简书 ,另外可以参考我的另一篇文章:《主流 Markdown 编辑器推荐》当我们用编辑器写好文章后,可以使用以下命令将其推送到服务器上12$ hexo g$ hexo d或者将两个命令合二为一输入以下命令:1$ hexo d -g现在访问你的博客就可以看见写好的文章啦!参考资料:《10款流行的Markdown编辑器》 (By xiaoxiao_engineer) 《献给写作者的 Markdown 新手指南》 (By 简书) 《认识与入门 Markdown》 (By Te_Lee) 《markdown简明语法》 (By 不如) 《markdown基本语法》 (By 高鸿祥) 《Markdown 公式指导手册》 (By Harries)# – 如何为博客更换自己喜欢的主题 博客也搭建好了,文章也会写了,但是!!!默认的主题并不喜欢怎么办?现在,我们就来为自己的博客更换自己喜欢的主题 点击此处进入 Hexo 官网的主题专栏,我们可以看见有许多的主题供我们选择 我们要做的就是把主题克隆过来,在此我们以主题 Aero-Dual 为例,点进去我们就可以看见该主题作者的博客,鼠标滑到底,我们可以看见 Theme By Levblanc 的字样(其他主题类似),点击作者 Levblanc ,页面就会跳转到该主题所有的相关文件在 Github 上的地址,复制该地址 再打开 Hexo 文件夹下的 themes 目录(如:E:\\TRHX_Blog\\Hexo\\themes),右键 Git Bash Here,输入以下命令:1$ git clone 此处填写你刚才复制的主题地址 比如要安装 Aero-Dual 主题,则输入命令:1$ git clone https://github.com/levblanc/hexo-theme-aero-dual 等待下载完成后即可在 themes 目录下生成 hexo-theme-aero-dual 文件夹,然后打开 Hexo 文件夹下的配置文件 _config.yml ,找到关键字 theme,修改参数为:theme:hexo-theme-aero-dual (其他主题修改成相应名称即可),再次注意冒号后面有一个空格! 返回 Hexo 目录,右键 Git Bash Here ,输入以下命令开始部署主题:12$ hexo g $ hexo s 此时打开浏览器,访问 http://localhost:4000/ 就可看见我们的主题已经更换了,如果感觉效果满意,我们就可以把它部署到Github上了 打开 Hexo 文件夹,右键 Git Bash Here ,输入以下命令:123$ hexo clean //该命令的作用是清除缓存,若不输入此命令,服务器有可能更新不了主题$ hexo g -d 此时访问自己的博客即可看见更换后的主题,但我们仍然需要对主题的相关配置进行修改,比如网站标题,图标等等,Hexo 中有两份主要的配置文件,名称都是 _config.yml ,它们均是用于站点配置使用的。其中,一份位于站点根目录下(比如我的:E:\\TRHX_Blog\\Hexo\\_config.yml),主要包含 Hexo 本身整站的配置;另一份位于主题目录下(比如我的:E:\\TRHX_Blog\\Hexo\\themes\\hexo-theme-aero-dual\\_config.yml),这份配置由主题作者提供,主要用于配置主题相关的选项,一般 _config.yml 文件里都有相关注释,按需修改即可 参考资料:《有哪些好看的 Hexo 主题?》 (知乎) 《Hexo | 配置》 (Hexo官方文档) 《hexo常用命令笔记》 (By 小弟调调) – 为你的 Hexo 博客配置个性域名本人在配置域名的时候问题百出,百度的各种方法都不管用,打开网站总是 404,可能是我太笨了 o(╥﹏╥)o ,不过好在后来终于解决了这个问题 首先我们要购买域名,阿里云,腾讯云都可以,也不贵,一年几十块钱,最便宜几块钱也能买到,以阿里云为例,我购买的域名是 itrhx.com,购买过程就不赘述了,选择阿里云的解析平台,来到阿里云的管理控制台,点击进入域名解析列表或者直接点击域名后面的解析 方法一:点击添加记录,需要添加两个记录,两个记录类型都是 CNAME ,第一个主机记录为 @ ,第二个主机记录为 www,记录值都是填你自己的博客地址(比如我的是:trhx.github.io),保存之后域名解析就完成了!方法二:两个记录类型为 A ,第一个主机记录为 @ ,第二个主机记录为 www,记录值都为博客的 IP 地址,IP 地址可以 cmd 中输入 ping 你的博客地址 获得(比如我的:ping trhx.github.io),保存之后域名解析就完成了!有关解析记录类型的区别可以参考《域名解析中A记录、CNAME、MX记录、NS记录的区别和联系》 为了使 GitHub 接收我们的域名,还需要在博客的根目录下添加一个名为 CNAME 的文件(注意不要加.txt,没有任何后缀名!),这个文件放到 Hexo 文件夹的 source 里面,(比如我的是:E:\\TRHX_Blog\\Hexo\\source),文件里面填写你的域名(加不加www都行),比如要填写我的域名,文件里面就写:www.itrhx.com 或者 itrhx.com,经过以上操作,别人就可以通过 www.itrhx.com 、itrhx.com 、trhx.github.io 三个当中任意一个访问我的博客了!你的也一样! 有关加不加www的问题有以下区别: 如果你填写的是没有www的,比如 itrhx.com,那么无论是访问 https://www.itrhx.com 还是 https://itrhx.com ,都会自动跳转到 https://itrhx.com 如果你填写的是带www的,比如 www.itrhx.com ,那么无论是访问 https://www.itrhx.com 还是 https://itrhx.com ,都会自动跳转到 http://www.itrhx.com 如果你在其他平台购买域名,或者选择 DNSPod 等其他域名解析,操作方法大同小异,遇到问题可自行百度解决! 参考资料:《推荐几家域名注册服务商》 (By Jelly Bool) 《盘点十大免费DNS域名解析服务:稳定、可靠》 – 结语一顿操作下来虽然有点儿累,但看见拥有了自己的博客还是非常有成就感的,人生就是需要折腾,那么现在就开始你的创作之旅吧!文章的不断积累,你会从中受益很多的!另外,这是一篇小白写的适用于小白的博客搭建教程,比较详细,有这方面基础的可以百度有简略一点儿的教程,文中如有错误还请大佬指出改正!文中涉及参考资料如有侵权请联系我删除!","categories":[{"name":"实用教程","slug":"实用教程","permalink":"https://itrhx.com/categories/实用教程/"}],"tags":[{"name":"Github Pages","slug":"Github-Pages","permalink":"https://itrhx.com/tags/Github-Pages/"},{"name":"Hexo","slug":"Hexo","permalink":"https://itrhx.com/tags/Hexo/"}]},{"title":"Hello World!","slug":"Hello-World","date":"2018-08-10T09:38:00.000Z","updated":"2019-02-04T18:20:33.650Z","comments":true,"path":"2018/08/10/Hello-World/","link":"","permalink":"https://itrhx.com/2018/08/10/Hello-World/","excerpt":"","text":"人类的幸福和欢乐在于奋斗,而最有价值的是为理想而奋斗! ——— 苏格拉底 Human happiness and joy lie in struggle, and what is most valuable is striving for ideals! ——— Socrates","categories":[{"name":"BLOG","slug":"BLOG","permalink":"https://itrhx.com/categories/BLOG/"}],"tags":[{"name":"BLOG","slug":"BLOG","permalink":"https://itrhx.com/tags/BLOG/"}]}]} \ No newline at end of file diff --git a/friends/index.html b/friends/index.html index ea460d4db..d0c488522 100644 --- a/friends/index.html +++ b/friends/index.html @@ -297,7 +297,7 @@ @@ -585,7 +585,7 @@
- +

两个有意思的

@@ -633,6 +633,23 @@
+ +
+ +
+
+

晨哥❤️芸霄的小窝

+ +
+ +

晨哥❤️芸霄的小窝!

+ +
+ +
+
+ diff --git a/sitemap.xml b/sitemap.xml index efd5abaec..020975fe9 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,16 +2,16 @@ - https://itrhx.com/2018/08/15/Build-your-own-independent-blog-using-GithubPages-and-Hexo/ + https://itrhx.com/friends/index.html - 2019-03-25T16:46:24.249Z + 2019-03-28T15:27:34.828Z - https://itrhx.com/friends/index.html + https://itrhx.com/2018/08/15/Build-your-own-independent-blog-using-GithubPages-and-Hexo/ - 2019-03-17T05:37:32.612Z + 2019-03-25T16:46:24.249Z -- GitLab