基础知识

1
type(被查看类型的数据)

字符串定义:

三引号:

1
2
3
4
5
text = """
在三个引号的范围内
全部都是
字符串
"""

字符串拼接:

​ 使用+直接相加,字符串无法和非字符串变量进行拼接,因为类型不一致,无法接上,就像接力赛一样,不是队友,不能接力的哦

字符串格式化:

1
2
3
4
5
6
7
8
9
name = "111"
class_nem = "222"
message = "222 %s" % name # % 表示:我要占位 ,s表示:将变量变成字符串放入占位的地方
message = "222 %s , 333%s" % (name , class_nem) 多个变量占位变量要用括号括起来并按照占位的顺序填入
#可以使用辅助符号"m.n"来控制数据的宽度和精度

#快速写法
print(f"我是{name},成立于:{set_up_year}") #这种写法不做精度控制也不理会类型,适用于快速格式化字符串

1
2
3
4
5
6
#input()语句的功能是,获取键盘输入的数据
name = input()
#可以使用:input(提示信息),用以在使用者输入内容之前显示提示信息。

# 要注意,无论键盘输入什么类型的数据,获取到的数据永远都是字符串类型

数据类型转换

1
2
3
int(x)  #将x转换为一个整数
float(x) #将x转换为一个浮点数
str(x) #将x转换为一个字符串

标识符命名规范

不推荐使用中文、数字不可以开头

运算符

运算符 描述 实例
+ 两个对象相加 a + b 输出结果 30
- 得到负数或是一个数减去另一个数 a - b 输出结果 -10
* 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 200
/ b / a 输出结果 2
// 取整除 返回商的整数部分 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0
% 取余 返回除法的余数 b % a 输出结果 0
** 指数 a**b 为10的20次方, 输出结果 100000000000000000000

循环语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
while condition:
循环体


for 临时变量 in 待处理数据集:
循环满足条件时执行的代码
#待处理数据集包括:字符串、列表、元组、等
range(num) #获取一个从0开始,到num结束的数字序列(不含num本身)
range(num1,num2) #获得一个从num1开始,到num2结束的数字序列(不含num2本身)
range(num1,num2,step) #获得一个从num1开始,到num2结束的数字序列(不含num2本身)数字之间的步长,以step为准(step默认为1)
注意点:

for i in range(5):
print(i)
print(i)
在实际中,第二个print也能访问到i,但是在编程规范上,是不允许、不建议这么做的

#continue : 中断本次循环,直接开始下次循环
#break : 直接结束所在循环



# 定义字符串name
name = ”itheima”
# for循环处理字符串
for x in name:
print(x)

函数

函数定义

1
2
3
4
5
6
7
8
def 函数名(传入参数):
函数体
return 返回值

#函数调用
函数名(参数)

如果函数没有使用return语句返回数据,函数有一个返回值None

局部/全局变量

1
2
3
4
5
6
7
8
9
☆ 使用 global关键字 可以在函数内部声明变量为全局变量
num = 100
def test():
global num
num = 200
pring(num)
print(num)
#输出为200

函数进阶

多个返回值
1
2
3
4
5
def test():
return 1,2
x,y=test()
print(x) # 1
print(y) # 2

按照返回值的顺序,写对应顺序的多个变量接收即可

变量之间用逗号隔开

支持不同类型的数据return

传参形式

位置参数

1
2
3
4
5
6
def user(name , age , gender):
print(f'您的名字{name},年龄是{age},性别是{gender}')

user('Tom',20,'男')

#传递的参数和定义的参数的顺序及个数必须一致

关键字参数

函数调用时通过“键=值”形式传递参数

1
2
3
4
5
6
7
8
9
10
def user(name , age , gender):
print(f'您的名字{name},年龄是{age},性别是{gender}')

# 关键字传参
user(name="小明",age="20",gender="男")
# 可以不按照固定顺序
user(age="20",name="小明",gender="男")

# 可以和位置参数混用,位置参数必须在前,且匹配参数顺序
user("小名",age="20",gender="男")

缺省参数

缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)

1
2
3
4
5
6
7
def user(name , age , gender):
print(f'您的名字{name},年龄是{age},性别是{gender}')

user("Tom",20)
user('rose',18,"女")

# 函数调用时,如果为缺省参数传值则修改默认参数值, 否则使用这个默认值

不定长参数

不定长参数也叫可变参数. 用于不确定调用的时候会传递多少个参数(不传参也可以)的场景

不定长参数的类型

①位置传递

1
2
3
4
5
6
7
def user(*args):
print(args)

user("Tom")
user('rose',18)

# 传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是位置传递

②关键字传递

1
2
3
4
5
6
def user(**args):
print(kargs)

user(age="20",name="小明",gender="男")

# 参数是“键=值”形式的形式的情况下, 所有的“键=值”都会被kwargs接受, 同时会根据“键=值”组成字典.
匿名函数

函数作为参数传递

1
2
3
4
5
6
7
8
def test(compute):
result = compute(1,2)
print(result)

def compute(x, y):
return x + y

test(compute) # 输出结果为3

这是一种计算逻辑的传递,而非数据的传递

lambda匿名函数

数据容器

特性 list tuple str set dict
形式 list=[, , , ,] tuple = (,,,)
变量名=tuple(,,,)
元组只有一个数据时也要添加逗号
字符串是字符的容器str=“” set={,,,} dic={key:value,key:value}
索引 从0开始,list[0]
list[-1]、list[-2]反向
嵌套:list[0][0]
从0开始,list[0]
list[-1]、list[-2]反向
嵌套:list[0][0]
从0开始,list[0]
list[-1]、list[-2]反向
嵌套:list[0][0]
数据类型 任何且可以嵌套 任何且可以嵌套 只能是字符 Key和Value可以是任意类型的数据(key不可为字典)
常见操作 方法列表 index(),
统计某个数据再当前元组出现的次数count()
,len(元组)
字符串方法列表 集合方法列表 字典方法列表
是否允许重复 否(因为要去重,所以无法保证顺序)
可以修改吗c 否,但是可以修改元组内的list内容
是否有序存储(或是否支持while循环)
支持for循环
set1 = {1,2,3}
for i in set1:
print(i)

image-20231021171645164
使用场景 可修改、可重复的一批数据记录场景 不可修改、可重复的一批数据记录场景 一串字符的记录场景 不可重复的数据记录场景 以Key检索Value的数据记录场景

序列

内容连续、有序,可使用下标索引的一类数据容器(列表、元组、字符串,均可以可以视为序列)

序列支持切片

切片:从一个序列中,取出一个子序列

语法:序列[起始下标:结束下标:步长]

1
2
3
4
5
6
7
8
9
10
11
my_list = [1, 2, 3, 4, 5]
new_list = my_list[1:4]
print(new_list) # 结果:[2, 3, 4]

my_str = "12345"
new_str = my_str[::-1] # 从头(最后)开始,到尾结束,步长-1(倒序)
print(new_str) # 结果:"54321"

my_tuple = (1, 2, 3, 4, 5)
new_tuple = my_tuple[:1:-2] # 从头(最后)开始,到下标1(不含)结束,步长-2(倒序)
print(new_tuple) # 结果:(5, 3)

步长为负数表示,反向取(注意,起始下标和结束下标也要反向标记)

此操作不会影响序列本身,而是会的得到一个新的序列

list的方法

编号 使用方式 作用
1 列表.append(元素) 向列表中追加一个元素
2 列表.extend(容器) 将数据容器的内容依次取出,追加到列表尾部
3 列表.insert(下标, 元素) 在指定下标处,插入指定的元素
4 del 列表[下标] 删除列表指定下标元素
5 列表.pop(下标) 删除列表指定下标元素
6 列表.remove(元素) 从前向后,删除此元素第一个匹配项
7 列表.clear() 清空列表
8 列表.count(元素) 统计此元素在列表中出现的次数
9 列表.index(元素) 查找指定元素在列表的下标 找不到报错ValueError
10 len(列表) 统计容器内有多少元素

列表while循环

1
2
3
4
5
6
7
8
while index < len(列表)
元素 = 列表[index]
index += 1

for 临时变量 in 数据容器:
对临时变量进行处理


字符串的方法

编号 操作 说明
1 字符串[下标] 根据下标索引取出特定位置字符
2 字符串.index(字符串) 查找给定字符的第一个匹配项的下标
3 字符串.replace(字符串1, 字符串2) 将字符串内的全部字符串1,替换为字符串2 不会修改原字符串,而是得到一个新的
4 字符串.split(字符串) 按照给定字符串,对字符串进行分隔 不会修改原字符串,而是得到一个新的列表
5 字符串.strip() 字符串.strip(字符串) 移除首尾的空格和换行符或指定字符串
6 字符串.count(字符串) 统计字符串内某字符串的出现次数
7 len(字符串) 统计字符串的字符个数

集合的方法

编号 操作 说明
1 集合.add(元素) 集合内添加一个元素
2 集合.remove(元素) 移除集合内指定的元素
3 集合.pop() 从集合中随机取出一个元素
4 集合.clear() 将集合清空
5 集合1.difference(集合2) 得到一个新集合,内含2个集合的差集 原有的2个集合内容不变 (集合1有而集合2没有的)
6 集合1.difference_update(集合2) 在集合1中,删除集合2中存在的元素 集合1被修改,集合2不变
7 集合1.union(集合2) 得到1个新集合,内含2个集合的全部元素 原有的2个集合内容不变
8 len(集合) 得到一个整数,记录了集合的元素数量

字典的方法

编号 操作 说明
1 字典[Key] 获取指定Key对应的Value值
2 字典[Key] = Value 添加或更新键值对
3 字典.pop(Key) 取出Key对应的Value并在字典内删除此Key的键值对
4 字典.clear() 清空字典
5 字典.keys() 获取字典的全部Key,可用于for循环遍历字典
6 len(字典) 计算字典内的元素数量

容器通用功能

功能 描述
通用for循环 遍历容器(字典是遍历key)
max 容器内最大元素
min() 容器内最小元素
len() 容器元素个数
list() 转换为列表
tuple() 转换为元组
str() 转换为字符串
set() 转换为集合
sorted(序列, [reverse=True]) 排序,reverse=True表示降序 得到一个排好序的列表

文件操作

打开函数

使用open函数,可以打开一个已经存在的文件,或者创建一个新文件

1
2
3
4
5
6
7
8
9
10
open(name,mode,encoding)
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读、写入、追加等。
encoding:编码格式(推荐使用UTF-8


f = open('python.txt', 'r', encoding=”UTF-8)
# encoding的顺序不是第三位,所以不能用位置参数,用关键字参数直接指定

# 此时的`f`是`open`函数的文件对象,对象是Python中一种特殊的数据类型,拥有属性和方法,可以使用对象.属性或对象.方法对其进行访问
模式 描述
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。 如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,新的内容将会被写入到已有内容之后。 如果该文件不存在,创建新文件进行写入。

读操作

read()方法:

1
文件对象.read(num)

num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。

readlines()方法:

readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。

1
2
3
4
5
6
7
8
9
f = open('python.txt')
content = f.readlines()

# ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc']
print(content)

# 关闭文件
f.close()

readline()方法:

一次读取一行内容

1
2
3
4
5
6
7
8
9
10
f = open('python.txt')

content = f.readline()
print(f'第一行:{content}')

content = f.readline()
print(f'第二行:{content}')

# 关闭文件
f.close()

for循环读取文件行:

1
2
for line in open("python.txt", "r"):
print(line)

# 每一个line临时变量,就记录了文件的一行数据

close()关闭文件对象:

1
2
3
f = open("python.txt", "r")

f.close()

最后通过close,关闭文件对象,也就是关闭对文件的占用

如果不调用close,同时程序没有停止运行,那么这个文件将一直被Python程序占用。

with open语法:

1
2
with open("python.txt", "r") as f:
f.readlines()

通过在with open的语句块中对文件进行操作

可以在操作完成后自动关闭close文件,避免遗忘掉close方法

操作 功能
文件对象 = open(file, mode, encoding) 打开文件获得文件对象
文件对象.read(num) 读取指定长度字节 不指定num读取文件全部
文件对象.readline() 读取一行
文件对象.readlines() 读取全部行,得到列表
for line in 文件对象 for循环文件行,一次循环得到一行数据
文件对象.close() 关闭文件对象
with open() as f 通过with open语法打开文件,可以自动关闭

写操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 打开文件
f = open('python.txt', 'w')
"""
文件如果不存在,使用”w”模式,会创建新文件
文件如果存在,使用”w”模式,会将原有内容清空
"""

# 2.文件写入
f.write('hello world')


# 3. 内容刷新
f.flush()
# close()方法,带有flush()方法的功能

直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区

当调用flush的时候,内容会真正写入文件

这样做是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)

文件追加

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 打开文件,通过a模式打开即可
f = open('python.txt', 'a')
"""
a模式,文件不存在会创建文件
a模式,文件存在会在最后,追加写入文件
"""
# 2.文件写入
f.write('hello world')
# 可以使用”\n”来写出换行符

# 3. 内容刷新
f.flush()

面向对象

self

定义在类内部的函数称之为方法

可以看到,在方法定义的参数列表中,有一个:self关键字

self关键字是成员方法定义的时候,必须填写的。

它用来表示类对象自身的意思

当我们使用类对象调用方法的是,self会自动被python传入

在方法内部,想要访问类的成员变量,必须使用self

1
2
3
4
5
6
7
8
9
10
class student:
name = None
def say(self):
print("hello")
def say2(self,msg):
print(f"hello , {msg}")

stu1 = student()
stu.say() # 调用的时候无需传参
stu.say("很高兴认识") # 调用的时候需传msg参数

可以看到,在传入参数的时候,self是透明的,可以不用理会它。

构造方法

在创建类对象(构造类)的时候,会自动执行。

在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Student:
name = None
age = None
tel = None

def __init__(self, name, age, tell):
self.name = name
self.age = age
self.tel = tel
print("Student类创建了一个对象")

stu = Student("周周",31,"13332282802")

"""
构建类时传入的参数会自动提供给__init__方法
构建类的时候__init__方法会自动执行
"""

为了将一个类实例当做函数调用,我们需要在类中实现__call__()方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class X(object):
def __init__(self, a, b, range):
self.a = a
self.b = b
self.range = range
def __call__(self, a, b):
self.a = a
self.b = b
print('__call__ with ({}, {})'.format(self.a, self.b))
def __del__(self, a, b, range):
del self.a
del self.b
del self.range



>>> xInstance = X(1, 2, 3)
>>> xInstance(1,2)
__call__ with (1, 2)

内置方法(魔法方法)

通过__str__方法,控制类转换为字符串的行为

1
2
3
__str__ 字符串方法 
返回值: 字符串
内容:自行定义
1
2
3
4
5
6
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Student类对象,name={self.namm}, age={self.age}"

通过__lt__小于符号比较方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Student:
def __init__(self, name, age):
self.name = name
self.age = age

stu1 = Student("周杰伦", 11)
sut2 = Studnet("林俊杰", 13)
print(stu1 < stu2) # 报错


class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __lt__(self, other):
return self.age < other.age

stu1 = Student("周杰伦", 11)
sut2 = Studnet("林俊杰", 13)
print(stu1 < stu2) # true
print(stu1 > stu2) # false

通过__le__小于等于符号比较方法

1
2
3
4
5
6
7
8
9
10
11
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __le__(self, other):
return self.age < other.age

stu1 = Student("周杰伦", 11)
sut2 = Studnet("林俊杰", 13)
print(stu1 < stu2) # true
print(stu1 > stu2) # false

通过__eq__比较运算符

1
2
3
4
5
6
7
8
9
10
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __e1__(self, other):
return self.age == other.age

stu1 = Student("周杰伦", 11)
sut2 = Studnet("林俊杰", 13)
print(stu1 == stu2) # true

不实现__eq__方法,对象之间可以比较,但是是比较内存地址,也即是:不同对象==比较一定是False结果。

实现了__eq__方法,就可以按照自己的想法来决定2个对象是否相等了

封装

私有成员

私有成员变量:变量名以__开头(2个下划线)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cIass Phone:
IMEI = None # 序列号
producer = None # 厂商

__current_voltage = None # 当前电压

def call_by_5g(se1f):
print("5g通话已开启")

def __keep_single_core(se1f):
print("让CPU以单核模式运行以节省电量")

phone = Phone()
phone._current_voltage = 33 # 私有变量赋值不报错,但无效
print(phone._current_voltage) # 获取私有变量值报错,无法使用

私有成员方法:方法名以__开头(2个下划线)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cIass Phone:
IMEI = None # 序列号
producer = None # 厂商

__current_voltage = None # 当前电压

def call_by_5g(se1f):
print("5g通话已开启")

def __keep_single_core(se1f):
print("让CPU以单核模式运行以节省电量")

phone = Phone() # 创建对象
phone.__keep_single_core() # 使用私有方注 会报错

私有成员无法被类对象使用,但是可以被其它的成员使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cIass Phone:
IMEI = None # 序列号
producer = None # 厂商

__current_voltage = None # 当前电压

def call_by_5g(se1f):
if self.__current_voltage >= 1:
self.__keep_single.core()
print("5g通话已开启")
else
print("通话失败,电量不足")

def __keep_single_core(se1f):
print("让CPU以单核模式运行以节省电量")

继承

单继承
1
2
3
4
5
6
7
8
9
10
11
12
13
cIass Phone:
IMEI = None # 序列号
producer = None # 厂商

def call_by_4g(se1f):
print("4g通话已开启")


cIass Phone2022(Phone):
face_id = True # 面部识别

def call_by_5g(se1f):
print("5g通话已开启")

将从父类那里继承(复制)来成员变量和成员方法(不含私有)

多继承

一个类,可以继承多个父类

1
2
3
4
5
cIass Phone2022(Phone, NFC, RemoteControl):
face_id = True # 面部识别

def call_by_5g(se1f):
pass

多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级。先继承的保留,后继承的被覆盖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Phone:
IMEI = None # 序列号
producer = None # 厂商

def call_by_5g(se1f):
print("5g通话已开启")

class NFCReader:
nfc_type ="第五代"
producer ="HM"
def read_card(se1f):
print("读取NFC卡")
def write_card(self):
print("写入NFC卡")
class Remotecontro1:
rc_type = "红外遥控"
def contro1(self):print("红外遥控开启")

class MyPhone(phone,NFCReader, Remotecontro1):
pass

my_phone = MyPhone()
print(My_phone.producer) # 结果为None而非"HM"
复写
1
2
3
4
5
6
7
8
9
10
11
12
class Phone:
IMEI = None # 序列号
producer = None # 厂商

def call_by_5g(se1f):
print("5g通话已开启")


class MyPhone(phone):
producer = "小米" # 复写父类属性
def call_by_5g(se1f):
print("子类5g通话已开启") # 复写父类方法
调用父类同名成员

1

使用成员变量:父类名.成员变量

使用成员方法:父类名.成员方法(self)

2

使用成员变量:super().成员变量

使用成员方法:super().成员方法()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Phone:
IMEI = None # 序列号
producer = "xuliehao" # 厂商

def call_by_5g(se1f):
print("5g通话已开启")

class MyPhone(phone):
producer = "小米" # 复写父类属性
def call_by_5g(se1f):
# 方式1调用父类成员
print(f"父类的品牌是: {phone.producer}")
phone.call_by_5g(se1f)

# 方式2调用父类成员
print(f"父类的品牌是:{super().producer}")
super().ca11_by_5g()
print("子类的5g通话”)

画图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import matplotlib #引入画图数据库
import matplotlib.pyplot as plt
import numpy as np

# Data for plotting

x1=[1,2,3]
x2=[2,3,4]
x3=[3,4,5]
x4=[4,5,6]
y1=[2,5,7]
y2=[4,5,8]
y3=[5,7,9]
y4=[1,5,0]
plt.plot(x3,y3,linewidth =3.0, label = '第一个线名字',color='#F27970', linestyle='-',marker=",")
#功能依次为线粗、标签(图例)、颜色、线类型、点形状
plt.plot(x2,y2,linewidth =3.0, label = '第二个线名字',color='#00CC96', linestyle='-',marker=",")
plt.plot(x4,y4,linewidth =3.0, label = '第三个线名字,color='#10A5EA', linestyle='-',marker=",")
plt.plot(x1,y1,linewidth =3.0, label = '第四个线名字',color='#8983BF', linestyle='-',marker=",")
plt.xlabel("generation") #X轴信息
plt.ylabel("fitness") #y轴信息
plt.title("Ant") #标题
spines[:].set_visible(False) #不显示边框
plt.legend() #标签显示(一般称为图例)
plt.savefig('myplot.pdf') #保存为pdf格式
plt.show()