1.python 基础
day01 计算机基础和环境搭建
课程目标:让大家了解计算机基础知识并完成Python的环境搭建。
课程概要:
- 计算机基础
- 编程的本质
- Python的介绍
- Python环境的搭建
1.计算机基础
1.1 基本概念
- 计算机的组成
计算机是由多个硬件组合而成,常见的硬件有:CPU、硬盘、内存、网卡、显示器、机箱、电源....
注意事项:机械将零件组合在一起,他们之间是无法进行协作。
- 操作系统
用于协调计算机的各个硬件,让硬件之间进行协同工作,以完成某个目标。
常见的操作系统分类:
- windows,优点:生态牛逼、工具多;缺点:略慢、收费。【个人】
- xp
- win7
- win10
...
- linux,优点:资源占用少、免费(很多公司的服务器上安装Linux);缺点:工具少、告别游戏。【企业的服务器】
- centos
- ubuntu
- redhat
...
- mac,优点:生态还行、工具差不多都有、用户体验和交互; 缺点:不能玩游戏
- 软件(应用程序)
在安装上操作系统之后,我们会在自己电脑上安装一些常用的软件,例如:QQ、杀毒、微信...
问题来了:这些软件是由谁开发的?是由各大公司的程序员开发的。
以后的你肯定是写`软件`,可以把软件理解成为一大堆的代码(一篇文章)。
1.2 编程语言
软件,是由程序员使用 编程语言 开发出来的一大堆代码的集合。全球的编程语言有2500+多种,常见的编程语言:Java、C#、Python、PHP、C...
作文,是由小学生使用 汉语/英语/法语/日语... 写出来一大堆的文字的集合。
本质上学习编程语言就是学习他的语法,根据语法再去编写相应的软件中的功能。
Python语言中输出的语法规则
- print("我是Alex的二大爷")
Golang语言中的输出的语法规则
- fmt.Println("我是Alex二大爷")
1.3 编译器/解释器
编译器/解释器,就是一个<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">翻译官</font>
,将代码翻译成计算机能够识别的命令。
A使用Python开发了一个软件 1000 B使用Golang开发了一个软件 2000
Python解释器 Golang编译器
操 作 系 统
CPU 硬盘 网卡 内存 电源 .....
为什么有的叫解释器?有的叫编译器?
- 解释器,实时翻译。拿到1000行代码之后,解释一句交给操作系统一句。
- 编译器,全文翻译。拿到2000行代码之后会将他编译成一个临时文件(计算机能够识别命令),再把文件交给操作系统去读取。
Python、PHP、JavaScript、Ruby...一般称为解释型语言。
C、C++、Go、Java...一般称为编译型语言。
2.学习编程的本质
学编程本质上就是三件事:
- 选择一门编程语言,在自己的电脑上安装此编程语言相关的 编译器/解释器。
- 学习编程语言的语法规则,根据语法规则 + 业务背景 设计并开发你的软件(代码集合)。
- 使用 编译器/解释器 去运行自己写的代码。
3.Python的介绍
3.1 语言的分类
<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">翻译</font>
的维度- 解释型语言,Python、Ruby....
- 编译型语言,C、C++、Golang
<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">高低</font>
的维度- 低级编程语言,写出来的代码直接可以被计算机识别。
机器语言,101 001 00001 00010 001000100010001,机器码,交给计算机去执行。
汇编语言,MOV INC ... ,指令,交给计算机去执行。
- <font style="color:rgb(51, 51, 51);">高级编程语言,写出来的代码无法直接被计算机识别,但可以通过某中方式将其转换为计算机可以识别的语言。</font>
C、C++、Java、Python、Ruby...,这类编程语言在编写代码时几乎是写英语作文。
交由相关编译器或解释器翻译成机器码,然后再交给计算机去执行。
注意:现在基本上都使用高级编程语言。
3.2 Python
Python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,Guido开始写Python语言的编译器。Python这个名字,来自Guido所挚爱的电视剧Monty Python’s Flying Circus。他希望这个新的叫做Python的语言,能符合他的理想:创造一种C和shell之间,功能全面,易学易用,可拓展的语言。
全球众多编程语言,为何Python可以脱颖而出成为业界炙手可热的编程语言?目前位居TIOBE排行榜第三名并且一直呈上升趋势。
Python如此火爆的原因如下:
- 语法简洁 & 适合小白学习,相比较于其他编程语言Python的学习成本非常低,甚至可以让其他行业的人快速掌握编程技能,通过编程提供工作效率,例如:Excel自动化办公、文件和文件夹的处理等。
- 类库强大,Python自诞生之初就任其自然生长,经过多年的发展,造就其在很多领域都是积累了很多方便的类库,自然也成为了运维自动化、数据分析、机器学习首选编程语言。
- 开发效率极高,结合Python语法精炼和类库齐全的特点,所以在使用Python进行开发时可以用更少的代码完成更多的功能,大大提升开发效率。例如:Python10行代码实现的功能,用其他语言可能需要100+行才能完成。
3.3 Python的解释器种类(了解)
想要学一门编程语言:安装Python解释器、学习python语法并编写代码、使用Python解释器去执行编写好的代码。
Python在全球非常的火,很多公司都会想要来层热度。
由于Python太火了,所有就有很多的公司都开发了Python解释器(用来翻译python代码成为计算机能够识别的命令)。
- CPython【主流】,底层是由C语言开发出来的Python解释器。
- Jython,是由Java语言开发出来的Python解释器,方便与让Python和Java代码做集成。
- IronPython,是基于C#语言开发出来的Python解释器,方便与让Python和C#代码做集成。
- RubyPython,...
- PyPy,是对CPython的优化,他的执行效率提高了。引入编译器的功能,本质上将Python代码进行编译,再去执行编译后的代码。
- ...
注意:常说的Python解释器默认指的就是CPython解释器。
3.4 CPython解释器的版本
CPython的解释器主要有两大版本:
2.x,目前最新的Python2.7.18。(2020后不再维护)
- Being the last of the 2.x series, 2.7 received bugfix support until 2020. Support officially stopped January 1 2020, and 2.7.18 code freeze occurred on January 1 2020, but the final release occurred after that date.
- 3.x,目前最新的3.9.0版本(授课)。
4.环境搭建
- Python解释器,将程序员编写的python代码翻译成计算机能够识别的指令。
- 主流CPython
- 3.9.0版本
- 学习编程本质上的3件事
- 安装 CPython 3.9.0版本解释器
- 学习Python语法并写代码
- 解释器去运行代码
4.1 安装Python解释器
4.1.1 mac系统
去Python官网下载Python解释器(3.9.0版本)
默认Python解释器安装目录: /Library/Frameworks/Python.framework/Versions/3.9
有bin目录下有一个 python3.9 文件,他就是Python解释器的启动文件。
解释器路径:/Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9
- 写一个简单的Python代码并且让解释器去运行。
name = input("请输入用户名:")
print("欢迎使用NB系统:",name)
将文件保存在:文稿/hello.py【/Users/wupeiqi/Documents/hello.py】
接下来要让解释器去运行代码文件:
- 打开终端
- 在终端输入:解释器 代码文件
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9 /Users/wupeiqi/Documents/hello.py
- 【补充】系统环境变量
- 假设你有30个Python文件要运行
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9 /Users/wupeiqi/Documents/hello1.py
...
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9 /Users/wupeiqi/Documents/hello30.py
- Python解释器的路径每次不用再写这么长。
- 将 /Library/Frameworks/Python.framework/Versions/3.9/bin 添加到系统的环境变量中。
- 以后再使用Python解释器去运行python代码时,就可以这样:
python3.9 /Users/wupeiqi/Documents/hello1.py
...
python3.9 /Users/wupeiqi/Documents/hello2.py
- 如何将 /Library/Frameworks/Python.framework/Versions/3.9/bin 添加到系统的环境变量中 ?
- 默认你不用添加,默认Python解释器在安装的过程中已经帮你添加了。
- 自己手动想添加:
- 打开用户目录的下的 .bash_profile 文件(.zprofile)
- 在文件中写如下内容
# Setting PATH for Python 3.9
# The original version is saved in .zprofile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.9/bin:${PATH}"
export PATH
4.1.2 windows系统
Python官网下载Python解释器
python解释器安装目录:C:\Python39
python解释器的路径:C:\Python39\python.exe
- 编写一个Python代码并交给Python解释器去运行
name = input("请输入用户名")
print("欢迎使用NB系统",name)
并将文件保存在:Y:\hello.py
怎么让解释器去运行写好的代码文件呢?
- 打开终端
- 在终端输入:解释器路径 代码路径
- 优化配置(让以后操作Python解释器去运行代码时候更加方便)
- 写了30个Python代码,想要使用解释器去运行。
C:\Python39\python.exe Y:\hello1.py
C:\Python39\python.exe Y:\hello2.py
...
C:\Python39\python.exe Y:\hello10.py
- 然你以后可以方便的去运行代码,不用再写Python解释器所在的路径。
只要你将 C:\Python39 路径添加到系统的环境变量中。以后你在终端就可以:
python.exe Y:\hello1.py
- 如何将 C:\Python39 添加到环境变量呢?【默认在解释器安装的时已自动添加到环境变量了】
4.2 安装Pycharm编辑器(mac)
帮助我们快速编写代码,用Pycharm可以大大的提高咱们写代码的效率。 + 用解释器去运行代码。
print("asdfasdf")
下载Pycharm
- https://www.jetbrains.com/pycharm/
- 安装
- 快速使用,写代码+运行代码
- 破解Pycharm(专业版)
4.3 安装Pycharm编辑器(win)
下载Pycharm
- https://www.jetbrains.com/pycharm/download/other.html
- 安装
- 快速使用:编写代码 + 运行代码
- 破解Pycharm(专业版)
总结
- 了解硬件 & 操作系统 & 软件(应用系统)之间的关系。
- 了解常见的操作系统都有哪些。
- 了解编译器和解释器的区别和作用。
- 编程语言进行分类
- 了解Python解释器的种类
- 了解CPython解释器的版本
- 学会如何安装Python解释器。
- 了解什么环境变量的作用。
- 了解Python和Pycharm的区别。
作业
- 简述硬件 & 操作系统 & 软件(应用系统)之间的关系。
- 列举常见的操作系统都有哪些。
- 简述编译器和解释器的区别和作用。
- 编程语言进行分类
- Python解释器的种类有哪些?
- CPython解释器的版本有哪些?你现在用的是哪个版本?
- 系统环境变量的作用是什么?
- Python和Pycharm的区别是什么?
day02 快速上手
课程目标:学习Python最基础的语法知识,可以用代码快速实现一些简单的功能。
课程概要:
- 初识编码(密码本)
- 编程初体验
- 输出
- 初识数据类型
- 变量
- 注释
- 输入
- 条件语句
1.编码(密码本)
计算机中所有的数据本质上都是以0和1的组合来存储。
在计算机中会将中文内存转换成 01010101010... ,最终存储到硬盘上。
在计算机中有这么一个编码的概念(密码本)。
武 -> 01111111 00011010 010110110
沛 -> 01001111 10010000 001110100
齐 -> 11111111 00000000 010101010
在计算机中有很多种编码。
每种编码都有自己的一套密码本,都维护这自己的一套规则,如:
utf-8编码:
武 -> 01111111 00011010 010110110
沛 -> 01001111 10010000 001110100
齐 -> 11111111 00000000 010101010
gbk编码:
武 -> 11111111 00000010
沛 -> 01001111 01111111
齐 -> 00110011 10101010
所以,使用的不同的编码保存文件时,硬盘的文件中存储的0/1也是不同的。
注意事项:以某个编码的形式进行保存文件,以后就要以这种编码去打开这个文件。否则就会出现乱码。
UTF-8编码去保存武沛齐:01111111 00011010 010110110 01001111 10010000 001110100 11111111 00000000 010101010
GBK编码形式去打开:乱码
2.编程初体验
- 编码必须要保持:保存和打开一直,否则会乱码。
- 默认Python解释器是以UTF-8编码的形式打开文件。如果想要修改Python的默认解释器编码,可以这样干:
# -*- coding:gbk -*-
print("我是你二大爷")
- 建议:所有Python代码文件的都要以UTF-8编码保存和读取。
3.输出
将结果或内容想要呈现给用户。
print("看着风景美如画")
print(" * * ")
print(" * * * * ")
print(" * * * * * * ")
print(" * * * * * * * * ")
print(" * * * * * * * * * * ")
print(" * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
print(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
关于输出:
- 默认print在尾部会加换行符
print("看着风景美如画")
print("本想吟诗增天下")
输出:
看着风景美如画
本想吟诗增天下
- 想要不换行,则可以这样干
print("看着风景美如画",end="")
print("本想吟诗增天下",end="")
输出:
看着风景美如画本想吟诗增天下
print("看着风景美如画",end=",")
print("本想吟诗增天下",end=".")
输出:
看着风景美如画,本想吟诗增天下.
练习题
- 使用print输出自己的姓名
- 使用print输出春眠不觉晓,出处闻啼鸟,夜来风雨声,花落知多少。
- 是用print输出春眠不觉晓,出处闻啼鸟,夜来风雨声,花落知多少。
4. 初识数据类型
刚上学时,老师教我们 数字 、拼音、汉字、真假判断 等,然后我们根据学到的内容写作文,老师来检查并打分。
现在学编程,我教大家 int、str、bool 等,然后大家根据这些内容来写代码,写完代码交给Python解释器去运行。
4.1 整形(int)
整形,整数。
整型,其实就是以前数学课上讲的整数(不包含小数),在写代码时用于表示整数相关的东西,例如:年龄、存款、尺寸、手机号等。一般我们提到的:5、18、22、99、… 等整数 在Python中都称为是整型,且支持 加/减/乘/除/取余/指数 等操作。
print(666)
print(2 + 10)
print(2 * 10)
print(10 / 2)
print(10 % 3)
print(2 ** 4)
4.2 字符串(str)
字符串,其实就是我们生活中的文本信息。例如:姓名、地址、自我介绍等。字符串有一个特点,他必须由引号引起来,如:
单行字符串
print("我是Alex")
print('我是Alex')
print('我是"alex')
print("中国北京昌平区")
多行字符串
print("""中国北京昌平区""")
print('''中国北京昌平区''')
对于字符串:
加,两个字符串可以通过加号拼接起来。
- print( "alex" + "是金角大王吧" )
乘,让整形和字符串进行相乘,以实现让字符串重复出现N次并拼接起来。
- print(3 * "我想吃饺子")
4.3 布尔类型(bool)
布尔类型中共有两个值:True / False
print(1 > 2)
print(False)
print(1 == 1)
print(True)
name = input("请输入你的用户名:")
if name == "alex":
print("用户登录成功")
else:
print("用户登录失败")
补充:
1 > 2
1 == 3
"alex" == "eric"
1 == "alex"
1 > "alex" 是无法进行比较大小
4.4 类型转换
上文数据类型int/str/bool有了初步了解,他们都有自己不同的定义方式。
- int,整型定义时,必须是数字且无引号,例如:5、8、9
- str,字符串定义时,必须用双引号括起来,例如:”中国”、”武沛齐”、”666”
- bool,布尔值定义时,只能写True和False
不同的数据类型都有不同的功能,例如:整型可以加减乘除 而 字符串只能加(拼接)和乘法。如果想要做转换可遵循一个基本规则:想转换什么类型就让他包裹一些。
例如:str(666) = "666"是将整型转换为字符串、int(“888”)是将字符串转 888。
转换为整形:
# 字符串转换为整形(度可度之人)
int("666")
int("999")
"6" + "9" 的结果应该是: "69"
int("6") + int("9") 的结果是:15
int("alex是sb") 报错
# 布尔类型转换为整形
int(True) 转换完等于 1
int(False) 转换完等于 0
转换为字符串
# 整形转字符串
str(345)
str(666) + str(9) 结果为:"6669"
# 布尔类型转换为字符串
str(True) "True"
str(False) "False"
转换为布尔类型
# 整形转布尔
bool(1) True
bool(2) True
bool(0) False
bool(-10) True
# 字符串转布尔
bool("alex") True
bool("砂玻帮你") True
bool("") False
bool(" ") True
三句话搞定类型转换:
- 其他所有类型转换为布尔类型时,除了 空字符串、0以为其他都是True。
- 字符串转整形时,只有那种 "988" 格式的字符串才可以转换为整形,其他都报错。
- 想要转换为那种类型,就用这类型的英文包裹一下就行。
str(...)
int(...)
bool(...)
练习题
- 计算整型50乘以10再除以5的商并使用print输出。
- 判断整型8是否大于10的结果并使用print输出。
- 计算整型30除以2得到的余数并使用print输出。
- 使用字符串乘法实现 把字符串”我爱我的祖国”创建三遍并拼接起来最终使用print输出。
- 判断 字符串”wupeiqi”和”alex”是否相等的结果并使用print输出。
- 判断 整型666和整型666是否相等的结果并使用print输出。
- 判断 字符串”666”和整型666是否相等的结果并使用print输出。
- 看代码写结果(禁止运行代码):
print( int("100")*3 )
print( int("123") + int("88") )
print( str(111) + str(222) )
print( str(111)*3 )
print( int("8") > 7 )
print( str(111) == 111 )
print( bool(-1) )
print( bool(0) )
print( bool("") )
print( bool("你好") )
print( True == True)
print( True == False)
print( bool("") == bool(0) )
注意:类型转换不是改变原来值,实际在底层是新创建了一个值。例如有整数 6 ,然后使用 str(6) 转化了一下得到 “6”,实际上这个字符串”6”是依据整数6新创建的。
5. 变量
变量,其实就是我们生活中起别名和外号,让变量名指向某个值,格式为: 【变量名 = 值】,以后可以通过变量名来操作其对应的值。
name = "武沛齐"
print(name) # 武沛齐
age = 18
name = "alex"
flag = 1 > 18
address = "北京昌平" + "沙河"
addr = "北京昌平" + "沙河" + name # "北京昌平沙河alex"
print(addr)
print(flag)
age = 18
number = 1 == 2
注意:
- 给变量赋值
<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">age = 18</font>
- 让age代指值
<font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">age=18</font>
5.1 变量名的规范
age = 18
name = "alex"
flag = 1 > 18
address = "北京昌平" + "沙河"
三个规范(只要有一条就会报错):
- 变量名只能由 字母、数字、下划线 组成。
不能以数字开头
- na9me9 = "alex"
- 不能用Python内置的关键字
def = "alex"
break = 123
[‘and’, ‘as’, ‘assert’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘exec’, ‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘not’, ‘or’, ‘pass’, ‘print’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’]
两个建议:
- 下划线连接命名(小写)
father_name = "wupeiqi"
brother_age = 19
- 见名知意
age = 18
color = "red"
current_user_name = "吉诺比利"
练习题
name = "吉诺比利"
name0 = "帕克"
name_1 = "邓肯"
_coach = "波波维奇"
_ = "卡哇伊"
1_year = "1990" # 错误
year_1_ = "1990"
_1_year = "1990"
nba-team = "马刺" # 错误
new*name = "伦纳德" # 错误
5.2 变量内存指向关系
通过学习上述变量知识让我们对变量了有了初步认识,接下来我们就要从稍稍高级一些的角度来学习变量,即:内存指向(在电脑的内存中是怎么存储的)。
情景一
name = "wupeiqi"
在计算机的内存中创建一块区域保存字符串”wupeiqi”,name变量名则指向这块区域。
情景二
name = "wupeiqi"
name = "alex"
在计算机的内存中创建一块区域保存字符串”wupeiqi”,name变量名则指向这块区域。然后又再内存中创建了一块域保存字符串”alex”,name变量名则指向”alex”所在的区域,不再指向”wupeiqi”所在区域(无人指向的数据会被标记为垃圾,由解释器自动化回收)
情景三
name = "wupeiqi"
new_name = name
在计算机的内存中创建一块区域保存字符串”wupeiqi”,name变量名则指向这块区域。new_name变量名指向name变量,因为被指向的是变量名,所以自动会转指向到name变量代表的内存区域。
情景四
name = "wupeiqi"
new_name = name
name = "alex"
在计算机的内存中创建一块区域保存字符串”wupeiqi”,name变量名则指向这块区域(灰色线), 然后new_name指向name所指向的内存区域,最后又创建了一块区域存放”alex”,让name变量指向”alex”所在区域.
情景五
num = 18
age = str(num)
在计算机的内存中创建一块区域保存整型18,name变量名则指向这块区域。通过类型转换依据整型18再在内存中创建一个字符串”18”, age变量指向保存这个字符串的内存区域。
至此,关于变量的内存相关的说明已讲完,由于大家都是初学者,关于变量的内存管理目前只需了解以上知识点即可,更多关于内存管理、垃圾回收、驻留机制等问题在后面的课程中会讲解。
练习题
- 看代码结果
alex_length = 3
wupeiqi_length = 18
total = alex_length + wupeiqi_length
print(total)
- 按要求写代码
# 假设age为小明的年龄
age = 18
# 问:已知小李比小明大3岁,计算小李年龄赋值给ming_age变量并输出。
ming_age = age + 3
print(ming_age)
# 问:已知大刘比小明和小李年龄的和还要大5岁,计算大刘的年龄赋值给liu_age变量并输入。
liu_age = age + ming_age + 5
print(liu_age)
- 看代码写结果
nickname = "一米八大高个"
username = nickname
username = "弟弟"
print(nickname)
print(username)
- 看代码写结果
nickname = "一米八大高个"
username = nickname
nickname = "弟弟"
print(nickname)
print(username)
- 看代码写结果
nickname = "一米八大高个"
username = "弟弟"
text = username + nickname
print(text)
- 看代码写结果
nickname = "一米八大高个"
username = nickname
nickname = "弟弟"
text = username + nickname
print(text)
- 看代码写结果
string_number = "20"
num = int(string_number)
data = string_number * 3
print(data) # "202020"
value = num * 3
print(value) # 60
6. 注释
写代码时候,如果想要对某写内容进行注释处理,即:解释器忽略不会按照代码去运行。
- 单行注释
# 声明一个name变量
name = "alex"
age = 19 # 这表示当前用户的年龄
注意:快捷点 command + ? 、 control + ?
- 多行注释
# 声明一个name变量
# 声明一个name变量
# 声明一个name变量
name = "alex"
"""
多行注释内容
多行注释内容
多行注释内容
"""
age = 19
7. 输入
输入,可以实现程序和用户之间的交互。
# 1. 右边 input("请输入用户名:") 是让用户输入内容。
# 2. 将用户输入的内容赋值给name变量。
name = input("请输入用户名:")
if name == "alex":
print("登录成功")
else:
print("登录失败")
data = input(">>>")
print(data)
特别注意:用户输入的任何内容本质上都是字符串。
- 提示输入姓名,然后给姓名后面拼接一个“烧饼”,提示输入姓名,然后给姓名后面拼接一个“烧饼”,最终打印结果。
name = input("请输入用户名:")
text = name + "烧饼"
print(text)
- 提示输入 姓名/位置/行为,然后做拼接并打印:xx 在 xx 做 xx 。
name = input("请输入用户名:")
address = input("请输入位置:")
action = input("请输入行为:")
text = name + "在" + address + action
print(text)
- 提示输入两个数字,计算两个数的和。
number1 = input("请输入一个数字:") # "1"
number2 = input("请输入一个数字:") # "2"
value = int(number1) + int(number2)
print(value)
8.条件语句
if 条件 :
条件成立之后的代码...
条件成立之后的代码...
条件成立之后的代码...
else:
条件不成立之后执行的代码...
条件不成立之后执行的代码...
条件不成立之后执行的代码...
name = input("请输入用户名:")
if name == "alex":
print("sb")
else:
print("db")
提醒:统一缩进问题(都是使用四个空格 = tab)。
name = input("请输入用户名:")
if name == "alex":
print("sb")
print("sb")
else:
print("db")
8.1 基本条件语句
- 示例1
print("开始")
if True:
print("123")
else:
print("456")
print("结束")
# 输出结果
开始
123
结束
- 示例2
print("开始")
if 5==5:
print("123")
else:
print("456")
print("结束")
- 示例3
num = 19
if num > 10:
print("num变量对应值大于10")
else:
print("num变量对应值不大于10")
- 示例4
username = "wupeiqi"
password = "666"
if username == "wupeiqi" and password == "666":
print("恭喜你,登录成功")
else:
print("登录失败")
- 示例5
username = "wupeiqi"
if username == "wupeiqi" or username == "alex":
print("VIP大会员用户")
else:
print("普通用户")
- 示例6
number = 19
if number%2 == 1:
print("number是奇数")
else:
print("number是偶数")
number = 19
data = number%2 == 1
if data:
print("number是奇数")
else:
print("number是偶数")
- 示例7
if 条件:
成立
print("开始")
if 5 == 5:
print("5等于5")
print("结束")
练习题
- 提示用户输入用户名和密码,用户名等于"wupeiqi"且密码等于"uuu"就输出登录成功;否则输出登录失败。
- 猜数字,提示用户输入一个数字,判断数字如果大于10,就输出猜错了;否则输出猜对了。
- 提示用户输入一个数字,判断是否为偶数,是偶数则输出 偶偶偶数,否则输出 奇奇奇数。
8.2 多条件判断
if 条件A:
A成立,执行此缩进中的所有代码
...
elif 条件B:
B成立,执行此缩进中的所有代码
...
elif 条件C:
C成立,执行此缩进中的所有代码
...
else:
上述ABC都不成立。
num = input("请输入数字")
data = int(num)
if data>6:
print("太大了")
elif data == 6:
print("刚刚好")
else:
print("太小了")
score = input("请输入分数")
data = int(score)
if data > 90:
print("优")
elif data > 80:
print("良")
elif data > 70:
print("中")
elif data > 60:
print("差")
else:
print("不及格")
8.3 条件嵌套
if 条件A:
...
elif 条件B:
...
if 条件A:
if 条件A1:
...
else:
...
elif 条件B:
...
模拟10086客服
print("欢迎致电10086,我们提供了如下服务: 1.话费相关;2.业务办理;3.人工服务")
choice = input("请选择服务序号")
if choice == "1":
print("话费相关业务")
cost = input("查询话费请按1;交话费请按2")
if cost == "1":
print("查询话费余额为100")
elif cost == "2":
print("交互费")
else:
print("输入错误")
elif choice == "2":
print("业务办理")
elif choice == "3":
print("人工服务")
else:
print("序号输入错误")
总结
- 什么是编码?打开文件时为什么会出现乱码?
- pycharm如何设置文件编码?
- python解释器去打开代码文件时,默认使用编码是什么?如何修改?
- print输入
- 各数据类型格式 以及 相关之间如何实现转换?
- 变量的命名规范
- 用户通过input输的内容均为字符串类型。
- 条件语句。
今日作业
- 谈谈你了解的编码以及为什么会出现乱码的现象?
- Python解释器默认编码是什么?如何修改?
- 用print打印出下面内容:
⽂能提笔安天下,
武能上⻢定乾坤.
⼼存谋略何⼈胜,
古今英雄唯是君。
- 变量名的命名规范和建议?
- 如下那个变量名是正确的?
name = '武沛齐'
_ = 'alex'
_9 = "老男孩"
9name = "宝浪"
oldboy(edu = 666
- 设定一个理想数字比如:66,让用户输入数字,如果比66大,则显示猜测的结果大了;如果比66小,则显示猜测的结果小了;只有等于66,显示猜测结果正确。
- 提示⽤户输入 "爸爸" ,判断⽤户输入的对不对。如果对, 提示真聪明, 如果不对, 提示你是傻逼么。
- 写程序,成绩有ABCDE5个等级,与分数的对应关系如下.
A 90-100
B 80-89
C 60-79
D 40-59
E 0-39
要求用户输入0-100的数字后,你能正确打印他的对应成绩等级.
day03 Python基础
课程目标:掌握Python基础中的必备语法知识。
课程概要:
- 循环语句
- 字符串格式化
- 运算符(面试题)
1. 循环语句
- while循环
- for循环(后期)
while 条件:
...
...
...
print("123")
while 条件:
...
...
...
print(456)
1.1 循环语句基本使用
示例1:
print("开始")
while True:
print("Alex是个小都比")
print("结束")
# 输出:
开始
Alex是个小都比
Alex是个小都比
Alex是个小都比
Alex是个小都比
...
示例2:
print("开始")
while 1 > 2:
print("如果祖国遭受到侵犯,热血男儿当自强。")
print("结束")
# 输出:
开始
结束
示例3:
data = True
print("开始")
while data:
print("如果祖国遭受到侵犯,热血男儿当自强。")
print("结束")
# 输出:
开始
如果祖国遭受到侵犯,热血男儿当自强。
如果祖国遭受到侵犯,热血男儿当自强。
如果祖国遭受到侵犯,热血男儿当自强。
...
示例4:
print("开始")
flag = True
while flag:
print("滚滚黄河,滔滔长江。")
flag = False
print("结束")
# 输出:
开始
滚滚黄河,滔滔长江。
结束
示例5:
print("开始")
num = 1
while num < 3:
print("滚滚黄河,滔滔长江。")
num = 5
print("结束")
# 输出:
开始
滚滚黄河,滔滔长江。
结束
示例6:
print("开始")
num = 1
while num < 5:
print("给我生命,给我力量。")
num = num + 1
print("结束")
# 输出:
开始
给我生命,给我力量。
给我生命,给我力量。
给我生命,给我力量。
给我生命,给我力量。
结束
练习题:重复3次输出我爱我的祖国。
num = 1
while num < 4:
print("我爱我的祖国")
num = num + 1
我爱我的祖国
我爱我的祖国
我爱我的祖国
1.2 综合小案例
请实现一个用户登录系统,如果密码错误则反复提示让用户重新输入,直到输入正确才停止。
# 请实现一个用户登录系统,如果密码错误则反复提示让用户重新输入,直到输入正确才停止。
print("开始运行路飞系统")
flag = True
while flag:
user = input("请输入用户名:")
pwd = input("请输入密码:")
if user == "wupeiqi" and pwd == "luffy":
print("登录成功")
flag = False
else:
print("用户名或密码错误")
print("系统结束")
练习题
- 补充代码实现猜数字,设定一个理想数字比如:66,一直提示让用户输入数字,如果比66大,则显示猜测的结果大了;如果比66小,则显示猜测的结果小了;只有输入等于66,显示猜测结果正确,然后退出循环。
number = 66
flag = True
while flag:
...
- 使用循环输出1~100所有整数。
- 使用循环输出 1 2 3 4 5 6 8 9 10,即:10以内除7以外的整数。
- 输出 1~100 内的所有奇数。
- 输出 1~100 内的所有偶数。
- 求 1~100 的所有整数的和。
- 输出10 ~ 1 所有整数。
1.3 break
break,用于在while循环中帮你终止循环。
print("开始")
while True:
print("1")
break
print("2")
print("结束")
# 输出
开始
1
结束
通过示例来更深入理解break的应用。
示例1:
print("开始")
while True:
print("红旗飘飘,军号响。")
break
print("剑已出鞘,雷鸣电闪。")
print("从来都是狭路相逢勇者胜。")
print("结束")
示例2:
print("开始")
i = 1
while True:
print(i)
i = i + 1
if i == 101:
break
print("结束")
# 输出
开始
1
2
...
100
结束
示例3:
print("开始运行系统")
while True:
user = input("请输入用户名:")
pwd = input("请输入密码:")
if user == 'wupeiqi' and pwd = "oldboy":
print("登录成功")
break
else:
print("用户名或密码错误,请重新登录")
print("系统结束")
# 输出
开始运行系统
>>> 用户名
>>> 密码
正确,登录成功
系统结束
不正确,一直循环输出
所以,以后写代码时候,想要结束循环可以通过两种方式实现了,即:条件判断 和 break关键字,两种在使用时无好坏之分,只要能实现功能就行。
1.4 continue
continue,在循环中用于 结束本次循环,开始下一次循环。
print("开始")
while True:
print(1)
continue
print(2)
print(3)
print("结束")
示例1:
print("开始")
while True:
print("红旗飘飘,军号响。")
continue
print("剑已出鞘,雷鸣电闪。")
print("从来都是狭路相逢勇者胜。")
print("结束")
# 输出
开始
红旗飘飘,军号响。
红旗飘飘,军号响。
红旗飘飘,军号响。
红旗飘飘,军号响。
...
示例2:
print("开始")
i = 1
while i < 101:
if i == 7:
i = i + 1
continue
print(i)
i = i + 1
print("结束")
# 输出
开始
1
2
3
4
5
6
8
9
10
...
100
结束
示例3:
print("开始")
i = 1
while True:
if i == 7:
i = i + 1
continue
print(i)
i = i + 1
if i == 101:
break
print("结束")
# 输出
开始
1
2
3
4
5
6
8
9
10
...
100
结束
写在最后,对于break和continue都是放在循环语句中用于控制循环过程的,一旦遇到break就停止所有循环,一旦遇到continue就停止本次循环,开始下次循环。
当然,通过如果没有了break和continue,我们用while条件的判断以及其他协助也能完成很多功能,有了break和continue可以在一定程度上简化我们的代码逻辑。
1.5 while else
当while后的条件不成立时,else中的代码就会执行。
while 条件:
代码
else:
代码
while False:
pass
else:
print(123)
num = 1
while num < 5:
print(num)
num = num + 1
else:
print(666)
# 输出
1
2
3
4
666
while True:
print(123)
break
else:
print(666)
# 输出
123
2.字符串格式化
字符串格式化,使用跟便捷的形式实现字符串的拼接。
2.1 %
%[(name)][flags][width].[precision]typecode
- (name) 可选,用于选择指定的key
- flags 可选,可供选择的值有:
- + 右对齐;正数前加正好,负数前加负号;
- - 左对齐;正数前无符号,负数前加负号;
- 空格 右对齐;正数前加空格,负数前加负号;
- 0 右对齐;正数前无符号,负数前加负号;用0填充空白处
- width 可选,占有宽度
- .precision 可选,小数点后保留的位数
- typecode 必选
- s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置
- r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置
- c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
- o,将整数转换成 八 进制表示,并将其格式化到指定位置
- x,将整数转换成十六进制表示,并将其格式化到指定位置
- d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
- e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
- E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
- f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
- F,同上
- g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
- G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
- %,当字符串中存在格式化标志时,需要用 %%表示一个百分号
注:Python中百分号格式化是不存在自动将整数转换成二进制表示的方式
2.1.1 基本格式化操作
name = "武沛齐"
# 占位符
# text = "我叫%s,今年18岁" %"武沛齐"
text = "我叫%s,今年18岁" %name
name = "武沛齐"
age = 18
# text = "我叫%s,今年%s岁" %("武沛齐",18)
# text = "我叫%s,今年%s岁" %(name,age)
text = "我叫%s,今年%d岁" %(name,age)
https://www.cnblogs.com/wupeiqi/articles/5484747.html
message = "%(name)s你什么时候过来呀?%(user)s今天不在呀。" % {"name": "死鬼", "user": "李杰"}
print(message)
2.1.2 百分比
text = "兄弟,这个片我已经下载了90%了,居然特么的断网了"
print(text)
text = "%s,这个片我已经下载了90%%了,居然特么的断网了" %"兄弟"
print(text)
# 输出:
兄弟,这个片我已经下载了90%了,居然特么的断网了
一旦字符串格式化中存现百分比的显示,请一定要呀加 %% 以实现输出 %。
2.2 format(推荐)
text = "我叫{0},今年18岁".format("武沛齐")
text = "我叫{0},今年{1}岁".format("武沛齐",18)
text = "我叫{0},今年{1}岁,真是的姓名是{0}。".format("武沛齐",18)
text = "我叫{},今年18岁".format("武沛齐")
text = "我叫{},今年{}岁".format("武沛齐",18)
text = "我叫{},今年{}岁,真是的姓名是{}。".format("武沛齐",18,"武沛齐")
text = "我叫{n1},今年18岁".format(n1="武沛齐")
text = "我叫{n1},今年{age}岁".format(n1="武沛齐",age=18)
text = "我叫{n1},今年{age}岁,真是的姓名是{n1}。".format(n1="武沛齐",age=18)
text = "我叫{0},今年{1}岁"
data1 = text.format("武沛齐",666)
data2 = text.format("alex",73)
text = "我叫%s,今年%d岁"
data1 = text %("武沛齐",20)
data2 = text %("alex",84)
2.3 f
到Python3.6版本,更便捷。
text = f"嫂子喜欢{'跑步'},跑完之后满身大汗"
action = "跑步"
text = f"嫂子喜欢{action},跑完之后满身大汗"
name = "喵喵"
age = 19
text = f"嫂子的名字叫{name},今年{age}岁"
print(text)
text = f"嫂子的名字叫喵喵,今年{19 + 2}岁"
print(text)
# 在Python3.8引入
text = f"嫂子的名字叫喵喵,今年{19 + 2=}岁"
print(text)
# 进制转换
v1 = f"嫂子今年{22}岁"
print(v1)
v2 = f"嫂子今年{22:#b}岁"
print(v2)
v3 = f"嫂子今年{22:#o}岁"
print(v3)
v4 = f"嫂子今年{22:#x}岁"
print(v4)
# 理解
text = f"我是{'alex'},我爱大铁锤"
name = "alex"
text = f"我是{name},我爱大铁锤"
name = "alex"
text = f"我是{ name.upper() },我爱大铁锤"
# 输出:我是ALEX,我爱大铁锤
3. 运算符
提到运算符,我想大家首先想到的就是加、减、乘、除之类, 本节要系统的跟大家来聊一聊,我们写代码时常见的运算符可以分为5种:
算数运算符,例如:加减乘除
- print( 9//2 )
- 比较运算符,例如:大于、小于
✨注意:python3中不支持 <>
if 1 >2:
pass
while 1>2:
pass
data = 1 == 2
- 赋值运算,例如:变量赋值
num = 1
while num < 100:
print(num)
# num = num + 1
num += 1
- 成员运算,例如:是否包含
v1 = "le" in "alex" # True/False
# 让用户输入一段文本,检测文本中是否包含敏感词。
text = input("请输入内容:")
if "苍老师" in text:
print("少儿不宜")
else:
print(text)
- 逻辑运算,例如:且或非
if username == "alex" and pwd == "123":
pass
data = 1 > 2
if not data:
pass
3.1 运算符优先级
运算符的优先级有很多,常见的没几个,推荐你记住3个即可:
- 算数优先级优先级 大于 比较运算符
if 2 + 10 > 11:
print("真")
else:
print("假")
- 比较运算符优先级 大于 逻辑运算符
if 1>2 and 2<10:
print("成立")
else:
print("不成立")
- 逻辑运算符内部三个优先级 not > and > or
if not 1 and 1>2 or 3 == 8:
print("真")
else:
print("假")
Python 运算符优先级(从高到低)
🔰上述这3个优先级从高到低总结:**<font style="color:#DF2A3F;background-color:rgb(243, 244, 244);">加减乘除 > 比较 > not and or</font>**
。绝招:加括号。
Python 运算符优先级(从高到低):
- not
- and
- or
✨****判断技巧:
- 优先计算加减乘除
- 先计算所有的比较操作(>、<、== 等)
- 再计算 not 操作
- 然后计算 and 操作
- 最后计算 or 操作
✨****记住以下规则:
- 在 Python 中,0、None、空字符串 ""、空列表 [] 等被视为假值
- 非零数字、非空字符串****/列表等被视为真值
- or 运算符返回第一个真值,如果都是假值则返回最后一个值
- and 运****算符返回第一个假值,如果所有值都为真,则返回最后一个值
♻️and运算时注意
# Python中的 and 运算符会返回最后一个真值或第一个假值
# 对于字符串来说:
# - 非空字符串被视为True
# - 空字符串""被视为False
v2 = "wupeiqi" and "alex" # 两个都是非空字符串(都为True)
print(v2) # 输出: alex
# 更多示例
v3 = "" and "alex" # 第一个是空字符串(False)
print(v3) # 输出: ""(返回第一个假值)
v4 = "wupeiqi" and "" # 第二个是空字符串(False)
print(v4) # 输出: ""(返回第一个假值)
v5 = "first" and "second" and "third" # 所有都是真值
print(v5) # 输出: "third"(返回最后一个真值)
Python中 and 运算符的规则:
- 如果所有值都为真,返回最后一个值
- 如果有假值,返回第一个假值
- 对于字符串:
- 非空字符串 = True
- 空字符串 = False
所以在 "wupeiqi" and "alex" 中:
- "wupeiqi" 是真值(非空字符串)
- "alex" 也是真值(非空字符串)
- 所有值都为真,所以返回最后一个值 "alex"
这就是为什么输出是 "alex" 而不是 True 或 False。
3.2 面试题
逻辑运算中:and or
v1 = name == "alex" and pwd == "123"
# v1 = True and False
if name == "alex" and pwd == "123":
pass
v2 = "wupeiqi" and "alex"
# 第一步:将and前后的只转换为布尔值 True and True
# 第二步:判断本次操作取悦于谁?由于前面的是True,所以本次逻辑判断取决于后面的值。
# 所以,后面的值等于多少最终结果就是多少。 v2 = "alex"
v3 = "" and "alex"
# 第一步:将and前后的只转换为布尔值 False and True
# 第二步:判断本次操作取决于谁?由于前面的是False,所以本次逻辑判断取决于前面的值。
# 所以,前面的值等于多少最终结果就是多少。 v2 = ""
v4 = 1 or 8
# 第一步:将and前后的只转换为布尔值 True or True
# 第二步:判断本次操作取悦于谁?由于前面的是True,所以本次逻辑判断取决于前面的值。
# v4 = 1
v5 = 0 or 8
# 第一步:将and前后的只转换为布尔值 False or True
# 第二步:判断本次操作取悦于谁?由于前面的是False,所以本次逻辑判断取决于后面的值。
# v5 = 8
练习题
v1 = 1 or 2
v2 = -1 or 3
v3 = 0 or -1
v4 = 0 or 100
v5 = "" or 10
v6 = "wupeiqi" or ""
v7 = 0 or ""
print(v1,v2,v3,v4,v5,v6,v7)
# or,看第一个值,如果第一个值为真,结果就应该是第一个值,否则就结果就是第二个值。
v1 = 4 and 8
v2 = 0 and 6
v3 = -1 and 88
v4 = "" and 7
v5 = "武沛齐" and ""
v6 = "" and 0
v7 = 0 and "中国"
print(v1,v2,v3,v4,v5,v6,v7)
# and,看第一个值,如果第一个值真,结果就应该是第二个值,否则结果就是第一个值。
面试题
如果多个and 和or的情况,先计算and再计算or.
v1 = 0 or 4 and 3 or 7 or 9 and 6
0 or 3 or 7 or 9 and 6
0 or 3 or 7 or 6
3 or 7 or 6
3 or 6
3
v2 = 8 or 3 and 4 or 2 and 0 or 9 and 7
8
v3 = 0 or 2 and 3 and 4 or 6 and 0 or 3
4
先计算not,在计算and,最后计算or
v4 = not 8 or 3 and 4 or 2
4
总结
- while循环语句
- break和continue关键字的作用
- 三种字符串格式化的方式
- 基本运算符(逻辑运算符涉及的相关面试题)
今日作业
- 判断下列逻辑语句的True,False
1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6
=false or true or false and true and true or false
=false or true or false or false
=true
not 2 > 1 and 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6
=not True and True or False and True and True or False
=False and True or False and True and True or False
=False or False or False
=False
- 求出下列逻辑语句的值。
8 or 3 and 4 or 2 and 0 or 9 and 7
0 or 2 and 3 and 4 or 6 and 0 or 3
- 下列结果是什么?
6 or 2 > 1 =6
3 or 2 > 1 =3
0 or 5 < 4 = False
5 < 4 or 3 = 3
2 > 1 or 6 = True
3 and 2 > 1 = True
0 and 3 > 1 = 0
2 > 1 and 3 = 3
3 > 1 and 0 = 0
3 > 1 and 2 or 2 < 3 and 3 and 4 or 3 > 2 =2
- 实现用户登录系统,并且要支持连续三次输错之后直接退出,并且在每次输错误时显示剩余错误次数(提示:使⽤字符串格式化)。
- 猜年龄游戏 要求:允许用户最多尝试3次,3次都没猜对的话,就直接退出,如果猜对了,打印恭喜信息并退出。
- 猜年龄游戏升级版要求:允许用户最多尝试3次,每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y,就继续让其猜3次,以此往复,如果回答N,就退出程序,如何猜对了,就直接退出。
day04 进制和编码
课程目标:讲解计算机中一些必备的常识知识,让学员了解一些常见名词背后的含义(重在理解)。
课程概要:
- python代码的运行方式
- 进制
- 计算机中的单位
- 编码
1.Python代码运行方式
脚本式
- python3 ~/PycharmProjects/day03/6.作业题讲解.py
交互式
- python3
2.进制
计算机中底层所有的数据都是以 <font style="color:rgb(51, 51, 51);background-color:rgb(243, 244, 244);">010101</font>
的形式存在(图片、文本、视频等)。
- 二进制
0
1
10
- 八进制
- 十进制
- 十六进制
2.1 进制转换
v1 = bin(25) # 十进制转换为二进制
print(v1) # "0b11001"
v2 = oct(23) # 十进制转换为八进制
print(v2) # "0o27"
v3 = hex(28) # 十进制转换为十六进制
print(v3) # "0x1c"
i1 = int("0b11001",base=2) # 25
i2 = int("0o27",base=8) # 23
i3 = int("0x1c",base=16) # 28
3. 计算机中的单位
由于计算机中本质上所有的东西以为二进制存储和操作的,为了方便对于二进制值大小的表示,所以就搞了一些单位。
- b(bit),位
1,1位
10,2位
111,3位
1001,4位
- B(byte),字节
8位是一个字节。
10010110,1个字节
10010110 10010110,2个字节
- KB(kilobyte),千字节
1024个字节就是1个千字节。
10010110 11010110 10010111 .. ,1KB
1KB = 1024B= 1024 * 8 b
- M(Megabyte),兆
1024KB就是1M
1M= 1024KB = 1024 * 1024 B = 1024 * 1024 * 8 b
- G(Gigabyte),千兆
1024M就是1G
1 G= 1024 M= 1024 *1024KB = 1024 * 1024 * 1024 B = 1024 * 1024 * 1024 * 8 b
T(Terabyte),万亿字节
- 1024个G就是1T
- ...其他更大单位 PB/EB/ZB/YB/BB/NB/DB 不再赘述。
做个小练习:
- 假设1个汉字需要2个字节(2B=16位来表示,如:1000101011001100),那么1G流量可以通过网络传输多少汉字呢?(计算机传输本质上也是二进制)
1G = 1024M = 1024 * 1024KB = 1024 * 1024 * 1024 B
每个汉字需要2个字节表示
1024 * 1024 * 1024/2 = ?
- 假设1个汉字需要2个字节(2B=16位来表示,如:1000101011001100),那么500G硬盘可以存储多少个汉字?
500G = 500 * 1024M = 500 * 1024 * 1024KB = 500 * 1024 * 1024 * 1024 B
500 * 1024 * 1024 * 1024 / 2 = ?
4.编码
编码,文字和二进制之间的一个对照表。
https://symbl.cc/en/unicode-table/
4.1 ascii编码
ascii规定使用1个字节来表示字母与二进制的对应关系。
00000000
00000001 w
00000010 B
00000011 a
...
11111111
2**8 = 256
4.2 gb-2312编码
gb-2312编码,由国家信息标准委员会制作(1980年)。
gbk编码,对gb2312进行扩展,包含了中日韩等文字(1995年)。
在与二进制做对应关系时,由如下逻辑:
- 单字节表示,用一个字节表示对应关系。2**8 = 256
- 双字节表示,用两个字节表示对应关系。2**16 = 65536中可能性。
4.3 unicode
unicode也被称为万国码,为全球的每个文字都分配了一个码位(二进制表示)。
https://symbl.cc/en/unicode-table/
- ucs2
用固定的2个字节去表示一个文字。
00000000 00000000 悟
...
2**16 = 65535
- ucs4
用固定的4个字节去表示一个文字。
00000000 00000000 00000000 00000000 无
...
2**32 = 4294967296
文字 十六进制 二进制
ȧ 0227 1000100111
ȧ 0227 00000010 00100111 ucs2
ȧ 0227 00000000 00000000 00000010 00100111 ucs4
乔 4E54 100111001010100
乔 4E54 01001110 01010100 ucs2
乔 4E54 00000000 00000000 01001110 01010100 ucs4
😆 1F606 11111011000000110
😆 1F606 00000000 00000001 11110110 00000110 ucs4
无论是ucs2和ucs4都有缺点:浪费空间?
文字 十六进制 二进制
A 0041 01000001
A 0041 00000000 01000001
A 0041 00000000 00000000 00000000 01000001
unicode的应用:在文件存储和网络传输时,不会直接使用unicode,而在内存中会unicode。
4.4 utf-8编码
包含所有文字和二进制的对应关系,全球应用最为广泛的一种编码(站在巨人的肩膀上功成名就)。
本质上:utf-8是对unicode的压缩,用尽量少的二进制去与文字进行对应。
unicode码位范围 utf-8
0000 ~ 007F 用1个字节表示
0080 ~ 07FF 用2个字节表示
0800 ~ FFFF 用3个字节表示
10000 ~ 10FFFF 用4个字节表示
具体压缩的流程:
- 第一步:选择转换模板
码位范围(十六进制) 转换模板
0000 ~ 007F 0XXXXXXX
0080 ~ 07FF 110XXXXX 10XXXXXX
0800 ~ FFFF 1110XXXX 10XXXXXX 10XXXXXX
10000 ~ 10FFFF 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
例如:
"B" 对应的unicode码位为 0042,那么他应该选择的一个模板。
"ǣ" 对应的unicode码位为 01E3,则应该选择第二个模板。
"武" 对应的unicode码位为 6B66,则应该选择第三个模板。
"沛" 对应的unicode码位为 6C9B,则应该选择第三个模板。
"齐" 对应的unicode码位为 9F50,则应该选择第三个模板。
😆 对应的unicode码位为 1F606,则应该选择第四个模板。
注意:一般中文都使用第三个模板(3个字节),这也就是平时大家说中文在utf-8中会占3个字节的原因了。
- 第二步:在模板中填入数据
- "武" -> 6B66 -> 110 101101 100110
- 根据模板去套入数据
1110XXXX 10XXXXXX 10XXXXXX
1110XXXX 10XXXXXX 10100110
1110XXXX 10101101 10100110
11100110 10101101 10100110
在UTF-8编码中 ”武“ 11100110 10101101 10100110
- 😆 -> 1F606 -> 11111 011000 000110
- 根据模板去套入数据
11110000 10011111 10011000 10000110
4.5 Python相关的编码
字符串(str) "alex媳妇叫铁锤" unicode处理 一般在内存
字节(byte) b"alexfdsfdsdfskdfsd" utf-8编码 or gbk编码 一般用于文件或网络处理
v1 = "武"
v2 = "武".encode("utf-8")
v2 = "武".encode("gbk")
将一个字符串写入到一个文件中。
name = "嫂子热的满身大汗"
data = name.encode("utf-8")
# 打开一个文件
file_object = open("log.txt",mode="wb")
# 在文件中写内容
file_object.write(data)
# 关闭文件
file_object.close()
总结
本章的知识点属于理解为主,了解这些基础之后有利于后面知识点的学习,接下来对本节所有的知识点进行归纳总结:
- 计算机上所有的东西最终都会转换成为二进制再去运行。
- ascii编码、unicode字符集、utf-8编码本质上都是字符与二进制的关系。
- ascii,字符和二进制的对照表。
- unicode,字符和二进制(码位)的对照表。
- utf-8,对unicode字符集的码位进行压缩处理,间接也维护了字符和二进制的对照表。
- ucs2和ucs4指的是使用多少个字节来表示unicode字符集的码位。
- 目前最广泛的编码为:utf-8,他可以表示所有的字符且存储或网络传输也不会浪费资源(对码位进行压缩了)。
- 二进制、八进制、十进制、十六进制其实就是进位的时机不同。
- 基于Python实现二进制、八进制、十进制、十六进制之间的转换。
- 一个字节8位
- 计算机中常见单位b/B/KB/M/G的关系。
- 汉字,用gbk编码需要用2个字节;用utf-8编码需要用3个字节。
- 基于Python实现将字符串转换为字节(utf-8编码)
# 字符串类型
name = "武沛齐"
print(name) # 武沛齐
# 字符串转换为字节类型
data = name.encode("utf-8")
print(data) # b'\xe6\xad\xa6\xe6\xb2\x9b\xe9\xbd\x90'
# 把字节转换为字符串
old = data.decode("utf-8")
print(old)
- 基于Python实现将字符串转换为字节(gbk编码)
# 字符串类型
name = "武沛齐"
print(name) # 武沛齐
# 字符串转换为字节类型
data = name.encode("gbk")
# print(data) # b'\xe6\xad\xa6\xe6\xb2\x9b\xe9\xbd\x90' utf8,中文3个字节
print(data) # b'\xce\xe4\xc5\xe6\xc6\xeb' gbk,中文2个字节
# 把字节转换为字符串
old = data.decode("gbk")
print(old)