day1 计算机基础和环境搭建
课程目标:让大家了解计算机基础知识并完成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 编译器/解释器
编译器/解释器,就是一个翻译官
,将代码翻译成计算机能够识别的命令。
A使用Python开发了一个软件 1000 B使用Golang开发了一个软件 2000
Python解释器 Golang编译器
操 作 系 统
CPU 硬盘 网卡 内存 电源 .....
为什么有的叫解释器?有的叫编译器?
- 解释器,实时翻译。拿到1000行代码之后,解释一句交给操作系统一句。
- 编译器,全文翻译。拿到2000行代码之后会将他编译成一个临时文件(计算机能够识别命令),再把文件交给操作系统去读取。
Python、PHP、JavaScript、Ruby…一般称为解释型语言。
C、C++、Go、Java…一般称为编译型语言。
2.学习编程的本质
学编程本质上就是三件事:
- 选择一门编程语言,在自己的电脑上安装此编程语言相关的 编译器/解释器。
- 学习编程语言的语法规则,根据语法规则 + 业务背景 设计并开发你的软件(代码集合)。
- 使用 编译器/解释器 去运行自己写的代码。
3.Python的介绍
3.1 语言的分类
-
翻译
的维度- 解释型语言,Python、Ruby….
- 编译型语言,C、C++、Golang
-
高低
的维度-
低级编程语言,写出来的代码直接可以被计算机识别。
机器语言,101 001 00001 00010 001000100010001,机器码,交给计算机去执行。 汇编语言,MOV INC ... ,指令,交给计算机去执行。
-
高级编程语言,写出来的代码无法直接被计算机识别,但可以通过某中方式将其转换为计算机可以识别的语言。
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 windows系统
-
Python官网下载Python解释器
https://www.python.org/downloads/release/python-390/
-
在自己电脑上进行安装
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.3 安装Pycharm编辑器(win)
-
下载Pycharm
https://www.jetbrains.com/pycharm/download/other.html
-
安装
-
快速使用:编写代码 + 运行代码
-
破解Pycharm(专业版)
总结
- 了解硬件 & 操作系统 & 软件(应用系统)之间的关系。
- 了解常见的操作系统都有哪些。
- 了解编译器和解释器的区别和作用。
- 编程语言进行分类
- 了解Python解释器的种类
- 了解CPython解释器的版本
- 学会如何安装Python解释器。
- 了解什么环境变量的作用。
- 了解Python和Pycharm的区别。
day2 一点数据类型
1.编码
编码有
-
ascii 规定使用1个字节来表示字母与二进制的对应关系 – 所以只能储存256个东西
-
gb-2312编码
gb-2312编码,由国家信息标准委员会制作(1980年)。
gbk编码,对gb2312进行扩展,包含了中日韩等文字(1995年)。
在与二进制做对应关系时,由如下逻辑:
- 单字节表示,用一个字节表示对应关系。2**8 = 256
- 双字节表示,用两个字节表示对应关系。2**16 = 65536中可能性。
-
unicode 也被称为万国码,为全球的每个文字都分配了一个码位(二进制表示)。
- ucs2 : 用固定的2个字节去表示一个文字。
- ucs4 : 用固定的4个字节去表示一个文字。
utf-8和gbk
就用utf-8就行了
2.输出
print()
3.认识一点数据类型
3.1整形(int)
就是数字
可以加减乘除
3.2字符串(str)
用 “ “这个括起来的就是字符串
例: “sb”这个就是
可以加 , 乘
-
加,两个字符串可以通过加号拼接起来。
print( “alex” + “是金角大王吧” )
-
乘,让整形和字符串进行相乘,以实现让字符串重复出现N次并拼接起来。
print(3 * “我想吃饺子”)
3.3布尔类型(bool)
就两个True,False
3.4类型转换
类型总结
- int,整型定义时,必须是数字且无引号,例如:5、8、9
- str,字符串定义时,必须用双引号括起来,例如:”中国”、”杨昌辉”、”666”
- bool,布尔值定义时,只能写True和False
3.4.1转整形(十进制数字)
int(东西)
进制转整形
int(“2或8或16进制的东西”,base = “2或8或16进制”)
扩展:
整数转2或8或16进制:
2进制
bin(“整形”)
8进制:
oct(“整形”)
16进制:
hex(“整形”)
3.4.2转字符串
str(”东西“)
3.4.3转布尔
bool(“东西”)
4变量规范
三个规范(只要有一条就会报错):
- 变量名只能由 字母、数字、下划线 组成。
- 不能以数字开头
- 不能用Python内置的关键字
全局变量用大写,局部变量用小写
day03,循环
1. 循环有while,for
1.1while:
-
用于不确定循环次数的时候用
-
格式:
while 条件:#不知道就用True,也可以是变量,或是可以转换成布尔类型的东西 缩进(四个空格) ···· 代码· 代码
1.2break
-
break用于跳出循环
print("开始") while True: print("1") break print("2") print("结束") #输出: 开始 1 结束
1.3 continue
-
continue,用于跳出当前循环,并开始下一次循环
print("开始") while True: print("nb") break print("2") print("结束") #输出: 开始 nb nb nb nb ....
1.4 while else语句
-
当while后面的条件不成立的时候,else下面的代码就执行
-
示例1
while False: print(1) else: print(123) #输出 123
2.字符串格式化
字符串格式化有三种方式:%,format ,f “ “
一般用第三个,第二个比较少用,
f “ “方法是3.X版本的东西
2.1 format
text = "我叫{0},今年18岁".format("杨昌辉")
text = "我叫{0},今年{1}岁".format("杨昌辉",18)
text = "我叫{0},今年{1}岁,真是的姓名是{0}。".format("杨昌辉",18)
2.2 f “ “
# 理解
text = f"我是{'alex'},我爱大铁锤"
name = "alex"
text = f"我是{name},我爱大铁锤"
name = "alex"
text = f"我是{ name.upper() },我爱大铁锤"
# 输出:我是ALEX,我爱大铁锤
3.运算符
3.1运算符
提到运算符,我想大家首先想到的就是加、减、乘、除之类, 本节要系统的跟大家来聊一聊,我们写代码时常见的运算符可以分为5种:
-
算数运算符,例如:加减乘除
-
比较运算符,例如:大于、小于
注意: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)
-
逻辑运算,例如:且或非逻辑运算,例如:且或非
-
有and,or ,not
3.2优先级
上述这3个优先级从高到低总结:加减乘除 > 比较 > not and or
。绝招:加括号。
算数:
and:
- T,T:选后
- T,F:选F
- F,F:选前
or:
- T,T:选前
- T,F:选T
- F,F:选后
再次注意:加减乘除 > 比较 > not > and > or
day4进制与编码
课程目标:讲解计算机中一些必备的常识知识,让学员了解一些常见名词背后的含义(重在理解)。
课程概要:
- python代码的运行方式
- 进制
- 计算机中的单位
- 编码
1.Python代码运行方式
-
脚本式
python3 ~/PycharmProjects/day03/6.作业题讲解.py
-
交互式
python3
2.进制
计算机中底层所有的数据都是以 010101
的形式存在(图片、文本、视频等)。
-
二进制
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 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()
5.总结
本章的知识点属于理解为主,了解这些基础之后有利于后面知识点的学习,接下来对本节所有的知识点进行归纳总结:
-
计算机上所有的东西最终都会转换成为二进制再去运行。
-
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)
day5数据类型(int,bool,str)
数据类型有:
- int,整数类型(整形)
- bool,布尔类型
- str,字符串类型
- list,列表类型
- tuple,元组类型
- dict,字典类型
- set,集合类型
- float,浮点类型(浮点型)
1.整形(int)
1.1定义
就是数字:123456789
1.2方法
bin
1.3功能
加减乘除
+-*/
1.4转换
可以将字符串“123”
布尔类型“True” =1
浮点数
和2,8,16进制转换成整数
v1 = int("0b1001",base = 2)
#把“2”换成8,16就行了
v2 = int(3.9)#3
1.5补充:
- python3 整形(不限制)
- python2 整形 长整形
在python2中
- int,可表示的范围:-9223372036854775808~9223372036854775807
- long,整数值超出int范围之后自动会转换为long类型(无限制)
在python3中去除了long只剩下:int(整型),并且 int 长度不在限制。
2.布尔类型(bool)
2.1定义
True or False
2.2转换
任何非空的东西为True
None,0,“”为False,“ ”为True
2.3补充
用于if,while的判断上
3.字符串类型(str)
不可变类型,有序
3.1定义
"你好"
3.2方法
1.判断是否为“XX”开头 : startswith(“XX”) ——> bool
2.判断是否为“XX”结尾:endswith(“XX”) ——> bool
3.判断字符串是否为整形:isdecimal()——> bool
4.去除字符串两边的空格、换行符、制表符:strip去除全部
**lstrip去除左边**
**rstrip去除右边**
返回——> new_str
5.字符串变大写:upper——>new_str
6.字符串变小写:lower——>new_str
7.字符串内容替换,replace(”原文中的字符串”,”要改成的字符串”)——>new_str
8.字符串切割:split(‘符号’,”要切几个符号(不写为全切)”)——>list
(前面加“r”从右切)(“l”从左切)split
9.拼接字符串:“符号”. join(列表)——>new_str
10.字符串格式:format()
11.字符串转字节类型:encode(“编码形式,如utf-8”)——>new_str
12将字符串内容居中、居左、居右展示:center(居中),ljust(居左),rjust(居右) ——> new_str
v1 = "王老汉"
# data = v1.center(21, "-")
# print(data) #---------王老汉---------
# data = v1.ljust(21, "-")
# print(data) # 王老汉------------------
# data = v1.rjust(21, "-")
# print(data) # ------------------王老汉
13.帮助你填充0:zfill(补几个0,数字) ——> new_str
用于二进制处理
day6数据类型(list,tuple)
- list:列表类型,有序(可用索引取值),可修改【80%】***
- tuple:元组类型,有序,不可修改【20%】不重要
1.列表(list)
列表(list),是一个有序且可变的容器,在里面可以存放多个不同类型的元素。
-
不可变类型:字符串、布尔、整型(已最小,内部数据无法进行修改)
-
可变类型:列表(内部数据元素可以修改)字典,集合等
1.1定义
v1 = ["猪","狗"]
v2 = [1,2,3]
1.2方法
1.在原列表追加一个值:append
v1 = [1,2,3]
v1.append(4)
print(v1)#[1,2,3,4]
2.追加一个列表(将列表元素逐一添加入列表):extend
v1 = [1,2,3]
v2 = [4,5,6]
v1.extend(v2)# 或 v1.extend(4,5,6])
print(v1)#[1,2,3,4,5,6]
3.根据索引位置插入值:insert(索引,要传的东西)
v1 = [1,2,3,4,5,6]
v1.insert(0,0)
v1.insert(2,"x")
print(v1)#[0,1,"x",2,3,4,5,6]
4.删除一个原列表中的值,从左到右找删除第一个,没有参数或参数不存在则报错,慎用:remove(要删除的东西)
v1 = [1,2,3,4,5,6]
v1.remove(1)
v1.remove(8)#报错
print(v1)#[2,3,4,5,6]
5.根据索引位置删除值,并返回这个值:pop(索引)
v1 = [1,2,3,4,5,6]
#索引 0 1 2 3 4 5
v2 = v1.pop(2)
print(v1)#[1,2,4,5,6]
print(v2) # 3
6.清空列表:clear():
#清空列表
v1 = [1,2,3,4,5,6]
v1.clear()
print(v1)#[]
#删除列表
del v1
print(v1)#报错
7.根据值获取索引,从左到右找,没有参数或参数不存在则报错:index
v1 = [1,2,3,4,5,6]
v2 = v1.index(3)
print(v2) # 2
8.列表元素排列: sort() 注:sort()数学是从小到大,从大到小sort(reverse == True),字符串和其他类型是以二进制的小排列的
v1 = [2,3,4,7,5,6,1,0]
v1.sort()
print(v1)#[0,1,2,3,4,5,6,7]
v1.sort(reverse == True)
print(v1)#[7,6,5,4,3,2,1,0]
注意:排序时内部元素无法进行比较时,程序会报错(尽量数据类型统一)。
9.翻转原列表:reverse()
v1 = [0,1,2,3,4,5,6,7]
v1.reverse()
print(v1) # [7,6,5,4,3,2,1,0]
1.3功能
1.相加,两个列表相加新生成一个新列表:
v1 = [1,2,3]
v2 = [4,5,6]
v3 = v1 + v2
print(v2)#[1,2,3,4,5,6]
2.相乘
v1 = ["猪","狗"]
v2 = v1 * 2
print(v2)#["猪","狗","猪","狗"]
- in:判断是否是列表的元素
v1 = ["猪","狗"]
v2 = "狗" in v1
print(v2)#True
4.获得长度
v1 = [0,1,2,3,4,5,6,7]
v2 = len(v1)
print(v2) # 8
5.索引
# 读
user_list = ["范德彪","刘华强",'尼古拉斯赵四']
print( user_list[0] )
print( user_list[2] )
print( user_list[3] ) # 报错
# 改
user_list = ["范德彪","刘华强",'尼古拉斯赵四']
user_list[0] = "杨昌辉"
print(user_list) # ["杨昌辉","刘华强",'尼古拉斯赵四']
# 删
user_list = ["范德彪","刘华强",'尼古拉斯赵四']
del user_list[1]
user_list.remove("刘华强")
ele = user_list.pop(1)
6.切片,多个元素的操作(很少用)
# 读
user_list = ["范德彪","刘华强",'尼古拉斯赵四']
print( user_list[0:2] ) # ["范德彪","刘华强"]
print( user_list[1:] )
print( user_list[:-1] )
# 改
user_list = ["范德彪", "刘华强", '尼古拉斯赵四']
user_list[0:2] = [11, 22, 33, 44]
print(user_list) # 输出 [11, 22, 33, 44, '尼古拉斯赵四']
user_list = ["范德彪", "刘华强", '尼古拉斯赵四']
user_list[2:] = [11, 22, 33, 44]
print(user_list) # 输出 ['范德彪', '刘华强', 11, 22, 33, 44]
user_list = ["范德彪", "刘华强", '尼古拉斯赵四']
user_list[3:] = [11, 22, 33, 44]
print(user_list) # 输出 ['范德彪', '刘华强', '尼古拉斯赵四', 11, 22, 33, 44]
user_list = ["范德彪", "刘华强", '尼古拉斯赵四']
user_list[10000:] = [11, 22, 33, 44]
print(user_list) # 输出 ['范德彪', '刘华强', '尼古拉斯赵四', 11, 22, 33, 44]
user_list = ["范德彪", "刘华强", '尼古拉斯赵四']
user_list[-10000:1] = [11, 22, 33, 44]
print(user_list) # 输出 [11, 22, 33, 44, '刘华强', '尼古拉斯赵四']
# 删
user_list = ["范德彪", "刘华强", '尼古拉斯赵四']
del user_list[1:]
print(user_list) # 输出 ['范德彪']
7.步长
user_list = ["范德彪","刘华强",'尼古拉斯赵四',"宋小宝","刘能"]
# 0 1 2 3 4
print( user_list[1:4:2] )
print( user_list[0::2] )
print( user_list[1::2] )
print( user_list[4:1:-1] )
# 案例:实现列表的翻转
user_list = ["范德彪","刘华强",'尼古拉斯赵四',"宋小宝","刘能"]
new_data = user_list[::-1]
print(new_data)
data_list = ["范德彪","刘华强",'尼古拉斯赵四',"宋小宝","刘能"]
data_list.reverse()
print(data_list)
# 给你一个字符串请实现字符串的翻转?
name = "杨昌辉"
name[::-1]
8.列表for面试题:
切记,循环的过程中对数据进行删除会踩坑【面试题】。
# 错误方式, 有坑,结果不是你想要的。
user_list = ["刘的话", "范德彪", "刘华强", '刘尼古拉斯赵四', "宋小宝", "刘能"]
for item in user_list:
if item.startswith("刘"):
user_list.remove(item)
print(user_list)
# 正确方式,倒着删除。
user_list = ["刘的话", "范德彪", "刘华强", '刘尼古拉斯赵四', "宋小宝", "刘能"]
for index in range(len(user_list) - 1, -1, -1):
item = user_list[index]
if item.startswith("刘"):
user_list.remove(item)
print(user_list)
1.4转换
-
str
name = "杨昌辉" data = list(name) # ["武","沛","齐"] print(data)
-
超前
v1 = (11,22,33,44) # 元组 vv1 = list(v1) # 列表 [11,22,33,44] v2 = {"alex","eric","dsb"} # 集合 vv2 = list(v2) # 列表 ["alex","eric","dsb"]
其他的类型转列表都没什么意义
1.5嵌套(懒得总结了)
列表属于容器,内部可以存放各种数据,所以他也支持列表的嵌套,如:
data = [ "谢广坤",["海燕","赵本山"],True,[11,22,[999,123],33,44],"宋小宝" ]
对于嵌套的值,可以根据之前学习的索引知识点来进行学习,例如:
data = [ "谢广坤",["海燕","赵本山"],True,[11,22,33,44],"宋小宝" ]
print( data[0] ) # "谢广坤"
print( data[1] ) # ["海燕","赵本山"]
print( data[0][2] ) # "坤"
print( data[1][-1] ) # "赵本山"
data.append(666)
print(data) # [ "谢广坤",["海燕","赵本山"],True,[11,22,33,44],"宋小宝",666]
data[1].append("谢大脚")
print(data) # [ "谢广坤",["海燕","赵本山","谢大脚"],True,[11,22,33,44],"宋小宝",666 ]
del data[-2]
print(data) # [ "谢广坤",["海燕","赵本山","谢大脚"],True,[11,22,33,44],666 ]
data[-2][1] = "alex"
print(data) # [ "谢广坤",["海燕","赵本山","谢大脚"],True,[11,"alex",33,44],666 ]
data[1][0:2] = [999,666]
print(data) # [ "谢广坤",[999,666,"谢大脚"],True,[11,"alex",33,44],666 ]
# 创建用户列表
# 用户列表应该长: [ ["alex","123"],["eric","666"] ]
# user_list = [["alex","123"],["eric","666"],]
# user_list.append(["alex","123"])
# user_list.append(["eric","666"])
user_list = []
while True:
user = input("请输入用户名:")
pwd = input("请输入密码:")
data = []
data.append(user)
data.append(pwd)
user_list.append(data)
user_list = []
while True:
user = input("请输入用户名(Q退出):")
if user == "Q":
break
pwd = input("请输入密码:")
data = [user,pwd]
user_list.append(data)
print(user_list)
2.元组
元组(tuple),是一个有序且不可变的容器,在里面可以存放多个不同类型的元素。
名言:
记住一句话:《”我儿子永远不能换成是别人,但我儿子可以长大”》
2.1定义
v1 = (11,22,33)
v2 = ("李杰","Alex")
v3 = (True,123,"Alex",[11,22,33,44])#《"我儿子永远不能换成是别人,但我儿子可以长大"》可以改变列表里面的值
# 建议:议在元组的最后多加一个逗v3 = ("李杰","Alex",)
面试题:
# 面试题
1. 比较值 v1 = (1) 和 v2 = 1 和 v3 = (1,) 有什么区别?
2. 比较值 v1 = ( (1),(2),(3) ) 和 v2 = ( (1,) , (2,) , (3,),) 有什么区别?
(1,2,3)
2.2方法、
没有滚
2.3功能
1.相加与列表一致(去看列表吧)
2.相乘与列表一致(去看列表吧)
3.获取长度(去看列表吧)
4.索引,切片,步长都是只能读不能改,与列表一致(去看列表吧)
2.4转换(懒了)
其他类型转换为元组,使用tuple(其他类型)
,目前只有字符串和列表可以转换为元组。
data = tuple(其他)
# str / list
name = "杨昌辉"
data = tuple(name)
print(data) # 输出 ("武","沛","齐")
name = ["杨昌辉",18,"pythonav"]
data = tuple(name)
print(data) # 输出 ("杨昌辉",18,"pythonav")
2.5 嵌套
由于元组和列表都可以充当容器
,他们内部可以放很多元素,并且也支持元素内的各种嵌套。
tu = ( '今天姐姐不在家', '姐夫和小姨子在客厅聊天', ('姐夫问小姨子税后多少钱','小姨子低声说道说和姐夫还提钱') )
tu1 = tu[0]
tu2 = tu[1]
tu3 = tu[2][0]
tu4 = tu[2][1]
tu5 = tu[2][1][3]
print(tu1) # 今天姐姐不在家
print(tu2) # 姐夫和小姨子在客厅聊天
print(tu3) # 姐夫问小姨子税后多少钱
print(tu4) # 小姨子低声说道说和姐夫还提钱
day7(set,dict,froat)
- set集合,一个不允许重复重复 & 可变类型(元素可哈希)。
- dict字典,一个容器且元素必须是键值对。
- float类型,我们生活中常见的小数。
1.集合(set)
集合是一个 无序 、可变、不允许数据重复的容器。
- 无序,无法通过索引取值。
- 可变,可以添加和删除元素。
- 不允许数据重复。
1.1定义
注意:定义空集合时,只能使用v = set()
,不能使用 v={}
(这样是定义一个空字典)。
v1 = {11,22,33,"alxe"}
什么时候用集合?
就是想要维护一大堆不重复的数据时,就可以用它。比如:做爬虫去网上找图片的链接,为了避免链接重复,可以选择用集合去存储链接地址。
1.2 方法
-
添加元素
data = {"刘嘉玲", '关之琳', "王祖贤"} data.add("郑裕玲") print(data)#{"刘嘉玲", '关之琳', "王祖贤","郑裕玲"} data1 = set() data.add("周杰伦") data.add("林俊杰") print(data1)#{"周杰伦","林俊杰"}
-
删除元素
data = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟", "李若彤"} data.discard("关之琳") print(data)
-
交集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s4 = s1.intersection(s2) # 取两个集合的交集 print(s4) # {"⽪⻓⼭"} s3 = s1 & s2 #或是这样也可以 取两个集合的交集 print(s3)
-
并集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s4 = s1.union(s2) # 取两个集合的并集 {"刘能", "赵四", "⽪⻓⼭","刘科⻓", "冯乡⻓", } print(s4) s3 = s1 | s2 #或是这样也可以 取两个集合的并集 print(s3)
-
差集,意思是(我有的,你没有)
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s4 = s1.difference(s2) # 差集,s1中有且s2中没有的值 {"刘能", "赵四"} s6 = s2.difference(s1) # 差集,s2中有且s1中没有的值 {"刘科⻓", "冯乡⻓"} s3 = s1 - s2 # 差集,s1中有且s2中没有的值 s5 = s2 - s1 # 差集,s2中有且s1中没有的值 print(s5,s6)
1.3 公共功能
-
减,计算差集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s3 = s1 - s2 s4 = s2 - s1 print(s3) print(s4)
-
&,计算交集
s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s3 = s1 & s2 print(s3)
-
,计算并集 s1 = {"刘能", "赵四", "⽪⻓⼭"} s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"} s3 = s1 | s2 print(s3)
-
长度
v = {"刘能", "赵四", "尼古拉斯"} data = len(v) print(data)
-
fof
v = {"刘能", "赵四", "尼古拉斯"} for item in v: print(item)
1.5集合的那些事
1.5.1集合的存储原理
1.5.2 元素必须可哈希
因存储原理,集合的元素必须是可哈希的值,即:内部通过通过哈希函数把值转换成一个数字。
目前可哈希的数据类型:int、bool、str、tuple,而list、set是不可哈希的。
总结:集合的元素只能是 int、bool、str、tuple 。
-
转换成功
v1 = [11,22,33,11,3,99,22] v2 = set(v1) print(v2) # {11,22,33,3,99}
-
转换失败
v1 = [11,22,["alex","eric"],33] v2 = set(v1) # 报错 print(v2)
1.5.3 查找速度特别快
因存储原理特殊,集合的查找效率非常高(数据量大了才明显)。
None类型
Python的数据类型中有一个特殊的值None,意味着这个值啥都不是 或 表示空。 相当于其他语言中 null
作用一样。 在一定程度上可以帮助我们去节省内存
None就是无的意思,啥也没有
None在判断里是False
2.字典(dict)
字典是 无序、键不重复 且 元素只能是键值对的可变的 个 容器。
- 容器
- 元素必须键值对
- 键不重复,重复则会被覆盖
- 无序(在Python3.6+字典就是有序了,之前的字典都是无序。)但还是无法通过索引取值,在某种意义上还是无序的
2.1定义
字典中对键值得要求:
-
键:必须可哈希。 目前为止学到的可哈希的类型:int/bool/str/tuple;不可哈希的类型:list/set/dict。(集合)
键的后代必须都是可哈希的
-
值:任意类型。
#定义一个字典
v1 = {}
#或是
v2 = dict()
一般在什么情况下会用到字典呢?
当我们想要表示一组固定信息时,用字典可以更加的直观,例如:
# 用户列表
user_list = [ ("alex","123"), ("admin","666") ]
...
# 用户列表
user_list = [ {"name":"alex","pwd":"123"}, {"name":"eric","pwd":"123"} ]
2.2方法
1.获取字典指定“键”的值:get(“键”) –> str
info = {
"age":12,
"status":True,
"name":"杨昌辉",
"data":None
}
data1 = info.get("name")
print(data1) # 输出:杨昌辉
2.获取字典所有键:keys() –>高仿列表
info = {
"age":12,
"status":True,
"name":"杨昌辉",
"data":None
}
a = info.keys()
print(a) #dict_keys(['age', 'status', 'name', 'data'])
#高仿列表可以for循环
for i in a:
print(i)
#输出
age
status
name
data
注意:在Python2中 字典.keys()直接获取到的是列表,而Python3中返回的是高仿列表
,这个高仿的列表可以被循环显示。
3.获取字典所有的值values(): –>高仿列表
info = {
"age":12,
"status":True,
"name":"杨昌辉",
"data":None
}
a = info.values()
print(a) #dict_values([12, True, '杨昌辉', None])
#高仿列表可以for循环
for i in a:
print(i)
#输出
12
True
杨昌辉
None
4.获取字典所有的键值:items() –>高仿列表
info = {
"age":12,
"status":True,
"name":"杨昌辉",
"data":None
}
a = info.items()
print(a) #dict_items([('age', 12), ('status', True), ('name', '杨昌辉'), ('data', None)])
for i in a:
print(i)
#输出
('age', 12)
('status', True)
('name', '杨昌辉')
('data', None)
5.更新字典键值对(无则添加,有则更新):update
info = {"age":12, "status":True}
info.update({"eng": 123})
print(info)
#输出
{"age":12, "status":True,"eng": 123}
6.设置值(有键则什么也不干,没有键则添加键值对) : setdefault
data = {
"name": "杨昌辉",
"email": 'xxx@live.com'
}
data.setdefault("age", 18)
print(data)
#输出: {'name': '杨昌辉', 'email': 'xxx@live.com', 'age': 18}
data.setdefault("name", "alex")
print(data)
#输出:{'name': '杨昌辉', 'email': 'xxx@live.com', 'age': 18}
7.移除指定键值对,并返回该键的值:pop(“键”):–> 值
info = {"age":12, "status":True,"name":"杨昌辉"}
data = info.pop("age")
print(info) # {"status":True,"name":"杨昌辉"}
print(data) # 12
8.按照顺序移除(后进先出)
info = {"age":12, "status":True,"name":"杨昌辉"}
data = info.popitem() # ("name","杨昌辉" )
print(info) # {"age":12, "status":True}
print(data) # ("name","杨昌辉")
- py3.6后,popitem移除最后的值。
- py3.6之前,popitem随机删除。
2.3公共功能
-
求
并集
(Python3.9新加入)v1 = {"k1": 1, "k2": 2} v2 = {"k2": 22, "k3": 33} v3 = v1 | v2 print(v3) # {'k1': 1, 'k2': 22, 'k3': 33}
-
长度:len ( )
info = {"age":12, "status":True,"name":"杨昌辉"} data = len(info) print(data) # 输出:3
-
是否包含
info = { "age":12, "status":True,"name":"杨昌辉" } v1 = "age" in info print(v1)#True
4.索引(键)
字典不同于元组和列表,字典的索引是
键
,而列表和元组则是0、1、2等数值
。info = { "age":12, "status":True, "name":"杨昌辉"} print( info["age"] ) # 输出:12 print( info["name"] ) # 输出:杨昌辉 print( info["status"] ) # 输出:True print( info["xxxx"] ) # 报错,通过键为索引去获取之后时,键不存在会报错(以后项目开发时建议使用get方法根据键去获取值) value = info.get("xxxxx") print(value) # None
5.根据键 修改值 和 添加值 和 删除键值对
上述示例通过键可以找到字典中的值,通过键也可以对字典进行添加和更新操作
info = {"age":12, "status":True,"name":"杨昌辉"} #添加 info["gender"] = "男" print(info) # 输出: {"age":12, "status":True,"name":"杨昌辉","gender":"男"} #更新 info["age"] = "18" print(info) # 输出: {"age":"18", "status":True,"name":"杨昌辉"} #删除 del info["age"] # 键不存在则报错 print(info) # 输出: {"status":True,"name":"杨昌辉"}
2.4 其他
2.4.1 存储原理
与集合一样
所以速度快
2.4.2 速度快
info = {
"alex":["肝胆","铁锤"],
"老男孩":["二蛋","缺货"]
}
for "alex" in info:
print("在")
info = {
"alex":["肝胆","铁锤"],
"老男孩":["二蛋","缺货"]
}
v1 = info["alex"]
v2 = info.get("alex")
3.浮点型(float)的坑
浮点型,一般在开发中用于表示小数。
v1 = 3.14
v2 = 9.89
关于浮点型的其他知识点如下:
-
在类型转换时需要,在浮点型转换为整型时,会将小数部分去掉。
v1 = 3.14 data = int(v1) print(data) # 3
-
想要保留小数点后N位
v1 = 3.1415926 result = round(v1,3) print(result) # 3.142
-
浮点型的坑(所有语言中)
底层原理视频:https://www.bilibili.com/video/BV1354y1B7o1/
在项目中如果遇到精确的小数计算应该怎么办?
import decimal
v1 = decimal.Decimal("0.1")
v2 = decimal.Decimal("0.2")
v3 = v1 + v2
print(v3) # 0.3