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解释器干了两件事情:
  1. 在内存中创建一个's'的字符串;
  1. 在内存中创建一个名为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 面试题

  1. 什么是强类型语言?什么是弱类型语言?Python是强类型语言还是弱类型语言?
  1. Python语言如何区分代码之间的层次结构?
  1. 什么是注释?怎么样给Python代码增加注释?
  1. Python的变量命名规则是怎样的?
  1. Python内部的内置关键字有哪些,如何查看?
  1. Python的赋值语句怎么写?赋值时,Python解释器干了什么事情?
  1. 为什么编程语言要有不同的数据类型?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 foundfind方法的详细使用方法,可以参考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 匹配

  1. 使用正则模块,search 方法,返回最早匹配的位置
其实,正则模块中还有一个match方法,不过它只会从主串的第一个字符开始匹配。第一个字符不匹配就返回None。
通过search和match方法的注释,可以看出它们的区别:
  1. findall查找出子串的所有匹配
输出\['2019', '12', '31']。
  1. finditer返回匹配的迭代器
findall如果匹配的数据太多,可能导致内存问题。可以使用finditer方法,返回一个迭代器,通过迭代器里面的对象 re.Match的 span 找出匹配位置。
如果打算一个模式可以被多次使用,那么可以提前将模式pattern编译成对象,另外,优先编译成正则对象,然后再进行匹配,这样程序的效率更高。例如下面这样:
  1. 匹配浮点数和整数
  • ? 表示前一个字符匹配 0 或 1 次
  • \\.? 表示匹配小数点(.)0 次或 1 次。注意要加一个反斜杠,表示后面的是小数点,而不是正则表达式中的.
  1. 写出匹配所有正整数正则表达式。
  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 面试题

  1. 从字符串 "https://httpbin.org/get?key1=value1\\&key2=value2\\&key2=value3"中,提取出所有的参数键值对。
  1. 如何判断一个URI是一个图片的地址,我们假设以http或者https开头,以合法的图片后缀名结尾的URI就是合法的图片地址。
  1. 提取字符串"urllib3 \[required: <1.23,>=1.21, installed: 1.22]"中所有的版本号。
  1. 将字符串"pipenv is released at 5/28/2020" 中的日志改成2020-5-28这种格式。
  1. 删除文本文件中每一行文本前后的空白字符。
  1. 将一个句子中的所有单词位置反转。例如"Requests is an elegant and simple HTTP library for Python" 句子反转后是"Python for library HTTP simple and elegant an is Requests"。
  1. 求字符串中最后一个单词的长度,单词之间用空格隔开。
  1. 有两个字符串,请从第一个字符串中删除第二个字符串中的字符。例如第一个字符串是"What you do with that power is entirely up to you.",第二个字符串是"aeio"。
  1. 定义一个函数 f(s),其中传入参数 s 是一个非空字符串;该函数的功能是统计 s 中(按字典序比较)最小字母的出现频次。
  1. 将一个字符串中每个单词的首字母大写,其他字母小写。例如:" 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 面试题

  1. 判断 list 内有无重复元素
如果列表中有重复元素,则返回True,没有重复元素则返回False。
  1. 找出列表中的所有重复元素
借助count函数统计个数,大于1个的说明是重复元素,添加到新的列表中,返回。
  1. 找出列表出现次数最多的元素
看到题目中出现了次数,就想count方法,看到“最”,想到 Python 内置的max 函数。
上面的办法在最多的元素有多个时,默认只返回一个。那么如何可以返回多个呢?
思路是:先找出最多元素的个数是几个,比如n个,然后在列表中找哪些元素的个数是n个。
 
 
 
 
 
 
 
 
 
 
 
🎒
离开乏味的皮囊,自由的灵魂在路上
  • Name: Alan Hsu
  • Tag: 随感、技术、经验、旅行、推荐、生活、音乐、电影 etc.
  • Email:xulanzhong521gmail.com
  • WeChat: Alan_Hsu_521
notion image
notion image
 
 
 
Relate Posts
Prompt Engeering2024_年终总结: [代码与咖啡]打工人的漂流记
Loading...
Alan_Hsu
Alan_Hsu
许心志我在 蓝湛阔天海 中定自主宰
统计
文章数:
181
Latest posts
deepseek-r1:7b和deepseek-r1:1.5b-qwen-distill-q4_K_M区别和释义
2025-2-14
CrewAI tool 调用是写在agents里还是task里
2025-2-14
Prompt Engeering
2025-2-9
Python测试开发
2025-2-7
2025_周报 #06
2025-2-7
2025_周报 #01
2025-2-6