前置知识
- python中一切皆对象
- 对象具有标准数据类型、属性(attribute)和方法(method或函数(function)
- 标准数据类型
- 数字 Number
- 字符串 String
- 列表 List
- 字典 Dictionary
- 元祖 Tuple
- 集合 Set
数据类型
1. Number
- 整数(int):3, -12
- 浮点数(float):0.1, 0.2
- 精确度问题(计算机浮点数求和通病)
- 如何解决:round(0.1+0.2, 1)
- 如何解决:round(0.1+0.2, 1)
- 精确度问题(计算机浮点数求和通病)
1.1 基本运算
加、减、乘、除、乘方、求余
(注意:8/2=4.0, 8//2=4)
2. String
- 字符串是各种字符:比如字母、数字、标点符号等;
- 要用引号(单双都可)包裹,引号不会显示
- 如果不用引号包裹,会被认为是变量名;
2.1 转义字符
当需要再字符串中使用转义字符时,Python中用反斜杠\表示
a = 'I\'m Chinese'
print(a)
// => I'm Chinese
什么意思呢,"'" 告诉编译器,\后的字符只把它当成一个英文字符就好。如果不加转义字符()会报错,因为编译器会认为
2.2 拼接字符串
⚠️需要注意:用+拼接会占用内存,因为string是不可变对象,每次+都会产生一个新的变量。
2.3 格式化字符串【实用】
python-fstring
可以理解为前端的`${}`
举个例子:
name = 'dolores'
gender = 'female'
age = 22
print(f"{name} is a {gender}, she is {age} years old")
// => dolores is a female, she is 22 years old
2.4 索引(index)【重要】
定位一个物体位置
a = 'hello'
print(a[0], a[-5], a[-1])
// => h h o
- 第一个字母是h,最后一个是o
- 从零开始
- h的索引index是0或-5
- o的索引index是4或-1
选取字符串中某几个连续字符
a[start:end]
3. List
一个列表list可以由多个数据类型的元素组成
list1 = [1, 2, 3]
list2 = [1, 'age', 1.1]
3.1 查询元素
- 通过索引index查询(和字符串用法是一样的)
3.2 修改元素
直接用索引修改
3.3 添加元素
- append方法
list_name.append(element)- 在列表最后添加一个元素,添加的元素(
element)可以是一个字符串、整数、元组或其他列表。 - 列表长度增加1
- 在列表最后添加一个元素,添加的元素(
- insert方法
list_name.insert(index, element)- 这个方法可以用来在任何需要的位置插入一个值。它需要两个参数—元素和要插入的元素的索引。
- 列表长度增加1
- extend方法
list_name.extend(iterable)- extend方法将迭代器(元组、字符串或列表)中的每个元素附加到列表的末尾。
- 列表长度增加为迭代器中元素数量
- ⚠️注意:迭代器是将需添加元素平铺添加
⚠️append, insert, extend添加方法的比较
3.4 删除元素
- pop方法
list_name.pop() | list_name.pop(index)- 默认删除最后一项
- 返回被删除项的值
*. function函数
如何声明函数?
def function_name():
do sth here
function_name() # 执行函数
4. 字典 dictionary
字典名 = {'key': value, 'key': value}
我把它理解为键值对,键与值构成字典。 -> 很像JSON
4.1 增删改(借助键名)
- 创建一个字典
- 增加一个键值对(默认增加到末尾)
- 修改某个键的值
- 删除某个键值对(del语句)
5. 元组 tuple(不修改)
- 元组是一种不可变序列类型,类似于列表
- 元组用小括号包裹(可省略)
- 用逗号相隔,若元组中只有一个元素,该元素后逗号不可省略(t = 1,)
5.1 操作元组
- 创建一个元组
- tuple函数:
tuple([ele1, ele2])参数iterable是可迭代对象(字段、字符串、元组、集合等) - (元素1, 元素2, ...):括号可省略
- tuple函数:
- 拼接创建一个新元组
- 通过序列index访问
- 不支持修改某一项或删除某一项,可以理解为一个元组创建后不可变
- 但可以删除整个元组(del语句)
- 但可以删除整个元组(del语句)
5.2 元组拆包
创建元组时,将多个元素放入一个元组叫做打包;将元组中的元素取出赋值给不同的变量的过程叫做拆包。
⚠️:突然想到元组的实际用处:可以用来保存私有变量
6. 集合 set
- 可迭代、无序的、不能包含重复变量的容器数据类型。
6.1 操作集合
- 创建一个集合
- set(iterable)函数:
set('ele1', ele2)参数iterable是可迭代对象(字段、字符串、元组、集合等);创建一个空集合,必须用set()函数,因为{}是创建一个空字典。 - {ele1, ele2, ...}
- set(iterable)函数:
-
添加元素 如果添加的元素已经存在,则不进行操作。
- add():只可以添加不可变元素:比如数字、字符串、元组等;添加的元素整体。
- update():可添加可迭代的元素:比如字符串、字典、元组等;添加数字类型会报错;会将元素拆分再添加。
- add():只可以添加不可变元素:比如数字、字符串、元组等;添加的元素整体。
-
删除元素
- remove():如果元素不存在会报错;
- discard():如果元素不存在不会报错;
- pop():任意删除一个元素,并返回被删除元素;
- clear():清空目标集合;
- remove():如果元素不存在会报错;
-
查看目标元素是否在一个集合中
- in:是否存在,返回Ture或False;
- not in:是否不存在, 返回False或Ture;
- in:是否存在,返回Ture或False;
条件控制
1. if-elif-else
使用前提是,我知道变量都有哪些,来写不同的执行条件。
2. while
只关注我们设置的执行条件,如果满足就一直执行
while 条件
do something
# 需要一个跳出循环的运算
# 通常不会这么简单,更多情况,是我们将条件设置为一个Flag,在while里面写逻辑
举个例子~
3. match...case(类似于switch...case)
- case _ :类似于switch...case中的default
- 无需使用break跳出语句,一旦有match匹配成功,就会结束语句。
for循环语句
循环列表
range()
range(stop)
range(start, stop[, step])
# start:默认为0,从0开始
# step步长:默认为1
- range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。
- list() 函数是对象迭代器,可以把 range() 返回的可迭代对象转为一个列表,返回的变量类型为列表。
常见用法
- 生成一个数组
- list()方法:
- list拆分(for循环)【常见】:
- list()方法:
装饰器 decorator
菜鸟教程解释---简单地说:他们是修改其他函数的功能的函数
我目前理解的作用是:如果有一个或多个行为在很多方法或类里都重复使用,那么我们可以把重复的部分提取出来作为一个装饰器
举个例子~
# 装饰器
# 我们要在网站里加入安全校验,这个安全校验会在登陆、和抢票的时候都进行
# 如果我们不用装饰器,看看要怎么实现
# 登陆
def rollIn():
username = input('请输入您的用户名:')
password = input('请输入您的密码:')
if (not(username) or not(password)):
return '用户名或密码不能为空'
else:
# 安全校验,先简单写一个哦,不要当真,正常安全校验不会是这样的
print('进行安全校验')
answer = input('谁是这个世界上最美的人?')
if (answer == '张小美'):
return ('校验通过!欢迎登岛')
else:
return ('校验失败!!回去重新准备!')
# 抢票
def grabVote():
print('正在为您抢票')
print('进行安全校验')
answer = input('谁是这个世界上最美的人?')
if (answer == '张小美'):
return ('校验通过!欢迎登岛')
else:
return ('校验失败!!回去重新准备!')
print(grabVote())
很明显安全校验的部分是一直在重复的,并且代码逻辑也一样,那么我们抽出作为装饰器看看,要怎么写?
# 用装饰器实现安全校验的部分
# 安全校验
def check(func): # func 是我们要装饰的方法,也可以理解为我们要对这个方法下手了!
def wrapper(): # 定义一个包装方法
print('开始安全校验')
answer = input('谁是这个世界上最美的人?')
if (answer == '张小美'):
print('校验通过!')
func()
else:
print('校验失败!!回去重新准备!')
return wrapper
@check
def rollIn():
username = input('请输入您的用户名:')
password = input('请输入您的密码:')
if (not(username) or not(password)):
print('用户名或密码不能为空')
return
else:
print(f'欢迎{username},登陆成功')
@check
def grabVote():
print('正在为您抢票')
print('进行安全校验')
rollIn()
Class
用来描述具有相同的属性和方法的对象的集合。
它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
我们来声明一个类
class ClassName:class语句声明一个类,类名需要首字母大写;def __init__(self, attr1, ..):每一个类都需要有__init__方法,称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法;self: 表示类的实例,定义方法时必须有,也可以叫别的,that都可以。- 当我们创建一个新的实例时
stu1 = Student,此时的stu1即为self。
- 当我们创建一个新的实例时
举个例子~
- 解释一下stu1.outStuCount()做了什么,其实是执行了Student.outStuCount(stu1),因为
stu1 = Student('ZJX', 'female')其实就是创建了stu1实例,self就是stu1,即stu1是根据Student这个类,实例化出来的具体实例。 - 记录一个我犯的小错误:一开始我把输出的
stu1.outStuCount()写成了print(stu1.outStuCount()),控制台输出的结果如下:
为什么会这样,多输出一个None,原因是: 当我们调用print(stu1.outStuCount())时,其实进行了两次print()调用,第一次是在outSuCount函数内部,然后我们在打印outSuCount函数的结果,由于outSuCount函数没有返回任何内容,即没有return,因为隐式返回了None。
⚠️注意 :所有未显式返回值的函数最终都隐式返回 None。
1. Python的基础内置类属性
2. 类属性(class attribute)和实例属性(instance attribute)【重点】
在我们这个例子里面,Students就是类属性,stu1和stu2就是实例属性。
类变量和实例变量
- 实例变量
看一下为什么
Students.stuInfo()会报错,还记得我们在声明stuInfo(self)时,传入的self属性么,self我们之前提到过,表示的实例而不是类,这也就可以解释为什么Students.stuInfo()会报错了,因为Students是类;同理Students.name也一样会报错,因为name是实例的属性,不是类的属性。
如何让一个方法既是类方法也是实例方法呢,这里需要介绍@classmethod这个装饰器。用法很简单:
- 共有变量
模块 module
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。