Python内存管理、Lambda函数、Tuple与List转换及更多编程技巧详解
目录

1、Python是如何进行内存管理的?
2、什么是lambda函数?它有什么好处?
3、Python里面如何实现tuple和list的转换?
在上述代码中,首先定义了一个包含重复元素的列表 `my_list`。然后,使用 `set(my_list)` 将列表转换为集合,集合会自动去除重复元素。最后,使用 `list(set(my_list))` 将集合转换回列表,并将结果存储在 `unique_list` 中。最后,打印出去除重复元素后的列表。
使用 Python 编程,通过 sort 函数进行排序。接着从序列的最后一个元素开始进行判断。
在 Python 中怎样拷贝一个对象呢?需要了解赋值、浅拷贝和深拷贝之间的区别。
7、介绍一下except的用法和作用?
8、Python中pass语句的作用是什么?
9、介绍一下Python中range()函数的用法?
10、如何用Python来进行查询和替换一个文本字符串?
11、Python里面match和search的区别?
12、Python里面如何生成随机数?
1、Python是如何进行内存管理的?
从三个方面来说:
一、对象的引用计数机制
二、垃圾回收机制
三、内存池机制
一、对象的引用计数机制
Python 在内部会使用引用计数这种方式。它通过引用计数来对内存中的对象进行保持追踪。并且所有的对象都具备引用计数这一特性。
引用计数增加的情况:
(1)一个对象分配一个新名称
(2)将其放入一个容器中(如列表、元组或字典)
引用计数减少的情况:
(1)使用 del 语句对对象别名显示的销毁
(2)引用超出作用域或被重新赋值
sys.getrefcount()函数能够获取对象的当前引用计数。在多数情况下,引用计数比你所猜测的要大很多。对于像数字和字符串这样的不可变数据,解释器会在程序的不同部分共享内存,目的是为了节约内存。
二、垃圾回收
一个对象的引用计数归零时,它会被垃圾收集机制处理掉。
当两个对象 a 与 b 相互引用时,del 语句能够减少 a 和 b 的引用计数,并且能销毁用于引用底层对象的名称。但因为每个对象都包含对其他对象的应用,所以引用计数不会变为零,对象也不会被销毁(进而导致内存泄露)。为了应对这一问题,解释器会定时执行一个循环检测器,去搜索不可访问对象的循环并将其删除。
三、内存池机制
Python 具备对内存的垃圾收集这一机制。它不会将不用的内存返还给操作系统,而是把不用的内存放置在内存池中。
Python 为了加速自身的执行效率,引入了一个内存池机制,即 Pymalloc 机制,该机制用于管理对小块内存的申请和释放。
Python 中,对于所有小于 256 个字节的对象,会使用 pymalloc 实现的分配器。而对于大的对象,则会使用系统的 malloc。
Python 对象中,像整数以及 List 这类对象都拥有各自独立的私有内存池,对象之间不会共享这些内存池。这意味着,倘若你分配并且释放了大量的整数,那么原本用于缓存这些整数的内存就无法再分配给浮点数了。
2、什么是lambda函数?它有什么好处?
lambda 表达式通常在需要一个函数时使用,此时不想费神去命名一个函数,也就是指匿名函数。
lambda 函数:首要用途是指点短小的回调函数
lambda[arguments]:expression
示例代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:AllTests软件测试
add=lambda x,y:x+y
print(add(2,3))
运行结果:输出5
3、Python里面如何实现tuple和list的转换?
使用 tuple 函数和 list 函数即可,并且可以通过 type()来判断对象的类型。
4、请写出一段Python代码实现删除一个list里面的重复元素?
方法一:利用set集合实现
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:AllTests软件测试
info 包含 1、2、4、1、5、6、5、0、9、0、7、7 这些数字
result = list(set(info))
print(result)
result.sort(key=info.index)
print(result)
运行结果:
方法二:使用字典函数
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:AllTests软件测试
info = [1, 2, 4, 1, 5, 6, 5, 0, 9, 0, 7, 7]
result = {}
result 利用 info 来创建键值对,从而生成一个新的字典,这个新字典的键就是 info 中的元素,值则是默认值(通常为 None)。
print(result)
使用 result.keys() 生成的结果被转换为列表,这个列表被赋值给 result_list 。
print(result_list)
运行结果:
方法三:列表推导式
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:AllTests软件测试
info = [1, 2, 4, 1, 5, 6, 5, 0, 9, 0, 7, 7]
lst = []
对于 info 中的每个元素 i,如果 i 不在 lst 中,就将 i 添加到 lst 中。然后将这些添加操作的结果存储在 res 中。即通过列表推导式 [lst.append(i) for i in info if i not in lst] 来实现将 info 中不在 lst 中的元素添加到 lst 中,并将这些添加操作的结果存储在 res 中。
print(lst)
运行结果:
5、使用Python编程用sort进行排序,然后从最后一个元素开始判断?
示例代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:AllTests软件测试
0 在 a 中。
a.sort()
last=a[-1]
定义一个变量 i ,它从 a 的长度减 2 开始,以步长为-1 进行递减循环,每次循环到 0 结束。
if last==a[i]:
del a[i]
else:
last=a[i]
print(a)
运行结果:
6、Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)
赋值(=)意味着创建了对象的一个新的引用。修改其中的任意一个变量,都会对另一个变量产生影响。
浅拷贝会创建一个新的对象。这个新对象包含的是对原始对象中包含项的引用。如果通过引用的方式去修改其中一个对象。那么另外一个对象也会随之修改改变。
完全切片方法;还有工厂函数,例如 list();以及 copy 模块的 copy() 函数
深拷贝会创建一个新的对象,然后递归地对它所包含的对象进行复制。如果修改其中一个对象,那么另外一个对象不会发生改变。
(copy 模块的 deep.deepcopy() 函数)
7、介绍一下except的用法和作用?
使用 try 语句进行尝试操作,接着使用 except 语句来捕获可能出现的异常,如果有多个 except 语句则可以分别捕获不同类型的异常。还可以使用 else 语句在 try 语句块没有发生异常时执行相应的代码。最后可以使用 finally 语句无论是否发生异常都会执行的代码块。
执行 try 下的语句,若引发异常,执行过程会跳转到 except 语句。按每个 except 分支的顺序尝试执行,若引发的异常与 except 中的异常组匹配,就执行相应的语句。若所有的 except 都不匹配,异常会传递到下一个调用本代码的最高层 try 代码中。如果 try 下的语句能正常执行,那么就会执行 else 块代码。若发生了异常,就不会执行 else 块代码。倘若存在 finally 语句,那么最后总是会执行 finally 语句中的代码。
8、Python中pass语句的作用是什么?
pass 语句不会进行任何操作。它通常被用作占位符。也可以用来创建占位程序。
9、介绍一下Python中range()函数的用法?
range()函数能够创建一个整数的列表,通常会在 for 循环里被使用。
range(start, stop[, step])
参数说明:
计数起始于 start ,通常是从 0 开始的。比如 range(5) 就等同于 range(0,5) 。
计数会一直持续到 stop 为止,但 stop 本身不包含在其中。例如 range(0,5) 所得到的结果是 [0, 1, 2, 3, 4],这里并不包含 5 。
步长为默认为 1。比如 range(0,5) 与 range(0,5,1) 是等价的。
10、如何用Python来进行查询和替换一个文本字符串?
可以运用 re 模块里的 sub()函数或者 subn()函数去进行查询以及替换操作。
格式:
sub 函数用于进行字符串的替换操作,它接受两个参数,一个是要替换的字符串,另一个是用于替换的字符串,还可以指定替换的次数(默认为 0)。
replacement 指被替换成的文本,string 为需要被替换的文本,count 是一个可选参数,其含义是最大被替换的数量。
示例代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:AllTests软件测试
import re
定义了一个正则表达式对象 p,该对象用于匹配“蓝色”或“白色”或“红色”
使用 p.sub 函数,传入参数 '彩色' 和 '蓝色袜子和红色鞋子' 进行打印操作。
使用 p.sub 函数,传入参数 '彩色'、'蓝色袜子和红色鞋子',并设置 count 为 1 来进行打印操作。
运行结果:
subn()方法执行的效果与 sub()相同。它会返回一个二维数组。这个二维数组包含替换后的新字符串以及总共替换的数量。
11、Python里面match和search的区别?
search() 也用于测试正则表达式与字符串是否匹配。不同的是,match() 会在字符串开头有 0 个或更多字符且符合正则表达式模式时,返回相关匹配的实例对象;若字符串不符合正则表达式模式,则返回 None。而 search() 有所不同,它会扫描整个字符串,若产生了匹配正则模式的情况,就能找到这个位置并返回相关匹配的对象。如果没有位置能够匹配这个模式则返回 None。
12、Python里面如何生成随机数?
Python 中用于生成随机数的是 random 这个模块,使用它之前需要进行 import 导入操作。
random.random()能够生成一个处于 0 到 1 这个范围之间的随机浮点数。
random.uniform 函数可以生成在 a 到 b 这个区间内的浮点数。
random.randint(a,b) 会生成在 a 到 b 这个范围内的整数。
random.randrange(a,b,step),即在指定的范围[a,b)内,按照 step 作为基数来随机选取一个数。
从特定序列中随机选取一个元素,这里的序列可以是字符串,也可以是列表,还可以是元组等。random.choice(sequence) 就是进行这样的操作。
最后,若你对软件测试怀有兴趣,欢迎通过百度进行搜索,搜索内容为“特斯汀软件测试腾讯课堂”;也欢迎关注公众号,公众号名称为“特斯汀软件测试”。此公众号及腾讯课堂中涵盖诸多精彩的免费视频以及干货知识。