wenmo8 发布的文章

批处理打开文件或文件夹
问题:
安装了robotframework+selenium+Python3.7自动化测试框架后,由于是自带路径,所以在电脑中很难去找ride.py文件所在路径,所以使用批处理命令打开最为方便。
处理:
1、桌面新建python.txt文件,如图:

2、找到ride.py文件所在路径。(所需打开的文件所在路径),如图:

3、双击打开python.txt文件;
方法一:
Start “” “C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts\ride.py”

方法二:
C:
cd \Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts
Start ride.py

4、保存时,更改后缀为.bat,后如图:

5、双击执行即可。

SPU = Standard Product Unit (标准产品单位)SPU是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个SPU。例如:iphone4就是一个SPU,与商家,与颜色、款式、套餐都无关。(可以理解成规格单位)

SKU=stock keeping unit(库存量单位)SKU即库存进出计量的单位, 可以是以件、盒、托盘等为单位。SKU是物理上不可分割的最小存货单元。在使用时要根据不同业态,不同管理模式来处理。在服装、鞋类商品中使用最多最普遍。例如:纺织品中一个SKU通常表示:规格、颜色、款式。(库存或销售单位)


什么是SPU?什么是SKU

SPU(Standard Product Unit) 标准产品单元,是一组可复用、易检索的标准化信息的集合。 该集合描述了一个产品的特性,通俗一点讲: 属性值、特性相同的商品就是一组SPU

(╯‵□′)╯︵┻━┻

SKU(Stock Keeping Unit) 库存保有单位,是对每一个产品的唯一标识符;比如说:比如说同一件产品:衣服, 衣服的颜色、尺码、款式就是一组SKU, 颜色、尺码也是一组SKU, 颜色、款式也是一组SKU.


他们两个之间的关系呢就是. 我们所说的商品是一个泛化的东西,比如说shoppingmode 苹果手机,他是有很多种的, shoppingmode iphone4, 5, 6等等, 我们可以将Iphone 看做是手机中的一个商品, 然后 shoppingmode iphone 5s, 确定一个产品,即SPU, 然后在从产品具体细化到, 颜色、尺码等具体的属性就是 一个SKU了,

即: SPU + 具体属性1 + 具体属性2 + 具体属性n = SKU,


一般来说,咱们库存,都是要按照具体属性来的(即,SKU为最小库存单位) 不然店里面缺货了,都不知道该补哪些哪些? 我要一个shoppingmode 苹果手机???5s ???? 嗯?那店长就会说,请问是什么颜色的呢? 请问是xxxxx

闭嘴,我用SKU存库存了…


自从我开始探索 Python 中惊人的语言功能已经有一段时间了。一开始,我给自己一个挑战,目的是让我练习更多的 Python 语言功能,而不是使用其他编程语言的编程经验。这让事情变得越来越有趣!代码变得越来越简洁,代码看起来更加结构化和规范化。下面我将会介绍这些好处。

通常如下使用场景中会用到 for 循环:

  • 在一个序列来提取一些信息。
  • 从一个序列生成另一个序列。
  • 写 for 已成习惯。

幸运的是,Python 已经有很多工具可以帮助你完成这些工作,你只需要转移你的思路,并以不同的角度来思考它。

通过避免编写 for 循环,你可以获得什么好处:

  • 较少的代码量
  • 更好的代码可读性
  • 更少的缩进(对 Python 还是很有意义的)

我们来看一下下面的代码结构:

# 1
with ...:
    for ...:
        if ...:
            try:
            except:
        else:

在这个例子中,我们正在处理多层嵌套的代码,这很难阅读。这个例子使用了多层嵌套的代码。我在这段代码中发现它无差别使用缩进把管理逻辑(with, try-except)和业务逻辑(for, if)混在一起。如果你遵守只对管理逻辑使用缩进的规范,那么核心业务逻辑应该立刻脱离出来。

"扁平结构比嵌套结构更好" - The Zen of Python

可以使用的已有的工具来替换 for 循环

1. List Comprehension / Generator 表达式

我们来看一个简单的例子。如果你想将一个数组转换为另一个数组:

result = []
for item in item_list:
    new_item = do_something_with(item)
    result.append(item)

如果你喜欢 MapReduce,你也可以使用 map,或者 Python 中的 List Comprehension:

result = [do_something_with(item) for item in item_list]

同样,如果您只想迭代数组中的元素,也可以使用一样的代码 Generator Expression。

result = (do_something_with(item) for item in item_list)

2. 函数

如果您想要将一个数组映射成另外数组,只需调用 map 函数,就可以用一个更高级、更实用的编程方式解决这个问题。

doubled_list = map(lambda x: x * 2, old_list)

如果要将序列减少为单个,请使用 reduce

from functools import reduce
summation = reduce(lambda x, y: x + y, numbers)

另外,许多 Python 内置函数都会使用 iterables:

>>> a = list(range(10))
>>> a
[0123456789]
>>> all(a)
False
>>> any(a)
True
>>> max(a)
9
>>> min(a)
0
>>> list(filter(bool, a))
[123456789]
>>> set(a)
{0123456789}
>>> dict(zip(a,a))
{00112233445566778899}
>>> sorted(a, reverse=True)
[9876543210]
>>> str(a)
'[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
>>> sum(a)
45

3. Extract Functions or Generators

上述两种方法是很好的处理更简单的逻辑。更复杂的逻辑怎么样?作为程序员,我们编写函数来抽离出复杂的业务。相同的想法适用于此。如果你是这样写的:

results = []
for item in item_list:
    # setups
    # condition
    # processing
    # calculation
    results.append(result)

显然你对一个代码块添加了太多的责任。相反,我建议你做:

def process_item(item):
    # setups
    # condition
    # processing
    # calculation
    return result

results = [process_item(item) for item in item_list]

如果换成嵌套函数会如何

results = []
for i in range(10):
    for j in range(i):
        results.append((i, j))

换成 List Comprehension 来实现是这样的:

results = [(i, j)
           for i in range(10)
           for j in range(i)]

如果你的代码块需要记录一些内部状态

# finding the max prior to the current item
a = [3462190758]
results = []
current_max = 0
for i in a:
    current_max = max(i, current_max)
    results.append(current_max)

# results = [3, 4, 6, 6, 6, 9, 9, 9, 9, 9]

我们使用 generator 来实现这一点:

def max_generator(numbers):
    current_max = 0
    for i in numbers:
        current_max = max(i, current_max)
        yield current_max

a = [3462190758]
results = list(max_generator(a))

读者可能要问 “等等!你在 generator 中用到 for 循环,作弊啊!别急,再看看下面的代码。

不要自己写。itertools 会帮你实现了

这个模块很简单。我相信这个模块在大多数场景中可以替换你原先的 for 循环。例如,最后一个例子可以重写为:

from itertools import accumulate
a = [3462190758]
resutls = list(accumulate(a, max))

另外,如果要迭代组合序列,则需要使用product(), permutations(), combinations()。

结论

  • 在大多数情况下,您都不需要编写 for 循环。
  • 你应该避免编写 for 循环,这样会有更好的代码可读性。


困惑


最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单alter table xxx ADD user_id int(1)。领导看到我的sql工单,于是说:这int(1)怕是不够用吧,接下来是一通解释。

其实这不是我第一次遇到这样的问题了,其中不乏有工作5年以上的老司机。包括我经常在也看到同事也一直使用int(10),感觉用了int(1),字段的上限就被限制,真实情况肯定不是这样。


数据说话

我们知道在mysql中 int占4个字节,那么对于无符号的int,最大值是2^32-1 = 4294967295,将近40亿,难道用了int(1),就不能达到这个最大值吗?





CREATE TABLE `user` (  `id` int(1) unsigned NOT NULL AUTO_INCREMENT,   PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

id字段为无符号的int(1),我来插入一个最大值看看。



mysql> INSERT INTO `user` (`id`) VALUES (4294967295);Query OK, 1 row affected (0.00 sec)

可以看到成功了,说明int后面的数字,不影响int本身支持的大小,int(1)、int(2)...int(10)没什么区别。

零填充

一般int后面的数字,配合zerofill一起使用才有效。先看个例子:





CREATE TABLE `user` (  `id` int(4) unsigned zerofill NOT NULL AUTO_INCREMENT,   PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

注意int(4)后面加了个zerofill,我们先来插入4条数据。




mysql> INSERT INTO `user` (`id`) VALUES (1),(10),(100),(1000);Query OK, 4 rows affected (0.00 sec)Records: 4  Duplicates: 0  Warnings: 0



分别插入1、10、100、1000 4条数据,然后我们来查询下:











mysql> select * from user;+------+| id   |+------+| 0001 || 0010 || 0100 || 1000 |+------+4 rows in set (0.00 sec)

通过数据可以发现 int(4) + zerofill实现了不足4位补0的现象,单单int(4)是没有用的。而且对于0001这种,底层存储的还是1,只是在展示的会补0。

总结

int后面的数字不能表示字段的长度,int(num)一般加上zerofill,才有效果。

zerofill的作用一般可以用在一些编号相关的数字中,比如学生的编号 001 002 ... 999这种,如果mysql没有零填充的功能,但是你又要格式化输出等长的数字编号时,那么你只能自己处理了。

图片