password
URL
type
status
date
slug
summary
tags
category
icon
周起始
标签
是否汉化
【适用人群】
面向Python编程小白,特别是为想用Python作为主要编程语言的测试开发工程师。
【内容大纲】
- Python基础知识
- 常用数据结构及算法
- Python设计模式
- 经典开源项目解读
【教程目标】
- 由浅入深掌握Python基础知识,最终精通Python技巧。
- 学习使用软件测试过程中常用的Python库,能够动手写代码解决实际问题。
- 书中代码尽量选择真实可用的代码片段,大部分选自Python官方文档,知名的第三方库,比如pytest、requests、selenium、appium、locust及django等。
- 本书注重每种Python特性的实际应用,通过阅读开源项目源码,进一步巩固Python知识。
- 另外,借助Python语言掌握常见的数据结构和算法,配合常见的面试题和经典的算法题目练习,搞定大部分面试题目。
【参考资料】
认识Python
Python是一门动态的、强类型的语言,是目前非常流行的语言。流行的主要原因是Python 语言应用广泛,可以应用在Web开发、爬虫、数据分析、软件测试和机器学习等多个领域。另外,Python语言简单易学,吸引了更多编程初学者的喜爱。Python语言简洁的语法和丰富的第三方库,使得业务开发的效率非常高。在自动化测试领域,Python可以说是一个多面手,可以进行服务端API接口测试、进行WEB自动化测试、APP自动化测试、性能测试和测试平台开发等工作。因此要想转行自动化测试,做好自动化测试,掌握Python语言都是必要前提。
本章就来对Python做一个初步的了解。
1.1 Python 语言的特性
1.1.1 Python是强类型语言
强类型是针对弱类型而言的。对于强类型语言和弱类型语言并没有明确的定义,维基百科上这样说:
in general a strongly typed language is more likely to generate an error or refuse to compile a program if the argument passed to a function does not closely match the expected type. A very weakly typed language may produce unpredictable results or may perform implicit type conversion instead.
直观上来说,Python强类型表现在不允许两种不同类型的变量相互操作。比如,在python交互式命令行中输入下面的代码:
按回车键后,则会收到TypeError异常,表示 int 变量和 str 变量 不能用+操作符。
常见的强类型语言有:
- Python
- Java
与之对应的是弱类型语言,比如 JavaScript,它就允许不同类型变量进行运算,比如:
JavaScript 在string 和 int 相加时,自动将int转化为 string。常见的弱类型语言有:
- C
- C++
- PHP
- Javascript
1.1.2 Python是解释型语言
Python编写的程序,在运行之前不需要进行编译,而是通过Python解释器对程序一边解释一边执行的。
1.1.3 Python是动态语言
编译期确定变量类型的语言是静态语言,运行期确定变量类型的语言是动态语言。
Python因为没有编译阶段,所以对变量的数据类型是在程序执行期间决定的。也就是在编写代码的时候可以不指定变量的数据类型,在程序执行时根据赋给变量的对象类型来确定变量的数据类型。常见的动态语言包括:
- Python
- JavaScrpit
- PHP
变量的类型在编译阶段就已经确定的,是静态类型语言。常见的静态类型语言包括:
- C/C++
- Java
- Scala
1.2 书写格式
Python的书写格式规范主要涉及缩进格式、行间空行数、变量和等号空格等。 完整的Python 编码规范可以参考PEP8。如果使用Pycharm开发,遇到不符合规范的编码,Pycharm会有提示。MacOS上,Pycharm通过快捷键option+command+l可以对代码进行格式化,Windows上的快捷键是Ctrl + Alt + L。
1.2.1 缩进
Python 最具特色的地方就是用缩进代替 Java、C++ 中的
{}
,缩进的层级结构表示代码的逻辑层次。Python 的缩进方法,一般为 4 个空格。下面这个例子来自Python著名的单元测试框架Pytest。- 代码行
class TestClass
与代码行def test_one(self):
之间有 4 个空格的缩进;
- 代码行
def test_one(self)
与assert
也有4 个空格的缩进。
通过这种缩进层级结构,展现了代码的逻辑层次。
1.2.2 注释
注释可以起到一个说明和备注的作用,团队合作的时候,个人编写的代码经常会被多人调用,清晰详细的注释让调用者对所调用函数的使用方法和逻辑更加清晰。强烈建议大家写代码的时候添加适当的注释。Python解释器对注释内容会忽略,不执行。
上面这个例子,来自Python的builtin.py,说明了min函数的使用方法。第一行#开头的是一个单行注释,""" """包裹起来的内容是多行注释。多行注释经常用于描述类、函数或方法的作用、参数类型和返回值等。
1.3 版本及安装
1.3.1 版本
Python官网在2020年4月20日发布了Python2的最后一个版本2.7.18。从此之后不再对Python2的全部版本进行支持。因此,建议大家从今天开始,学习和使用Python3.7及其以后的版本。
1.3.2 安装
通常的安装方法是,通过下载对应操作系统的安装包,通过安装包的方式安装Python。 下载地址:https://www.python.org/downloads/。
但是,我更推荐使用pyenv方式安装,pyenv使得在同一个系统上安装多个不同版本的Python变的简单。
1.3.3 开发工具
强烈建议开发Python代码时使用Pycharm这个集成开发环境。它配置简单,完全为Python开发打造。会让我们写代码的效率更好,不容易出错。
Pycharm有两个版本,一个收费版本,一个社区版本。使用社区版本就足够满足我们日常的开发工作了。下载地址:https://www.jetbrains.com/pycharm/download/,选择Community版本。
VSCode也是一款开源的编辑器,经过适当的配置,也可以作为Python开发的集成开发工具。
1.4 变量
Python中的变量,就是代数中的变量概念一样。用来代表或者说指向一个具体的数值、字符串等对象。
1.4.1 变量命名
在Python程序中,变量是用一个变量名表示,变量名必须是大小写英文、数字和下划线(\_)的组合,且不能用数字开头。最好是具有实际意义的英文单词,这样可以通过变量名称了解它的实际意义。例如:age,my\_age,\_gender,edge\_1等。
注意变量名不能与Python自带的关键字(keyword)同名。可以在Python的交互是命令行输入下面两行代码,查看Python自带的关键字,如下所示:
1.4.2 变量赋值
在Python中,等号
=
是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量。在Python交互式命令行输入:而且Python语言,在变量赋值之前,不需要声明变量,可以直接赋值。
当给变量a赋值为s时,即书写代码
a = 's'
时,Python解释器干了两件事情:- 在内存中创建一个
's'
的字符串;
- 在内存中创建一个名为
a
的变量,并让a指向's'
!\[]\(file:///Users/chunming.liu/learn/mybook/书稿/【课件】!!!!!!/0.Python基础/pics/变量.png?msec=1728791634510)!
当把一个变量a赋值给另一个变量b时,即上面代码中
b=a
,这个操作实际是把变量b指向变量a所指向的数据,即变量b也指向了变量a指向的's'
。!\[]\(file:///Users/chunming.liu/learn/mybook/书稿/【课件】!!!!!!/0.Python基础/pics/变量2.png?msec=1728791634510)!
a=a+'m',并不是让 a 的值拼接一个m,而是表示重新创建了一个新的sm 的对象,并让 a 指向它。但是 b 仍然不变,仍然指向 s这个对象。
!\[]\(file:///Users/chunming.liu/learn/mybook/书稿/【课件】!!!!!!/0.Python基础/pics/变量赋值.png?msec=1728791634631)!
上面图示中的对象和变量是一回事。在Python中一切皆是对象。
1.4.3 数据类型
数据的类型用来表示对象的取值范围以及可以对它进行什么操作。变量指向的对象,都有固定的类型,比如:
- 整数
- 浮点数
- 字符串
- 布尔值
可以通过type()函数查看变量的类型:
除了上面的数据类型,Python中还有元组、列表、字典、集合等类型。在后面的章节会陆续学习这些数据类型。
1.5 面试题
- 什么是强类型语言?什么是弱类型语言?Python是强类型语言还是弱类型语言?
- Python语言如何区分代码之间的层次结构?
- 什么是注释?怎么样给Python代码增加注释?
- Python的变量命名规则是怎样的?
- Python内部的内置关键字有哪些,如何查看?
- Python的赋值语句怎么写?赋值时,Python解释器干了什么事情?
- 为什么编程语言要有不同的数据类型?Python语言如何查看一个对象的数据类型?
字符串
2.1 字符串表示
表示一个字符串就是用引号将一连串字符包裹起来,或者使用str()构造器生成一个字符串。引号可以使是单引号、双引号,也可以是三引号。
- 单引号''
- 双引号 ""
- 三引号之中(''' '''或""" """,两者一样)
- 构造器str()
打开Pycharm集成开发环境,输入下面的代码:
在Pycharm的编辑器窗口上,点击右键,点击Run,可以看到下面的输出:
Python内置的string.py模块中,定义了通用的字符串:
想使用这些字符串,可以通过下面的方式:
2.2 字符串操作
Python内置的字符串操作方法存在于str类中。查看这个类的内容,可以在PyCharm的编辑界面,按两下shift键,在弹出来的搜索窗中输入str,勾选上"Include non-project items",然后选择Class标签,排在第一个的是"str(object) builtins",点击它就可以看到str类的内容了。
str类中提供了非常多的操作字符串的方法,列举如下:
这些都是Python为字符串类型的数据提供的内置方法。str类中每个内置方法,都有注释,通过注释可以知道内置方法的作用。
例如,lower这个函数,在str类中是这样定义的:
从注释中看到,lower函数可以将一个字符串转换成小写字母。实际编写一段代码验证一下:
接下来,学习字符串的常见操作。
2.2.1 读取字符或子串
通过索引和切片的方式读取字符串中的字符或者子串。
2.2.2 反转
利用切片操作,或者reversed函数,将字符串反转:
2.2.3 替换
2.2.4 拼接
两种拼接方法,一种是加号,一种是join方法。
加号拼接,就是直接将两个字符串连接在一起:
另一种join方法,可以将多个独立的字符或者字符串,或者一个列表里面的数据,用特定的字符拼接起来。
2.2.5 分割
通过内置的split方法,可以将一个字符串切分成一段一段的,放到一个列表中,列表可以理解成一个由多个字符串组成的集合,后面将学习列表更多的内容。比如将Python单元测试框架Pytest的slogan用空格分割成列表:
再来看一个例子,从web自动化测试工具selenium下载网址中提取域名:
这里的\[1]、\[0],表示集合中第二个元素,和第一个元素。
如果单词之间用多个空格,或者其他空白符隔开时,那么不给split方法传参就可以了:
这是因为split方法默认是使用ASCII whitespace characters对字符串进行分割的。看下split函数的官方文档(在Pycharm中通过command+点击split方式进入):
可以看到除了作为分隔符的sep参数,还有一个maxsplit参数,用来限制分割的次数。例如,下面的代码会对字符串分割两次,最终形成三个子串组成的列表
['Return', 'a', 'list of the words in the string']
。2.2.6 去掉字符串两边的内容
在接收用户输入时,避免用户在输入数据两边意外加入空格或者其他空白符,可以对收到数据两边的空白(空格和制表符)进行去除,例如:
还可以删除其他字符,将待删除的字符作为参数,比如:
2.2.7 子串判断
判断 a 串是否为 b 串的子串,使用
in
关键字。2.2.8 子串查找
在主串中查找子串使用find方法,返回主串中匹配子串的最小索引。
还有一个index和rindex方法,使用方法类似find和rfind。只不过当查找不到子串时,find和rfind方法返回-1,而index和rindex方法返回异常:
ValueError: substring not found
。find
方法的详细使用方法,可以参考str类的find方法的注释:除了指定查找子串的起始位置start,也可以指定查找的终止下标end。
2.2.8 统计个数
统计字符串中某个字符或者子串出现的次数,使用
count
方法。和
find
方法类似,也可以指定统计的范围,使用start表示哪个下标开始统计,end表示统计到哪个下标结束。2.2.9 首字母大写
将字符串的首字母大写,使用
capitalize
方法。2.3 格式化
如果让字符串输出的格式更加美观,有三种方式。
2.3.1 %格式化
%格式化方式是使用%s作为字符串占位符,使用%d作为十进制数占位符。使用%()中的参数替换字符串中的占位符。例如:
上面的代码中,Apache JMeter™替换占位符%s,100替换占位符%d,%%表示百分号。
2.3.2 format格式化
format格式化字符串方法是非常常用的,基本用法如下:
在字符串模板中用{}占位,format的参数将会替换这些占位符。如果有多个{},format函数中的参数将按顺序传递给字符串模板中的多个{}。上例中format的第一个参数Jmeter传递给第一个占位符{},第二个参数8传递给第二个占位符{}。
字符串模板中{}里面还可以指定变量名,然后通过传入字典或者变量值给format函数,例如:
2.3.3 f字符串
f字符串是一种更加容易的、简便的格式化方法,在Python 3.6开始加入标准库。在一个字符串开头有一个大写的F或者小写的f,大括号中的变量被值替换。注意:!,:{} ;不能出现在{}里面否则会报错。
更加强大的是,大括号{}可以对表达式或者执行函数求值。
title
对字符串中每个单词的首字母进行大写。2.4 不可改变性
Python字符串是不可改变的,Python的不可改变性体现在:
- 不能按索引修改字符串的值,比如name\[0]='J'
- 通过加号修改字符串,并不是修改了源字符串而是新建了新的字符串。
下面这段代码,开始时通过id()查看变量str1的身份是4314674880,与str2拼接之后,再次查看str1的身份,已经是4316047728了,与最开始身份已经不同了,说明不是原来的对象了。
2.5 转义字符
如果想在字符串中输入一些特殊字符,需要借助转义字符,转义字符以反斜杠\开头。比如:
- '\n'表示换行符;
- '\\"'表示双引号
- "\\"表示续行符,通常放在行尾,表示下一行内容与此行相连,不进行换行。例如下面这个print语句将把三行字符串以一行输出。
完整的转义字符如下:
转义字符 | 描述 |
(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\’ | 单引号 |
\” | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数yy代表的字符,例如:\o12代表换行 |
\xyy | 十进制数yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
如果要取消转义字符的效果,可以在字符串前面添加一个r,例如:
将会原样输出Hello\\"World\\"。
2.6 字符串加密
对字符串进行加密,可以使用hashlib库,hashlib提供了多种数据加密算法,例如常见的md5和sha256:
除此之外,hashlib还提供
sha1(), sha224(), sha384(), sha512(), blake2b(), blake2s(),sha3_224, sha3_256, sha3_384, sha3_512, shake_128, and shake_256.
这些加密算法。2.7 正则表达式
String.py模块封装的方法,处理一般的字符串操作,还能应付。但是,稍微复杂点的字符串处理任务,需要靠正则表达式来进行处理,简洁且强大。
Python中的正则,是通过模块re.py来支持的,因此使用正则表达式时,要先
import re
导入re模块。首先,认识常用的元字符
.
匹配除 "\n" 和 "\r" 之外的任何单个字符。
^
匹配字符串开始位置
$
匹配字符串中结束的位置
前面的原子重复 0 次、1 次、多次
?
前面的原子重复 0 次或者 1 次
+
前面的原子重复 1 次或多次
{n}
前面的原子出现了 n 次
{n,}
前面的原子至少出现 n 次
{n,m}
前面的原子出现次数介于 n-m 之间
( )
分组,输出需要的部分
再认识常用的通用字符:
\\s
匹配空白字符
\\w
匹配任意字母/数字/下划线
\\W
和小写 w 相反,匹配任意字母/数字/下划线以外的字符
\\d
匹配十进制数字
\\D
匹配除了十进制数以外的值
[0-9]
匹配一个 0\~9 之间的数字
[a-z]
匹配小写英文字母
[A-Z]
匹配大写英文字母
正则表达式使用中,常会涉及到以上这些元字符或通用字符。更多的元字符和通用字符可以查看re.py文件。
2.7.1 匹配
- 使用正则模块,search 方法,返回最早匹配的位置
其实,正则模块中还有一个match方法,不过它只会从主串的第一个字符开始匹配。第一个字符不匹配就返回None。
通过search和match方法的注释,可以看出它们的区别:
- findall查找出子串的所有匹配
输出\['2019', '12', '31']。
- finditer返回匹配的迭代器
findall如果匹配的数据太多,可能导致内存问题。可以使用finditer方法,返回一个迭代器,通过迭代器里面的对象 re.Match的 span 找出匹配位置。
如果打算一个模式可以被多次使用,那么可以提前将模式pattern编译成对象,另外,优先编译成正则对象,然后再进行匹配,这样程序的效率更高。例如下面这样:
- 匹配浮点数和整数
?
表示前一个字符匹配 0 或 1 次
\\.?
表示匹配小数点(.
)0 次或 1 次。注意要加一个反斜杠,表示后面的是小数点,而不是正则表达式中的.
。
- 写出匹配所有正整数正则表达式。
- 找出字符串中所有字符 t 或 T 的位置,不区分大小写。
re.I 表示不区分大小写。
2.7.2 分割
如果一个规则简单的字符串,直接使用split 函数。
如下requests入门文档网址字符串,可以很方便通过split方法根据分割符 / 进行分割:
对于分隔符很复杂的字符串,split 函数就无能为力。这时就要用正则分割了。包含多个空格的句子中,分割出单词,就用这个方法。
2.7.3 替换
正则模块re.py中的sub 方法,替换匹配到的子串:
2.7.4 compile 预编译
如果要用同一匹配模式,做很多次匹配,可以使用 compile 预先编译串。
案例:从一系列字符串中,挑选出所有正浮点数。
2.7.5 贪婪模式与非贪婪模式
现在想要在网页中提取
div
标签中的内容,需要用到括号()。使用一对
()
去获取我们想要的部分。pattern\_1和pattern\_2都表示匹配<div>
和</div>
之间的内容。不同在于:(.*)
尽可能一次性地匹配更多字符,也被称为贪婪模式。尽量匹配更长的结果。
(.*?)
被称为非贪婪模式。尽量匹配更多的结果。
因此,pattern\_1从content第一个
<div>
匹配到最后一个</div>
,匹配到一个很长的字符串。pattern\_2从content中匹配更多的<div>
和</div>
之间的字符串。2.8 面试题
- 从字符串 "https://httpbin.org/get?key1=value1\\&key2=value2\\&key2=value3"中,提取出所有的参数键值对。
- 如何判断一个URI是一个图片的地址,我们假设以http或者https开头,以合法的图片后缀名结尾的URI就是合法的图片地址。
比如 https://requests.readthedocs.io/zh_CN/latest/_static/requests-sidebar.png 就是合法的图片地址,因为是以png图片格式结尾的。https://farm5.staticflickr.com/4259/35163667010_8bfcaef274_k_d.jpg 也是。
- 提取字符串"urllib3 \[required: <1.23,>=1.21, installed: 1.22]"中所有的版本号。
- 将字符串"pipenv is released at 5/28/2020" 中的日志改成2020-5-28这种格式。
- 删除文本文件中每一行文本前后的空白字符。
- 将一个句子中的所有单词位置反转。例如"Requests is an elegant and simple HTTP library for Python" 句子反转后是"Python for library HTTP simple and elegant an is Requests"。
- 求字符串中最后一个单词的长度,单词之间用空格隔开。
- 有两个字符串,请从第一个字符串中删除第二个字符串中的字符。例如第一个字符串是"What you do with that power is entirely up to you.",第二个字符串是"aeio"。
- 定义一个函数
f(s)
,其中传入参数s
是一个非空字符串;该函数的功能是统计s
中(按字典序比较)最小字母的出现频次。
- 将一个字符串中每个单词的首字母大写,其他字母小写。例如:" aBc dEf " -> "Abc Def".
可以参考Python内置的string.py模块中的capwords函数的实现。
数值与随机数
3.1 数值类型
Python支持的数值类型有整型int、布尔型bool、浮点型float、Decimal。
这里要提一下,布尔型是只有两个值的整数。True对应1,False对应0。对于布尔型要从以下方面理解:
- 有两个值True和False
- 对于值为零的任何数字或者空集(空列表\[]、空元组()、空集合{}、空字典{}),他们的布尔值都是False
3.2 算数运算
- 加法+
- 减法-
- 乘法\*
- 除法/
- 取余%
- 幂运算\*\*或pow
- 取商和余数divmod
- 四舍五入round
- 绝对值abs
3.3 位运算
将数值转成二进制后,按位操作。
- 按位取反\~
- 按位与&
- 按位或|
- 按位异或^
- 左移<<
- 右移>>
3.4 数制转换
- bin(),将十进制转换为二进制
- oct(),将十进制转换为八进制
- hex(),将十进制转换为十六进制
3.5 比较运算
- 大于>
- 小于<
- 等于==
- 大于等于>=
- 小于等于<=
- 不等于!=
3.6 decimal模块
普通的float型数据在运算时,是有误差的,python默认的是17位小数的精度,再长后面的数据就不准了。如果不能接受误差,可以使用decimal模块解决精确计算问题。
3.7 random模块
实际编程过程中,会遇到需要随机字符串、随机数值的情况。在Python中, random模块使用生成随机数的模块。randmo模块中有很多方法,常见的方法情况下面的例子:
Python中还有一个非常好用的产生随机数的第三方包Faker(https://pypi.org/project/Faker/)。安装方法是:
它的功能特别强大,能够产生的随机数类型非常丰富,举几个例子:
从名字可以看出产生的随机数的类型。
如果想要每次生成的随机数是固定的。可以提供一个随机数种子,这样相同的方法,总会得到相同的随机结果。
在使用Pytest测试框架的测试工作中,可以将faker制作成为fixture函数。例如下面的代码,在conftest.py文件中定义一个叫作faker的fixture函数,其中指定了locale是中国。
测试函数中,就可以直接使用faker,在使用过程中,使用相同seed的faker,产生的随机数是一样的,比如下面的test\_faker和test\_something这两个测试函数中,相同方法产生的随机数是一样的。
元组与列表
元组和列表都是容器,容器里面可以放各种类型的数据,同一个列表,允许放不同数据类型的数据。
4.1 声明
声明列表两种方法:
声明元组两种方法:
4.2 相同点与区别
4.2.1 相同点
列表和元组的相同点,主要表现在以下几个方面:
- 都可以放置任意数据类型
- 都支持负数索引
- 1 表示最后一个元素,-2 表示倒数第二个元素
- 都支持切片操作
l[1:3]
,返回列表中索引从1到2的子列表tup[1:3]
, 返回元组中索引从1到2的子元组
- 都可以随意嵌套
l = [[1, 2, 3], [4, 5]]
, 列表的每一个元素也是一个列表tup = ((1, 2, 3), (4, 5, 6))
,元组的每一个元素也是一个元组
4.2.2 区别
- 列表是动态的,可以随意地增加、删减或者改变元素,长度会变化
- 元组是静态的,长度固定,无法增加、删减或者改变
在Pycharm中输入下面的代码,Pycharm会错误提示。执行时会报TypeError。
- 切片复制时,列表产生新对象而元组不产生新对象
\- 列表产生新对象
\- 元组不产生新对象
4.4 列表和元组的操作
4.4.1 共有的操作
已知列表l = \[3, 2, 3, 7, 8, 1] ,元组 t=(3,2,3,7,8,1)
4.4.2 列表独有的操作
在Pycharm中,按两下shift,输入list或者tuple,并勾选include non-project items,可以查询Python内置的列表和元祖操作的所有方法及具体用法。
4.5 赋值与修改
4.5.1 列表赋值与修改
由于列表是可变的,当多个变量指向同一个列表对象时,当列表对象变化后,所有变量的值都会变化。
4.5.2 元组的赋值与修改
由于元组是不可变的,当对元组进行修改时,是生成新的元组,不是在原来的元组对象上修改。因此对元组的改变,只会影响原来变量的值。
可见,在Python中:
- 变量的赋值,只是表示让变量名指向了某个对象,而一个对象,可以被多个变量所指。
- 可变对象(列表、字典、集合等)的改变,会影响所指向该对象的变量。
- 对于不可变对象(字符串、整型、元组等等),所有指向该对象的变量的值总是一样的,也不会改变。但是通过某些操作(例如+=)更新不可变对象的值时,会返回一个新对象。
4.6 使用场景
- 如果存储的数据不变,适合用元组,比如存放经纬度、四季、12个月份等
- 如果存储的数据是经常变动的,比如需要频繁对其中的元素进行增、删除、修改等操作,适合用列表。
4.7 列表解析
根据已有字符串、列表、元组、字典生产新列表。数据全部放在内存。
列表解析常与 if、for、嵌套 for、map、lambda 等结合使用。
4.8 序列解包
可以将包含N个元素的元组或者列表,分解成N个独立的变量。
当元素的数量和变量的数量不匹配时会报错。
解包操作时,对于不关心的数据可以丢,只需要在相应的位置上用一个用不到的变量名即可,例如\_。
还可以从N个元素的元组或者列表中,分解出小于N个元素。例如多名大众评委给选手打分组成的列表,去掉最高分和一个最低分之后,计算总分。
4.9 all 和 any
all(iterable)函数,接受一个迭代器,如果迭代器的所有元素都为真,返回 True,否则返回 False。迭代器的概念后续会学习到,这里先把它理解成列表或者元组即可:
any(iterable)函数,接受一个迭代器,如果迭代器里有一个元素为真,返回 True,否则返回 False:
4.11 面试题
- 判断 list 内有无重复元素
如果列表中有重复元素,则返回True,没有重复元素则返回False。
- 找出列表中的所有重复元素
借助count函数统计个数,大于1个的说明是重复元素,添加到新的列表中,返回。
- 找出列表出现次数最多的元素
看到题目中出现了次数,就想count方法,看到“最”,想到 Python 内置的max 函数。
上面的办法在最多的元素有多个时,默认只返回一个。那么如何可以返回多个呢?
思路是:先找出最多元素的个数是几个,比如n个,然后在列表中找哪些元素的个数是n个。
离开乏味的皮囊,自由的灵魂在路上
- Name: Alan Hsu
- Tag: 随感、技术、经验、旅行、推荐、生活、音乐、电影 etc.
- Email:xulanzhong521gmail.com
- Twitter:@AlanHsu521
- Telegram:@AlanHsu521
- WeChat: Alan_Hsu_521
- Github: https://github.com/xsoway/
- Blog: https://xmylog.com


- Author:Alan_Hsu
- URL:https://xmylog.com/article/articles_python_test
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts