导图社区 Python基础
这是一篇关于Python基础的思维导图,介绍了内置对象、一些描述程序的专业术语、模块和包、文件的读写、异常处理、实践项目函数、类、语句几个方面的知识点,希望梳理的内容对大家有用喔!
编辑于2021-08-03 22:27:00Python基础
内置对象
一些描述程序的专业术语
计算机程序:是一组指示计算机或其他具有信息处理能力的设备的每一步操作的指令集合
源代码:用某种高级语言编写的程序
源文件:保存源代码的文件
本地代码:计算机(CPU)能直接执行的机器语言程序,用任何编程语言编写的源代码,最后都要被翻译为本地代码,否则CPU无法理解
编译:用编译器(一种程序)将源代码全部翻译成本地代码的过程
编译型语言:编写的代码需要编译后才能执行的语言
解释:用解释器(一种程序)在源代码执行过程中,对源代码进行解释
解释型语言:编写的代码通过解释器来运行的代码
模块和包
标准库
调用方式
import 库名称
调用函数:库名称 . 函数
from 库名称 import 函数名
from 库名称 import 函数名 as 新名称
from 库名称 import * #调用该库中的所有函数
import 库名称 as新名称 #更改库名称
子主题
第三方包
安装方式
pip3 install 第三方库名#要注意电脑中的Python版本,如果是Python2系列的写pip即可
pip3 install 第三方库名称==版本号#安装特定版本的第三方库
pycharm 中命令行设置:在Terminal 窗口写入命令
查看已安装的第三方库:pip3 list
删除对应第三方包(库):pip3 uninstall 库名称
pypi 镜像:pip在国内的镜像,防止下载中网络超时
搭建库
隐藏部分语句:将要隐藏的语句写到 if __name__=='__main__' 的代码块下#即判断该文件的执行是否在编译器中,如果作为库导入则不会执行该代码块下的语句,注意‘’__name__‘’是该模块的属性
当库的搜索路径不在Terminal搜索路径下(不在同一目录),可以通过在Terminal中用 sys.path 查看搜索路径,用sys.path.append()追加库的搜索路径以实现调用
包
包含 .py文件或子目录 和__init__.py(可以为空)文件(有一定层次的目录结构)
在命令行中通过tree查看包,在包的目录树的每一层都要包含__init__.py文件
.pyc文件:当第一次执行某个Python 程序时(.py文件)解释器在翻译代码时同时会生成.pyc文件,当程序作为模块被调用时则会生成目录结构(树),当再次访问该文件(程序)时,如果其源代码没有发生修改则会直接执行,否则会先翻译在执行
包的本质就是模块:因此导入包的语法与导入模块的语法一致
现在第三方库时如果超时可以更换下载源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 库名(清华源)
文件的读写:
标准库:os函数
os.getcwd()#查看当前工作目录
写或导出创建文件:open(文件名字符串,"w") #如果在当前文件夹内(源文件所在文件夹)已有同名文件则会进行覆盖,如果没有就会新建,返回值对应文件
写入数据,设文件对应变量f:f.write(内容) 写完数据后 f.close()才能将写入的数据保存
读取文件:open(文件名字符串,’r‘) #'r'是默认的可以不写 f.read()#返回文件内容
with open(文件名字符串,"a") as f: #将结果返回给变量f f.write("\n Haiest la MEIT") #上下文管理器,可以不用再写f.close()来保存文件内容
由于读取产生的对象是迭代器对象,可以用for循环按行输出: for line in f: print(line,end=' ')#将末尾的'\n'换成空,防止行与行间有多余的空行 由于是迭代器对象要注意读取后的初始化(初始化方法2:f.seek(0))
打开模式
r
以读的模式打开文件。默认打开模式
w
以写的模式打开文件,如果文件已经存在则覆盖原文件,否则新建文件
a
以写的方式打开文件。如果文件已经存在,则指针指向文件最后,实现像文件中追加新的内容;否则新建文件
b
以二进制模式打开文件。不单独使用,配合r/w/a等模式使用
+
同时实现读写操作。不单独使用,配合r/w/a等模式使用
x
创建文件,但如果文件存在,则无法创建
csv(逗号分隔值文件):纯文本形式存储表格
调用csv库
创建csv文件: with open(file,"w",newline='') as f:#newline=''可以消除空行 writer=csv.writer(f) writer.writerows(要写入的内容或对象)
csv.writer(指定文件对应的对象)#选定需要操作的文件
.writerows(要写入的内容或对象)#由于csv文件是特殊的表格文件,因此需要其内置的函数进行写入操作
操作excel文件
安装第三方库:pip3 install openpyxl
from openpyxl import Workbook wb=Workbook()#实例化,创建工作簿 ws=wb.active #获得工作表(创建工作表) ws.title #返回工作表的标题(默认为“Sheet”),可以通过赋值语句修改 注:工作簿包含工作表,一个工作簿可由多个工作表 wb.sheetnames #返回工作簿wb内包含的工作表名称(注:是.title 内的内容)
数据操作
ws['E1'] = 111 #给ws对应的工作表的第E列第1行赋值111
ws.cell(row=2,colum=2,value=222)#给excel表格的B2单元格赋值222
保存以上数据:wb.save(保存生成的文件名注意后缀:xlsx)#注意要保存工作簿不是工作表
注意excel文件的索引开始是1,第一个单元格是A1
异常处理
意义:防止程序因为一些错误而中断
分类:Python中的错误包含语法错误和异常
语法错误:由Python解释器运行时处理
异常:如逻辑错误
常见异常类型:
NameError :尝试访问没有申明的变量
ZeroDivisionError:除数为零
SyntaxError:语法错误
IndexError:索引超出序列范围
KeyError:请求一个不存在的字典关键字
IOError:输入输出错误(要读取的文件不存在)
AttributeError:尝试访问位置的对象属性
格式:try: 正常执行的语句 except 异常的关键词(申明异常类型) :#用于捕获异常 用于异常处理的语句(例如输出相关提示)
try语句用于检测其代码块的执行异常,except用于捕获相关异常在其代码块下处理异常
except后写异常名称:捕获对应异常
except不写一场名称:捕获所有异常(无目的性,使用价值低)
except后写多个异常名称:只要发生指定的异常中的任意一个,就会执行对应代码块
else(写在try,except等位置上):当没有异常(except没有捕获到异常)则会执行else下的代码块
try finally语句:无论是否发生异常都会在程序结束时执行finally下的代码块
raise语句(except等位置)执行该语句后程序会结束
捕获异常参数: except 异常类型 as Argument: print(,Argument)
自定义异常类型
理解异常也是对象,可以通过创建类来自定义异常
子主题
class Networkerror(Exception):
def __init__(self, arg): self.args = arg try: raise Networkerror("Bad hostname") except Networkerror as e: print(e.args)
注意事项:一定要编写函数或写raise语句将自定义异常抛出
实践项目
语音合成系统
认识SDK:(Software Development Kit软件开发工具包):是开发工具的集合
例:百度语音平台(ai开放平台)--->语音合成--->帮助文档--->pythonsdk(内置教程)
认识API:(Application Programming Interface应用程序接口):是一些预先定义的函数或指软件系统不同组成部分衔接的约定。 用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。
网络爬虫
SQLite数据库
是小型关系型数据库,不需要单独的服务,零配置,Python内置驱动模块像操作文件一样操作
用法
语句
简单语句
引入模块
import 模块
from 模块 import 方法
from 模块 import 方法 as //引入的同时重新命名
from 模块 import 方法,方法,方法
赋值语句
对象=被引用对象//注:是一种引用关系//并且可以将多个对象赋值给同一对象,此时用元祖存储
链式赋值:对象1=对象2=被引用对象
PS:两个语句写在同一行中间用;隔开
换值语句:a,b=b,a //将a,b的值互换
运算x=x+1——————》x+=1
输入输出语句
输入:a=input()
输出
print();打印括号内参数(多个参数用逗号隔开)
格式化输出
(1)不带编号,即“{}”
print('{} {}'.format('hello','world')) # 不带字段
(2)带数字编号,可调换顺序,即“{1}”、“{2}”
print('{0} {1}'.format('hello','world')) # 带数字编号
print('{0} {1} {0}'.format('hello','world')) # 打乱顺序,输出hello world hellow
(3)带关键字,即“{a}”、“{tom}”
print('{a} {tom} {a}'.format(tom='hello',a='world')) # 带关键字
变式用法
条件语句
if true: __do somthing(注意缩进至少两格) elif 条件: //在if分支下继续判断
循环语句
for循环:for a in b:(注换行至少缩进两格)(遍历元素b(可迭代对象)作为循环条件,a是一个变量)//可以通过遍历字典的键来输出其值
while 循环: while True:(注:换行至少缩进两格)跳出循环:break
类(class)
对象与类:类相当与设计蓝图而对象(实例)是跟据蓝图(类)生产出来的
类的概述
类的属性(是什么)
类的方法(能做什么)
类的自定义
注意:初始化方法括号内的参数要与下面的参数对应; def __init__(self,name,year): self.name=name self.year=year 类的属性添加: self.x='python' #添加了名为x的属性 自定义类可以没有初始化方法,当有初始化方法时优先执行初始化方法 尤其要注意利用self定义的属性是实例属性,不包含在类的属性中,类 属性的定义要写在方法外
类的实例化:利用类来创建对象的过程,通过调用对象的方法和方法的返回值来实现实例化 :Zhangsan=SuperMan('zhangsan') Zhangsan.name #引用张三的属性‘name’ 类的属性可以在定义是通过引用对象来确定,或者先用变量占位在实例化的过程中通过外传参数来确定
类属性和实例属性
类属性:(静态属性)
类属性的增添:类的名称 . 新属性的名称=某个不可变对象
类属性的修改是覆盖而非替代,当上层属性被删除后下层属性就可以显示出来
类属性的删除:利用del函数:del 类的名称 . 属性名称
实例属性:来自于类属性会根据类属性的变化而变化,对实例属性的修改不影响类的属性和其他实例属性:实例的名称 . 新属性的名称=不可变对象 可以通过__dict__来查看实例的实例属性
类的方法
类的方法与函数的不同点:类的方法的第一个参数必须是self(指向自生用于在方法间传递参数) 可以在类的普通方法中来实例化如: class foo:
初始化方法与普通方法的不同点:初始化方法不能有返回值或者其返回值必须是None
方法的调用:通过实例来调用方法时不需要给self传参数 但通过类来调用方法时要给self传参数(实例的名称) 参数self引用的是当前类的实例
用装饰器语法糖装饰类方法:classmethod(声明为类方法) 修饰符对应的实例不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。: class A(object): bar = 1 def func1(self): print ('foo') @classmethod def func2(cls): print ('func2') print (cls.bar) cls().func1() # 调用 foo 方法 A.func2() # 不需要实例化 cls参数引用的是当前类,通过cls.属性来调用类属性
用装饰器语法糖装饰类方法:staticmethod修饰符表示下面的函数属于静态方法即不会随着将来类的变化(cls)和实例变化(self)而变化#主要是参数变化
继承(对象)
用C类作为P类的子类: class C(P) (单继承)
意义:避免重复代码
子类中与父类同名的方法会被子类覆盖
调用父类方法实例: class P: def __init__(self,name): self.name=name class C(P): def __init__(self,name,age): self.age=age P.__init__(self.name) #实现父类中被覆盖的方法在子类中的重现还可以 super().__init__(name) 必要注意:要继承的属性一定要写到子类的同名方法括号中
多继承:指子类的父类不止一个(继承顺序符合mro算法)要调用父类属性,要在子类的初始化方法中写父类名称 . __init__(self)
多态
含义:在Pyt中不需要声明变量类型,只要符合某类运算,不论是何种变量都不会报错
封装
使得某属性在作用于外不能被调用
实现:在属性或方法名前加双下划线”__“(名称的私有化)
定制类
当讨论对象的类型就是在讨论这个对象是有哪个类实例化得到的
__str__ , __repr__分别调用函数str函数和repr函数(类的内置方法) 在交互模式中直接输出变量(对解释器友好__repr__:对用户友好__str__)
接上:函数重载:用用新编写的内容覆盖原内容的过程
运算符与类的关系:运算符因为有对应的方法所以可以使用,有对应方法的对象才能进行对应的运算:例子:在类Fraction中为了实现分数加法重写了__add__函数
控制属性访问
__slots__: class foo: __slots__=('name','age')#限制了foo的实例只能有name 和age两种属性并且不能修改
__getattr__:处理访问不存在的属性时发生的报错(一般自定义的类中不存在该方法)可以访问不存在的方法
__setattr__:一般默认存在于自定义的类中,有该方法的类都可以接受新添加的实例属性
迭代器和生成器
迭代器:应用函数:iter()创建迭代器#被转化为迭代器的对象必须是可迭代对象
可迭代对象与迭代器的区别:访问可迭代对象可以将该对象的元素存到内存中(元素可见)访问迭代器时必须通过迭代器名称 . __next__()循环执行来访问迭代器中的元素#该方法迭代器对象中没有,当每个元素都被迭代后在迭代会报错
利用for循环也可以迭代迭代器对象中的元素,并且迭代完成后不会报错
迭代器迭代完成后,指针会停留在最后一个元素此时需要重载:iter(可迭代对象)
通过类来编写迭代器对象:要添加__iter__方法并且返回self,添加__next__方法用于规定迭代规则
注;要编写异常处理处理Stopiteration异常
迭代器的意义:由于元素是逐个存如内存的,因此不用担心因为数据过于庞大导致内存无法装下
生成器
生成器函数与普通函数的区别
性质:生成器也是一种迭代器
定义方法:在普通函数中添加关键词yield# yield 对象返回指定对象
yield与return的区别:return语句会直接终止函数,yield语句会暂停函数等待下一步操作
生成器解析:gt=(输出格式 for 变量 in 可迭代对象)#gt是生成器
函数
自定义函数
格式def 函数名称(参数): return 返回值
.py脚本中调用自定义函数:再有返回值的函数中,函数名(参数)已经等于返回值 若无返回值,直接书写函数名(参数)注意:参数也是在引用对象,只要该对象符合条件即可,在定义时可以让参数=初始值来给参数赋予默认值,调用函数时也可以给默认值传参数以达到修改参数的目的
无参数函数: def foo(): pass //用于占位,空函数会报错
返回值详解:当返回多个变量时,这些变量会存在一个元组中
return:标识返回值,并中断函数
参数收集(用于收集数量不确定的参数): def func(x, *args)://只需要参数前加 * 参数名自定义(只能标出一个),收集的参数存在元组中
‘ **kwargs ’:形式: 例:定义:def foo(**kwargs): print(kwargs) 调用: foo('a'=1,'b'=2,'c'=3) 输出: 字典形式
嵌套函数的使用:如: def bar(): 代码块 def foo(func): func() #在函数foo中调用函数bar 另外可以在函数内定义函数
局部变量与全局变量
global 加变量:用于声明所用变量是之前定义的全局变量
nonlocal 加变量用于声明所用变量时外层函数中定义的变量
在使用格式化输出对嵌套函数的内容进行输出时应写成: def foo(func): def wri(name): return 'my name is {0}'.format(func(name)) 参数嵌套形式
装饰器(函数)
被装饰的函数与装饰器函数之间可以直接进行参数的交流,不需要额外定义变量作为交流的桥梁,当有多个装饰器函数时,由下到上依次执行,(每一个函数的返回值将作为下一个函数的参数继续执行)
装饰器函数的格式:def foo(func): def wr(name): 对func一系列操作 return func return foo @foo def wra(func): 对func一系列操作 return func 注:装饰器函数必须是嵌套函数
特殊函数
lambda函数:用于快速便捷地定义函数:自定义函数名=lambda变量:返回值 函数的参数可以是多个
lambda函数与列表解析的综合应用:[(lambda x:x>3)(n) for n in range(10)] 注意引用关系(lambda x:x>3)相当于自定义的函数名
map函数:返回一个map对象是一个迭代器 map(函数,可迭代对象)//用途是将可迭代对象中的元素传给前面的函数将计算结果存在一个map对象中 例: r=map(lambda x, y,z: lis1,lis2,lis3)//将三个列表中的元素相加存在列表中
filter函数(过滤器): n=range(-5,5) f=filter(lambda x: x>0,n)
常用函数
type():返回参数的类//对象类型
help():返回对象的帮助文档
hash():返回对象的哈希值
int():将参数转化为整数并返回(只适用于浮点数)
id():返回参数的内存地址
divmod(,):返回两个参数的商和余数(元组形式)
round(,):返回四舍五入值,函数的第二个参数填要保留的小数位数
dir():返回对象的方法与属性
len():返回对象的长度(参数个数)
a.split( ):以参数为分割点(删掉a中的参数),将剩下的元素存储到列表中
“ ”.join( ): 用“”中的字符作为桥梁组装参数对应的列表
hasatter(对象,方法)//返回布尔值,判断某对象是否有某方法
range(起始,结束,步长)
zip(a,b)//将对象a,b中的元素依次逐个用元组连接起来(a,b必须是可迭代对象)---->>可以用来生成字典 for x , y in zip(a,b):
enumerate(有索引的对象):返回[(索引,元素),]形式的列表
在循环中的应用:for i , ele in enumerate(有索引的对象):
字符串大小写转化
大写转化:str.upper()
小写转化:str.lower()
abs( ) //用于计算绝对值
sorted():// 用于排序
hasatter(对象,属性)//判断某对象是否有某属性
eval():将括号内字符串形式的算式结果返回
二进制转化:bin()#返回值带0b前缀
input():括号内填字符串会在用户输入前输出
浮动主题
列表
基本操作
列表相加:lis1=['a'],lis2=['b'],list0=lis1+lis2==['a','b']//相加后形成的是一个新的列表,对原列表没有影响
运算类型的'is','in'等
清空列表:lis.clear()
列表的方法
利用索引修改元素:lis=['a','b'],lis[0]='c',lis==['c','b']
利用函数增加元素
lst.append() // 给列表lst追加括号内的元素(对象)
lst.extend() //给列表lst追加可迭代对象
lst.insert(索引,元素(对象)) //给列表插入元素(对象)
利用函数删除元素
lst.remove(元素) //删除对应的元素(对象)
lst.pop(索引)//删除索引对应的元素(对象)
利用函数查看内存地址:id(列表)——》返回该列表的内存地址
利用函数查看列表长度:len(列表)——》返回列表的长度
拷贝
浅拷贝:lis.copy()
深拷贝
s.index( a,b ) ;返回从左到右第b个参数开始,a参数的索引
基本性质:可修改
列表解析:格式:[输出表达式 for 变量 in输入序列 if 判断条件] 例:[x**2 for x in range(1,10)] [x+y for x,y in zip(x,y)] 或者:[输出格式A if 判断条件 else 输出格式B for 变量 in 输入序列]
元组(不可修改)
利用函数list将元组转化为列表:list(对象)//返回括号内对象对应的列表(不修改原对象)
利用tuple函数将列表转化为元组:tuple(对象)//返回括号内对象对应的元组(不修改原对象)
元组可以作为字典的key(键)
基本性质:不可修改
字典(一种映射关系)
基本操作
len(d)//返回字典d中的键值对数量
d[key]//返回字典d中的key对应的值
d[key]=value//将value赋予键key(这是原地修改,原来的字典已经发生变化)
del d [key]//删除键key(将对应的键值对整个删除,属于原地修改)
key in d //返回bool值,判断是否含有键key的项()键值对
利用dict函数创建字典:d=dict([(key ,value)])//键值之间用用逗号隔开
字典的方法
读取值的方法
d[key]//返回key对应的值(必须是已有的键)
利用{}来创建字典:d={key:value}//键值之间用逗号隔开
d.get(键,值(如果没有对引得键值对返回该值))//不会影响原字典
d.setdefault()//同.get类似,但会修改原字典(添加不存在的键值对),如果没有赋值则默认值为None
视图对象(跟随字典的变化而变化)(通过关联对象查看)
d.keys()//返回dict_keys([key,])
d.values()//返回dict_values[value,]
d.items()//返回dict_items[(key,value),]
性质:可以通过list()将视图对象转化为列表
增删键值对
增加减值对:d.update([(key,value), ])//修改原字典
删除键值对
del d[key]//删除对应键的键值对(若对应键不存在则会报错)
d.pop(key,value)//返回被删除的值,并且是原地修改,若原字典不存在对应的键则会返回第二个参数
d.popitem()//优先删除最后一个键值对知道删完后会报错
d.clear()//清空字典中的所有键值对(d将变成空字典仍然占据内存)
del d//删除整个字典对象,(将不再占据内存)
拷贝
浅拷贝:d.copy()//创建一个新字典与字典d完全相同,但占据不同的内存地址是两个不同的字典(ps:'='表示引用,被赋值的对象与原对象是同一个对象)但是元素占据的内存相同是同一个元素
深拷贝:需要通过import 调用copy库:import copy copy.deepcopy(待拷贝对象) 创建一个新对象(与原对象内存地址不同,并且新对象中的元素与原对象中的元素内存地址不同)
字典解析:{key:value for k,v in d. items()}
集合
基本操作
创建集合: set( 列表)(会拆解元素)##s={}创建的是字典##PS:可哈希(可散列)和不可哈希(不可散列:
可哈希(hashable):当一个对象在使用周期中是不变的,则可哈希
不可哈希(unhashable):当一个对象在使用周期中是变化的,则不可哈希
哈希值(散列值):通过哈希函数(算法)处理原数据后获得的固定长度的数据,与原数据之间具有映射关系,但哈希值可能相同,当哈希值相同时其原数据可能相同也可能不同,(此时发生‘冲突’或‘碰撞’(collision))
利用hash()函数查看对象的哈希值
集合的方法
增加元素
s.add//向集合中添加元素(原地修改)(保留原对象不进行拆分)
s.update//会拆分添加的元素,分别作为单独元素储存到s中,如果是字典则存储键
删除元素
s.pop()//每次删除一个元素并返回被删元素值(任意值)
s.remove(指定元素)//若不包含该元素则会报错
s.discard()//当集合中没有指定元素则不作为(不会报错)
s.clear()//清空所有元素
基本性质:无序性(不存在索引),互异性(可用于消去相同元素),确定性
创建不可变的元素:frozenset()(会拆解元素),由于不可变可以作为字典的//注意:和集合(set)不同,他创建的对象时一个新的类(frozenset)
集合的关系和运算
集合的关系
元素与集合
属于,in//返回布尔值
计算集合的长度(元素个数):len()
集合与集合
子集:A集合包含B集合,B是A的子集 判断:b.issubset(a)//判断b是否是a的子集
超集:A集合包含B集合,A是B的超集 判断:a.issubset(b)//判断a是否是b的超集
集合的运算
并交集
运算符: |
方法: a.union(b)//计算a与b的并集
交集
运算符: &
方法: a.intersection(b) //计算a和b的交集
补集
运算符: -
方法:a.difference(b)//计算消去b的a的部分
集合解析:{输出格式 for 变量 in输入序列}
对字符串的操作(同样适用于可迭代对象)
索引
r='python'
r[0]=='p' //变量r引用了字符串对象[]中是字符串的第一个字符
切片
r[起始的索引:终止的索引:步长]#终止的索引是指切到终止索引前
若步长为负数则反向切片,同理考虑起始索引和终止索引
字符编码
相关函数
ord("A") #将字符A转化为其对应的ASCII码
bin(65)#将65转化为其对应的二进制数
chr(65)#将ASCII码中65对应的字符输出
转义字符
\ 在行位的续行符,及一行未完转下一行
\ 反斜杠符号
\' 单引号
\'' 双引号
\a 响铃
\b 退格(Backspace)
\e 转义
\000 空
\n 换行
\v 纵向制表符
\t 横向制表符
\r 回车
\f 换页
\oyy 八进制数,yy代表的字符,如12代表换行
\xyy 十六进制数,yy代表的字符,如0a代表换行
\other 其他的字符以普通格式输出
字符串
运算类型(按照优先级从上到下)
** 指数运算
~x 按位翻转
+x,-x正负号
*,/,%,// 乘法,除法,模运算,取整返回商数(对于字符串,列表等来说‘*'表示返回重复几次的结果
+,- 加法,减法
<<,>>移位运算
&按位与
^ 按位异或
| 按位或
<,<=,>,>=,!=,==比较运算
is,is not判断两个对象是否为同一对象的运算(输出bool)
in, not in 判断A是或不是B中的一个成员
not x 布尔“非”运算
and 布尔“与”运算
or 布尔“或”运算
变量的操作
一,首先对变量进行赋值//x=2
二,进行运算
数据类型
浮点数(float) 要注意浮点数的溢出问题
有限
无限(用函数表示)
float(''inf'')
float (''-inf'')
变量(variable)
整数(integer)
布尔(bool)
字符(character)与字符串