前言
本文是基于黑马程序员2018年的Python基础班的内容编写的,以2018年的资料为蓝本,2016年的资料为补充,还参考了一些网上的教程,旨在更好地总结Python基础知识,力求简明扼要,以供实战演练时能够快速查询遗忘的知识点。学一门语言贵在坚持用它,不用就淡忘了,而记录下一篇文章也有助于日后快速回忆。全文分为两大部分,分别是Python基础语法和面向对象。
第一部分 Python基础语法
第一部分 Python基础语法
1. 认识Python
1.1 Python 简介
Python 的创始人为吉多·范罗苏姆(Guido van Rossum)。
Python 的设计目标:
一门简单直观的语言并与主要竞争者一样强大
开源,以便任何人都可以为它做贡献
代码像纯英语那样容易理解
适用于短期开发的日常任务
Python 的设计哲学:
优雅、明确、简单
Python 开发者的哲学是:用一种方法,最好是只有一种方法来做一件事
Python 是完全面向对象的语言,在 Python 中一切皆对象。
可扩展性:如果需要一段关键代码运行得更快或者希望某些算法不公开,可以把这部分程序用
C
或C++
编写,然后在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.6
、Python 2.7
来执行,并且做一些兼容性的处理
IPython 是一个 python 的 交互式 shell,比默认的 python shell
好用得多,它支持 bash shell
命令,适合于学习/验证 Python 语法或者局部代码。
集成开发环境(IDE
,Integrated Development Environment)—— 集成了开发软件需要的所有工具,一般包括以下工具:
图形用户界面
代码编辑器(支持 代码补全/自动缩进)
编译器/解释器
调试器(断点/单步执行)
……
PyCharm 是 Python 的一款非常优秀的集成开发环境
PyCharm运行工具栏
1.3. PyCharm 的设置
PyCharm 的 配置信息 是保存在 用户家目录下 的 .PyCharmxxxx.x
目录下的,xxxx.x
表示当前使用的 PyCharm 的版本号
1.3.1 恢复 PyCharm 的初始设置:
关闭正在运行的 PyCharm
在终端中执行以下终端命令,删除 PyCharm 的配置信息目录:
$ rm -r ~/.PyCharm2016.3
重新启动 PyCharm
1.3.2 PyCharm 安装和启动步骤:
执行以下终端命令,解压缩下载后的安装包
$ tar -zxvf pycharm-professional-2017.1.3.tar.gz
将解压缩后的目录移动到
/opt
目录下,可以方便其他用户使用
/opt
目录用户存放给主机额外安装的软件
$ sudo mv pycharm-2017.1.3/ /opt/
切换工作目录
$ cd /opt/pycharm-2017.1.3/bin
启动 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 只需要做以下两步工作:
删除解压缩目录
$ sudo rm -r /opt/pycharm-2016.3.1/
删除家目录下用于保存配置信息的隐藏目录
$ rm -r ~/.PyCharm2016.3/
如果不再使用 PyCharm 还需要将
/usr/share/applications/
下的jetbrains-pycharm.desktop
删掉
1.4. 多文件项目的演练
开发 项目 就是开发一个 专门解决一个复杂业务功能的软件
通常每 一个项目 就具有一个 独立专属的目录,用于保存 所有和项目相关的文件
在
PyCharm
中,要想让哪一个Python
程序能够执行,必须首先通过 鼠标右键的方式执行 一下对于初学者而言,在一个项目中设置多个程序可以执行,是非常方便的,可以方便对不同知识点的练习和测试
对于商业项目而言,通常在一个项目中,只有一个 可以直接执行的 Python 源程序
让选中的程序可以执行
2. 注释
注释的作用
使用用自己熟悉的语言,在程序中对某些代码进行标注说明,增强程序的可读性
2.1 单行注释(行注释)
以
#
开头,#
右边的所有东西都被当做说明文字,而不是真正要执行的程序,只起到辅助说明作用
print("hello python") # 输出 `hello python`
为了保证代码的可读性,
#
后面建议先添加一个空格,然后再编写相应的说明文字;为了保证代码的可读性,注释和代码之间 至少要有 两个空格。
2.2 多行注释(块注释)
要在 Python 程序中使用多行注释,可以用 一对 连续的 三个 引号(单引号和双引号都可以)
""" 这是一个多行注释 在多行注释之间,可以写很多很多的内容…… """ print("hello python")
提示:
注释不是越多越好,对于一目了然的代码,不需要添加注释
对于 复杂的操作,应该在操作开始前写上若干行注释
对于 不是一目了然的代码,应在其行尾添加注释(为了提高可读性,注释应该至少离开代码 2 个空格)
绝不要描述代码,假设阅读代码的人比你更懂 Python,他只是不知道你的代码要做什么
2.3 代码规范:
Python
官方提供有一系列 PEP(Python Enhancement Proposals) 文档,其中第 8 篇文档专门针对 Python 的代码格式 给出了建议,也就是俗称的 PEP 8:
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 逻辑运算符
运算符 | 逻辑表达式 | 描述 |
---|---|---|
and | x and y | 只有 x 和 y 的值都为 True,才会返回 True<br />否则只要 x 或者 y 有一个值为 False,就返回 False |
or | x or y | 只要 x 或者 y 有一个值为 True,就返回 True<br />只有 x 和 y 的值都为 False,才会返回 False |
not | not x | 如果 x 为 True,返回 False<br />如果 x 为 False,返回 True |
3.7 运算符优先级
以下表格的算数优先级由高到最低顺序排列:
运算符 | 描述 |
---|---|
** | 幂 (最高优先级) |
* / % // | 乘、除、取余数、取整除 |
+ - | 加法、减法 |
<= < > >= | 比较运算符 |
== != | 等于运算符 |
= %= /= //= -= += *= **= | 赋值运算符 |
is is not | 身份运算符 |
in not in | 成员运算符 |
not or and | 逻辑运算符 |
<补>程序执行原理
Python程序执行示意图
操作系统会首先让 CPU 把 Python 解释器 的程序复制到 内存 中
Python 解释器 根据语法规则,从上向下 让 CPU 翻译 Python 程序中的代码
CPU 负责执行翻译完成的代码
Python 的解释器有多大?
执行以下终端命令可以查看 Python 解释器的大小
# 1. 确认解释器所在位置$ which python# 2. 查看 python 文件大小(只是一个软链接)$ ls -lh /usr/bin/python# 3. 查看具体文件大小$ ls -lh /usr/bin/python2.7
4. 变量
4.1 变量定义
在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 才会被创建
可以用 其他变量的计算结果 来定义变量
变量名 只有在 第一次出现 才是 定义变量
变量名 = 值
使用交互式方式,如果要查看变量内容,直接输入变量名即可,不需要使用
使用解释器执行,如果要输出变量的内容,必须要要使用
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)
<补>不同类型变量之间的计算
数字型变量 之间可以直接计算
在 Python 中,两个数字型变量是可以直接进行 算数运算的
如果变量是
bool
型,在计算时True
对应的数字是1
False
对应的数字是0
字符串变量 之间使用
+
拼接字符串字符串变量 可以和 整数 使用
*
重复拼接相同的字符串数字型变量 和 字符串 之间 不能进行其他计算
<补>从键盘获取输入信息: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
中的 标识符 是 区分大小写的
在定义变量时,为了保证代码格式,
=
的左右应该各保留一个空格在 Python 中,如果 变量名 需要由 二个 或 多个单词 组成时,可以按照以下方式命名:每个单词都使用小写字母,单词与单词之间使用
_
下划线 连接,例如:first_name
、last_name
、qq_number
、qq_password
。
当然,还有驼峰命名法:
小驼峰式命名法:第一个单词以小写字母开始,后续单词的首字母大写,例如:firstName
、lastName
。
大驼峰式命名法,每一个单词的首字母都采用大写字母,例如:FirstName
、LastName
、CamelCase
。
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"]
列表示意图
<补>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)
for-in循环流程图
尽管 Python 的 列表 中可以 存储不同类型的数据
但是在开发中,更多的应用场景是
列表 存储相同类型的数据
通过 迭代遍历,在循环体内部,针对列表中的每一项元素,执行相同的操作
4.4.2 元组(tuple)
Tuple
(元组)与列表类似,不同之处在于元组的 元素不能修改用于存储 一串 信息,数据 之间使用
,
分隔
元组 表示多个元素组成的序列
元组 在
Python
开发中,有特定的应用场景元组用
()
定义,元组的 索引 从0
开始,索引 就是数据在 元组 中的位置编号。
info_tuple = ("zhangsan", 18, 1.75)
创建空元组:
info_tuple = ()
元组中 只包含一个元素 时,需要 在元素后面添加逗号:
info_tuple = (50, )
元组示意图
在 Python 中,可以使用
for
循环遍历所有非数字型类型的变量:列表、元组、字典 以及 字符串提示:在实际开发中,除非 能够确认元组中的数据类型,否则针对元组的循环遍历需求并不是很多
在开发中,更多的应用场景是:
函数的 参数 和 返回值,一个函数可以接收 任意多个参数,或者 一次返回多个数据
格式字符串,格式化字符串后面的
()
本质上就是一个元组让列表不可以被修改,以保护数据安全
<补>元组和列表之间的转换
使用
list
函数可以把元组转换成列表
list(元组)
使用
tuple
函数可以把列表转换成元组
tuple(列表)
4.4.3 字典(dict)
dict
(字典) 是 除列表以外 Python 之中 最灵活 的数据类型。
字典同样可以用来 存储多个数据,通常用于存储 描述一个 物体 的相关信息
和列表的区别:
列表 是 有序 的对象集合
字典 是 无序 的对象集合
字典用
{}
定义。字典使用 键值对 存储数据,键值对之间使用逗号
,
分隔:键
key
是索引值
value
是数据键 和 值 之间使用冒号
:
分隔键必须是唯一的
值 可以取任何数据类型,但 键 只能使用 字符串、数字或 元组
xiaoming = {"name": "小明", "age": 18, "gender": True, "height": 1.75}
字典示意图
字典的遍历 就是 依次 从 字典 中获取所有键值对:
# 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)
字符串示意图
提示:在 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 中所有的元素(的字符串表示)合并为一个新的字符串 |
<补>字符串的切片
切片 方法适用于 字符串、列表、元组
切片 使用 索引值 来限定范围,从一个大的 字符串 中 切出 小的 字符串
列表 和 元组 都是 有序 的集合,都能够 通过索引值 获取到对应的数据
字典 是一个 无序 的集合,是使用 键值对 保存数据
字符串索引示意图
字符串[开始索引:结束索引:步长]
注意:
指定的区间属于 左闭右开 型
[开始索引, 结束索引)
=>开始索引 <= 范围 < 结束索引
从
起始
位开始,到结束
位的前一位 结束(不包含结束位本身)
从头开始,开始索引 数字可以省略,冒号不能省略
到末尾结束,结束索引 数字可以省略,冒号不能省略
步长默认为 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!'] | 重复 | 字符串、列表、元组 |
in | 3 in (1, 2, 3) | True | 元素是否存在 | 字符串、列表、元组、字典 |
not in | 4 not in (1, 2, 3) | True | 元素是否不存在 | 字符串、列表、元组、字典 |
> >= == < <= | (1, 2, 3) < (2, 2, 3) | True | 元素比较 | 字符串、列表、元组 |
注意
in
在对 字典 操作时,判断的是 字典的键in
和not in
被称为 成员运算符
4.4.5.4 内置函数完整的 for 循环语法
在 Python 中完整的
for 循环
的语法如下:
for 变量 in 集合: 循环体代码else: 没有通过 break 退出循环,循环结束后,会执行的代码
应用场景:
在 迭代遍历 嵌套的数据类型时,例如 一个列表包含了多个字典
需求:要判断 某一个字典中 是否存在 指定的 值
如果 存在,提示并且退出循环
如果 不存在,在 循环整体结束 后,希望 得到一个统一的提示
4.4.5.5 变量的引用
变量 和 数据 都是保存在 内存 中的
在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的
在 Python 中:变量 和 数据 是分开存储的,数据 保存在内存中的一个位置,变量 中保存着数据在内存中的地址,就叫做 引用,使用 id()
函数可以查看变量中保存数据所在的 内存地址。
注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是 修改了数据的引用
变量 不再 对之前的数据引用
变量 改为 对新赋值的数据引用
在 Python 中,变量的名字类似于 便签纸 贴在 数据 上:
定义一个整数变量
a
,并且赋值为1
代码 | 图示 |
---|---|
a = 1 |
将变量
a
赋值为2
代码 | 图示 |
---|---|
a = 2 |
定义一个整数变量
b
,并且将变量a
的值赋值给b
代码 | 图示 |
---|---|
b = a |
在 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))
结果
4.4.5.6 可变和不可变类型
不可变类型,内存中的数据不允许被修改:
数字类型
int
,bool
,float
,complex
,long(2.x)
字符串
str
元组
tuple
可变类型,内存中的数据可以被修改:
列表
list
字典
dict
注意:字典的
key
只能使用不可变类型的数据
注意
可变类型的数据变化,是通过 方法 来实现的
如果给一个可变类型的变量,赋值了一个新的数据,引用会修改
变量 不再 对之前的数据引用
变量 改为 对新赋值的数据引用
<补>哈希 (hash)
Python 中内置有一个名字叫做
hash(o)
的函数:接收一个 不可变类型 的数据作为 参数,返回 结果是一个 整数。哈希
是一种 算法,其作用就是提取数据的 特征码(指纹),相同的内容 得到 相同的结果,不同的内容 得到 不同的结果。在 Python 中,设置字典的 键值对 时,会首先对
key
进行hash
已决定如何在内存中保存字典的数据,以方便 后续 对字典的操作:增、删、改、查:键值对的key
必须是不可变类型数据,键值对的value
可以是任意类型的数据。
4.4.5.7 局部变量和全局变量
局部变量 是在 函数内部 定义的变量,只能在函数内部使用;函数执行结束后,函数内部的局部变量,会被系统回收;不同的函数,可以定义相同的名字的局部变量,但是 彼此之间 不会产生影响;局部变量一般临时 保存 函数内部需要使用的数据。
全局变量 是在 函数外部定义 的变量(没有定义在某一个函数内),所有函数 内部 都可以使用这个变量。
提示:在其他的开发语言中,大多 不推荐使用全局变量 —— 可变范围太大,导致程序不好维护!
注意:函数执行时,需要处理变量时 会:
首先 查找 函数内部 是否存在 指定名称 的局部变量,如果有,直接使用
如果没有,查找 函数外部 是否存在 指定名称 的全局变量,如果有,直接使用
如果还没有,程序报错!
注意:函数不能直接修改全局变量的引用,如果要修改,必须要用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: 以上条件都不满足时,执行的代码 ……
注意
elif
和else
都必须和if
联合使用,而不能单独使用可以将
if
、elif
和else
以及各自缩进的代码,看成一个 完整的代码块
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]
之间的整数,包含a
和b
例如:
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
共同学习,写下你的评论
评论加载中...
作者其他优质文章