为了账号安全,请及时绑定邮箱和手机立即绑定

看完这篇文章,你的Python基础就差不多了

标签:
Python

前言

本文是基于黑马程序员2018年的Python基础班的内容编写的,以2018年的资料为蓝本,2016年的资料为补充,还参考了一些网上的教程,旨在更好地总结Python基础知识,力求简明扼要,以供实战演练时能够快速查询遗忘的知识点。学一门语言贵在坚持用它,不用就淡忘了,而记录下一篇文章也有助于日后快速回忆。全文分为两大部分,分别是Python基础语法和面向对象。

第一部分 Python基础语法

webp

第一部分 Python基础语法

1. 认识Python

1.1 Python 简介

Python 的创始人为吉多·范罗苏姆(Guido van Rossum)。

Python 的设计目标:

  • 一门简单直观的语言并与主要竞争者一样强大

  • 开源,以便任何人都可以为它做贡献

  • 代码像纯英语那样容易理解

  • 适用于短期开发的日常任务

Python 的设计哲学:

  • 优雅、明确、简单

Python 开发者的哲学是:用一种方法,最好是只有一种方法来做一件事

Python 是完全面向对象的语言,在 Python 中一切皆对象。

可扩展性:如果需要一段关键代码运行得更快或者希望某些算法不公开,可以把这部分程序用 CC++ 编写,然后在 Python 程序中使用它们。

1.2. 第一个Python程序

执行 Python 程序的三种方式:
解释器、交互式运行、IDE运行

Python 是一个格式非常严格的程序设计语言。
python 2.x 默认不支持中文

  • ASCII 字符只包含 256 个字符,不支持中文

  • Python 2.x 的解释器名称是 python

  • Python 3.x 的解释器名称是 python3

为了照顾现有的程序,官方提供了一个过渡版本 —— Python 2.6

提示:如果开发时,无法立即使用 Python 3.0(还有极少的第三方库不支持 3.0 的语法),建议

  • 先使用 Python 3.0 版本进行开发

  • 然后使用 Python 2.6Python 2.7 来执行,并且做一些兼容性的处理

IPython 是一个 python 的 交互式 shell,比默认的 python shell 好用得多,它支持 bash shell 命令,适合于学习/验证 Python 语法或者局部代码。

集成开发环境(IDE,Integrated Development Environment)—— 集成了开发软件需要的所有工具,一般包括以下工具:

  • 图形用户界面

  • 代码编辑器(支持 代码补全自动缩进

  • 编译器/解释器

  • 调试器(断点单步执行

  • ……

webp

PyCharm 是 Python 的一款非常优秀的集成开发环境

webp

PyCharm运行工具栏

1.3. PyCharm 的设置

PyCharm 的 配置信息 是保存在 用户家目录下.PyCharmxxxx.x 目录下的,xxxx.x 表示当前使用的 PyCharm 的版本号

1.3.1 恢复 PyCharm 的初始设置:

  1. 关闭正在运行的 PyCharm


  1. 在终端中执行以下终端命令,删除 PyCharm 的配置信息目录:

$ rm -r ~/.PyCharm2016.3

  1. 重新启动 PyCharm

1.3.2 PyCharm 安装和启动步骤:

  1. 执行以下终端命令,解压缩下载后的安装包

$ tar -zxvf pycharm-professional-2017.1.3.tar.gz

  1. 将解压缩后的目录移动到 /opt 目录下,可以方便其他用户使用

/opt 目录用户存放给主机额外安装的软件

$ sudo mv pycharm-2017.1.3/ /opt/

  1. 切换工作目录

$ cd /opt/pycharm-2017.1.3/bin

  1. 启动 PyCharm

$ ./pycharm.sh
1.3.3 设置启动图标
  • 在专业版中,选择菜单 Tools / Create Desktop Entry... 可以设置任务栏启动图标

  • 注意:设置图标时,需要勾选 Create the entry for all users
    快捷方式文件
    /usr/share/applications/jetbrains-pycharm.desktop

ubuntu 中,应用程序启动的快捷方式通常都保存在 /usr/share/applications 目录下

1.3.4 卸载之前版本的 PyCharm

要卸载 PyCharm 只需要做以下两步工作:


  1. 删除解压缩目录

$ sudo rm -r /opt/pycharm-2016.3.1/

  1. 删除家目录下用于保存配置信息的隐藏目录

$ rm -r ~/.PyCharm2016.3/

如果不再使用 PyCharm 还需要将 /usr/share/applications/ 下的 jetbrains-pycharm.desktop 删掉

1.4. 多文件项目的演练

  • 开发 项目 就是开发一个 专门解决一个复杂业务功能的软件

  • 通常每 一个项目 就具有一个 独立专属的目录,用于保存 所有和项目相关的文件

  • PyCharm 中,要想让哪一个 Python 程序能够执行,必须首先通过 鼠标右键的方式执行 一下

  • 对于初学者而言,在一个项目中设置多个程序可以执行,是非常方便的,可以方便对不同知识点的练习和测试

  • 对于商业项目而言,通常在一个项目中,只有一个 可以直接执行的 Python 源程序

webp

让选中的程序可以执行

2. 注释

  • 注释的作用
    使用用自己熟悉的语言,在程序中对某些代码进行标注说明,增强程序的可读性

2.1 单行注释(行注释)

  • # 开头,# 右边的所有东西都被当做说明文字,而不是真正要执行的程序,只起到辅助说明作用

print("hello python")  # 输出 `hello python`

为了保证代码的可读性,# 后面建议先添加一个空格,然后再编写相应的说明文字;为了保证代码的可读性,注释和代码之间 至少要有 两个空格。

2.2 多行注释(块注释)

  • 要在 Python 程序中使用多行注释,可以用 一对 连续的 三个 引号(单引号和双引号都可以)

"""
这是一个多行注释

在多行注释之间,可以写很多很多的内容……
""" print("hello python")

提示:

  1. 注释不是越多越好,对于一目了然的代码,不需要添加注释

  2. 对于 复杂的操作,应该在操作开始前写上若干行注释

  3. 对于 不是一目了然的代码,应在其行尾添加注释(为了提高可读性,注释应该至少离开代码 2 个空格)

  4. 绝不要描述代码,假设阅读代码的人比你更懂 Python,他只是不知道你的代码要做什么

2.3 代码规范:

3. 运算符

3.1 算数运算符

是完成基本的算术运算使用的符号,用来处理四则运算,而“+”和“*”还可以用来处理字符串。

运算符描述实例
+10 + 20 = 30
-10 - 20 = -10
*10 * 20 = 200
/10 / 20 = 0.5
//取整除返回除法的整数部分(商) 9 // 2 输出结果 4
%取余数返回除法的余数 9 % 2 = 1
**又称次方、乘方,2 ** 3 = 8

3.2 比较(关系)运算符

运算符描述
==检查两个操作数的值是否 相等,如果是,则条件成立,返回 True
!=检查两个操作数的值是否 不相等,如果是,则条件成立,返回 True
>检查左操作数的值是否 大于 右操作数的值,如果是,则条件成立,返回 True
<检查左操作数的值是否 小于 右操作数的值,如果是,则条件成立,返回 True
>=检查左操作数的值是否 大于或等于 右操作数的值,如果是,则条件成立,返回 True
<=检查左操作数的值是否 小于或等于 右操作数的值,如果是,则条件成立,返回 True
  • Python 2.x 中判断 不等于 还可以使用 <> 运算符

  • != 在 Python 2.x 中同样可以用来判断 不等于

3.3 赋值运算符

  • 在 Python 中,使用 = 可以给变量赋值。在算术运算时,为了简化代码的编写,Python 还提供了一系列的 与 算术运算符 对应的 赋值运算符,注意:赋值运算符中间不能使用空格

运算符描述实例
=简单的赋值运算符c = a + b 将 a + b 的运算结果赋值为 c
+=加法赋值运算符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

3.4 身份运算符

身份运算符比较两个对象的内存位置。常用的有两个身份运算符,如下所述:

运算符描述示例
is判断两个标识符是不是引用同一个对象x is y,类似 id(x) == id(y)
is not判断两个标识符是不是引用不同对象x is not y,类似 id(a) != id(b)

辨析

  • is 用于判断 两个变量引用的对象是否为同一个

  • == 用于判断 引用变量的 是否相等

3.5 成员运算符

Python成员运算符测试给定值是否为序列中的成员。 有两个成员运算符,如下所述:

运算符描述
in如果在指定的序列中找到一个变量的值,则返回true,否则返回false。
not in如果在指定序列中找不到变量的值,则返回true,否则返回false。

3.6 逻辑运算符

运算符逻辑表达式描述
andx and y只有 x 和 y 的值都为 True,才会返回 True<br />否则只要 x 或者 y 有一个值为 False,就返回 False
orx or y只要 x 或者 y 有一个值为 True,就返回 True<br />只有 x 和 y 的值都为 False,才会返回 False
notnot x如果 x 为 True,返回 False<br />如果 x 为 False,返回 True

3.7 运算符优先级

  • 以下表格的算数优先级由高到最低顺序排列:

运算符描述
**幂 (最高优先级)
* / % //乘、除、取余数、取整除
+ -加法、减法
<= < > >=比较运算符
== !=等于运算符
= %= /= //= -= += *= **=赋值运算符
is is not身份运算符
in not in成员运算符
not or and逻辑运算符

<补>程序执行原理

webp

Python程序执行示意图

  1. 操作系统会首先让 CPUPython 解释器 的程序复制到 内存

  2. Python 解释器 根据语法规则,从上向下CPU 翻译 Python 程序中的代码

  3. CPU 负责执行翻译完成的代码

Python 的解释器有多大?

  • 执行以下终端命令可以查看 Python 解释器的大小

# 1. 确认解释器所在位置$ which python# 2. 查看 python 文件大小(只是一个软链接)$ ls -lh /usr/bin/python# 3. 查看具体文件大小$ ls -lh /usr/bin/python2.7

4. 变量

4.1 变量定义

  • 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 才会被创建

  • 可以用 其他变量的计算结果 来定义变量

  • 变量名 只有在 第一次出现 才是 定义变量

变量名 = 值

使用交互式方式,如果要查看变量内容,直接输入变量名即可,不需要使用 print 函数
使用解释器执行,如果要输出变量的内容,必须要要使用 print 函数

4.2 变量的类型

  • Python 中定义变量是 不需要指定类型(在其他很多高级语言中都需要),Python 可以根据 = 等号右侧的值,自动推导出变量中存储数据的类型

  • 数据类型可以分为 数字型非数字型

    • 字符串(str):加号(+)是字符串连接运算符,星号(*)是重复运算符。

    • 列表(list

    • 元组(tuple

    • 字典(dict

    • 整型 (int):Python3中的所有整数都表示为长整数。 因此,长整数没有单独的数字类型。

    • 浮点型(float

    • 布尔型(bool) :真 True 非 0 数 —— 非零即真,假 False 0

    • 复数型 (complex):复数是由x + yj表示的有序对的实数浮点数组成,其中x和y是实数,j是虚数单位。

    • 数字型

    • 非数字型:有些运算符还支持这些数据类型,详见4.4.5.3 运算符。

提示:在 Python 2.x 中,整数 根据保存数值的长度还分为:

  • int(整数)

  • long(长整数)

  • 使用 type 函数可以查看一个变量的类型

In [1]: type(name)
<补>不同类型变量之间的计算
  1. 数字型变量 之间可以直接计算

  • 在 Python 中,两个数字型变量是可以直接进行 算数运算的

  • 如果变量是 bool 型,在计算时

    • True 对应的数字是 1

    • False 对应的数字是 0

  1. 字符串变量 之间使用 + 拼接字符串

  2. 字符串变量 可以和 整数 使用 * 重复拼接相同的字符串

  3. 数字型变量字符串 之间 不能进行其他计算

<补>从键盘获取输入信息:input
  • 在 Python 中可以使用 input 函数从键盘等待用户的输入

  • 用户输入的 任何内容 Python 都认为是一个 字符串

字符串变量 = input("提示信息:")
<补>类型转换函数
函数说明
int(x)将 x 转换为一个整数
float(x)将 x 转换到一个浮点数
str(x)将对象x转换为字符串表示形式
tuple(s)将s转换为元组
list(s)将s转换为列表
price = float(input("请输入价格:"))
<补>格式化输出:print
  • 如果希望输出文字信息的同时,一起输出 数据,就需要使用到 格式化操作符

  • % 被称为 格式化操作符,专门用于处理字符串中的格式

    • 包含 % 的字符串,被称为 格式化字符串

    • % 和不同的 字符 连用,不同类型的数据 需要使用 不同的格式化字符

格式化字符含义
%s字符串
%d有符号十进制整数,%06d 表示输出的整数显示位数,不足的地方使用 0 补全
%f浮点数,%.2f 表示小数点后只显示两位
%%输出 %
  • 语法格式如下:

print("格式化字符串" % 变量1)

print("格式化字符串" % (变量1, 变量2...))

4.3 变量的命名

4.3.1 标识符和关键字

标示符就是程序员定义的 变量名函数名

  • 标示符可以由 字母下划线数字 组成

  • 不能以数字开头

  • 不能与关键字重名

关键字 就是在 Python 内部已经使用的标识符

  • 关键字 具有特殊的功能和含义

  • 开发者 不允许定义和关键字相同的名字的标识符

  • 通过以下命令可以查看 Python 中的关键字

In [1]: import keyword
In [2]: print(keyword.kwlist)
4.3.2 变量的命名规则

命名规则 可以被视为一种 惯例,并无绝对与强制
目的是为了 增加代码的识别和可读性
注意 Python 中的 标识符区分大小写的

  1. 在定义变量时,为了保证代码格式,= 的左右应该各保留一个空格

  2. 在 Python 中,如果 变量名 需要由 二个 或 多个单词 组成时,可以按照以下方式命名:每个单词都使用小写字母,单词与单词之间使用 _下划线 连接,例如:first_namelast_nameqq_numberqq_password

当然,还有驼峰命名法:
小驼峰式命名法:第一个单词以小写字母开始,后续单词的首字母大写,例如:firstNamelastName
大驼峰式命名法,每一个单词的首字母都采用大写字母,例如:FirstNameLastNameCamelCase

4.4 高级变量类型

Python 中,所有 非数字型变量 都支持以下特点:
1. 都是一个 序列 sequence,也可以理解为 容器
2. 取值 []
3. 遍历 for in
4. 计算长度len最大/最小值max/min比较删除del
5. 链接 +重复 *
6. 切片

4.4.1 列表(list)

  • List(列表) 是 Python 中使用 最频繁 的数据类型,在其他语言中通常叫做 数组,专门用于存储 一串 信息,列表用 [] 定义,数据 之间使用 , 分隔,列表的 索引0 开始。

索引 就是数据在 列表 中的位置编号,索引 又可以被称为 下标
注意:从列表中取值时,如果 超出索引范围,程序会报错

name_list = ["zhangsan", "lisi", "wangwu"]

webp

列表示意图

<补>del 关键字
  • 使用 del 关键字(delete) 同样可以删除列表中元素

  • del 关键字本质上是用来 将一个变量从内存中删除的

  • 如果使用 del 关键字将变量从内存中删除,后续的代码就不能再使用这个变量了

In [1]: l = [1,2,3,4]
In [2]: del l[1]
In [3]: l[1]
Out[3]: 3

在日常开发中,要从列表删除数据,建议 使用列表提供的方法

<补>函数与方法
  • 函数 封装了独立功能,可以直接调用

函数名(参数)

函数需要死记硬背

  • 方法 和函数类似,同样是封装了独立的功能

  • 方法 需要通过 对象 来调用,表示针对这个 对象 要做的操作

对象.方法名(参数)

在变量后面输入 .,然后选择针对这个变量要执行的操作,记忆起来比函数要简单很多

<补>循环遍历
  • 遍历 就是 从头到尾 依次列表 中获取数据,在 循环体内部 针对 每一个元素,执行相同的操作。

  • 在 Python 中为了提高列表的遍历效率,使用 for 就能够实现迭代遍历。

# for 循环内部使用的变量 in 列表for name in name_list:
    循环内部针对列表元素进行操作
    print(name)

webp

for-in循环流程图

  • 尽管 Python 的 列表 中可以 存储不同类型的数据

  • 但是在开发中,更多的应用场景是

  1. 列表 存储相同类型的数据

  2. 通过 迭代遍历,在循环体内部,针对列表中的每一项元素,执行相同的操作

4.4.2 元组(tuple)

  • Tuple(元组)与列表类似,不同之处在于元组的 元素不能修改

    • 用于存储 一串 信息数据 之间使用 , 分隔

    • 元组 表示多个元素组成的序列

    • 元组Python 开发中,有特定的应用场景

    • 元组用 () 定义,元组的 索引0 开始,索引 就是数据在 元组 中的位置编号。

info_tuple = ("zhangsan", 18, 1.75)

创建空元组:

info_tuple = ()

元组中 只包含一个元素 时,需要 在元素后面添加逗号

info_tuple = (50, )

webp

元组示意图

  • 在 Python 中,可以使用 for 循环遍历所有非数字型类型的变量:列表元组字典 以及 字符串

  • 提示:在实际开发中,除非 能够确认元组中的数据类型,否则针对元组的循环遍历需求并不是很多

  • 在开发中,更多的应用场景是:

    • 函数的 参数 和 返回值,一个函数可以接收 任意多个参数,或者 一次返回多个数据

    • 格式字符串,格式化字符串后面的 () 本质上就是一个元组

    • 让列表不可以被修改,以保护数据安全

<补>元组和列表之间的转换
  • 使用 list 函数可以把元组转换成列表

list(元组)
  • 使用 tuple 函数可以把列表转换成元组

tuple(列表)

4.4.3 字典(dict)

dict(字典) 是 除列表以外 Python 之中 最灵活 的数据类型。
字典同样可以用来 存储多个数据,通常用于存储 描述一个 物体 的相关信息

  • 和列表的区别:

    • 列表有序 的对象集合

    • 字典无序 的对象集合

  • 字典用 {} 定义。

  • 字典使用 键值对 存储数据,键值对之间使用逗号 , 分隔:

    • key 是索引

    • value 是数据

    • 之间使用冒号 : 分隔

    • 键必须是唯一的

    • 可以取任何数据类型,但 只能使用 字符串数字元组

xiaoming = {"name": "小明",            "age": 18,            "gender": True,            "height": 1.75}

webp

字典示意图

  • 字典的遍历 就是 依次 从 字典 中获取所有键值对:

# for 循环内部使用的 `key 的变量` in 字典for k in xiaoming:

    print("%s: %s" % (k, xiaoming[k]))

提示:在实际开发中,由于字典中每一个键值对保存数据的类型是不同的,所以针对字典的循环遍历需求并不是很多

  • 尽管可以使用 for in 遍历 字典

  • 但是在开发中,更多的应用场景是:

    • 使用 多个键值对,存储 描述一个 物体 的相关信息 —— 描述更复杂的数据信息

    • 多个字典 放在 一个列表 中,再进行遍历,在循环体内部针对每一个字典进行 相同的处理

card_list = [{"name": "张三",              "qq": "12345",              "phone": "110"},
             {"name": "李四",              "qq": "54321",              "phone": "10086"}
             ]

4.4.4 字符串(str)

  • 字符串 就是 一串字符,是编程语言中表示文本的数据类型

  • 在 Python 中可以使用 一对双引号 " 或者 一对单引号 ' 定义一个字符串

    • 如果字符串内部需要使用 ",可以使用 ' 定义字符串

    • 如果字符串内部需要使用 ',可以使用 " 定义字符串

    • 虽然可以使用 \" 或者 \' 做字符串的转义,但是在实际开发中:

  • 可以使用 索引 获取一个字符串中 指定位置的字符,索引计数从 0 开始

  • 也可以使用 for 循环遍历 字符串中每一个字符

大多数编程语言都是用 " 来定义字符串

string = "Hello Python"for c in string:
    print(c)

webp

字符串示意图

提示:在 python 中对字符串操作,内置提供的方法足够多,使得在开发时,能够针对字符串进行更加灵活的操作!应对更多的开发需求!

1) 判断类型 - 9
方法说明
string.isspace()如果 string 中只包含空格,则返回 True
string.isalnum()如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True
string.isalpha()如果 string 至少有一个字符并且所有字符都是字母则返回 True
string.isdecimal()如果 string 只包含数字则返回 True,全角数字
string.isdigit()如果 string 只包含数字则返回 True,全角数字\u00b2
string.isnumeric()如果 string 只包含数字则返回 True,全角数字汉字数字
string.istitle()如果 string 是标题化的(每个单词的首字母大写)则返回 True
string.islower()如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True
string.isupper()如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True
2) 查找和替换 - 7
方法说明
string.startswith(str)检查字符串是否是以 str 开头,是则返回 True
string.endswith(str)检查字符串是否是以 str 结束,是则返回 True
string.find(str, start=0, end=len(string))检测 str 是否包含在 string 中,如果 start 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回 -1
string.rfind(str, start=0, end=len(string))类似于 find(),不过是从右边开始查找
string.index(str, start=0, end=len(string))跟 find() 方法类似,不过如果 str 不在 string 会报错
string.rindex(str, start=0, end=len(string))类似于 index(),不过是从右边开始
string.replace(old_str, new_str, num=string.count(old))把 string 中的 old_str 替换成 new_str,如果 num 指定,则替换不超过 num 次
3) 大小写转换 - 5
方法说明
string.capitalize()把字符串的第一个字符大写
string.title()把字符串的每个单词首字母大写
string.lower()转换 string 中所有大写字符为小写
string.upper()转换 string 中的小写字母为大写
string.swapcase()翻转 string 中的大小写
4) 文本对齐 - 3
方法说明
string.ljust(width)返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串
string.rjust(width)返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串
string.center(width)返回一个原字符串居中,并使用空格填充至长度 width 的新字符串
5) 去除空白字符 - 3
方法说明
string.lstrip()截掉 string 左边(开始)的空白字符
string.rstrip()截掉 string 右边(末尾)的空白字符
string.strip()截掉 string 左右两边的空白字符
6) 拆分和连接 - 5
方法说明
string.partition(str)把字符串 string 分成一个 3 元素的元组 (str前面, str, str后面)
string.rpartition(str)类似于 partition() 方法,不过是从右边开始查找
string.split(str="", num)以 str 为分隔符拆分 string,如果 num 有指定值,则仅分隔 num + 1 个子字符串,str 默认包含 '\r', '\t', '\n' 和空格
string.splitlines()按照行('\r', '\n', '\r\n')分隔,返回一个包含各行作为元素的列表
string.join(seq)以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
<补>字符串的切片
  • 切片 方法适用于 字符串列表元组

    • 切片 使用 索引值 来限定范围,从一个大的 字符串切出 小的 字符串

    • 列表元组 都是 有序 的集合,都能够 通过索引值 获取到对应的数据

    • 字典 是一个 无序 的集合,是使用 键值对 保存数据

webp

字符串索引示意图

字符串[开始索引:结束索引:步长]

注意

  1. 指定的区间属于 左闭右开[开始索引, 结束索引) => 开始索引 <= 范围 < 结束索引

  • 起始 位开始,到 结束位的前一位 结束(不包含结束位本身)

从头开始,开始索引 数字可以省略,冒号不能省略

到末尾结束,结束索引 数字可以省略,冒号不能省略

步长默认为 1,如果连续切片,数字和冒号都可以省略

<补>索引的顺序和倒序
  • 在 Python 中不仅支持 顺序索引,同时还支持 倒序索引

  • 所谓倒序索引就是 从右向左 计算索引:最右边的索引值是 -1,依次递减。

num_str = "0123456789"# 1. 截取从 2 ~ 5 位置 的字符串print(num_str[2:6])# 2. 截取从 2 ~ `末尾` 的字符串print(num_str[2:])# 3. 截取从 `开始` ~ 5 位置 的字符串print(num_str[:6])# 4. 截取完整的字符串print(num_str[:])# 5. 从开始位置,每隔一个字符截取字符串print(num_str[::2])# 6. 从索引 1 开始,每隔一个取一个print(num_str[1::2])# 倒序切片# -1 表示倒数第一个字符print(num_str[-1])# 7. 截取从 2 ~ `末尾 - 1` 的字符串print(num_str[2:-1])# 8. 截取字符串末尾两个字符print(num_str[-2:])# 9. 字符串的逆序(面试题)print(num_str[::-1])

4.4.5 公共方法和变量的高级应用

4.4.5.1 内置函数

Python 包含了以下内置函数:

函数描述备注
len(item)计算容器中元素个数
del(item)删除变量del 有两种方式
max(item)返回容器中元素最大值如果是字典,只针对 key 比较
min(item)返回容器中元素最小值如果是字典,只针对 key 比较
cmp(item1, item2)比较两个值,-1 小于 / 0 相等 / 1 大于Python 3.x 取消了 cmp 函数

注意字符串 比较符合以下规则: "0" < "A" < "a"。

4.4.5.2 切片
描述Python 表达式结果支持的数据类型
切片"0123456789"[::-2]"97531"字符串、列表、元组
  • 切片 使用 索引值 来限定范围,从一个大的 字符串切出 小的 字符串

  • 列表元组 都是 有序 的集合,都能够 通过索引值 获取到对应的数据

  • 字典 是一个 无序 的集合,是使用 键值对 保存数据

4.4.5.3 运算符
运算符Python 表达式结果描述支持的数据类型
+[1, 2] + [3, 4][1, 2, 3, 4]合并字符串、列表、元组
*["Hi!"] * 4['Hi!', 'Hi!', 'Hi!', 'Hi!']重复字符串、列表、元组
in3 in (1, 2, 3)True元素是否存在字符串、列表、元组、字典
not in4 not in (1, 2, 3)True元素是否不存在字符串、列表、元组、字典
> >= == < <=(1, 2, 3) < (2, 2, 3)True元素比较字符串、列表、元组

注意

  • in 在对 字典 操作时,判断的是 字典的键

  • innot in 被称为 成员运算符

4.4.5.4 内置函数完整的 for 循环语法
  • 在 Python 中完整的 for 循环 的语法如下:

for 变量 in 集合:
    
    循环体代码else:
    没有通过 break 退出循环,循环结束后,会执行的代码

应用场景:

  • 迭代遍历 嵌套的数据类型时,例如 一个列表包含了多个字典

  • 需求:要判断 某一个字典中 是否存在 指定的 值

    • 如果 存在,提示并且退出循环

    • 如果 不存在,在 循环整体结束 后,希望 得到一个统一的提示

4.4.5.5 变量的引用
  • 变量 和 数据 都是保存在 内存 中的

  • 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的

在 Python 中:变量数据 是分开存储的,数据 保存在内存中的一个位置,变量 中保存着数据在内存中的地址,就叫做 引用,使用 id() 函数可以查看变量中保存数据所在的 内存地址

注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是 修改了数据的引用

  • 变量 不再 对之前的数据引用

  • 变量 改为 对新赋值的数据引用

在 Python 中,变量的名字类似于 便签纸 贴在 数据 上:

  • 定义一个整数变量 a,并且赋值为 1

代码图示
a = 1

webp

  • 将变量 a 赋值为 2

代码图示
a = 2

webp

webp

  • 定义一个整数变量 b,并且将变量 a 的值赋值给 b

代码图示
b = a

webp

Python 中,函数的 实参/返回值 都是是靠 引用 来传递来的

def test(num):

    print("-" * 50)
    print("%d 在函数内的内存地址是 %x" % (num, id(num)))

    result = 100

    print("返回值 %d 在内存中的地址是 %x" % (result, id(result)))
    print("-" * 50)    return  result

a = 10print("调用函数前 内存地址是 %x" % id(a))

r = test(a)

print("调用函数后 实参内存地址是 %x" % id(a))
print("调用函数后 返回值内存地址是 %x" % id(r))

webp

结果

4.4.5.6 可变和不可变类型
  • 不可变类型,内存中的数据不允许被修改:

    • 数字类型 int, bool, float, complex, long(2.x)

    • 字符串 str

    • 元组 tuple

  • 可变类型,内存中的数据可以被修改:

    • 列表 list

    • 字典 dict

注意:字典的 key 只能使用不可变类型的数据

注意

  1. 可变类型的数据变化,是通过 方法 来实现的

  2. 如果给一个可变类型的变量,赋值了一个新的数据,引用会修改

  • 变量 不再 对之前的数据引用

  • 变量 改为 对新赋值的数据引用

<补>哈希 (hash)
  • Python 中内置有一个名字叫做 hash(o) 的函数:接收一个 不可变类型 的数据作为 参数返回 结果是一个 整数

  • 哈希 是一种 算法,其作用就是提取数据的 特征码(指纹)相同的内容 得到 相同的结果不同的内容 得到 不同的结果

  • 在 Python 中,设置字典的 键值对 时,会首先对 key 进行 hash 已决定如何在内存中保存字典的数据,以方便 后续 对字典的操作:增、删、改、查:键值对的 key 必须是不可变类型数据,键值对的 value 可以是任意类型的数据。

4.4.5.7 局部变量和全局变量
  • 局部变量 是在 函数内部 定义的变量,只能在函数内部使用;函数执行结束后,函数内部的局部变量,会被系统回收;不同的函数,可以定义相同的名字的局部变量,但是 彼此之间 不会产生影响;局部变量一般临时 保存 函数内部需要使用的数据

  • 全局变量 是在 函数外部定义 的变量(没有定义在某一个函数内),所有函数 内部 都可以使用这个变量

提示:在其他的开发语言中,大多 不推荐使用全局变量 —— 可变范围太大,导致程序不好维护!

注意:函数执行时,需要处理变量时 会:

  1. 首先 查找 函数内部 是否存在 指定名称 的局部变量,如果有,直接使用

  2. 如果没有,查找 函数外部 是否存在 指定名称 的全局变量,如果有,直接使用

  3. 如果还没有,程序报错!

注意:函数不能直接修改全局变量的引用,如果要修改,必须要用global声明该变量是全局变量。

num = 10def demo1():

    print("demo1" + "-" * 50)    # global 关键字,告诉 Python 解释器 num 是一个全局变量
    global num    # 只是定义了一个局部变量,不会修改到全局变量,只是变量名相同而已
    num = 100
    print(num)def demo2():

    print("demo2" + "-" * 50)
    print(num)

demo1()
demo2()

print("over")

注意:为了避免局部变量和全局变量出现混淆,在定义全局变量时,有些公司会有一些开发要求,例如:全局变量名前应该增加 g_ 或者 gl_ 的前缀。

5. 判断(分支)

5.1 if 语句语法

1、if 判断语句基本语法:

if 要判断的条件:
    条件成立时,要做的事情
    ……

注意:代码的缩进为一个 tab 键,或者 4 个空格 —— 建议使用空格

  • 在 Python 开发中,Tab 和空格不要混用!

2、如果需要在 不满足条件的时候,做某些事情,该如何做呢?

if 要判断的条件:
    条件成立时,要做的事情
    ……else:
    条件不成立时,要做的事情
    ……
  • 在程序开发中,通常 在判断条件时,会需要同时判断多个条件,只有多个条件都满足,才能够执行后续代码,这个时候需要使用到 逻辑运算符。

  • Python 中的 逻辑运算符 包括:与 and或 or非 not 三种

条件1 and 条件2 :两个条件同时满足,返回 True条件1 or 条件2:两个条件只要有一个满足,返回 Truenot 条件:非,不是

3、如果希望 再增加一些条件条件不同,需要执行的代码也不同 时,就可以使用 elif

if 条件1:
    条件1满足执行的代码
    ……elif 条件2:
    条件2满足时,执行的代码
    ……elif 条件3:
    条件3满足时,执行的代码
    ……else:
    以上条件都不满足时,执行的代码
    ……

注意

  • elifelse 都必须和 if 联合使用,而不能单独使用

  • 可以将 ifelifelse 以及各自缩进的代码,看成一个 完整的代码块

4、在开发中,使用 if 进行条件判断,如果希望 在条件成立的执行语句中增加条件判断,就可以使用 if 的嵌套

if 条件 1:
    条件 1 满足执行的代码
    ……    
    if 条件 1 基础上的条件 2:
        条件 2 满足时,执行的代码
        ……    
        
    # 条件 2 不满足的处理
    else:
        条件 2 不满足时,执行的代码        
# 条件 1 不满足的处理else:
    条件1 不满足时,执行的代码
    ……

5.2 if语句的应用

5.2.1 随机数的处理
  • Python 中,要使用随机数,首先需要导入 随机数模块 —— “工具包”

import random
  • 导入模块后,可以直接在 模块名称 后面敲一个 . 然后按 Tab 键,会提示该模块中包含的所有函数

  • random.randint(a, b) ,返回 [a, b] 之间的整数,包含 ab

  • 例如:

random.randint(12, 20)  # 生成的随机数n: 12 <= n <= 20   random.randint(20, 20)  # 结果永远是 20   random.randint(20, 10)  # 该语句是错误的,下限必须小于上限
5.2.2 石头剪刀布
# 导入随机工具包# 注意:在导入工具包的时候,应该将导入的语句,放在文件的顶部# 因为,这样可以方便下方的代码,在任何需要的时候,使用工具包中的工具import random# 从控制台输入要出的拳 —— 石头(1)/剪刀(2)/布(3)player = int(input("请输入您要出的拳 石头(1)/剪刀(2)/布(3):"))# 电脑 随机 出拳 —— 先假定电脑只会出石头,完成整体代码功能computer = random.randint(1, 3)

print("玩家选择的拳头是 %d - 电脑出的拳是 %d" % (player, computer))# 比较胜负# 1 石头 胜 剪刀# 2 剪刀 胜 布# 3 布 胜 石头# if (()#        or ()#        or ()):if ((player == 1 and computer == 2)        or (player == 2 and computer == 3)        or (player == 3 and computer == 1)):

    print("欧耶,电脑弱爆了!")# 平局elif player == computer:
    print("真是心有灵犀啊,再来一盘")# 其他的情况就是电脑获胜else:
    print("不服气,我们决战到天明!")



作者:易寒不易寒
链接:https://www.jianshu.com/p/ebc19de7a204


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消