1.字符串处理
将字符串中的数字替换成其两倍的值,例如:
修改前:"AS7G123m (d)F77k"
修改后:"AS14G246m (d)F154k"
个人思路:先用正则表达式将其中的数字匹配出来进行乘2操作,然后将字符串根据其中的数字进行切割,得到一个字符列表,最终将乘以2后的数字和原有的字符进行拼接得到最后的结果。(我脑子比较笨,想不到别的,如果您有更好更简便的方法,希望可以分享一下!)
import re text = "AS7G123m (d)F77k" nums = re.findall(r'(\d+)', text) # 取出字符串中数字 double_nums = [2 * int(i) for i in nums] # 乘以2 the_str = [] # 字符列表 for i in nums: the_str.append(text.split(i, 1)[0]) text = text.split(i, 1)[1] result = "" # 结果 for i in range(len(double_nums)): result += the_str[i] + str(double_nums[i]) result += text print(result)
2.Python传参是值传递还是引用传递?
答案是Python中传递参数是引用传递,那么要证明是引用传递呢?可以参考下面这个例子:
def f(x): print(id(x)) a = 1 print(id(a)) f(a) # 140716760159264 # 140716760159264
这里分别打印了两个地址,一个是对象a的地址,一个是传入的参数x的地址,可以看到两个地址是一样的,这也就说明Python中的传参使用的引用传递!需要注意的是:对于不可变类型,在函数中对其操作并不会对原对象产生影响,但对于可变类型,在函数中对其操作则可能会改变其值,如下:
1)传入的参数是不可变类型:
def f(x): x += "666" # 这里会创建一个新的对象 print(x) s = "777" # 字符串不可变 print(s) f(s) print(s) # 777 # 777666 # 777
2)传入的参数是可变类型:
def f(x): x.append(4) # 修改原对象的值 print(x) s = [1, 2, 3] # 列表可变 print(s) f(s) print(s) # [1, 2, 3] # [1, 2, 3, 4] # [1, 2, 3, 4]
3.浅拷贝与深拷贝的那些事
在Python中,浅拷贝与深拷贝是一定要分清楚的!对于浅拷贝和深拷贝,可以这么理解:
1)浅拷贝:创建一个对象,但其中包含的是原对象中所包含项的引用,如果用引用的方式修改了其中的对象,就会对原对象进行改变。
2)深拷贝:创建一个对象,并且递归复制原对象中所包含的对象,此时修改数据不会对原对象产生影响。
在下面的代码中包含了赋值、浅拷贝和深拷贝,在Python中赋值即引用对象,所以对c操作也就是对原对象a进行操作,对于浅拷贝对象b和d,对其中的引用进行操作会改变对a中的对象,而对深拷贝对象e进行操作就与原对象a无关了。
import copy a = [1, [2], 3] b = a[:] # 使用切片操作,浅拷贝 c = a # 赋值操作,即引用 d = a.copy() # 浅拷贝 e = copy.deepcopy(a) # 深拷贝 b.append(4) c.append(5) d.append(6) d[1].append(2) e.append(7) e[1].append(3) print(a) # [1, [2, 2], 3, 5] print(b) # [1, [2, 2], 3, 4] print(c) # [1, [2, 2], 3, 5] print(d) # [1, [2, 2], 3, 6] print(e) # [1, [2, 3], 3, 7]
4.Python一行式能干嘛?
下面是一些Python一行式的示例,从中可以看出Python是非常简洁和强大的!
1)一行代码输出一百以内的奇数:
print([x for x in range(100) if x % 2])
2)一行代码求水仙花数:
print([x for x in range(100, 1000) if int(str(x)[0])**3 + int(str(x)[1])**3 + int(str(x)[2])**3 == x])
3)一行代码打印九九乘法表:
print("".join(["{} * {} = {}\t".format(x, y, x * y) if x != y else "{} * {} = {}\n".format(x, y, x * y) for x in range(1, 10) for y in range(1, x + 1)]))
4)一行代码实现IP地址转换,如将192.168.12.1转换成0b11000000 10101000 00001100 00000001:
print("0b"+" ".join(("00000000" + bin(int(i)).replace("0b", ""))[-8:] for i in ip.split(".")))
5)一行代码求1到10的和:
from functools import reduce; print(reduce(lambda x, y: x + y, [i for i in range(1, 11)]))
5.下面这段代码的结果是什么?
def mul(): return [lambda x: x * i for i in range(4)] print([m(2) for m in mul()])
以上这段代码输出的结果是[6, 6, 6, 6],而不是[0, 2, 4, 6]!
产生这个问题的原因在于Python闭包的延迟绑定。这意味着内部函数被调用时,参数的值在闭包内进行查找。所以当mul()返回的函数被调用时,i的值会在返回的函数里查找,而for循环完成后i的值为3,也就是i最终赋值为3。因此,每次返回的函数乘以传入的值就是最后的结果,得到的结果就是[6, 6, 6, 6]。
如果要解决这个问题,可以参考以下方法:
1)使用Python生成器。
def mul(): for i in range(4): yield lambda x: x * i print([m(2) for m in mul()])
2)创造一个闭包,利用默认函数进行绑定。
def mul(): return [lambda x, i=i: x * i for i in range(4)] print([m(2) for m in mul()])
这篇文章先介绍到这,后期小牛知识库小编会为大家分享更多的文章。
1、两个有序int数组,合并成一个? 答:用两个下标移动,判断大小,写入到一个新的数组里面 2、求一个数的n次方? 答:我写的是递归,显然不是面试官想要的答案。说时间复杂度能不能降一下,不会啦! 网上百度啦一个答案,没怎么看懂,放出来大家瞅一瞅 #腾讯笔试##大数据求职#
Python基础篇 1:为什么学习Python 2:通过什么途径学习Python 3:谈谈对Python和其他语言的区别 4:简述解释型和编译型编程语言 5:Python的解释器种类以及相关特点? 6:位和字节的关系 7:b、B、KB、MB、GB的关系 8:PE8规范 9:通过代码实现如下转换(进制之间转换) 10:请编写一个函数实现将IP地址转换成一个整数 11、python递归的最大层数?99
关于 Python 的面试题,从语言特性到数据库,再到网络和操作系统,比较全面。
Python由于其简单易学的特性,常常作为软件测试工程师入门的开发语言,并且由于python在Web自动化测试、APP自动化测试、还有接口测试中都拥有比较突出的优势,而且还有很多可用的框架技术,所以python语言是很实用的软件自动化测试方面的语言。下面给大家推荐一些软件测试工程师面试遇到的一些python笔试题。 一、python实现九九乘法口诀。 二、python实现冒泡排序 三、python
请用Vue.js 2.0以 “SFC 单文件组件” 编码方式完成以下购物车题目。除了Vue.js 2.0, bootstrap 外,请尽量少用第三方库。不可使用Element UI, Mint UI等第三方库。 目标 提供前端端购物车功能 购物车外观 以下只是参考。 购物车功能 自动计算总金额(必须) 能删除已选择产品 能更改数量 能按產品名稱排序 评分准则 SFC组件设计 编码整洁 外覌 加分项
主要内容:MySQL查询字段区不区分大小写?,MySQL innodb的事务与日志的实现方式,MySQL binlog的几种日志录入格式以及区别MySQL查询字段区不区分大小写? MySQL innodb的事务与日志的实现方式 MySQL binlog的几种日志录入格式以及区别 MySQL查询字段区不区分大小写? 答案是不区分 如何解决需要区分英文大小写的场景 例如登录用户为admin,此时填写ADMIN也能登录,如果用户名需要区分大小写,你的做法是什么? 解决方案一 MySQL默认的字符检索策