python语言程序设计完结

概述:

程序设计是计算机可编程的体现
程序设计,亦称编程,是深度应用计算机的主要手段
程序设计已经成为当今社会需求量最大的职业技能之一
程序设计语言是一种用于交互(交流)的人造语言
程序设计语言,亦称编程语言,程序设计的具体实现方式
编程语言相比自然语言更简单、更严谨、更精确
变成语言种类很多,但生命力强劲的却不多
编程语言有超过600种,绝大部分都不再被使用
C语言诞生于1972年,它是第一个被广泛使用的编程语言
python语言诞生于1990年,它是最流行,最好用的编程语言

编译和解释

编程语言按照执行方式划分,分为编译和解释两种
编译:将源代码一次性转换成目标代码的过程
解释:将源代码逐条转换成目标代码同时逐条运行的过程

根据执行方式的不同,编程语言分为两类:静态语言和脚本语言
静态语言就是:使用编译执行的编程语言,比如C++,Java语言;
编译器一次性生成目标代码,优化更充分,程序运行速度更快
脚本语言:使用解释执行的编程语言,比如python语言、js、php;
执行程序时需要源代码,维护更灵活,跨多个操作系统平台运行

程序的基本编写方法

IPO
-I Input输入, 程序的输入,一个程序的开始
-P Process处理,程序的主要逻辑
-O Output输出,程序的输出

编程解决问题的步骤:

  1. 分析问题:分析问题的计算部分,想清楚
  2. 划分边界:划分问题的功能边界,规划IPO
  3. 设计算法:设计问题的求解算法,关注算法
  4. 编写程序:编写问题的计算程序,编程序
  5. 调试测试:调试程序使正确运行,运行调试
  6. 升级维护:适应问题的升级维护,更新完善

计算机编程

变成能够训练思维
-编程体现了一种抽象交互关系、自动化执行的思维模式
-计算思维:区别逻辑思维和实证思维的第三种思维模式
-能够促进人类思考,增进观察力和深化对交互关系的理解
编程可以带来乐趣
编程可以带来就业机会
。。。。。。

python语言编写和运行

python有两种编程方式,一种是交互式,一种是文件式
交互式:对每个输入语句即时运行结果,适合语法练习
文件式:批量执行一组语句并运行结果,编程的主要方式,主要是将程序代码写入到一个ide中去运行

温度转换问题分析

摄氏度:中国等大多数国家使用,以1标准大气压下水额度结冰点为0度,沸点为100度,将温度进行等分刻画
华氏度:美国、英国等国家使用,以1标准大气压下水的结冰点为32度,沸点为212度,将温度进行等分刻画
两个温度的相互之间的转换(华氏温度转换为摄氏温度或者摄氏温度转化为华氏温度)怎么分析呐?
该问题中计算部分的理解和确定
理解1:直接将温度值进行转换
理解2:将温度信息发布的声音或图像形式进行理解和转换
理解3:监控温度信息发布渠道,实时获取并转换温度值
分析问题
——采用理解1 直接将温度值进行转换
温度数值需要表明温度体系,即摄氏度或华氏度
转换后也需要给出温度体系

划分边界
——输入 带华氏或摄氏标志的温度值
——处理 根据温度标志选择适当的温度转换算法
——输出 带摄氏或华氏标志的温度值

输入输出格式设计
标识放在温度最后,F表示华氏度,C表示摄氏度
82F表示华氏82度,28C表示摄氏28度

设计算法
根据华氏和摄氏温度定义,利用转换共识如下:
C=(F-32)/1.8
F = C*1.8+32
其中,C表示摄氏温度,F表示华氏温度

接下来我们实现这段代码,具体如下

Tempstr = input("请输入带有符号的温度值:")
if Tempstr[-1] in ['F', 'F']:
    C = (eval(Tempstr[0:-1]) - 32)/1.8
    print("转换后的温度是{:.2f}C".format(C))
elif Tempstr[-1] in ['C', 'c']:
    F = 1.8*(eval(Tempstr[0:-1])) + 32
    print("转换后的温度是{:.2f}F".format(F))
else:
    print("输入温度错误")

python程序语法元素分析

程序的格式框架
——首先我们看到有的代码是高亮的,这个是编程的色彩辅助体系,不是语法要求
——缩进,表达程序的格式框架;严格明确,缩进是语法的一部分,缩进不正确程序运营错误;所属关系,表达代码间包含和层次关系的唯一手段;长度一致,程序内一致即可,一般用4个空格或者1个TAB
——注释,不被程序执行的辅助性说明信息;单行注释,以#开头,其后内容为注释;多行注释,以‘’‘开头和结尾
命名和保留字
比如温度转换程序中的C F TempStr,他们是程序中的变量,程序中用于保存和表示数据占位符号
——用来保存和表示数据的占位符号,变量采用标识符来表示,关联标识符的过程叫命名
——我们可以使用等号=向变量赋值或修改值,=被称为赋值符号
比如Tempstr=’82F‘,#这个表示向变量Tempstr赋值82F
命名:
命令规则:大小写字母、数字、下划线和汉字等字符及组合,需要注意的是:python大小写敏感、首字符不能是数字、不能与保留字相同
保留字
被编程语言内部定义并保留使用的标识符
——python语言有33个保留字(也叫关键字),比如说if elif else in等等
——保留字是编程语言的基本单词,大小写敏感
保留字的范围:
在这里插入图片描述
黑色的26个保留字是在python基础语法体系中出现的

数据类型
在温度转换这段代码中,包含了 字符串、整数、浮点数、列表这四种数据类型
数据类型-顾名思义,供计算机程序理解的数据形式,或者说程序设计语言通过一定方式向计算机表达数据的形式
字符串——由0个或者多个字符组成的有序字符序列,显著特点是在两侧有一对单引号或一对双引号
字符串的序号——正向递增和反向递减序号,如下图:
在这里插入图片描述
正是因为有了序号,所以我们可以使用列表获得字符串中的一个或者多个字符,变现为字符串的索引和切片操作,也就是我们使用[]这个符号获取字符串中的一个或者多个字符
——索引:返回字符串中单个字符,表达形式是 <字符串>[M],比如Tempstr[-1],表示的是取字符串的最后一个字符
——切片:返回字符串中一段字符字串,表达形式是<字符串>[M:N],比如Tempstr[0:-1]表示的是,从取第一个字符到倒数第二个字符,相当于把字符串的最后一个字符去掉
我们看到温度转换代码中还有32 1.8等数字,我们把他们叫做数字类型
整数和浮点数都是数字类型
——整数,数学中的整数,比如32
——浮点数,数学中的实数,带有小数部分,比如1.8
——列表类型,由0个或多个数据组成的有序序列,当然,我们可以使用一个保留字in来判断前者是否与列表中某个元素相同,比如说温度转换中的这代代码 Tempstr[-1] in [‘F’, ‘F’]:
语句与函数
赋值语句:由赋值符号构成的一行代码,也就是用来给变量赋予新的数据值,赋值语句右侧的数据类型同时作用于变量
分支语句:由判断条件决定程序运行方向的语句,使用保留字if elif else构成条件判断的分支结构
函数:根据输入参数产生不同输出的功能过程,比如input eval,类似于数学中的函数

python程序的输入和输出

输入函数input()
从控制台获得用户输入的函数,使用格式:<变量> = input(<提示信息字符串>),用户输入的信息以字符串类型保存在变量中

输出函数print()
以字符形式向控制台输出结果的函数,使用格式:print(<拟输出字符串或字符串变量>),字符串类型的一对引号仅在程序内部使用,输出无引导
——格式化:以温度转化代码为例 print(“转换后的温度是{:.2f}F”.format(F))
其中{}表示槽,后续变量填充到槽中
{:.2f}表示将变量C填充到这个位置时取小数点后2位

评估函数eval()
去掉参数最外侧引号并执行余下语句的函数
——eval()函数的基本使用格式
eval(<字符串或字符串变量>)
比如说eval(“1”)执行后的结果时1;eval(“1+2”)执行后的结果是3,再比如我们在温度转换代码中的这段代码也体现该函数的应用eval(Tempstr[0:-1])

python基本图形绘制

深入理解python语言

据统计世界上有600多种编程语言,它可以覆盖由A到Z的全部字母表,举几个非常常用的语言
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
python语言的特点与优势
——强制可读性
——较少的底层语法元素
——多种编程方式
——支持中文字符
——C代码量的10%
——13万第三方库
——快速增长的计算生态
——避免重复造轮子
——开放共享
——跨操作系统平台

在这里插入图片描述

实例2python蟒蛇绘制

import turtle

turtle.setup(650, 350, 200, 200)
turtle.penup()
turtle.fd(-250)
turtle.pendown()
turtle.pensize(25)
turtle.seth(-40)
for i in range(3):
    turtle.circle(40, 80)
    turtle.circle(-40, 80)
turtle.circle(40, 80/2)
turtle.fd(40)
turtle.circle(16, 180)
turtle.fd(40 * 2/3)
turtle.done()

python蟒蛇绘制共这17行左右的代码,有很多的类似
清楚理解这些行代码能够掌握python基本绘图方法
我们可以参考框架结构、逐行分析、逐词理解
当然我们也可以针对代码进行举一反三:比如说我们可以改变蟒蛇的颜色、长度、以及它爬行的方向

模块1:turtle库的使用

## turtle库基本介绍
turtle(我们也称之为海归)库使turtle绘图体系的python实现,是python语言的标准库之一,同时也是入门级的图形绘制函数库
标准库:随解释器直接安装到操作系统中的功能模块
第三方库:需要经过安装才能使用的功能模块
在python中我们经常会遇到库Library、包Package、模块Module,统称为模块
turtle绘图窗体布局
顾名思义,其实这个就是turtle的绘图窗体
在这里插入图片描述
也就是turtle的一个画布空间,这个画布空间的最小单位是像素
窗体的左上角是坐标的起始点,我们使用
turtle.setup(width, height, startx, starty)函数来设置窗体的大小及位置,其中这4个参数中后两个四可选的,当然setup不是非必须的,只有当你需要设置窗口大小和窗口位置的时候才需要这个函数
举个例子
如果我们使用turtle.setup(800, 400, 0, 0),则窗体默认是对应屏幕左上角
在这里插入图片描述
如果我们使用turtle.setup(800, 400),则窗体默认是对应屏幕中间位置
在这里插入图片描述

所以,我们看到 这个坐标,其实就是相对于屏幕左上角的相对位置坐标

turtle空间坐标体系

在turtle窗体内部,形成了一个空间坐标体系,包含绝对坐标和海龟坐标两种,对于绝对坐标来讲,turtle也就是海龟最开始在画布的正中心,正中心的坐标就是(0,0),海龟的运行方向向着画布的右侧,所以整个窗体的右侧是X轴,上方向是Y轴,因此构成了一个绝对坐标系,我们选取4个点,那么这四个点根据坐标位置的不同就会有不同的坐标值。这里我们一定要区分,这个坐标值指的是海龟绘制过程中它的画布中间的空间坐标体系,也就是我们最常使用的;它与窗体在屏幕中间的位置的坐标是不同的,去利用空间坐标改变turtle的行进位置,我们可以使用函数,其中很重要的一个函数是goto,goto有两个重要的参数x和y,它指的是任何位置的海龟无论在哪里去到达某个位置的原理,举个例子:

import turtle
turtle.goto(100, 100)
turtle.goto(100, -100)
turtle.goto(-100, -100)
turtle.goto(-100, 100)
turtle.goto(0, 0)
turtle.done()

经过这样一个语句,我们可以在屏幕中绘制这样一个图形,运行之后的结果是
在这里插入图片描述

当然,我们把坐标标记上去之后就更加明了了
在这里插入图片描述

除了绝对坐标,在turtle空间坐标体系中,也就是说海龟本身从它自身的运动来讲,它看到的世界会是什么样子的呢,对于海龟来讲,无论这个方向是朝向哪个角度的,它都叫前进方向,反方向是后退方向,海龟运行的左侧叫左侧方向,右侧叫右侧方向。因此我们可以使用一些控制海龟的函数,比如,turtle.fd,指的是向海龟的正前方运行,turtle.bk表示的是向反方向运行,turtle.circle表示的是以海龟当前位置左侧的某一个点为圆心,进行曲线运行这些函数也能改变海龟的空间坐标位置,进而实现绘图功能。

turtle的角度坐标体系
我们可以使用turtle.seth(angle)函数来改变当前海龟的运行角度,这里我们需要注意的是seth并不在图像中绘制任何信息,它只是改变行进的方向,angle参数表示的是绝对度数
在这里插入图片描述
我们举两个例子:
我们可以使用turtle.seth(45),那么海龟的朝向就是45°
在这里插入图片描述
如果使用turtle.seth(-135),那么海龟的朝向就是-135度的方向
在这里插入图片描述
如果在此基本上,我们继续使用fd函数,它会朝着当前设定的方向直线运行。
此外,为了更好的改变海龟运行的方向,从海龟的坐标角度,对于海龟运行的一个方向,我们可以使用左右的方式,来改变它的运行角度,turtle提供了.left(angle)和right(angle)两个函数,分别让当前海龟向左或者向右去改变运行方向。

我们介绍了这么多函数,接下里我们实现一个小例子,比如我们要画一个大写的Z字,如图:

import turtle
turtle.left(45)
turtle.fd(150)
turtle.right(135)
turtle.fd(300)
turtle.left(135)
turtle.fd(150)
turtle.done()

绘制结果如下:
在这里插入图片描述
RGB色彩体系
在我们绘图的过程中,我们都希望自己的绘制的图形是有颜色的
在turtle库中,最常用的色彩体系叫RGB
RGB由三种颜色构成的万物色
——RGB指红蓝绿三个通道的颜色组合
——覆盖视力所能感知的所有颜色
——RGB每色取值范围0-255整数或0-1小数
在这里插入图片描述
我们看一些常用的颜色,如下:
在这里插入图片描述
在这里插入图片描述

我们以purple为例,RGB的整数值分别是160,32,240,它的小数值是0.63, 0.13, 0.94 ,也就是说向系统中告知它的色彩的具体值,我们就能够形成紫色。
turtle库默认采用RGB的小数值来表示颜色,我们当然也可以切换采用整数来表示
我们使用turtle.colormode(mode)来去改变色彩数值的使用
——1.0:RGB小数值模式
——255:RGB整数值模式
我们在使用过程中也可以查阅相关文档获取自己想要的颜色

turtle程序语法元素分析

库引用与import
我们以蟒蛇绘制图形的脚本为例,我们发现前面有很多相似的.turtle样式:
在这里插入图片描述

这里就是用了库引用的方式
也就是扩充python程序功能的方式
——使用import保留字完成,采用.()编码风格
import <库名>
<库名>.<函数名>(<函数参数>)

来调用相关功能

当然我们也可以使用from和import两个保留字共同完成这个代码,具体的方式是:
from <库名> import <函数名>
from <库名> import *
<函数名>(<函数参数>)

使用这种方式,再去写代码的时候,就不需要使用turtle.的形式了,直接使用函数名加函数参数来去完成库的使用,具体实现如下:

from turtle import *

setup(800, 400)
penup()
fd(-250)
pendown()
pensize(25)
seth(-40)
for i in range(4):
    circle(40, 80)
    circle(-40, 80)
circle(40, 80/2)
fd(40)
circle(16, 180)
fd(40 * 2/3)
done()

这个虽然简单了,但是其实存在一些问题,我们比较下

import <库名>
<库名>.<函数名>(<函数参数>),这种方式加起来是新程序中的函数名,

如果使用from <库名> import <函数名>
from <库名> import *
<函数名>(<函数参数>),这种方式加起来是新程序中的函数名,这里面呢会带来一个问题,如果我们使用第一种方法,就不会出现函数重名的问题;如果使用第二种方法,就会出现可能与程序中用户自定义的函数名冲突,冲突的话,函数就会执行异常。

我们将这两种方式通盘考虑,我们可以使用import和as保留字共同完成这个引用,具体形式如下:
import <库名> as <库别名>
<库别名><函数名>(<函数参数>)

也就是说,给调用的外部库关联一个更短、更适合自己的名字
这对编写程序来讲会带来很多便利
比如说我们将turtle as t执行后如下:

import turtle as t

t.setup(800, 400)
t.penup()
t.fd(-250)
t.pendown()
t.pensize(25)
t.seth(-40)
for i in range(4):
    t.circle(40, 80)
    t.circle(-40, 80)
t.circle(40, 80/2)
t.fd(40)
t.circle(16, 180)
t.fd(40 * 2/3)
t.done()

这种方式我们冗余的代码量最少,同时也防止了函数重名的问题

turtle画笔控制函数

在蟒蛇代码例子中,其中有四行代码与画笔控制函数有关系,分别是
turtle.penup()
turtle.pendown()
turtle.pensize(25)
turtle.pencolor(“purple”)

这里面我们将海龟想象成一个画笔,海龟是一个形象图案,画笔是一个抽象图案,那么画笔控制函数是控制海龟或者控制画笔的一种方式函数。
画笔操作后,一直有效,一般是成对出现

turtle.penup(),别名,turtle.up(),指的是抬起画笔,海龟在飞行
turtle.pendown(),别名,turtle.pd(),指的是落下画笔,海龟在爬行
所以我们说画笔操作是成对出现,你不能只让海龟在天上飞,并不形成绘制图形,这样是不行的,所以让它降下来。
画笔操作后,一直有效,直至下次重新设置
turtle.pensize(width),别名turtle.width(width),指的是画笔宽度,海龟的腰围

画笔操作后,一直有效,直至下次重新设置
turtle.pencolor(color),color为颜色字符串或rgb值,指的是画笔颜色,海龟在涂装
color的参数有三种形式,分别是
——颜色字符串:turtle.pencolor(“purple”)
——RGB的小数值:turtle.pencolor(0.63, 0.13, 0.94)
——RGB的元组值:turtle.pencolor((0.63, 0.13, 0.94))

turtle运动控制函数

在蟒蛇代码例子中,其中有2个函数与运动控制函数有关系,分别是fd(),circle()函数
运动控制函数能控制海龟行进的方向,包括让海归走直线还是走曲线,最常用的函数是:
1、turtle.forward(d) ,别名是turtle.fd(d),指的是向前行进,海归走直线,参数d:表示的是行进距离,可以为负数
2、另一个函数是turtle.circle(r, extent=None),指的是根据半径r绘制extent角度的弧形,-r表示的是默认圆心在海龟左侧r距离的位置,-extent:绘制角度,默认是360度整圆,我们举两个例子:

turtle.circle(100)

表示的是半径100,画一个整圆,运行结果是:
在这里插入图片描述

turtle.circle(-100, 90)

表示的是半径为-100,角度为90度,运行结果是:
在这里插入图片描述

turtle方向控制函数

在蟒蛇代码例子中,其中有1个函数与运动控制函数有关系,它就是seth(angle)。
turtle.setheading(angle),别名turtle.seth(angle),表示的是改变行进方向,海龟走角度,其中参数angle表示的是:改变行进方向,海龟走角度。
比如说turtle.seth(45),表示的是我们将海龟的方向转化为绝对坐标下的45度;turtle.seth(-135),表示的是我们将海龟的方向转化为绝对坐标下的-135度方向,
除了绝对角度,turtle还提供了控制海龟面对方向的绝对角度和海龟角度,分别是:
turtle.left(angle),海龟向左转
turtle.right(angle),海龟向右转
——angle:在海龟当前行进方向上旋转的角度

这边我们需要注意的是,方向控制函数只改变海龟行进的方向,并不实际在绘图上让海龟行动,如果希望海龟行动,需要使用运动控制函数,让海龟走直线或者走曲线。

循环语句和range函数
循环语句是指按照一定次数循环执行一组语句,使用形式为
for <变量> in range(<参数>)
<被循环执行的语句>
举个例子:

for i in range(5):
    print(i)

我们发现打印出来的结果是12345
在这里插入图片描述
实际上range()函数是产生循环技术序列
比如说
range(N),会产生0到N-1的整数序列,共N个
range(M,N),会产生M到N-1的整数序列,共N-M个

基本数据类型

数字类型及操作
整数类型:
与数学中的概念一致,可正可负,没有取值范围限制
pow(x,y)函数,计算x的y次方,想算多大算多大
python的整数提供了四种进制表现形式,最常用的就是十进制
比如1010,99,-27
二进制表现形式:以0b或0B开头:0b010,-0B101
八进制表现形式:以0o或0O开头:0o123, -0O456
十六进制表现形式:以0x或0X开头:0x9a,-0X89

浮点数类型及操作
与数学中的实数的概念一致
带有小数点及小数的数字
浮点数取值范围和小数精度都存在限制,但常规计算可以忽略
取值范围数量级约-10的-308次方至10的308次方,精度数量级10的-16次方

浮点数间的运算存在不确定尾数,不是bug
举个例子

a = 0.1 + 0.3
print(a)

b = 0.1 + 0.2
print(b)

运行结果:
在这里插入图片描述
那么,0.30000000000000004后面的很多0就是不确定尾数造成的,那么,为什么会产生这样一种情况呢?
我们知道,计算机中所有的数字都是采用二进制进行表示的,具体来说,在python语言中,使用53位二进制来表示一个浮点数的小数部分,那么0.1在计算机中表示的二进制是如下一串010的数字,但是呢我们需要知道,由于计算机中的二进制和十进制之间不存在严格的对等关系,所以0.1在用二进制表示的时候,它是一个无限的小数,计算机只能截取其中的53位无限的接近0.1,但它并不是真正意义上的0.1;那么经过53位二进制小数表示的这么一个浮点数,如果转换成10进制,它就是0.1,但是后面还会有一个很长很长的尾数,只是在计算机中,将浮点数结果输出的时候,只输出了其中的16位小数,之后的并没有输出出来,所以,正是因为二进制表示小数,它可以无限接近一个十进制的小数,但并不完全相同这样一个问题,所以使得0.1和0.2进行计算的时候,它在计算机内部经过二进制转换再经过二进制运算,在经过反向转换,转换成十进制的小数的时候,结果会无限接近0.3,但可能出现一个不确定的尾数,这就是浮点数运算存在不确定尾数的原因
在这里插入图片描述

因此,我们可以明确的知道0.1+0.2==0.3的结果是false,那么为了解决这个问题,我们可以使用一个函数,这个函数就是round函数,这个函数的作用就是
round(x,y)表示的是对x进行四舍五入,d是小数截取位数
浮点数间运算及比较用round()函数辅助
不确定尾数一般发生在10的-16次方左右,round()十分有效

print(round(0.1 + 0.2, 1) == 0.3)

运行结果是
在这里插入图片描述

浮点数可以采用科学计数法表示
使用字母e或E作为幂的符号,以10为基数,格式如下:
e 表示a*10的b次方
例如:4.3e-3值为0.0043 9.6E5值为9600000.0

复数类型
在这里插入图片描述
在这里插入图片描述

数值运算操作符
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
类型间可以进行混合运算,生成结果为“最宽”类型
三种类型存在一种逐渐扩宽或者变宽的关系:整数》浮点数》复数

实例:天天向上的力量
基本问题就是:持续的价值
一年365天,每天进步1‰,累计进步多少呢?
一年365天,每天进步1‰,累计进步多少呢?
我们可以使用如下代码程序进行计算输出

dayup = pow(1.001, 365)
daydown = pow(0.999, 365)
print("向上:{:.2f}, 向下:{:.2f}".format(dayup, daydown))

运行结果如下:
在这里插入图片描述
那如果要计算5‰和1%的力量呢,我们可以使用如下代码

dayfactor = 0.005
dayup = pow(1 + dayfactor, 365)
daydown = pow(1-dayfactor, 365)
print("向上:{:.2f}, 向下:{:.2f}".format(dayup, daydown))

运行结果:
在这里插入图片描述
如上,我们看到,因为我们引入了变量,所以它的好处是我们只需要修改一处,就能实现我们想要的结果

OK,如果是工作日呢,我们叫做工作日的力量:
一年365天,一周5个工作日,每天进步1%
一年365天,一周2个休息日,每天退步1%
这种工作日的力量如何呢?
如下:

dayfactor = 0.01
dayup = 1.0
for i in range(365):
    if i % 7 in [6, 0]:
        dayup = dayup*(1 - dayfactor)
    else:
        dayup = dayup*(1 + dayfactor)

print("{:.2f}".format(dayup))

运行结果如下:
在这里插入图片描述

但是事实上,有时候工作日努力,休息日不努力,很难达到预期效果,所以,这个时候我们就要问了,工作日模式要努力到什么水平,才能与每天努力1%一样?
小伙伴A:一年365天,每天进步1%,不停歇
小伙伴B:一年365天,每周工作5天休息2天,休息日下降1%,要多努力呢?
我们抛开数学思维,我们使用计算机,当然我们可以用一种笨方法进行试错,也就是说给小伙伴一个值,用来计算是否能够匹配上A,如果还不行,就继续增加这个值,也就是让B的努力多一点,直到匹配上A;在这里我们知道,当A一年365天,每天进步1%的话,最终累计进步是37.78,我们整体的思路是,让B持续的努力(让这个数值不断的+0.001),直到不小于37.78,程序代码如下:

def dayUp(df):
    dayup = 1
    for i in range(365):
        #如果周末休息,就后退
        if i % 7 in [6, 0]:
            dayup = dayup*(1 - 0.01)
        #工作日前进
        else:
            dayup = dayup*(1 + df)
    return dayup
dfactor = 0.01
while dayUp(dfactor) < 37.78:
    dfactor += 0.001
print("工作日努力的参数是:{:.3f}".format(dfactor))

运行后的结果是:
在这里插入图片描述

也就是小伙伴B努力为0.019才能和小伙伴A持平

字符串类型及操作

字符串类型的表示
字符串有2类共4种表示方法,为什么这样表示呢?
——如果希望在字符串中包含双引号或单引号呢?我们可以用如下表现形式
‘这里有个双引号(“)‘或者“这里有个单引号(’)”
——如果希望在字符串中既包括单引号又包括双引号呢?我们可以用如下表现形式
‘’‘这里既有单引号(’)又有双引号(”)’‘’

字符换的序号

我们之前讲过,字符串存在正序和逆序,这个就不多说了,我们来直接说下字符串的切片
我们可以使用[M:N:K]根据步长对字符串切片
——<字符串>[M:N],M缺失表示至开头,N缺失表示至结尾,举例子:
“0一二三四五六七八九十”,[3]结果是“0一二”
——<字符串>[M:N:K],根据步长K对字符串切片,举个例子:
“0一二三四五六七八九十”,[1:8:2]结果是“一三五七”
——那,如果我们想让我们的字符串反转,该怎么做呢?
“零一二三四五六七八九十”,[::-1],结果是“十九八七六五四三二一零”

字符串的特殊字符
转义符
-转义符表达特定字符的本意,使用反斜杠/表示
“这里有个双引号(“)”结果为这里有个双引号(”)
-转义符形成一些组合,表达一些不可打印的含义
”\b"回退“\n"换行(光标移动到下行首)“\r”回车(光标移动到本行首)

字符串操作符

在这里插入图片描述

字符串处理函数

一些以函数形式提供的字符串处理功能
在这里插入图片描述
在这里插入图片描述

字符串的处理方法

常用的八个处理方法如图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

字符串类型的格式化

使用.format()方法实现,具体使用的过程中我们需要使用一个概念,叫槽,槽相当于一个占位信息符,使用{}来表示,它只在字符串中有用,规则就是format中的参数按照顺序填到模板字符串的槽中,如下:
在这里插入图片描述

进一步我们可以在槽中指定需要添加的参数的位置,如下,{1}对应了format中的C,其他同理
在这里插入图片描述

接下来,我们也可以对format进行格式控制,简单说,在槽的内部,除了槽的参数序号之外,我们可以通过一个冒号,来引导一些参数,控制某一个变量在槽位置的输出格式
python一共提供了六种格式标记,分别是填充、对其、宽度,一个逗号,精度和类型,这六种方式看起来很复杂,也不好记忆
在这里插入图片描述
我们简单将上述六种类型分成两类,举个示例
在这里插入图片描述
在这里插入图片描述

time库的使用

time库基本介绍

处理时间的标准库
计算机时间的表达
提供获取系统时间并格式化输出功能
提供系统级精确计时功能,用于程序性能分析
使用import引入即可
包括三类函数:
——时间获取:time() ctime() gmtime()
——时间格式化:strftime() strptime()
——程序计时:sleep() perf_counter()

时间获取

在这里插入图片描述
在这里插入图片描述

时间格式化

以合理方式展示出来的方法,我们可以使用gmtime这个函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

程序计时应用

——指的是测量起止动作所经历的过程
——测量时间:perf_counter(),它可以获取计算机中CPU也就是中央处理器以其频率运行的时钟,这个时间往往是以纳秒来计算的,所以这样获取的时间会非常的精准
——产生时间:sleep()
在这里插入图片描述
在这里插入图片描述

文本进度条问题分析

文本进度条:采用字符串方式打印可以动态变化的文本进度条,需要在一行中逐渐变化
——采用sleep函数模拟
我们简单来个程序,如下:

import time

scale = 10  #文本进度条宽度
print("------执行开始------")
for i in range(scale + 1):
    a = '*' * i
    b = '.' * (scale - i)
    c = (i/scale)*100
    print("{:^3.0f}%[{}->{}]".format(c, a, b))
    time.sleep(0.1)
print("++++++执行开始++++++")

执行之后的结果是
在这里插入图片描述
我们看到,我们上面的程序代码实现的结果是没有动态刷新的,接下来我们要实现动态刷新
——刷新的本质:用后打印的字符覆盖之前的字符
——不能换行:print()需要被控制
——要能回退:打印后光标退回到之前的位置\r
刷新的关键就是\r,直接上一段简单的代码

import time

for i in range(101):
    #输出的字符串,输出之前把光标放在行的行首,并且不换行
    print("\r{:3}%".format(i), end="")
    time.sleep(0.1)

运行之后我们可以看到这个数值变化的过程,直到100%停止
在这里插入图片描述

那么,我们进一步丰富下,看下效果

import time

scale = 50
start = time.perf_counter()
print("执行开始".center(scale//2, "-"))
for i in range(scale + 1):
    a = '*' * i
    b = '.' * (scale - i)
    c = (i/scale)*100
    dur = time.perf_counter() - start
    print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c, a, b, dur), end="")
    time.sleep(0.1)
print("\n"+"执行结束".center(scale//2, "+"))

运行后的结果,我们可以看到进度覆盖的变化
在这里插入图片描述

程序的控制结构

程序的分支结构

单分支结构

根据判断条件结果而选择不同向前路径的运行方式,使用方式:
if <条件>:
<语句块>
举个例子:

guess = eval(input())
if guess == 99:
    print("猜对了")
    
    
#当然,我们的判断条件也可以直接使用真假来表示
if True:
    print("你真棒")

二分支结构

根据判断条件结果而选择不同向前路径的运行方式,使用方式
if <条件>:
<语句块1>
else:
<语句块2>
举个简单例子:

guess = eval(input())
if guess == 99:
    print("猜对了")
else:
    print("猜错了")


#当然,我们的判断条件也可以直接使用真假来表示
if True:
    print("你真棒")
else:
    print("你也好棒")

多分支结构

"""
if <条件>:
    <语句块1>
elif:
    <语句块2>
    ......
else:
    <语句块2>
"""

条件判断及组合

在这里插入图片描述
在这里插入图片描述

程序的异常处理

"""
try:
    <语句块1>
except:
    <语句块2>
    
或者使用

try:
    <语句块1>
except <异常类型>:
    <语句块2>
"""
try:
    <语句块1>
except <异常类型><语句块2>
else:
    <语句块3>
finally:
    <语句块4>
其中,语句块4一定执行,语句块3在不发生异常时执行

实例5:身体质量指数BMI

——指的是对身体质量的刻画
——Body Mass Index
——国际上常用的衡量人体肥胖和健康程度的重要标准,主要用于统计分析
——定义:BMI=体重kg/身高的平方(m的平方)
标准的数值内容如下
在这里插入图片描述

height, weight = eval(input("请输入身高\米和体重\公斤,逗号隔开: "))
bmi = weight / pow(height, 2)
print("BMI数值为:{:.2f}".format(bmi))
#国内,国际
who, nat = "", ""
if bmi < 18.5:
    who, nat = "偏廋", "偏廋"
elif 18.5 <= bmi < 24:
    who, nat = "正常", "偏廋"
elif 24 <= bmi < 25:
    who, nat = "偏胖", "正常"
elif 25 <= bmi < 28:
    who, nat = "偏胖", "偏胖"
elif 28 <= bmi < 30:
    who, nat = "肥胖", "偏胖"
elif 30 <= bmi:
    who, nat = "肥胖", "肥胖"
print("BMI指数国内是{},国际是{}".format(who, nat))

其实总体代码逻辑很简单,我们实现的方式也有很多种,大家也可以自行进行丰富处理

程序的循环结构

遍历循环

"""
使用方式是
for <循环变量> in <>遍历结构:
    <语句块>


——由保留字for和in组成,完整遍历所有元素后结束
——每次循环,所获得的元素放入循环变量,并执行一次语句块
"""

有哪些应用呢

1、计数循环
for i in range(N):
    <语句块>
——遍历由range()函数产生的数字序列,产生循环
2、计数循环(特定次)
for i in range(M, N, P):
    <语句块>
——遍历由range()函数产生的数字序列,产生循环
'''
3、字符串遍历循环
for c in s:
    <语句块>
——s是字符串,遍历字符串每个字符,产生循环
'''
for i in "python666":
    print(i, end= ',')

在这里插入图片描述

'''
4、列表遍历循环
for item in ls:
    <语句块>
——ls是一个列表,遍历其每个元素,产生循环
'''
for item in ["python666", '3', 'aa']:
    print(item, end= ',')

在这里插入图片描述

'''
5、文件遍历循环
for line in fi:
    <语句块>
——fi是一个文件标识符,遍历其每行,产生循环
'''

无限循环

由条件控制的循环运行方式,反复执行语句块,直到条件不满足时结束,比如while

循环控制保留字

break——跳出并结束当前整个循环,执行循环后的语句
continue——结束当次循环,继续执行后续次数循环

举几个例子吧

for c in "python":
    if c == "t":
        continue
    print(c, end=",")

在这里插入图片描述

for c in "python":
    if c == "t":
        break
    print(c, end=",")

在这里插入图片描述

循环的扩展

循环与else

'''
for <循环变量> in <遍历结构>:
    <语句块1>
else:
    <语句块2>
    
    
或者是


while <条件>:
    <语句块1>
else:
    <语句块2>
'''

random库基本介绍

随机数的python库

基本随机数函数:  seed()   random()
扩展随机数函数:  randint()   getrandbits()   uniform()   randrange()  choice()   shuffle()  

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

圆周率的计算问题分析

圆周率大家都知道,它是一个无理数,而且圆周率有一个近似计算的公式
在这里插入图片描述
接下来我们就要想办法用程序实现这个公式

pi = 0
N = 100
for k in range(N):
    pi += 1/pow(16,k) * (4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))
print("圆周率是:{}".format(pi))

在这里插入图片描述

当然我们也可以是使用蒙特卡罗方法,蒙特卡罗方法就是圆的面积跟单位方形的面积之比,就构成了圆周率的相关数据,如下图,如果我们向右图中撒点,如果这个点落在圆内部,它就是圆的面积的一部分,如果落在整个的方形中,就是方形面积的一部分,接下来我们用代码简单实现下
在这里插入图片描述

from random import random
from time import perf_counter

darts = 1000*1000  #区域内抛洒点的总数量
hits = 0.0  #圆内部的初始数量
start = perf_counter() #启动计时
for i in range(1, darts+1):#开始循环撒点
    x, y = random(), random()
    if pow(x**2 + y**2, 0.5) <= 1.0:
        hits += 1
pi = 4*(hits/darts)
end = perf_counter()
print("圆周率的值是:{}".format(pi))
print("所用时间是:{}".format(end-start))

运行之后的结果是:

在这里插入图片描述

函数和代码复用

函数的定义与使用

函数的理解和定义
函数是一段代码的表示,是一段具有特定功能的、可重用的语句组;
函数是一种功能的抽象,一般函数表达特定功能;
函数有两个作用:降低编程难度和代码复用
它的表达形式如下:

def <函数名>(<参数(0个或者多个)>):
    <函数体>
    return <返回值>

函数定义后,不经过调用,不会被执行

函数的使用及调用过程

def fact(n):
    s = 1
    for i in range(1, n+1):
        s *= i
    return s

fact(10)

函数的参数传递
函数可以有参数,也可以没有,但是必须保留括号
函数定义时可以为某些参数指定默认值,构成可选参数
举个例子

def fact(a, b=6):
    c = a+b
    return c


print(fact(10))

其中b就是可选参数
参数传递的两种方式:函数调用时,参数可以按照位置或名称方式传递

函数的返回值
函数可以返回0个或者多个结果
return保留字用来传递返回值
函数可以有返回值,也可以没有,可以有return,也可以没有return
return可以传递0个返回值,也可以传递任意多个返回值
举例如下:

def fact(n, m=1):
    s = 1
    for i in range(1, n+1):
        s*=i
    return s//m, n, m


print(fact(10))

运行之后的结果是:
在这里插入图片描述
我们可以看到运行之后的结果其实是一个元组类型

局部变量和全局变量
其实两者的区别主要在于,局部是函数内部使用的变量,而函数外部,整个程序使用的变量叫全局变量
1、局部变量和全局变量是不同变量,局部变量是函数内部的占位符,与全局变量可能重名但不同,函数运算结束后,局部变量被释放,我们也可以使用global保留字在函数内部使用全局变量
在这里插入图片描述

2、局部变量为组合数据类型且未创建,等同于全局变量
在这里插入图片描述
lambda函数
lambda函数返回函数名作为结果
——lambda函数是一种匿名函数,即没有名字的函数
——使用lambda保留字定义,函数名是返回结果
——lambda函数用于定义简单的、能够在一行内表示的函数
使用形式:

<函数名> = lambda <参数>:<表达式>

举个例子:

f = lambda x, y : x+y
print(f(10, 15))

运行结果是25
在这里插入图片描述
为什么要涉及lambda函数呢?这就涉及了lamda函数的应用,一般在我们编写代码的时候,去定义这个函数,哪怕这个函数只有一行,我们也建议使用def和return方式来定义,要谨慎使用lambda函数,也就是说,lambda函数并不是定义函数的常用形式,它的存在主要用作一些特定函数或方法的参数,有些复杂的函数,它的某一个参数就是一个函数作为一个参数来使用,这种情况下,我们使用lambda函数。

实例:七段数码管绘制

七段数码管:由七段不同线条组成不同的数字,如图所示:
在这里插入图片描述
我们要想绘制这个七段数码管,简要的步骤如下:
1、绘制单个数字对应的数码管
2、获得一串数字,绘制对应的数码管
3、获得当前系统时间,绘制对应的数码管
在这里插入图片描述
在这里插入图片描述
完整代码如下:

import turtle
def drawLine(draw):
    #绘制单段数码管
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    turtle.right(90)

def drawDigit(digit):
    #绘制七段数码管
    drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
    drawLine(True) if digit in [0,1, 3, 4, 5, 6,7, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 6, 8] else drawLine(False)
    turtle.left(90)
    drawLine(True) if digit in [0, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 3, 5, 6,7, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
    turtle.left(180)
    turtle.penup()
    turtle.fd(20)
def drawDate(date):
    #获得要输出的数字
    for i in date:
        drawDigit(eval(i))  #通过eval函数将数字变成整数
def main():
    turtle.setup(800, 350, 200, 200)
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate("20240222")
    turtle.hideturtle()
    turtle.done
main()

代码复用与函数递归

我们可以编写的代码当成是一种资源进行抽象。同一份代码在需要时可以被重复使用
在函数定义中,调用函数自身的方式就是递归,其实递归不是程序设计的新名词,它在数学中也广泛存在,比如n的阶乘,在递归中,有两个关键的特征:
——链条:计算过程中存在的递归链条
——基例:存在一个或者多个不需要再次递归的基例
类似于数学中的归纳法
比如说n的阶乘,我们可以使用如下函数实现:

def fact(n):
    if n == 0:
        return 1
    else:
        return n*fact(n-1)


print(fact(4))

调用之后的运行之后的结果显示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/455b0148364f420b8e6438c3cb471372.png

我们可以简单的使用如下图来理解递归调用的整个过程

在这里插入图片描述
这种函数递归的思想其实有很多的应用,比如说,字符串的反转,简单实现如下:

def fact(s):
    if s == "":
        return s
    else:
        return fact(s[1:])+s[0]

s = "qwedfc"
print(fact(s))

再比如斐波那契数列:F(n)=F(n-1)+F(n-2),我们使用函数+分支结构,具体再细分就是分别实现递归基例和递归链条:

def fact(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fact(n-1)+fact(n-2)

PyInstaller库的使用

PyInstaller库是将.py源代码转换成无需源代码的可执行文件,它是一个第三方库
官方网站:https://pyinstaller.org/en/stable/
第三方库就是使用前需要额外安装
安装第三方库需要使用pip工具
PyInstaller库常用的参数如下:
在这里插入图片描述

实例:科赫雪花小包裹

科赫雪花是一种高大上的分形几何,是一种迭代的几何图形,广泛存在于自然界中,这种典型的曲线我们叫做科赫曲线,也叫做雪花曲线,那么,我们怎么实现用python绘制出科赫曲线呢?
那我们的思想就是:函数+分支
递归链条:线段的组合
递归基例:初识线段
简单代码实现如下:

import turtle
def koch(size, n):
    if n == 0:
        turtle.fd(size)
    else:
        for angle in [0, 60, -120, 60]:
            turtle.left(angle)
            koch(size/3,  n-1)
def main():
    turtle.setup(600, 600)
    turtle.penup()
    turtle.goto(-200, 100)
    turtle.pendown()
    turtle.pensize(2)
    level = 3
    koch(400, level)  #3阶曲线
    turtle.right(120)
    koch(400, level)
    turtle.right(120)
    koch(400, level)
    turtle.hideturtle()
main()

代码运行后如下:
在这里插入图片描述

组合数据类型

组合数据类型有三种重要的数据结构,他们分别是:集合类型、序列类型和字典类型

集合类型及操作

集合类型:与数学中的集合概念一致,是多个元素的无序组合;
——元素之间无序,每个元素唯一,不存在相同的元素;
——集合元素不可更改,不能是可变数据类型
集合用{}表示,元素间用逗号分隔
建立集合类型用{}或set()
建立空集合类型,必须使用set()

集合间操作:并、差、交、补
在这里插入图片描述
当然,他们还有大于等于小于等于操作符
除了这几种外,python还提供了如下的增强操作符:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
那么,集合类型的应用场景有哪些呢?
首先是包含关系的比较,如下:

print("p" in {"p", "y", 123})
print({"p", "y"} >= {"p", "y", 123})

运行之后的结果是:
在这里插入图片描述
另外,集合有一个非常典型的数据应用场景,那就是数据去重,数据去重指的是,集合类型所有元素无重复,举个实例:

ls = ["p", "p", "y", "y", 123]
print(set(ls))
lt = list(set(ls))
print(lt)

运行之后:
在这里插入图片描述

序列类型及操作

序列类型是python组合数据类型中非常重要的一种类型结构
序列是具有先后关系的一组元素,与集合不同,序列元素之间存在先后关系,
序列是一维元素向量,元素类型可以不同
类似数学中的元素序列
元素间由序号引导,通过下标访问序列的特定元素
序列是一个基类类型,我们一般不直接使用序列,我们一般使用序列衍生出来的几种类型,比如说字符串类型,是序列类型的一种衍生,元组类型是一种衍生,列表类型是一种衍生,但是序列类型的所有操作,在字符串类型、元组类型和列表类型中都是适用的,同时他们也还具有各自的操作能力,所以它是一种基础的数据类型结构
序列类型有一个关于序号的定义,元素存在正向递增的序号的索引的关系和反向递减序号的索引关系,如下:
在这里插入图片描述
序列类型有一些通用的操作符,如下:
在这里插入图片描述
在这里插入图片描述
元组是序列类型的一种扩展
元组是一种序列类型,一旦创建就不能被修改
使用小括号()或tuple()创建,元素间用逗号,分割
可以使用或不适用小括号
元组类型继承了序列类型的全部通用操作
元组因为创建后不能修改,因此没有特殊操作
使用或不使用小括号
列表类型及操作
——列表是一种序列类型,创建后可以随意被更改
——使用方括号[]或list()创建,元素间用逗号,分割
——列表中各元素类型可以不同,无长度限制

在定义列表的时候,如果我们使用了[]或者使用了函数list,那么我们真正的创建了一个列表,但是,如果我们没有使用函数或者[],仅仅使用赋值,那么,它只是将一段列表赋给了一个新的名字,相当于重新命名。
列表的操作函数和方法:
在这里插入图片描述
在这里插入图片描述

字典类型及操作

再说字典之前,我们要先理解一点就是映射的概念,映射其实就是一种键(索引)和值(数据)的对应,字典就是其中的一种体现;
在python中我们使用大括号{}和dict()创建,键值对用冒号:表示;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

jieba库的使用

jieba库是优秀的中文分词第三方库
——中文文本需要通过分词获得单个的词语
——jieba是优秀的中文分词第三方库,需要额外安装
pip install jieba
具体的原理就是:我们知道词语与词语之间,它都是由汉字组成的,所以简单来说,jieba库是通过中文词库的方式来识别分词的,利用一个中文词库,确定汉字之间的关联概率,形成分词的结果

jieba分词的三种模式:精确模式、全模式、搜索引擎模式
精确模式:把文本精确的切分开,不存在冗余单词
全模式:把文本中所有可能的词语都扫描出来,有冗余
搜索引擎模式:在精确模式基础上,对长词再次切分

在这里插入图片描述
在这里插入图片描述

文件和数据格式化

文件的使用

文件时数据的抽象和集合
文件是存储在辅助存储器上的数据序列
文件是数据存储的一种形式
文件展现形态:文本文件和二进制文件,他们只是文件的展示方式,本质上,所有文件都是二进制形式存储的,形式上,所有文件采用两种方式展示

文本文件:
文件是数据的抽象和集合,由单一特定编码组成的文件,如UTF-8编码,由于存在编码,也被看成是存储着的长字符串,适用于例如 .txt文件, .py文件

二进制文件
文件是数据的抽象和集合
直接由比特0和1组成,没有统一字符编码,一般存在二进制0和1的组织结构,即文件格式;适用于例如: .png文件, .avi文件等

文件的打开和关闭

文件处理的步骤就是:打开——操作——关闭
文件的打开:
<变量名> = open(<文件名>, <打开模式>)
这里的文件名指的是文件路径和名称,源文件同目录可省路径,打开模式可以是文本或者二进制
在这里插入图片描述

python种提供了如下几种的读和写文件操作
在这里插入图片描述

python提供了7种打开模式:
在这里插入图片描述
总结如下:
在这里插入图片描述
二进制和文本形式文件打开
在这里插入图片描述

文件的关闭:
<变量名>close()
一般打开就要有对应的关闭操作

文件内容的读取:

在python中提供如下读取的方法
.read(size=-1),读入全部内容,如果给出参数,读入前size长度
.readline(size=-1),读入一行内容,如果给出参数,读入改行前size长度
在这里插入图片描述

遍历全文:方法一
fname = input("请输入要打开的文件名称")
fo = open(fname, "r")
txt = fo.read()
fo.close()
这个是一次性的读取文件,缺点是如果对于大型的文件,读取将占用超级大的内存,所以我们可以使用方法二,进行分段读取

遍历全文本:方法二
fname = input("请输入要打开的文件名称")
fo = open(fname, "r")
txt = fo.read(2)
while txt != "":
    #对txt进行处理
    txt = fo.read(2)
fo.close()

文件的逐行操作

逐行遍历文件:方法一
fname = input("请输入要打开的文件名称")
fo = open(fname, "r")
for line in fo.readlines():
    print(line)
fo.close()
一次读入,分行处理

逐行遍历文件:方法二
fname = input("请输入要打开的文件名称")
fo = open(fname, "r")
for line in fo:
    print(line)
fo.close()
分行读入,逐行处理,对于极大的文件处理非常有效

数据的文件写入

在这里插入图片描述

在这里插入图片描述

数据组织的维度

一维数据:由对等关系的有序或无序数据构成,采用线性方式组织——对应python中的列表、数组和集合等概念
二维数据:由多个一维数据构成,是一维数据的组合形式
多维数据:由一维或二维数据在新维度上扩展形成
高维数据:仅利用最基本的二元关系展示数据间的复杂结构,比如字典

数据的操作周期,可以简单理解为:存储《》表示《》操作

一维数据的表示:

如果数据间有序:我们可以使用列表表示,它可以有效的表达一维有序数据,我们也可以使用for循环遍历数据,进而对每个数据进行处理
如果数据间无序:我们可以使用集合表示,我们可以使用for循环遍历数据,进而对每个数据进行处理

一维数据的存储:

存储方式一:空格分隔,使用一个或者多个空格分隔进行存储,不换行
缺点:数据中不能存在空格

存储方式二:逗号分隔,使用英文半角逗号分隔数据进行存储,不换行
缺点:数据中不能有英文逗号

当然,我们也可以使用其他方式进行存储,比如说采用其他特殊字符进行分隔存储

一维数据的处理:

也就是将存储的数据读入程序或者说将程序表示的数据写入文件
比如说从分隔的文件中读取数据

txt = open(fname).read()
ls = txt.split()
f.close()

同样的道理,我们也可以从特殊符号$分割的文件中读取数据

txt = open(fname).read()
ls = txt.split("$")
f.close()

再比如我们采用空格的方式将数据写入文件

ls = ['中国', '美国', '日本']
f = open(fname, 'w')
f.write(' '.join(ls))
f.close()

二维数据的格式化和处理

二维数据的表示

我们一般采用列表类型可以表达二维数据,可以简单理解为嵌套
我们可以使用for循环进行两层遍历

CSV格式与二维数据的存储

二维数据的读入处理

从CSV文件中读入数据

fo = open(fname)
ls = []
for line in fo:
    line = line.replace("\n", "")
    ls.append(line.split(","))
fo.close()

将数据写入CSV文件

ls = [[], [], []]
f = open(fname, w)
for item in ls:
    f.write(','.join(item) + '\n')
f.close()

wordcloud库基本介绍

优秀的词云展示第三方库,词云以词语为基本单位,更加直观和艺术的展示文本
使用pip install wordcloud进行安装

wordcloud库使用说明

wordcloud库把词云当作一个WordCloud对象
wordcloud.WordCloud()代表一个文本对应的词云,可以根据文本中词语出现的频率等参数绘制词云,词云的形状,尺寸,颜色都可以设定
在这里插入图片描述

w = wordcloud.WordCloud()
#以WordCloud对象为基础
#配置参数、加载文本、输出文件

步骤1:配置对象参数
步骤2:加载词云文本
步骤3:输出词云文件
来吧 简单搞个实例

import wordcloud

c = wordcloud.WordCloud()
c.generate("wordcloud by python")
c.to_file("pythoncloud.png")

运行完成后会生成一个图片,默认400*200像素
在这里插入图片描述

那么,从文本变成词云,wordcloud做了哪些事情呢,简单来说,wordcloud大概做了四件事情
首先是将文本以空格进行单词分割
统计:单词出现次数并过滤,将很短的单词过滤掉
字体:根据统计配置字号
布局:颜色环境尺寸等

配置对象参数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
图片太多,直接上一个实例:

import wordcloud
txt = "life is short, you need python"
w = wordcloud.WordCloud(background_color='white')
w.generate(txt)
w.to_file("pywcloud.png")

运行之后我们可以看到如下内容:
在这里插入图片描述
当然,我们也可以对中文进行分词
举个例子

import jieba
import wordcloud
txt = "程序设计语言是用于书写计算机程序的语言。语言的基础是一组记号和一组规则。根据规则由记号构成的记号串的总体就是语言。在程序设计语言中,这些记号串就是程序。程序设计语言有3个方面的因素,即语法、语义和语用"
w = wordcloud.WordCloud(width = 1000, font_path="msyh.ttc", height=700)
w.generate(" ".join(jieba.lcut(txt)))
w.to_file("pywcloud1.png")

运行之后的数据:
在这里插入图片描述

程序设计方法学

体育竞技分析

比赛规则:
双人击球比赛:A&B,回合制,5局3胜
开始时一方先发球,直至判分,接下来胜者发球
球员只能在发球局得分,15分一局

自顶向下:解决复杂问题的有效方法,将一个总问题表达为若干个小问题组成的形式,使用同样方法进一步分解小问题,直到计算机可以很轻松的解决
自底向上:逐步组建复杂系统的有效测试方法,分单元测试,逐步组装,按照自顶向下相反的路径操作,直至,系统各部分以组装的思路都经过测试和验证

程序总体框架及步骤:
步骤1:打印程序的介绍性信息式
步骤2:获得程序运行参数:proA,proB,n
步骤3:利用球员A和B的能力值,模拟n局比赛
步骤4:输出球员 A和B获胜比赛的场次及概率
以上我们可以定义4个函数:
printInfo()
getInputs() 获得用户的输入
simNGames() 模拟n场比赛
prinSummary() 最后输出结果
第一阶段:程序总体框架及步骤
在这里插入图片描述
分别开始对这几个函数进行丰富
在这里插入图片描述
在这里插入图片描述
或者我们直接上代码:

def printInfo():
    print("这个程序模拟两个选手A和B的某种竞技比赛")
    print("程序运行需要A和B的能力值(以0到1之间的小数表示)")

def getInputs():
    a = eval(input("请输入选手A的能力值(0-1):"))
    b = eval(input("请输入选手B的能力值(0-1):"))
    n = eval(input("请输入模拟比赛的场次:"))
    return a, b, n

def prinSummary(winsA, winsB):
    n = winsA + winsB
    print("竞技分析开始,共模拟{}场比赛".format(n))
    print("选手A获胜{}场比赛,占比{: 0.1%}".format(winsA, winsA/n))
    print("选手B获胜{}场比赛,占比{: 0.1%}".format(winsA, winsA / n))

def gameOver(a, b):
    return a == 15 or b == 15
def simOneGame(probA, probB):
    scoreA, scoreB = 0, 0
    serving = "A"
    while not gameOver(scoreA, scoreB):
        if serving == "A":
            if random() < probA:
                scoreA += 1
            else:
                serving = "B"
        else:
            if random() < probB:
                scoreB += 1
            else:
                serving = "A"
    return scoreA, scoreB





def simNGames(n, probA, probB):
    winsA, winsB = 0, 0
    for i in range(n):
        scoreA, scoreB = simOneGame(probA, probB)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA, winsB


def main():
    printInfo()
    probA, probB, n = getInputs()
    winsA, winsB = simNGames(n, probA, probB)
    prinSummary(winsA, winsB)


main()

运行结果是:

在这里插入图片描述

python程序设计思维

计算思维与程序设计

第3种人类思维特征
逻辑思维:推理和演绎,数学为代表
实证思维:实验和验证,物理为代表
计算思维:设计和构造,计算机为代表,比如汉诺塔递归
计算思维有很明显的特征,就是抽象和自动化
也就是说要抽象问题的计算过程,利用计算机自动化求解
计算思维是基于计算机的计算思维

抽象问题的计算过程,利用计算机自动化的求解,这是计算思维的核心概念,简单叫抽象加自动化

编程是将计算思维变成显示的手段

计算生态与python语言

计算生态以开源项目为组织形式,充分利用“共识原则”和“社会利他”组织人员,在竞争发展、相互依存和迅速更迭中完善信息技术的更新换代,形成了技术的自我演化路径

开源思想深入演化和发展,形成了计算生态

没有顶层设计、以功能为单位、具备三个特点,分别是竞争发展、相互依存、迅速更迭

比如说python
第三方库>15万个
同一个功能,python会提供2个及以上个库进行实现和竞争
库与库之间依存发展
庞大的社区,更迭迅速

看见更大的python世界

python社区https://pypi.org/

os库的使用

os库提供通用的、基本的操作系统交互功能
os库是python的标准库,包含几百个函数
常用路径操作(os.path)、进程管理(启动系统中其他程序)、环境参数(获得系统软硬件信息)等几

类 os库之路径操作

os.path子库以path为入口,用于操作和处理文件路径
import os.path
import os.path as op
常用的操作函数如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

os库的进程管理

进程管理指的是,使用我们python编写的程序,去调用其他的外部程序,那么os库提供了一个函数是
os.system(command)
——执行程序或命令command
——在windows系统中,返回值为cmd的调用返回信息

os库的环境参数

环境参数指的是获取或改变操作系统中的环境信息,os库中有一些常用的函数,比如
在这里插入图片描述
在这里插入图片描述

“第三方库安装脚本”问题分析

需求就是:批量安装第三方库需要人工干预,能否自动安装
自动执行pip逐一根据安装需求安装

假设我们要安装如下第三方库
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
简单代码示例如下:

import os
libs = {"numpy", "jieba"}
try:
    for lib in libs:
        os.system("pip install"+ lib)
    print("successful")
except:
    print("failed")

简单来说就是取出里面每一个不同的元素,进行遍历,连接相同的部分去执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/525163.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

顺序表——功能实现

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 目录 1.0 前言 2.0 线性表 2.1 顺序表 2.2 顺序表的分类 2.3 顺序表功能的实现…

利用Leaflet + React:构建WEBGIS

React是 Facebook 开发的一个开源库&#xff0c;用于构建用户界面。就其本身而言&#xff0c;Leaflet是一个用于将地图发布到网络的JavaScript 库。这两个工具的组合很简单&#xff0c;允许您创建动态网络地图。在本文中&#xff0c;我们将看到这种组合的一些特征以及一些简单的…

Go 项目依赖注入wire工具最佳实践介绍与使用

文章目录 一、引入二、控制反转与依赖注入三、为什么需要依赖注入工具3.1 示例3.2 依赖注入写法与非依赖注入写法 四、wire 工具介绍与安装4.1 wire 基本介绍4.2 安装 五、Wire 的基本使用5.1 前置代码准备5.2 使用 Wire 工具生成代码 六、Wire 核心技术5.1 抽象语法树分析5.2 …

并发编程之Java中Selector

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Selector提供选择执…

ChatGPT基础(一) GPT的前世今生

文章目录 GPT模型简史GPT系列模型ChatGPT的应用 最近ChatGPT3.5可以免注册使用了&#xff0c;出来刨一波坟 说一说ChatGPT的来源和应用。 GPT模型简史 Generative pre-trained transformers(GPT)生成式预训练转换模型是大语言模型的一种(Large Language Model–>LLM)。它是…

C语言高效的网络爬虫:实现对新闻网站的全面爬取

1. 背景 搜狐是一个拥有丰富新闻内容的网站&#xff0c;我们希望能够通过网络爬虫系统&#xff0c;将其各类新闻内容进行全面地获取和分析。为了实现这一目标&#xff0c;我们将采用C语言编写网络爬虫程序&#xff0c;通过该程序实现对 news.sohu.com 的自动化访问和数据提取。…

深入理解GO语言——GC垃圾回收二

文章目录 前言一、Go V1.5的三色并发标记法总结 前言 书接上回&#xff0c;无论怎么优化&#xff0c;Go V1.3都面临这个一个重要问题&#xff0c;就是mark-and-sweep 算法会暂停整个程序 。 Go是如何面对并这个问题的呢&#xff1f;接下来G V1.5版本 就用 三色并发标记法 来优…

深入MyBatis的动态SQL:概念、特性与实例解析

MyBatis 是一个优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它可以使用简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff0c;即普通的 Java 对象为数据库中的记…

混合云构建-如何通过Site to Site VPN 连接 AWS 和GCP云并建立一个高可用的VPN通信

如果我们的业务环境既有AWS云又有GCP云,那么就需要将他们打通,最经济便捷的方式就是通过Site-to-Site VPN连接AWS和GCP云,你需要在两个云平台上分别配置VPN网关,并建立一个VPN隧道来安全地连接这两个环境,稍微有些复杂繁琐,以下是详细步骤的动手实践: 一、在GCP 云中创…

通过自动化部署消除人为操作:不断提高提交部署比率

三十年后&#xff0c;我仍然热爱成为一名软件工程师。事实上&#xff0c;我最近读了威尔拉森&#xff08;Will Larson&#xff09;的《员工工程师&#xff1a;超越管理轨道的领导力》&#xff0c;这进一步点燃了我以编程方式解决复杂问题的热情。知道雇主继续照顾员工、原则和杰…

pyside6,“提升为”的部件使用困惑

在Qt designer中&#xff0c;新建一个QMainWindow&#xff0c;新建一个QWidget&#xff0c;并命名为widget&#xff0c;如图&#xff1a; 新建NewClass.py&#xff0c;输入代码&#xff1a; # encoding: utf-8 from PySide6.QtWidgets import QWidgetclass NewClass(QWidget):…

关于Mac使用idea问题

多窗口切换问题 如果出现Mac打开idea新的项目&#xff0c;发现始终就一个窗口&#xff0c;不能像window那样多窗口&#xff0c;比如 只能这样来回点着切换&#xff0c;提供以下方案 1.方案一 则在idea里多个项目会呈tab页切换&#xff0c;也是始终一个窗口&#xff0c;只是多了…

SpringCloud Alibaba Sentinel 简介和安装

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十三篇&#xff0c;即介绍 SpringCloud Alibaba Sentinel 简介和安装。 二、Sentinel 简介 2.1 Sent…

STM32CubeMX配置步骤详解七 —— 时钟及其它内部参数配置(2)

接前一篇文章&#xff1a;STM32CubeMX配置步骤详解六 —— 时钟及其它内部参数配置&#xff08;1&#xff09; 本文内容主要参考&#xff1a; STM32CUBEMX配置教程&#xff08;一&#xff09;基础配置-CSDN博客 野火STM32系列HAL库开发教程 —— 第12讲 STM32的复位和时钟控制…

docker一键部署GPU版ChatGLM3

一键运行 docker run --gpus all -itd --name chatglm3 -p 81:80 -p 6006:6006 -p 8888:8888 -p 7860:7860 -p 8501:8501 -p 8000:8000 --shm-size32gb registry.cn-hangzhou.aliyuncs.com/cwp-docker/chatglm3-gpu:1.0 进入容器 docker exec -it chatglm3 /bin/bash cd /…

企业版ChatGPT用户激增至60万;百度文心一言推出个性化声音定制功能

&#x1f989; AI新闻 &#x1f680; 企业版ChatGPT用户激增至60万 摘要&#xff1a;OpenAI首席运营官Brad Lightcap在接受采访时透露&#xff0c;企业版ChatGPT的注册用户已超60万&#xff0c;相较2024年1月的15万用户&#xff0c;短短三个月内增长了300%。这一版本自2023年…

【Java】maven是什么?

先看一下基本概念: ①Maven 翻译为"专家"&#xff0c;"内行"是跨平台的项目管理工具。 主要服务于基于Java平台的项目构建&#xff0c;依赖管理和项目信息管理。 ②项目构建 项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报…

js 数组 按列循环二维数组

期待效果&#xff1a; 核心代码&#xff1a; //js function handle(array) {var result [];for (let i 0; i < array[0].length; i) {var item []; for (let j 0; j < array.length; j) {item.push(array[j][i])} result.push(item);} return result; } 运行代码&a…

14 Python进阶:math模块和requests 模块

常用方法 Python3 的 math 模块提供了许多数学函数&#xff0c;用于执行常见的数学运算。以下是 math 模块中一些常用方法的简介&#xff1a; 数值运算函数&#xff1a; math.sqrt(x)&#xff1a;返回 x 的平方根。math.pow(x, y)&#xff1a;返回 x 的 y 次幂。math.exp(x)&a…

TiDB MVCC 版本堆积相关原理及排查手段

导读 本文介绍了 TiDB 中 MVCC&#xff08;多版本并发控制&#xff09;机制的原理和相关排查手段。 TiDB 使用 MVCC 机制实现事务&#xff0c;在写入新数据时不会直接替换旧数据&#xff0c;而是保留旧数据的同时以时间戳区分版本。 当历史版本堆积过多时&#xff0c;会导致读…