Python A 笔记 第一部分


本笔记全部代码都是在Python3.8环境下运行的


第一章 程序设计基本方法

1.1 Python语言概述

  • Python 于 1990 年,由 Guido van Rossum 设计并领导开发,其语言解释器的 全部代码都是开源的;
  • Python Software Foundation 作为非盈利组织,拥有 Python 2.1 版本之后的所有版本的版权,该组织致力于更好推进并保护 Python 语言的开放性;
  • 2008年12月 Python 3.0 正式发布,该版本在语法层面和解释器内部做了很多改进,解释器内部采用完全面向对象的方式实现;
  • Python 3.x 无法向下兼容 Python 2.0 系列的既有语法;

Python 语言的特点

  • 语法简洁:实现相同功能,Python语言的代码行数仅相当于其他语言的十分之一到五分之一;
  • 与平台无关:Python程序可以在任何安装解释器的计算机环境中运行;
  • 粘性扩展:Python语言有着优异的扩展性,体现在可以集成C,C++,Java等语言编写的代码,通过接口和函数库等方式进行扩展;
  • 开源;
  • 通用灵活:可以应用于几乎各类应用;
  • 强制可读:Python通过强制缩进来体现语句间的逻辑关系,显著提高了可读性,进而增加了程序的可维护性;
  • 支持中文:Python 3.0 解释器采用了 UTF-8编码来表达所有字符信息;
  • 模式多样:虽然解释器采用面向对象方式实现,但是Python的语法层面同时支持面向过程和面向对象两种编程方式;
  • 类库丰富:Python解释器内部提供几百个内置类和函数库,此外世界各地程序员通过开源社区贡献了十几万个第三方库,具备良好的编程生态;

1.2 程序的基本编写方法

1.2.1 IPO程序编写方法

无论程序规模如何,每个程序都有统一的运算模型:输入数据,处理数据和输出数据。这种朴素运算模式形成了基本的程序编写方法:IPO(Input,Process,Output)方法。

  • 输入(Input)是一个程序的开始,程序要处理的数据有多种来源,因此形成了多种输入方式:文件输入、网络输入、控制台输入、交互界面输入、随机数据输入、内部参数输入等;
  • 输出(Output)是程序展示运算成果的方式。程序的输出方式包括:控制台输出、图形输出、文件输出、网络输出、操作系统内部变量输出等;
  • 处理(Process)是程序对输入数据进行计算产生输出结果的过程。计算问题的处理方法统称为算法,它是程序最重要的组成部分,也可以说是一个程序的灵魂;

存在没有输入输出的程序,例如:

while(True):
    a = 1

这个无限循环程序包含两行语句,while()的括号内为真时,进入第二语句执行第二语句,反之则跳过。这个括号内为True,因此代码将一直执行下去。

IPO不仅仅是程序设计的基本方法,也是描述计算问题的方式。及圆面积计算为例,IPO描述如下:

  • 输入:圆的半径 radius
  • 处理:计算圆面积 area = π · radius · radius
  • 输出:圆面积 area

1.2.2 理解问题的计算部分

编写程序的目的是:使用计算机解决问题。一般来说可分为六个步骤:

  1. 分析问题,分析问题的计算部分:首先需要明确,计算机只能解决计算问题。对于一个问题中计算部分,不同的理解将产生不同的计算问题,也将产生不同功能和复杂程度的程序。
  2. 划分边界,划分问题的功能边界:需要精确定义或描述问题的功能边界,即明确问题的输入、输出和对处理的要求。该步骤只关心功能需求,无需关心功能具体实现方法,需要明确输入、输出以及输入输出之间的总体功能关系;
  3. 设计算法,设计问题的求解算法:对于程序简单的,直接选择或者设计算法。对于程序复杂的,需要利用设计方法将大功能划分为多个小功能,或者将功能中相对独立的部分封装为具备属性和操作的类,并在各功能或类时间设计处理流程;
  4. 编写程序;
  5. 调试程序(Debug):运行程序,通过单元测试和集成测试评估程序运行结果的正确性。找到并排除程序的错误的过程成为调试;
  6. 升级维护:随着功能需求和计算需求的不断变化,对程序进行升级维护以适应这些变化。

1.3 第一章作业

  1. 单选题,以下关于Python语言中“缩进”说法正确的是 ( D )

    A. 缩进在程序中长度统一且强制使用

    B. 缩进统一为4个空格

    C. 缩进是非强制的,仅为了提高代码可读性

    D. 缩进可以用在任何语句之后,表示语句间的包含关系

  2. 单选题,以下不属于IPO模型的是 ( C )

    A. Input

    B. Process

    C. Program

    D. Output

  3. 单选题,下面不属于Python保留字的是 ( A )

    A. type

    B. import

    C. elif

    D. def

  4. ( A ) 利用print()格式化输出,哪个选项用于控制浮点数的小数点后两位输出

    A. {:.2f}

    B. {:.2}

    C. {.2}

    D. {.2f}’


第二章 Python 程序实例解析

2.1 实例1 温度转换

温度的刻画有两个不同体系:摄氏度(Celsius)和华氏度 (Fabrenheit)。摄氏度以1标准大气压下水的结冰点为 0度,沸点为 100 度,将两个温度区间进行 100等分后确定1度所代表的温度区间,进而刻画温度值。华氏度以1标准大气压下水的结冰点为 32度,沸点为 212度,将两个温度区间进行 180 等分后定义为1度区间华氏度的1度比摄氏度的1度所对应温度区间更小,所以华氏度体系更为细致。由于历史原因,不同国家可能采用不同的温度表示方法,例如,中国采用摄氏度,美国采用华氏度。

对于去美国旅行的中国游客来说,需要将当地发布的华氏温度转换为摄氏温度以符合自己的理解习惯:同样,来中国旅行的美国游客,也需要将当地发布的摄氏温度转换为华氏温度。问题是,如何利用计算机程序辅助旅行者进行温度转换?

  1. 分析问题:从三个角度理解问题的计算部分。

    第一:利用程序进行温度转换,用户输入温度值,程序给出结果;

    第二,通过语音识别、图像识别检测数数据源,再由程序转换出结果给用户;

    第三,通过互联网获取温度值,再将数据转换输出结果给用户;

    我们需要根据特定的技术和社会条件下,分析出一个问题最经济、最合理的计算部分,进而用程序实现。

  2. 划分边界:在确定问题计算部分的基础上,划分出问题的边界,即并且问题的输入、输出和对数据处理的要求。由于程序可能接收华氏温度和摄氏温度,并相互转换,因此该功能的IPO描述如下:

    • 输入:带华氏或摄氏标志的温度值;
    • 处理:根据温度标志选择适当的温度转换算法;
    • 输出:带摄氏或华氏标志的温度值

    这里采用82F表示华氏82度,28C表示摄氏28度。

  3. 设计算法:根据华氏和摄氏的温度定义,两个温度体系都以1 STP下输的结冰点和沸点为温度区间边界,因此转换算法如下:

    C = ( F-32 ) / 1.8
    F = C * 1.8 + 32
    
  4. 编写程序:根据IPO描述和算法设计,编写如下温度转换的Python程序:

    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("输入格式错误")
    
  5. 调试程序:将上述程序在Pycharm中运行。

    输入带有摄氏标志的温度值,程序运行结果如下:
    截屏2022-03-29 10.21.58

​ 输入带有华氏标志的温度值,程序运行结果如下:

截屏2022-03-29 10.21.08-8520476

​ 上述程序符合Python语法,执行结果正确。

  1. 升级维护:例如算法改进,平台更换等;

2.2 Python 程序语法元素分析

2.2.1 程序的格式框架

Python程序采用严格的缩进来表明程序的格式框架。代码编写当中,缩进可以使用 Tab键 实现,可以用多个空格(通常情况下是4个空格)实现,但两者不可以混用。

截屏2022-03-29 10.29.48

图a 其中的箭头表示if语句与后面语句之间单层缩进关系。图b 给出的是由嵌套形成的多层缩进。

Python语言对语句之间的层次没有限制,可以“无限制”嵌套使用。

缩进表达了所属关系,单层缩进代码属于之前最邻近的一行非缩进代码,多层缩进关系则根据缩进关系确定所属范围。

需要注意的是,不是所有语句都可以缩进,例如print()语句就不可以缩进

2.2.2 注释

Python有两种注释方式:单行注释和多行注释

# 这是一个单行注释
'''
这是一个多行注释
print("Hello")
在注释中的内容会被解释器过滤掉,因此上面的语句不会被执行
'''

通常来讲,注释有三个主要的用途

  1. 标注作者和版权信息,作者、日期、用途、版权声明等信息;
  2. 解释代码原理和用途;
  3. 辅助调试程序:临时”去掉“一些与当前调试无关的代码;

2.2.3 命名与保留字

与数学概念类似,Python采用”变量“在保存和表示具体的数据值。为了更好地使用变量等其他程序元素,需要给他们关联一个标识符,关联过程称为命名。命名用于保证程序元素的唯一性。

Python程序的标识符对大小写敏感,Python和python是两个不同的名字。程序允许采用大小写字母、数字、下划线和汉字等字符及其组合给变量命名,但是需要注意的是,名字的首字符不能是数字,中间不能出现空格。

一般来说,可以选择任何喜欢的名字,但是这些名字不能与Python的保留字相同。

截屏2022-03-29 14.37.53

通常来讲,不建议使用中文等非英语语言字符对变量命名。

2.2.4 字符串

文本在程序中用字符串 String 类型来表示。在Python中,字符串使用两个双引号或者单引号括起来的一个或多个字符。

字符串是字符的序列,可以按照单个字符或字符片段进行索引。字符串包括两种序号体系,正向递增序号和反向递增序号。

截屏2022-03-29 14.41.30

Python的字符串提供区间访问方式,采用[M:N]格式,表示字符串从N到M(不包含M)的子字符串。其中的N和M为字符串的索引序号,可以混合正向递增序号和反向递减序号。

2.2.5 赋值语句

Python语言中,用”=“表示赋值,即将等号右侧的计算结果赋给左侧变量。

此外还有一种同步赋值语句,可以给多个变量赋值,基本格式如下:

<变量 1>,...,<变量 N> = <表达式 1>,...,<表达式 N>

同步赋值语句可以使赋值过程变得简洁,但是应尽量避免将多个无关的单一赋值语句组合成同步赋值语句,否则会降低程序的可读性。

2.2.6 input()语句

<变量> = input(<提示性文字>)

需要注意的是,无论输入的是数字还是字符,函数统一按照字符串类型输出。

2.2.7 分支语句

分支语句是控制程序运行的一类重要语句,作用是根据判断条件选择程序的执行路径。

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

2.2.8 eval()函数

eval(<字符串>)函数是Python语言中一个重要的函数,能够以Python表达式的方式解释并执行字符串,简单的讲是将输入的字符串转换为Python语句并执行该语句。

2.2.9 print()函数

函数能输出函数输出信息,也能以字符形式输出变量。当输出纯字符信息室,可以直接将待输出内容传递给print()函数。

当输出变量时,需要采用格式化输出方式。通过format()方法将待输出变量整理成期望输出格式。

print("转换后的温度是{:.2f}F".format(F))

其中大括号{}表示一个槽位置,这个括号中的内容由字符串后面紧跟的format()方法中的参数F填充。

2.2.10 循环语句

循环语句是控制程序运行的一类重要语句。与分支语句控制程序执行类似,它的作用是根据判断条件确定一段程序是否再执行一次或者多次。

2.2.11 函数

一般将特定功能代码编写在一个函数里,便于阅读和复用,也使得程序模块化更好。函数可以理解为对一组表达特定功能表达式的封装,它与数学函数类似,能够接收变量并输出结果。

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

经过函数化改造的温度转换程序如上所示,用def保留字定义了一个名为tempConvert()的函数,使用一个参数ValueStr作为输入函数字符串试用贴。

语句调用tempConvert()函数执行温度转换的功能。函数是代码编写中的最重要的封装方式,可以辅助代码按照功能划分模块,有利于代码之间进行语块级别的复用。


2.3 turtle库语法元素分析

2.3.1 绘图坐标体系

turtle库绘制图形有一个基本框架:一个小海龟在坐标系中爬行,其爬行轨迹形成了绘制图形。刚开始绘制时,小海龟位于画布正中央,此处坐标为(0,0)

turtle.setup(width,height,startx,starty):用作设置主窗体的大小和位置。

  • width:窗口宽度,如果是整数,表示像素值,如果是小数,表示窗口宽度与屏幕的比例;
  • height:窗口高度,如果是正式,表示像素值,如果是小时,表示窗口高度与屏幕的比例;
  • startx:窗口左侧与屏幕左侧的像素距离,如果是None,窗口位于屏幕水平中央;
  • starty:窗口顶部与屏幕顶部的像素距离,如果是None,窗口位于屏幕垂直中央;

2.3.2 画笔控制函数

(1) turtle.penup()turtle.pendown()函数

turtle中的小海龟通过一组函数来控制。函数定义如下:

turtle.penup()

  • 作用:抬起画笔,之后移动画笔不绘制形状;
  • 参数:无;

turtle.pendown()

  • 作用:落下画笔,之后移动画笔将绘制形状;
  • 参数:无;

(2) turtle.pensize(width)

  • 作用:设置画笔宽度,当无参数输入时返回当前画笔宽度;
  • 参数:width 设置画笔线条宽度,如果为None或者为空,则函数返回当前画笔宽度;

(3) turtle.pencolor()

turtle.pencolor(colorstring)turtle.pencolor((r,g,b))

  • 作用:设置画笔颜色,当无参数输入时返回当前画笔颜色;
  • 参数设定:colorstring表示颜色的字符串,例如”purple“、”red“等。(r,g,b)颜色对应的RGB数值;

截屏2022-03-29 16.00.27

2.3.3 形状绘制函数

(1) turtle.fd(distance)

  • 作用:向小海龟当前行进方向前进distance距离。
  • 参数:distance 行进距离的像素,当值为负数时,表示向相反方向前进;

(2) turtle.seth(to_angle)

  • 作用:设置小海龟当前行进方向为to_angle,该角度是绝对方向角度值。
  • 参数:角度的整数值

截屏2022-03-29 16.15.28

(3) turtle.circle()函数和for循环语句

turtle.circle(radius,extent=None)

  • 作用:根据半径radius绘制extent角度的弧形;
  • 参数:radius:弧形半径,值为正数,半径在小海龟左侧,值为负数半径在小海龟右侧。extent:绘制弧形的角度,当不设置参数或者参数设置为None时,绘制整个圆形;

第三章 基本数据类型

3.1 数字类型

3.1.1 数字类型概述

整数和带有小数的数字分别由计算机中央处理器中不同的硬件逻辑操作,对于相同类型操作,例如整数加法和小数加法,前者比后者速度一般快5~20倍。为了尽可能提高运行速度,需要区分不同运行速度的不同数字类型。

表示数字或数值的数据类型称为数字类型,Python语言提供整数、浮点数和复数这三种数字类型,分别对应数学中的整数、实数和复数。

需要注意:1010表示一个整数,”1010“表示一个字符串。

3.1.2 整数类型

整数类型有四种进制表示:十进制、二进制、八进制和十六进制。通常情况下是十进制。使用其他进制需要使用引导符号:

进制种类 引导符号 描述
十进制 默认情况,例如:1010,-425
二进制 0b或0B 由字符0和1组成,例如:0b101/0B101
八进制 0o或0O 由字符0到7组成,例如:0o711/0O711
十六进制 0x或0X 由字符0到9,a到f,A到F组成,例如0x8ACD

整数类型理论上的取值没有限制,实际上的取值受限于计算机的内存大小。除极大数的运算外,一般认为整数类型没有取值范围限制。

3.1.3 浮点数类型

浮点数与数学中的实数概念一致,表示带有小数的数值。Python要求所有的浮点数必须含有小数部分。小数部分可以是0「例如:3.0」。浮点数有十进制表示方法和科学计数法表示这两种方法。

使用科学计数法:以字母e或E作为幂的符号,以10为基数,含义如下:

<a> e <b> = a * 10 ^ b

Python的浮点数的数值范围小数精度受不同计算机系统的限制,我们可以通过下面的方式查询Python解释器所运行系统的浮点数各项参数:

import sys
print(sys.float_info)
print(sys.float_info.max)

浮点数类型直接表示或科学计数法表示中的系数<a>最长可以输出16个数字,浮点数运算结果中最长可输出17个数字,然而,根据sys.float_info结果,计算机只能够提供15个数字(dig)的准确定.

截屏2022-03-29 20.50.52

浮点数在超过15位数字计算中产生的误差与计算机内部采用二进制运算有关,使用浮点数无法进行极高精度的数学运算。若要进行精确的计算,可以将两个浮点数的小数点去掉,当做整数进行运算。

3.2 数字类型的操作

3.2.1 内置的数值运算操作符

Python提供了9种基本的运算操作符,不需要第三方函数库:

操作符 描述
x + y x 与 y 之和
x - y x 与 y 之差
x * y x 与 y 之积
x / y x 与 y 之商
x // y x 与 y 之整数商,即不大于x与y之商的最大整数
x % y x 与 y 之商的余数,也成为模运算
- x x 的负值
+ x x 本身
x ** y x 的 y 次幂,即 x ^ y

上述9个操作符与数学习惯一致,运算结果也符合数学意义。操作符运算的结果可能改变数字类型,三种数字类型之间存在着一种逐渐扩展的关系,具体如下:

整数 -> 浮点数 -> 复数

基本准则如下:

  • 整数之间的运算,如果从数学意义上的结果是小数,结果是浮点数;
  • 整数之间的运算,如果从数学意义上的结果是整数,结果是整数;
  • 整数和浮点数混合运算,输出结果是浮点数;
  • 整数或浮点数与复数运算,输出结果是复数;

3.2.2 内置的数值运算函数

内置函数包含了如下六个与数值运算相关的函数:

截屏2022-03-29 21.07.40

3.2.3 内置的数字类型转换函数

浮点数类型转换为整数类型时,小数部分会被舍弃而不是四舍五入,复数不能直接转换为其他数字类型,可以通过.real.imag将复数的实部或虚部分别转换。

截屏2022-03-29 21.11.41

3.3 字符串类型及其操作

3.3.1 字符串类型的表示

可以由一对单引号、双引号或三引号构成。其中的单引号和双引号都可以表示单行字符串,两者作用相同,使用单引号的时候可以成为双引号中的一部分。三引号可以表示单行或者多行字符串。

Python程序提供区间访问方式,因为字符串是以Unicode编码储存,因此,字符串的英文字符和中文字符都算作1个字符。

反斜杠字符(\)是一个特殊的字符,在字符串中表示转义,即该字符与后面相邻的一个字符共同组成了新的含义。

例如:\n 表示换行、\\表示反斜杠、\'表示单引号、\"表示双引号、\t表示制表符(Tab) 等等。

3.3.2 基本的字符串操作

Python提供了五种基本操作方式。

截屏2022-03-29 21.22.35

3.3.3 内置的字符串处理函数

截屏2022-03-29 21.23.27

每一个字符在计算机中可以表示为一个数字,称为编码。早期的 ASCII 编码对于英语字符之外的其他语言字符的支持并不好,因此在Python 3.0 版本之后使用了 Unicode 编码。chr(x)ord(x)函数用于在单字符和Unicode编码值之间进行转换。前者返回Unicode编码对饮的字符,后者返回单字符对应的Unicode编码。

3.3.4 内置的字符串处理方法

Python解释器内部,所有的数据类型都采用面向对象方式实现,封装为一个类。字符串也是一个类。字符串类型共包含43个内置方法。这里仅介绍一些常用的16种方法。

截屏2022-03-30 00.13.11

截屏2022-03-30 00.13.24


3.4 字符串类型的格式化

字符串类型的格式化,有两种方式,一种类似C语言中的printf()函数的格式化方法,支持该方法主要考虑与大批C语言程序员编程习惯相一致;另外一种采用专门的str.format()格式化方法。由于Python中更为接近自然语言的复杂数据类型(例如字典和列表等)无法通过类C的格式化方法很好表达,因此在Python后续版本中已经不存在改进C风格格式化方法了。主要采用format()方法进行字符串格式化。

3.4.1 format()方法的基本使用

该函数的基本使用格式如下:

<模板字符串>.format(<逗号分隔的参数>)

模板字符串由一系列槽组成,用来控制修改字符串中嵌入值出现的位置,其基本思想是将format()方法中逗号分隔的参数按照序号关系替换到模板字符串的槽中。槽用大括号{}来表示,如果大括号中没有序号,则按照出现顺序替换。如果出现序号,则按照序号顺序进行替换,排序从0开始。

截屏2022-04-01 09.10.48

3.4.2 format()方法的格式控制

format()方法中模板字符串的槽除了包括参数序号,还可以包括格式控制信息。其中,格式控制标记用来控制参数显示时的格式,如下表所示:

引导符号
<填充> 用于填充的单个字符
<对齐> < 左对齐,>右对齐,^居中对齐
<宽度> 槽的设定输出宽度
< , > 数字的千分位分隔符,适用于整数和浮点数
< .精度 > 浮点数小数部分的精度或字符串的最大输出长度
<类型> 整数类型b,c,d,o,x,X 浮点数类型e,E,f,%

截屏2022-04-01 09.21.52

格式控制标记中的逗号用于显示数字类型的千位分隔符:

截屏2022-04-01 09.22.48

<.精度>表示两个含义,由小数点开头。对于浮点数,精度表示小数部分输出的有效位数。对于字符串,精度表示输出的最大长度。

截屏2022-04-01 09.24.00

<类型>表示输出整数和浮点数类型的格式规则。对于整数类型,输出格式包括以下6种。

  1. b:输出整数的二进制方式。
  2. c:输出整数对应的Unicode字符。
  3. d:输出整数对应的十进制方式。
  4. o:输出整数的八进制方式。
  5. x:输出整数的小写十六进制方式。
  6. X:输出整数的大写十六进制方式。

截屏2022-04-01 09.26.47

对于浮点类型,输出格式包括以下4种。

  1. e:输出浮点数对应的小写字母e的指数形式。
  2. E:输出浮点数对应的大写字母E的指数形式。
  3. f:输出浮点数的标准浮点方式。
  4. %:输出浮点数的百分形式。

浮点数输出时,尽量使用<.精度>表示小数部分的宽度,有助于更好控制输出格式。

截屏2022-04-01 09.30.08

3.4.3 实例练习

1.文本进度条(一)

import time
scale = 10
print("---------start---------")
for i in range(scale+1):
    a , b = '**' * i,'..' *(scale - i)
    c = (i/scale)*100
    print("%{:^3.0f}[{}->{}]".format(c,a,b))
    time.sleep(0.5)
print("---------end---------")

截屏2022-04-01 09.37.45

2.文本进度条(二)单行动态刷新

import time
for i in range(101):
    print("\r{:2}%".format(i),end="")
    time.sleep(0.5)

截屏2022-04-01 09.40.56

3.文本进度条(三)带刷新的文本进度条

import time
scale = 50
print("执行开始".center(scale//2,'-'))
t = time.perf_counter()  #在Python3.8之前要使用 time.clock(),该方法在3.8之后不再被支持
for i in range(scale + 1):
    a = '*' * i
    b = '.' * (scale - i)
    c = (i/scale)*100
    t -= time.perf_counter()
    print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,-t),end='')
    time.sleep(0.05)
print("\n"+"执行结束".center(scale//2,'-'))

截屏2022-04-01 09.48.44

猜你喜欢

转载自blog.csdn.net/qq_17790209/article/details/124035908