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
主要内容:MySQL查询字段区不区分大小写?,MySQL innodb的事务与日志的实现方式,MySQL binlog的几种日志录入格式以及区别MySQL查询字段区不区分大小写? MySQL innodb的事务与日志的实现方式 MySQL binlog的几种日志录入格式以及区别 MySQL查询字段区不区分大小写? 答案是不区分 如何解决需要区分英文大小写的场景 例如登录用户为admin,此时填写ADMIN也能登录,如果用户名需要区分大小写,你的做法是什么? 解决方案一 MySQL默认的字符检索策
请用Vue.js 2.0以 “SFC 单文件组件” 编码方式完成以下购物车题目。除了Vue.js 2.0, bootstrap 外,请尽量少用第三方库。不可使用Element UI, Mint UI等第三方库。 目标 提供前端端购物车功能 购物车外观 以下只是参考。 购物车功能 自动计算总金额(必须) 能删除已选择产品 能更改数量 能按產品名稱排序 评分准则 SFC组件设计 编码整洁 外覌 加分项