加载中...

Python 基础

print 打印关键字

注释

1注释 # ,可以用快捷键就是ctrl+/这是一个单行注释注释的内容不会 被程序执行

多行注释,在Python中用'''或者"""

'''
多行注释
多行注释
多行注释
‘’‘

提高代码可读性,提高开发效率,尤其是大型项目或者团队项目有重要的意义

变量(不需要指定数据类型)

1、什么是变量?

变量其实就是个盒子,里面可以装各种东西,装了苹果,箱子和其他的东西结合的时候就属于苹果,装了香蕉 箱子和其他的东西结合的时候就属于香蕉

在python当中 其实变量的概念和初中代数的方程变量是一致的

方程式y=x*3 X就是变量 当X=2 结果其实就6 当X是不同的值的时候就是变量

只不过在计算机当中,写程序的时候 变量不仅仅可以是数字,还可以是其他的任意类型

食材+食谱->厨师==美味的菜肴

变量+逻辑->python解释器-->软件的功能

其实变量就是原材料【就是数据了】

变量=存储的数据

顾名思义:变量是一段有名字的连续存储空间,我们可以通过定义变量来申请并命名这样的存储空间,并通过变量的名字来使用这段存储空间

变量是程序中临时存放数据的场所

2、变量如何来定义和使用

变量命名 规范

变量必须以字母(a-z,A-Z)或下划线(_)开头

其他字符可以是字母,数字或_

变量分大小写

Python关键字不能用作变量名

变量不能以数字开头

查看Python关键字

见名知意,尽量使用有语义的单词命名。如使用password用作密码,username用户名。

小驼峰式命名法:第一个单词字母小写其他的单词字母大写,如userName

大驼峰式命名法:全部单词首字母大写,如UserName

下划线命名法:每个单词用_下划线链接,如user_name

数据类型

数字(num)

int(有符号整形)

long(长整形)(Python3取消)

float(浮点型)

complex(复数)adwd

布尔值(bool)

True

falsed

字符串(str)

字典(dict) 高级 数据结构

d={} #字典类型

print(type(d))
<class 'dict'>

元组(Tuple)高级 数据结构

b=() #元祖类型
print(type(b))
<class 'tuple'>

列表(list)高级 数据结构

c=[] #列表类型

print(type(c))
<class 'list'>

Type函数可以查看数据类型

>>> a=1+1
>>> type(a)
<class 'int'>
>>> b="你好"
>>> type(b)
<class 'str'>
>>> b=6>2
>>> type(b)
<class 'bool'>
>>> 

算术运算符

+加法 算术加法 a+b=10

-减法 算术减法 a-b=4

*乘法 算术乘法 a * b=21

**指数 左边的数是底数,右边是指数 a * * b=343

%取余 x%y x处于y的余数 a%b=1

/除法 x/y结果包含小数点后面的数 a/b=2.3333333335

//地板除 x//y结果是忽略小数点后面的小数位,只保留整数位 a//b=2

比较运算符

== 等于 x==y 如果x恰好等于y,则为真

!=不等于 x!=y 如果x恰好不等于y,则为真

>大于 x>y 如果x(左侧参数)大于y(右侧参数),则为真

<小宇 x<y 如果x(左侧参数)小于y(右侧参数),则为真

>= x>=y 如果x(左侧参数)大于或等于y(右侧参数),则为真

<= x<=y 如果x(左侧参数)小于或等于y(右侧参数),则为真

逻辑运算符

and x and y x,y同为真,则结果为真.如果一个为假,则结果为假

or x or y x,y有一个为真,则结果为真,全部为假则结果为假

not not x 取反 如果x为真 则结果为假 如果x为假则 结果为真

例子

#逻辑运算符  and or  not
#and 条件比较严格
#定义四个变量
a,b,c,d=23,18,10,3
print(a+b>c and  c<d)#True and False  返回false
print(c>d and a>b)#True and True 返回True
#  or 条件有一个为真 结果就为真
print('---------------or--------------------')
print(a<b or b>d)#True  有一个满足
print(a<b or b<d)#False 都不满足
# not 取反 真假切换
print('-----------------not-----------------')
print(not a>b)
#优先级
# ()-> not -> and -> or
#相同等级从左往右 ->->->->->->->->->->->->
print(2>1 and 1<4 or 2<3 and 9>6 or 2<4 and 3<2)

结果
False
True
---------------or--------------------
True
False
-----------------not-----------------
False
True

Process finished with exit code 0

赋值运算符

= 赋值运算符 将=号右边的值赋值给左边的变量

+= 加法赋值运算符 c+=a 等效于 c=c+a

-= 加法赋值运算符 c-=a 等效于 c=c-a

*= 加法赋值运算符 c * =a 等效于 c=c * a

/= 加法赋值运算符 c/=a 等效于 c=c/a

%= 加法赋值运算符 c%=a 等效于 c=c%a

** = 加法赋值运算符 c ** =a 等效于 c=c ** a

//= 加法赋值运算符 c//=a 等效于 c=c//a

例子

#赋值运算   算数运算的一个补充
# += -= *=  /= %= **=
a,b,c,d=23,18,10,3
a+=c #a=a+c  23+10
print(a)
a**=2 #a=a**2=23*23*23 等于几就相当于几次方
print(a)

结果
33
1089

Python格式化输出

python有一个简单的字符串格式化方法,使用%做占位符.%后面跟的是变量类型

例子 \n换行 \t空格

#输出 %占位符
name='张扬'
classPro='清华附中一年3班'
age=7
print('我的名字是:%s  来自[%s]今年%d岁'%(name,classPro,age))
#%s 这里的s就是str类型


结果
我的名字是:张扬  来自[清华附中一年3班]今年7岁

常用的格式化符号,其中最常用的%s %d %f

%c 字符

%s 通过 str()字符串转换来的格式化

%i 有符号十进制整数

%d 有符号十进制整数

%u 无符号十进制整数

%o 八进制整数

%x 十六进制整数(小写字母)

%e 索引符号(小写E)

%E 索引符号(大写E)

%f 浮点实数

%g %f和%e的简写

%G %f和%E的简写

例子

name='老夫子'
QQ=66666666
phone=5024193635
addr='河南省新乡市'
print("姓名:%s"%name)
print("QQ:%s"%QQ)
print("手机号:%s"%phone)
print("地址:%s"%addr)


结果

姓名:老夫子
QQ:66666666
手机号:5024193635
地址:河南省新乡市

.format(变量1,变量2) 输出

grade=int(input("请输入你的成绩:"))
addr=input('家庭住址:')
    print('成绩:{}\n地址:{}'.format(grade,addr))

Python输入 input

Python中提供了input方法来获取键盘输入 (重点:input接受的键盘输入结果都是str类型的,如果需要接收数字类型需要将str转成int)

特殊注释

#!/usr/bin/eny.pyrhon3 这个是 解释器的位置

#--coding=utf-8 中文编码

流程:

就是计算机执行代码的顺序

流程控制:

流程控制就是对计算机代码执行的顺序进行有效的管理,只有流程控制才能实现在开发当中的业务逻辑

流程控制的分类: if while

1顺序流程:就是代码一种自上而下的执行结构,也是Python默认的流程

2选择流程/分支流程:根据在某一步的判断,有选择的去执行相应的逻辑的一种结构

单分支

	if 条件表达式:
        一条条的python代码
        一条条的python代码
        一条条的python代码
        ......

双分支

	if 条件表达式:
        一条条的python代码
        一条条的python代码
        一条条的python代码
        ......
    else:
        一条条的python代码
        一条条的python代码
        一条条的python代码
        ......
        

多分支

	if 条件表达式:
        一条条的python代码
        一条条的python代码
        一条条的python代码
        ......
    elif 条件表达式:
        一条条的python代码
        一条条的python代码
        一条条的python代码
        ......
	elif 条件表达式:
        一条条的python代码
        一条条的python代码
        一条条的python代码
        ......
     ....
     else:
        一条条的python代码
        一条条的python代码
        一条条的python代码
        ......
条件表达式:比较运算符/逻辑运算符/复合的运算符

3循环流程:在一定的条件下,一直重复的去执行某段代码的逻辑[事情]


pass 占位符 表示完整的代码块结束了 退出结构

IF ELIF 可以嵌套但是要注意缩进

循环

while

#打印99乘法表
i=9
while i>=1:
    j=1
    while j<=i:
        print('{}*{}={}'.format(j,i,j*i),end="丨")
        j+=1
    i-=1
    print()
结果
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 
1*4=4 2*4=8 3*4=12 4*4=16 
1*3=3 2*3=6 3*3=9 
1*2=2 2*2=4 
1*1=1 

end=""可以不换行

例子打印三角形

row=1
while row<=7:
    j=1
    while j<=row:
        print('*',end=' ')
        j+=1
        pass
    print()
    row+=1
    pass
方向相反的
row=7
while row>=1:
    j=1
    while j<=row:
        print('*',end=' ')
        j+=1
        pass
    print()
    row-=1
    pass
结果
* 
* * 
* * * 
* * * * 
* * * * * 
* * * * * * 
* * * * * * * 


打印等腰三角形*3

# 等腰三角形
row=1
fan=10
while row<=10:
    A=1
    while A<=row:
        print(' ',end='')
        A+=1
        pass
    # Q = 1
    # while Q <= 2 * row - 1:
    #     print('*', end="")
    #     Q += 1
    #     pass
    j=1
    while j<=fan*2-1:
        print('#',end='')
        j+=1
        pass
    fan-=1
    x=1
    while x<=2*row-1:
        print('*',end="")
        x+=1
        pass
    print()
    row+=1
结果
 ###################*
  #################***
   ###############*****
    #############*******
     ###########*********
      #########***********
       #######*************
        #####***************
         ###*****************
          #*******************

for循环

for 临时变量 in 容器:

执行代码块

break 退出循环

for item in "I LOVE Python":
    if item =='E':
        break #彻底中断循环
    print(item)
结果
I
 
L
O
V

continue 跳过本次循环

for item in "I LOVE Python":
    if item=='o':
        continue
    print(item)
结果
I
 
L
V
E
 
P
y
t
h
n

while使用 : 适用于对位置的循环次数

for使用: 适用于已知的循环次数[可迭代对象便利]

高级数据类型

序列:在python当中序列就是一组按照顺序排雷的值[数据集合]

在python中 存在三种内置的序列类型:

字符串,列表,元组

优点:可以支持索引和切片的操作

特征:第一个正索引为0,指向的是左端,第一个索引为负数的时候,指向的是右端

切片: 是指截取字符串中的其中一段内容.切片使用语法:[起始下标: 结束下标: 步长]切片截取的内容不包含结束下标对应的数据,步长指的是隔几个下标获取一个字符

切片: [高级特性]可以根据下来获取序列对象的任意[部分]数据

语法结构: [start: end: step] step默认是1

字符串的常用方法.出来方法

capitalize()首字母大写

isalnum()判断是否字母和数字

islower()判断是否是小写

swapcase大写变小写,小写变大写

title()把每个单词的首字母变成大写

endswiht/starts with()是否x结束/开始

isalpha()判断是否是字母

join()循环去除所有值用xx去连接

lstrip/rstrip/strip 移除左/右/两侧空白

replace(old,new,count=None)old被换字符串,new替换字符串count还多少个.无count表示全部替换

find()检测x是否在字符串中

isdigit() 判断是否是数字"abc123",isdigit()

lower/upper 大小写转换

split()切割字符串

count()统计出现的次数

list 列表

list: python当中非常重要的数据结构,是一种有序的数据集合

特点:

1:支持增删改查

2:列表中的数据是可以变化的 [ 数据项可以变化,内存地址不会改变 ]

3:我们用中括号'[]' 来表示列表类型,数据之间用逗号 ' , ' 来分割 ,注意:数据项可以说任何类型的数据

4:支持索引和切片来进行操作

列表常用方法

append 在列表后面追加元素

count 统计元素出现的次数

extend 扩展,相当于批量添加

index 获取指定元素索引号

insert 在指定位置插入

pop 删除最后一个元素

remove 移除左边找到的第一个元素

reverse 反转列表

sort 列表排序 reverse=True 倒叙

# 怎么定义一个列表  li=[] 就定义好了
li = [1,2,3,4,5,'你好',7,8,9]  # 空列表
print(len(li))  # len函数可以获取到列表对象中的数据个数
strA='我喜欢python'   # 汉字是一个字符一个字符来定义的和英语一样
print(len(strA))
print(type(li))

# 查找
listA = ['abcd',785,12.23,'求职',True]
print(listA)  # 输出完整的列表
print(listA[0])  # 输出第一个元素
print(listA[1:3])  # 从第二个开始到第三个元素
print(listA[2:])  # 从第三个开始一直到最后
print(listA[::-1])  # 倒叙输出 读书负数 从右向左开始输出
print(listA*3)  # 连着 多次都可以 [ 复制 ]

# 增加
print('---------------增加-------------')
print("追加之前",listA)
listA.append(['李豪','a',123,True])  # 追加操作
listA.append(999)   # 追加单个
print("追加之后",listA)
listA.insert(1,'在第二个后面插入')  # 插入操作,需要指定一个位置
print("追加之后",listA)
rsData = list(range(10))  # 强制转换为list对象
print(rsData)
listA.extend(rsData)  # 扩展  等于批量添加
listA.extend([1,2,3,4,5,6,7,8])  #一样的添加
print(listA)

# 修改
print('-------------------修改-----------------------------')
print("修改之前",listA)
listA[0]='修改过了'  # 用切片索引寻找修改目标并修改
print("修改之后",listA)

#删除
listB = list(range(10,50))
print('-------------------删除-----------------------------')
print("删除之前",listB)
del listB[0]  # 单个删除
del listB[1:3]  # 批量删除数据  slice  批量之间用 ':' 链接
listB.remove(20)  # 移除指定的元素   数据的具体值
listB.pop(1)  # 每次移除指定的项  参数索引值
print("删除之后",listB)

print(listB.index(31))  # 返回的是一个索引下表

下标从0开始

tuple 元组 :

是一种不可变的序列.在创建之后不能做任何的修改

1.不可变

2.用()创建元组类型,数据项用","来分割

3.可以说任何的类型

4.当元组中只有一个元素时,要加上逗号","不然解释器会当做整形来处理

5.同样可以支持切片操作

dict字典:

字典也是python中重要的数据类型,字典是有 键值对 组成的集合 , 通常使用键来访问数据,效率非常高,和list一样 支持对数据的添加,修改,删除操作

特点:

1.不是一个序列类型 没有下标的概念, 是一个无序的 键值集合 . 是内置的高级数据类型

2.用哪个{}来表示字典对象,每个键值用逗号 "," 分割

3.键 必须是不可变的类型 [元组 , 字符串 ] 值可以是任意的类型

4.每个键必定是唯一的,如果纯在重复的键,那么后者会覆盖前者

公用方法

字符串 数组 字典等都适用

1. + 连接

2. * 复制

3. in 查找 返回bool 布尔值

函数

1.什么是函数: 一系列Python语句的组合,可以在程序中运行一次或者多次,

2. 一般是完成具体独立的功能

3.为什么要是用函数

4. 代码的附庸最大化以及 最小化冗余代码, 整体代码结构清晰 , 问题局部化

函数的定义:

def + 关键字 +小括号 +冒号 + 换行缩进 + 代码块 定义一个函数

def 函数名():

函数体[一系列的python语句,表示独立的功能]

函数的调用:

本质上就是去执行函数定义里面的代码块,在调用函数之前 必须先定义

def 函数名():

​	代码块

函数的调用:

函数名加()即可调用该函数

函数说明文档:

函数内容的第一行可以用字符串进行函数说明

函数的4中基本类型

1.无参数 ,无返回值 ,一般用于提示信息打印.

2.无参函数,有返回值,多用在数据采集中,比如获取系统信息.

3.有参数,无返回值,多用子啊设置某些不需要返回值的参数设置

4.有参数,有返回值,一般是计算型的,需要参数,最终也好返回结果.

局部变量 [优先使用]

就是在函数内部定义的变量.

作用于仅仅局限在函数的内部. 只在函数内生效 互不干扰

不同的函数,可以定义相同的局部变量, 但是各自用各自的不回产生影响

局部变量的作用: 为了临时的保存数据 需要在函数中定义来进行存储

全局变量

定义一个全局变量[作用于的范围不同]

在最外层定义的变量

但是如果全局变量遇到局部变量并相同的情况下,程序会优先使用函数内部变量

如果在函数内部项对全局变量进行修改的话, 必须用global 关键字进行声明

变量的关键字

global 修改全局变量

引用

小结

1. 在python当中 万物皆对象,在函数调用的时候,实参传递的就是对象的引用

2. 了解了远离之后,就可以更好的去把控 在函数内部的处理是否会影响到函数外部数据变化

3. 重要的事情说三遍↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

参数的传递其实就是通过对象引用来完成,

参数传递是通过对象引用来完成,

参数传递是通过对象引用来完成

匿名函数

python中使用lambda关键字来创建匿名函数,所谓匿名即这个函数没有名字不用def关键字创建标准的函数

例1:

lambda 参数1,参数2,参数3:执行代码语句
# 使用lambda表达式计算两个数和:
test =lambda x,y:x+y
test(1,3)
test(4,5)
# 换成普通的韩式其实是这样的
def test(x,y):
    return x + y

例2:

# 匿名函数
# 语法:
# lambda 参数1,参数2,参数3:表达式
# 特点
# 1.使用lambda关键字去创建函数
# 2.不需要名字,没有名字
# 3.匿名函数冒号后面的表达式有且只有一个,
# ↑ 注意:是表达式,而不是语句
# 4.自带了一个retun, 而这个return的结果就是表达式计算后的结果
def 求和(x,y):
    '''
    计算两个数的和
    :param x:
    :param y:
    :return:
    '''
    return x+y
    pass
#对应的匿名函数
m = lambda x,y:x+y
# 通过变量去调匿名函数
print(m(23,19))
# print(求和(10,45))
c=lambda a,b,c:a*b*c
# 调用
print(c(1,2,3))

 
输出结果
42
6

例3: 里含标准双分支

# 双分支
age = 25
print('可以参军'if age>18 else '继续上学')  # 可以替代窜通双分支写法

输出
'可以参军'

#比较最大值
b = lambda x,y:x if x>y else y
print(b(12,14))

输出
14

#还可以这么写 更简洁
b = (lambda x,y:x if x>y else y)(16,12) # 直接的调用
print(b)

输出
16

递归 没看太懂有时间复习一下

代码块例子

# 递归条件的瞒足
# 自己调用自己
# 必须有一个明确的结束条件
# 优点: 逻辑简单,定义简单.
# 缺点: 容易,导致栈溢出,内存资源紧张, 甚至内存泄漏
# 求阶乘
# 循环的方式去实现

# def 阶乘(参数):
#     值=1
#     for item in range(1,参数+1):
#         值*=item
#         pass
#     return 值
# print('5的阶乘{}'.format(阶乘(5)))
# 递归方式去实现
def 递归阶乘(参数):
    '''
    递归实现
    :param 参数: 阶乘参数
    :return:
    '''
    if 参数==1:
        return 1
    else:
        return 参数*递归阶乘(参数-1)
        pass
    pass
# 递归调用

print('5的递归阶乘{}'.format(递归阶乘(5)))

# 递归案例 模拟实现 树形结构的便利
import os #引入文件操作模块 简称OS模块
def 查找文件(文件路径):
    listRs= os.listdir(文件路径) # 得到改路径下面所有的文件夹
    for 文件 in listRs:
        文件地址 =os.path.join(文件路径,文件) # 获取完整的文件路径
        if os.path.isdir(文件地址): # 判断是否是文件夹
            查找文件(文件)
        else:
            print(文件)
            pass
        pass
    else:
        return
    pass

# 调用搜索文件对象
查找文件('E:\\学习资料上课笔记')

python 内部函数

也叫 内嵌函数

就是python 在安装的时候就集成到python 中的函数直接调用就好

直接拿来用就行

数学运算你函数

abs() 求绝对值函数

round() 四舍五入 求近似数的

注意 : 这里不是 完全按照四舍五入或者四舍六入 武城双来进行取值的,取值和python的版本有关系,还和浮点数的精度有关

pow() 求幂运算的

divmod() 求余和商的

max() 求最大值

min() 求最小值

sum() 求和

eval() 动态执行的

如果要给执行的赋值的话必须使用字典类型

例子

# abs() 取绝对值
print(abs(-123))
# round()  取近似的值
print(round(3.66)) #不保留小数位
print(round(3.66,1)) #保留1位小数
# pow() 求次方
print(3**3)  #也可以求出来3 的 3 次方
print(pow(3,3))  # 3 的 3 次方
# divmod() 求商和余数
print(divmod(10,2)) # 求商求余
# max() 求最大值
print(max([999,99999,1203105123,124])) #可以是列表 ,元组 等等
# min() 求最小值
print(min(12,1245,2156362,0.2))
# sum() 求和
print(sum([1,2,3,4,5,6,7,8,9]))
print(sum([1,2,3,4],10))
print(sum((1,2,3,4,5,6,7,8,9),1))
print(sum((1,1)))
# eval() 执行字符串表达式  动态执行
a,b,c=1,2,3
print('动态执行的函数={}'.format(eval('a+b+c')))
def tesaa():
    print('我执行了吗?')
    pass
eval('tesaa()')  # 可以调用函数执行

类型转换函数

int()

float()

str()

ord()

chr() # 将数字转换为阿斯克码

bool() # 布尔类型

bin() # 转换成刚二进制

hex() # 转换成刚十六进制

oct()

list() # 强制转换成列表模式

tuple()# 强制转换成元组模式

dict() # 声明一个字典或转换成一个字典

bytes() # 转为字节数

例子:

# 类型转换
# bin() # 转换成刚二进制
# bool() # 布尔类型
# chr() # 将数字转换为阿斯克码
# print(hex(23)) # 转换成16进制
# 元组转换成列表
tup = (1,2,3,4,5,6,7,8,9)
print(type(tup))
li = list(tup)
print(type(li))
tupli = tuple(li)
print(type(li))
字典的操作 dict()
dic = dict(name = '小明',age = 18)  # 创建一个字典
print(type(dic))
# dict['name']='小明'
# dict['age']=18
print(dic)

# bytes 转换成字节数
print(bytes('我喜欢python',encoding='utf-8'))

序列操作函数 序列包含(字符串 元组 列表)

all() #主要用来判断给定的可迭代参数 iterable 中的所有元素是否都为TRUE ,如果是返回True,否则返回False元素除了是0 空 FALSE 外都是 TRUE

注意: 空元组,空列表返回值为true

any() #用于判断给定的可迭代参数 iterable 是否全部为False,则返回False,如果有一个为True 则返回True

注意 : 除了是 0 空 False 外都算True

sorted() #函数对所有可迭代的对象进行排序操作,

","(逗号)reverse = True 或False 默认的是False 是升序

.key = str.lower #字符串于大小写无关

返回一个新的list 并不会修改原始值 sort 会修改

sort与sorted 区别 :

  • sort是应用在list上的方法,sorted可以对所有可迭代的队形进行排序操作
  • list的sort方法返回的是对已经存在的列表进行操作,而内建函数sorted 方法返回的是一个新的list,而不是在原来的基础上进行的操作

reverse() # 函数用于反向列表中元素

语法: list.reberse()

返回值: 该方法没有返回值 , 但是会对列表的元素进行反向排序

range() # 函数可创建一个整数列表, 一般用在for 循环中

语法 range(start,stop[, step])

参数:

  • start : 计数从 start 开始默认是从0开始列入 range(5)等价于range(0,5)
  • stop : 计数到stop结束 , 但不包括 stop 列如: reange(0,5)是[0,1,2,3,4]没有5
  • step: 步长,默认为1列如: range(0,5)等价于range(0,5,1)

zip() # 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表 如果各个迭代器的元素个数不一致,则返回列表长度于最短对象相同,利用*号操作符,可以将元组解压为列表

语法: zip([iterable,...])

参数: iterabl -- 一个或多个迭代器:

返回值:返回 元组列表

如果可迭代对象的元素个数不一样,name按照最少的那个迭代压缩最少元素进行可迭代对象结束后退出

enumerate()

导入OPENPYXL库

代码
import openpyxl
或者是
form openpyxl import Workbook
form openpyxl import load_wrokbook

posted @ 2021-06-17 10:32  语零  阅读(714)  评论(0)    收藏  举报