我正在python中编写一些单元测试,测试是否收到整数.然而,有时这个整数可以关闭1或2,我真的不在乎.基本上我希望能够断言收到的整数在一定范围内,如:
self.assertBetween(998, 1000, my_integer)
Run Code Online (Sandbox Code Playgroud)
这是否有可接受的方式?或者我必须做这样的事情:
self.assertTrue(998 <= my_integer)
self.assertTrue(my_integer <= 1000)
Run Code Online (Sandbox Code Playgroud)
编辑 到目前为止的答案建议:
self.assertTrue(998 <= my_integer <= 1000)
Run Code Online (Sandbox Code Playgroud)
在我的2个断言的例子中,这有什么好处吗?
我最近开始学习python 3.
在python 2中, range()函数可用于分配列表元素.
>>> A = []
>>> A = range(0,6)
>>> print A
[0, 1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
在python 3中,当使用range()函数时,这种情况正在发生
>>> A = []
>>> A = range(0,6)
>>> print(A)
range(0, 6)
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
为什么python会做这个改变?
这是恩惠还是祸根?
我有一个问题,如何创建一个子列表(我希望这是正确使用的术语)从给定的列表,而不是复制.
切片似乎可以创建子列表,但是可以通过复制来实现.这是一个例子.
In [1]: a = [1,2,3]
In [2]: id(a)
Out[2]: 4354651128
In [3]: b = a[0:2]
In [4]: b
Out[4]: [1, 2]
In [5]: id(b)
Out[5]: 4354621312
In [6]: id(a[0:2])
Out[6]: 4354620880
Run Code Online (Sandbox Code Playgroud)
在这里看到b的id和[0:2]是不同的,尽管它们的值是相同的.要仔细检查,更改a中的值,b中的值不会更改.
In [7]: a[1] = 4
In [8]: a
Out[8]: [1, 4, 3]
In [9]: b
Out[9]: [1, 2]
Run Code Online (Sandbox Code Playgroud)
所以回到我的问题,如何创建子列表但不复制?我的意思是,当a [1]的值设置为4时,b将为[1,4].
我四处搜索并没有找到太多帮助(也许我没有使用正确的关键字).谢谢!
编辑:
谢谢大家的意见和答案!这是我学到的.
这是与numpy数组相同的过程.
In [1]: import numpy as np
In [2]: a = np.arange(1,4)
In [3]: a
Out[3]: array([1, 2, 3])
In …Run Code Online (Sandbox Code Playgroud) 当你做这样的事情:
for i in range(5):
print i
Run Code Online (Sandbox Code Playgroud)
Python做什么?它首先使用[0,1,2,3,4]生成一个数组,然后遍历打印它的每个项目吗?相近:
for i in [0,1,2,3,4]:
print i
Run Code Online (Sandbox Code Playgroud)
或者是否在生成它们时打印每个数字?就像是:
生成0将0分配给i打印i
生成1 - >将1分配给i - >打印i
生成2 - >将2分配给i - >打印i
生成3 - >将3分配给i - >打印i
生成4 - >将4分配给i - >打印i
更新
我添加了Python 2.7的标签.我不认为我的问题是版本特定的,但它似乎是!
现在我正在使用Python 2.7,所以我的问题就是这个.但我发现将Python 2范围与Python 3范围进行比较的信息非常有价值.
看来在 python 3 中评估的检查时间:
if x in range(n)
应该是 O(1),是吗?你能指点我一些文档吗?
(在 2.7 范围中是列表,因此时间复杂度肯定是线性的)
在我的 Python 应用程序中,我有一个 IP 地址字符串数组,如下所示:
[
"50.28.85.81-140", // Matches any IP address that matches the first 3 octets, and has its final octet somewhere between 81 and 140
"26.83.152.12-194" // Same idea: 26.83.152.12 would match, 26.83.152.120 would match, 26.83.152.195 would not match
]
Run Code Online (Sandbox Code Playgroud)
我安装了netaddr,虽然文档看起来很棒,但我无法理解它。这一定非常简单 - 如何检查给定的 IP 地址是否与这些范围之一匹配?不需要netaddr特别使用 - 任何简单的 Python 解决方案都可以。
说我有一个功能:
x=[]
i=5
while i<=20:
x.append(i)
i=i+10
return x
Run Code Online (Sandbox Code Playgroud)
无论如何有这样将其转换为列表理解吗?
newList = [i=05 while i<=20 i=i+10]
Run Code Online (Sandbox Code Playgroud)
我收到语法错误
当我遇到在对象中查找的答案之一range是 CONSTANT TIME 操作时,我在 StackOverflow 上滚动浏览了许多与列表与范围相关的问题!这在 O(1) 中如何完成是没有意义的,您将不得不遍历范围以查看是否存在数字。范围对象是否像一些哈希图/字典一样工作?
def usingRange(x):
return x in range(0, 100000000)
print(usingRange(9999999))
def noRange(x):
return x in list(range(0, 100000000))
print(noRange(9999999))
%timeit usingRange(9999999)
%timeit noRange(9999999)
Run Code Online (Sandbox Code Playgroud)
我得到的输出为:
True
True
443 ns ± 8.83 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
6.89 s ± 380 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Run Code Online (Sandbox Code Playgroud)
我想知道为什么它的时间恒定的原因是因为
有人告诉我不要太专注于学习 Python 编程面试中的“技巧”!因为你所做的每一件事,你都必须解释时间复杂度,所以你要么记住i in list1O(N),要么使用 for 循环遍历列表:
for …Run Code Online (Sandbox Code Playgroud)由于range对象按需生成值,是否意味着无论何时索引范围,迭代协议都会被调用到该索引?
我的意思是:
>>> R = range(1,11)
>>> print(R[5])
6
Run Code Online (Sandbox Code Playgroud)
既然R[5]没有存储在内存中,是否每次都通过创建一个新的迭代器来计算?如果没有,如何索引范围对象?
python ×10
list ×3
python-3.x ×3
python-2.7 ×2
compare ×1
indexing ×1
ip-address ×1
lookup ×1
range ×1
unit-testing ×1
xrange ×1