目录
Python是脚本语言(动态语言),通过解释器执行代码
abs函数的用法
1.取绝对值 (absolute)
2.取模(turtle库,二维坐标系)
map函数
map是python内置函数,会根据提供的函数对指定的序列做映射。
map()函数的格式是:map(function,iterable,...)
第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合。
map将函数参数依次作用在list中的每一个元素上,得到一个新的list并返回。注意,map不改变原list,而是返回一个新list。
类似的replace,reversed,sorted不改变原有迭代器,返回被改变后新的迭代器
这里注意sorted是函数(内为参数) 而sort是方法直接用.
而reverse,sort直接改变原有迭代器,且无返回值
注意没有replaced函数
Zip函数
zip函数将多个可迭代对象转化为一个迭代器,对迭代器可以用for循环遍历提取,也可以用list转化为一个元组元素的列表
sum函数
iterable – 可迭代对象,如:列表(list)、元组(tuple)、集合(set)、字典(dictionary)。
start – 指定相加的参数,如果没有设置这个值,默认为0。
也就是说sum()最后求得的值 = 可迭代对象里面的数加起来的总和(字典:key值相加) + start的值(如果没写start的值,则默认为0) 所以,我所求的几个int值的和可以写成这样
>>>sum = sum([1,2,3]) 6
如果我们加上start的话,应该是这样的
>>> sum = sum([1,2,3],5) 11
浮点数
1.必须带有小数点
2.科学计数法 写成<a> e <b> 形式 含义为a * 10 的 b 次方 e为实数10
此外 浮点数在超过15位会产生误差,这与计算机本质上采用二进制运算有关\
3.浮点数转为整数时,去掉小数位而不是四舍五入
如何精确运算浮点数?
我们可以使用整数表达浮点数的方式。
1.由于整数的运算是精确的,所以我们可以先用整数运算,再转化为浮点数。
2.Python中可以通过标准库decimal(小数的),decimal提供了一个更精确的数据类型Decimal类型,并且可以使用getcontext(),prec = 精度参数 (context:上下文)来控制浮点数的位数,注意这里的总位数包括小数点本身,即小数点占一位,通过decimal.Decimal('小数字符串')来创建Decimal 小数类型
3.涉及浮点数运算建议使用math库提供的函数,而不是Python运算符
如:math.fsum([x1,x2,x3,......])对浮点数进行求和
math.pow(x,y) 返回x的y次幂
math.exp(x)返回e的x次幂,e为自然对数
math.sqrt(x)返回x的平方根,注意也可以使用math.pow(x,1/2)
不同数据类型运算规律
整数可以看作浮点数没有小数的情况,浮点数可以看作复数虚部为0的情况,所以运算结果按一下顺序靠拢
整数 -> 浮点数 -> 复数
python中复数必须带括号不可省略 此外 复数为0 写为 0j 其虚部单位j不可省略 而且虚部如果是1不能省略,但实部为0可以省略
range函数返回值为range类型
for i in range(65,97)和for i in (65,97)有本质的区别!前者表示遍历范围,后者表示分别选取数值并操作
循环模运算
条件1.T>A
条件2.A自增
如果A从0开始自增 A % T 返回的值范围为 [0,T-1]
字符串格式控制
引用符号 填充符 对齐方式 宽度 千分位分隔符 精度 格式
: 字符参数 <,>,^ 整数 , .精度位数(不包含逗号) f,%
其中居中对齐也可以使用str.center(宽度,填充字符)函数
区分一下千分位分隔符是逗号
精度控制符是点
在使用千分位分隔符时必须要求字符串是整数
而使用其他控制符时可以是整数 也可以是字符串
字符串str() 如果含有表达式的先计算表达式 再转化为字符 直接加引号 对于列表也是直接加引号
而不是变成字符串列表
eval函数的参数只能是字符串 如果有字符串可以拼接 先进字符串拼接再去引号操作
同样的join函数和split函数的参数也只能是字符串或者字符串列表之类由字符串组成的
\0为转义字符,表示字符串的结束,在python中使用len函数遇到\0不会结束函数,\0视为1个长度
对文件的读写
对文件的逐行遍历
f.read(size)返回文件的所有内容,如果给出参数size则读入size长度的字符串或字节流
f.readline(size)返回文件的一行内容,如果给出参数size则读入size长度的字符串或字节流
f.readlines(hint)返回所有行为元素组成的字符串列表,如果给出hint参数则读入hint行
注意 read操作有readline(逐行读取) 但是 write操作没有writeline (逐行写入)
Python将文件本身作为一个行序列可以直接 for line in f 完成对文件行的遍历
f = f.open
f只是一个文件对象,对其内容的输出仍然需要f.read等函数来访问这个文件对象
单纯print(f)只是输出这个文件对象的相关信息!!!
w打开的文件不能进行读操作
对文件操作完成后,要关闭文件,才能保证所修改的数据保存到文件中
--------------------------------------------------------------------------------------------------------------------------------
JSON类型是 字典列表 [ {‘a’ : b}, {'c' : d} , ... ]
csv类型是以逗号分隔数据,以行为单位,每行表示一个一位数据,多行表示二维数据,的纯文本格式!可以用记事本打开
导入csv数据到Python列表
对csv数据进行处理
f = open('bla/bla/bla/bla.csv','r')
list = []
for lien in f:
line.replace('\n','')
list.append(line.split(','))
f.close
csv转JSON
将csv转为Python列表格式后
用dump函数将Python数据类型转化为JSON类型,注意dump函数需要键值对
for i in range (0,len(list)):
list[i] = dict(zip([标签1,标签2,...] , list[i] ))
json.dump (list , indent(缩进) = 4 ,sort_keys = True)
f.close
JSON转csv
使用load函数将JSON类型转化为Python数据类型,便于用Python操作
f = open('bla/bla/bla/bla.json','r')
ls = json.load()
for i in ls:
fw.write(','.join(i) + '\n')
---------------------------------------------------------------------------------------------------------------------------------
文件的写入
write(str)写入字符串或字节流
writelines()写入一个字符串列表的全字符串元素,每个元素间以+连接写入
write函数和writelines函数在写入后不增加换行
write操作没有writeline!!!
只能通过对文件行的遍历(for循环)结合write函数实现逐行写入
writelines写入一个字符串列表
readlines读取并返回一个字符串列表
由于文件写入后文件操作指针在写入内容的后面,所有我们使用f.seek()函数来移动文件指针
便于文件的打印输出
f.seek()的三个参数 0:文件开头 1:当前位置 2:文件末尾
str.split() 将字符串按照指定的分隔符分成多个子串,返回这个子串的字符串列表
单纯的对列表进行str转化得不到字符串列表,只能得到字符串
str.split(sep.maxsplit)
解释:
- str:要进行分隔的字符串
- sep:指定的分隔符,也可以包含多种分隔符。默认为None,表示所有空字符,包括空格、换行符“\n”、制表符“\t”等
- maxsplit:可选的参数,用于只当分割的次数,最后列表中子串的个数最多为maxsplit+1。如果不指定或者指定为-1,表示分割次数没有限制。
str.join()
用来将列表(或元组,或字符串)中包含的多个字符串通过自定义的连接符(可以为空)链接成一个字符串。注意对象必须是字符串列表,字符串元组,或者字符串
newstr = str.join(iterable)
解释:
- newstr:合并后生成的新字符串;
- str:用于指定合并时的分隔符,如果想要以csv格式,用‘,’拼接
- iterable:做合并操作时的源字符串数据,允许以列表、元组形式提供。
ste.find('目标字符串',开始位置索引,结束位置索引) 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。
同样的
str.index('目标元素',开始位置索引,结束位置索引)
Python字符串index()函数将引发ValueError,而find()函数将返回-1。 这是这些功能之间的唯一区别。
对字符串的查找可以替换为list
在for循环列表时,分为待遍历次数和已遍历次数,带遍历次数是由列表长度(待遍历次数)决定的,可以改变,但已遍历次数只会递增,如果在for循环中进行列表增删操作时,需要注意这个问题!
for-else语句
Python特有的 for else语句
当for循环正常执行且遍历结束后,程序会继续执行else语句中的内容。else语句的内容只在
循环正常执行并且循环遍历结束后,才会执行。因此可以在else语句的内容中放置判断循环执行情况的语句。类似于异常处理中的finally语句,但finally无论是否正常运行均会执行
continue则是跳过循环中位于continue下方的代码,继续执行下一次循环,此时循环未必结束
同样的Python还有 while else语句
lambda函数
lambda函数返回函数类型,因此我们使用lambda函数是为了快捷灵活地创造函数,使用lambda函数后返回函数类型,用一个变量去接收这个类型,再去调用这个函数类型变量,或者写在表达式里作为自定义功能
比如对字典的排序可以用到lambad函数
对于序列类型如列表含有多个数据需要传参时,不用遍历列表去传参,直接将列表打包传参
f(*list)
LEGB原则
局部-嵌套-全局-内置模块
对于内部外部重名的变量,函数优先考虑自身包含的变量,如果对其进行修改,函数结束后变量内存空间被释放,所以全局变量没有改变!
由于代码是自上而下,从左到右执行的
对于已经定义的全局变量x
如果在函数内
如 x = x + 1 其含义为 先访问这个全局变量然后尝试去修改这个全局变量
由于只能访问不能修改所以会引发UnbondLocalError
注意
对于列表类型,由于Python中的列表类型必须赋值才能真实的被创建(与c语言不通,c语言的数组需要事先定义好数量和类型,因此c语言中数组已然被创建,而python中只是引用,两者概念不同),因此在函数内部对空列表进行追加时,由于赋值了元素,因此导致列表的真实创建,进而对列表实现了'修改',我的理解是类似于c语言的数组名指针
组合数据类型(表示多个数据的类型)tips
序列类型
字符串,元组,列表,均可使用切片和索引以及len()函数,in,not in操作,
列表可以用切片赋值
字符串是不可变的,因此对字符串的所有的元素赋值和切片赋值都是非法的 ! ! !
python中元组的圆括号是可选择的 比如 a,b = b,a 实质上就是两个元组的赋值而已 !
对序列类型使用索引超出范围会报错,但使用切片则会返回其对应的空类型! ! 如字符串返回'',列表返回[],元组返回()
集合类型
- 无序,输出时顺序不固定且与原先数据不一致 字典是特殊的集合 同样无序
- 不可重复(可以用来去重)
- 元素类型为不可变类型(元组,字符串,整数,浮点数等),列表,字典和集合本身都是可变数据类型(不能进行哈希计算)这些不能作为集合元素。
使用set(任何组合数据类型)函数生成集合(也可以进行数据类型转化),
而不是{},这是生成字典的方法,同样的也可以使用tuple(),dict(),list()函数进行创建数据类型或转化
对字典进行列表类型的转化时 只是对字典的键进行操作而舍弃了值
字典类型(映射类型)
- 字典的get(key,返回值),和pop(key,返回值) 其返回值可自定义
- 字典的键值为不可变类型!
- 字典无序
如d = { [1,2] : 1 }错误 d = { (1,2) :1 } 正确 d ={ 1 : [1,2] }正确
对字典的修改通过中括号的访问和赋值实现,键存在则修改对应值,键不存在则创建新的键值对。而d.get和d.pop方法只能进行访问,没有修改作用,其第二个参数是人为规定的不存在时的返回值,用来更好的处理访问的结果,如果存在返回对应的值
pop的参数只是键名,而del函数需要通过中括号索引的方式删除
字典排序
d.items d.keys d.values 均为dict_类型
需进行类型转化 list()函数 因为字典不可变 所以为 列表元组
转为列表类型后可对字典进行排序操作 如sorted方法或sort方法
这里重点介绍一下sort方法中的参数key
key – 是一个函数,用来选取参与比较的元素。
因此可以用匿名函数进行选参 , lambad x : x[0] 意为在迭代中对每个被迭代的元组选取第一个元素 key值 同样的 1 就意味着第二个 value值
函数在传参时是单向一次性的值传递,不可以重复传参
datetime库
datetime
import datetime
t = datetime.now
注时间戳是字符串而不是浮点数 这样才能格式化输出
t_now = t.strftime ('%Y %m %d %H %M %S')
print(t_now)
这个如果要用的话可以说是固定模板了
turtle库
运动指令
控制指令
注:
turtle.color 两个参数 一个是画笔颜色 一个是填充颜色
turtle.pencolor 一个参数 设置画笔颜色
turtle.fillcolor 一个参数颜色 可以是字符串 也可以是rgb元组 (配合begin_fill和end_fill使用)
一些库函数
chr(x)返回Unicode编码x所对应的 单个字符
ord(x)返回单个字符x所对应的 Unicode编码
python本身没有可以判断小数的函数故先用replace去掉小数点再判断是否为数字
str.isdigit()判断数字,只有此函数判断byte数不会报错
str.isnumeric()可以判断汉字数字
str.isdecimal判断数字,
math库
math.fsum([x1,x2,x3,......])对浮点数进行求和
math.pow(x,y) 返回x的y次幂
math.exp(x)返回e的x次幂,e为自然对数
math.sqrt(x)返回x的平方根,注意也可以使用math.pow(x,1/2)
jieba库
jieba.lcut(str)精确模式,返回的分词能够完整不多余地组成原始文本
jieba.lcut(str,cut_all = True)全模式,输出原始文本中可能产生的所有词语组合,冗余性最大
jieba.lcut_for_search(str)搜索引擎模式,该模式首先行执行精确模式,然后再对其中的长句子进一步切分获得结果
jieba.add_word(word)向分词库添加自定义词
PIL(pillow)库
图像的本质是有规则的二维数据所以可以用np.array转化为二维数组
from PIL import image
Image.open(文件路径)
Image.fomat
Image.mode
Image.size
Image.save(文件名,格式)参数均为字符类型
Image.convert(格式)格式参数为字符类型参数有真色彩图像'RGB' , 灰度图像'L' , 出版图像'CMYK
Image.getpixel(x,y)获取(x,y)坐标对应的像素值(RGB为三元素元组,灰度值为单元素元组,范围均为0~255)
r,g,b=Image.split()获得rgb通道,返回图像副本
r.point(func)根据func对每个元素进行运算返回图像副本
Image.merge(g,b,r)根据新的色彩通道生成新图像
Image.fromarray()将array转化为Image
json库
json.dump(obj,sort_keys=False)将Python数据类型(字典键值对类型或者每个元素为二元元组的列表等)转化为JSON格式,sort_key参数为按key值排序,因为Python中字典列表无序
json.load(str)将JSON格式转化为Python数据类型
numpy库
np.array(Python列表或元组或Image对象)创建数组,副本
np.asarry()同array,只不过是直接cut过去而不是copy,cut过去的数组会随着输入的改变而改变。
np.uint()将数据转化为整数类型可以是数组
np.linespace(s,e,sep) 返回一维数组,三个参数代表开始值、结束值(默认包括)和步长(s到e均分为sep-1个元素的数组)
np.concatenate( (数组1,数组2) )将两个数组进行拼接
matplotlib.pyplot库
主要使用matplotlib.pyplot字库
import matplotlib.pyplot as plt
正确显示中文字体
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['font.sans-serif'] = 'SimHei'
plt.subplot(行数,列数,区域)在全局绘图区域中创建子区域,当子区域不超过9时,三个参数可以连写,行数列数代表分割线
plt.plot(x,y,lable,color,width)根据x,y数组绘制直线,曲线
plt.bar(x,width,height,lable) 绘制条形图
- x:表示x坐标;
- height:表示柱状图的高度,也就是y坐标值,数据类型为int或float类型;
- width:表示柱状图的宽度,取值在0~1之间,默认为0.8;
plt.pie(x,explode,labels,colors
)绘制扇形图
x
即每个扇形的占比的序列或数组explode
如果不是None,则是一个len(x)长度的数组,指定每一块的突出程度;突出显示,设置每一块分割出来的间隙大小labels
为每个扇形提供标签的字符串序列colors
为每个扇形提供颜色的字符串序列
plt.title()设置居中标题
plt.figtext(x,y,str)在(x,y)坐标设置文字
plt.lengd()放置图注
plt.fill_between(x,y1,y2)填充两条曲线围成的多边形
plt.thetagrids(angles,labels)
- Angles:
将角度设置为theta网格的位置(这些网格线沿theta尺寸相等)
- labels:如果不是None,则为len(angles)或在每个角度使用的标签字符串列表。
至此Python学习暂告一段落,特此留念~
Life is short,use python.