0%

args和*kwargs

*args

args和*kwargs主要用于函数定义,可以将不定数量的参数传递给一个函数
举例
输入:

1
2
3
4
5
def test_var_args(f_arg, *argv):
print("first normal arg:", f_arg)
for arg in argv:
print("another arg through *argv:", arg)
test_var_args('yasoob', 'python', 'eggs', 'test')

输出:

1
2
3
4
first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test

*kwargs

kwargs允许将不定长度的键值对作为参数传递给一个函数,如果想在一个函数里处理带名字的参数,应该使用*kwargs
使用示例如下:

1
2
3
4
5
6
7
8
9
def getArgs(f_arg, *args):
print "first is" + f_arg
for arg in args:
print "the data is" + arg
def gree(**kwa):
for key, value in kwa.items():
print("{0} == {1}".format(key,value))
#getArgs('name1', 'name2', 'name3', 'name4')
gree(name='test', age=12, first="apple")

输出:

1
2
3
age == 12
name == test
first == apple

使用args和*kwargs来调用函数

如果存在以下函数:

1
2
3
4
def test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)

可以使用args或*kwargs来给这个函数传递参数
(1)如果是*args

1
2
args = ("two", 3, 5)
test_args_kwargs(*args)

输出:

1
2
3
arg1: two
arg2: 3
arg3: 5

(2)如果是**kwargs

1
2
kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
test_args_kwargs(**kwargs)

输出:

1
2
3
arg1: 5
arg2: two
arg3: 3

(3)标准参数与args、kwargs在使用时的顺序
some_func(fargs, args, *kwargs)

使用场景

函数装饰器
猴子补丁

##调试**
python debugger
##生成器和迭代器
##Map Filter和Reduce

##准备
来源
http://python.jobbole.com/81184/
初始代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sys
def add(num1=0, num2=0):
return int(num1) + int(num2)
def sub(num1=0, num2=0):
return int(num1) - int(num2)
def main():
#Assuming our inputs are valid numbers
print sys.argv
addition = add(sys.argv[1], sys.argv[2])
print addition
subtraction = sub(sys.argv[1], sys.argv[2])
print subtraction
if __name__ == '__main__':
main()

基础用法

1
2
import pdb
pdb.set_trace() //设置断点

在程序中添加断点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pdb
import sys
def add(num1=0, num2=0):
return int(num1) + int(num2)
def sub(num1=0, num2=0):
return int(num1) - int(num2)
def main():
#Assuming our inputs are valid numbers
print sys.argv
pdb.set_trace() # <-- Break point added here
addition = add(sys.argv[1], sys.argv[2])
print addition
subtraction = sub(sys.argv[1], sys.argv[2])
print subtraction
if __name__ == '__main__':
main()

触发调试器

程序会自动在断点处停止执行
下一行n
输入n运行到下一行
打印p
可以使用c使pdb跳到末尾或者直到下一个断点
如果想知道sys.argv包含的内容,可以输入p sys.argv
使用这种方法可以方便地查看变量中实际储存着什么值
单步s
可以使用s进入函数内部
r返回到进入函数的返回语句
动态添加断点b
b 18:代表在18行设置一个断点
列表l
l可以显示出此刻在代码中的位置
结束
q
w
w:显示当前正在执行的代码行的上下文信息
a
打印当前函数的参数列表

##迭代器Iterator
迭代器是一个可以让程序员遍历一个容器的对象,一个迭代器在遍历并读取一个容器的数据元素时不会执行一个迭代。
迭代器三个部分
可迭代对象
迭代器
迭代
可迭代对象
python中的任意对象,只要定义了可以返回一个迭代器的iter方法,或者定义了可以支持下标索引的getitem方法,那么就是一个可跌打对象
迭代器
任意对象,只要定义了next(Python2)或者next方法,它就是一个迭代器
迭代
从某个地方取出一个元素的过程,当使用一个循环来遍历某个东西时,这个过程本身就叫做迭代。
##生成器Generators
生成器也是一种迭代器,但是只能对其迭代一次

介绍
两端都可以操作的序列
基本操作
创建:
import collections
d = collections.deque()
往右边添加一个元素:
d.append(1)
d.append(‘adc’)
往左添加一个元素:
d.appendleft(3)
清空队列:
d.clear
浅拷贝:
d1 = d.copy()
返回指定元素的出现次数:
d.count(1)
从队列右边扩展一个列表的元素:
d.extend([3,4,5])
从队列左边扩展一个列表的元素:
d.extendleft([3,4,5])
查找某个元素的索引位置:
d.index(“c”, 0, 2) //指定查找区间
在指定位置插入元素:
d.insert(2,”z”)
删除最右边一个元素(返回删除的元素)
d.pop()
删除最左边一个元素(返回删除的元素)
d.popleft()
删除指定元素
d.remove(“c”)
队列翻转
d.reverse()
把右边元素放左边
d.rotate(2) (每个元素向右移动n个,右边元素往左进)

feature/20190315_auto_reconcile_log
http://finance.administration.dev5.tff.com/reconciliation/download?platform=%E9%A9%AC%E8%9C%82%E7%AA%9D&per_page=683&page=1

介绍

可以作为一个方括号内的逗号分隔值出现,列表的数据项不需要具有相同的类型
操作
(1)取值:
list[0], list[0:3] (list[-2]代表读取列表中倒数第二个元素)
(2)更新列表
添加元素:append–> list.append(‘test’)
删除元素:del—> del list[2]
脚本操作符

python表达式 结果 描述
len([1,2,3]) 3 长度
[1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] 组合
[‘Hi!’] * 4 [‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’] 重复
3 in [1, 2, 3] True 元素是否存在于列表中
for x in [1, 2, 3]: print x, 1 2 3 迭代
函数&方法
函数 作用
cmp(list1, list2) 比较两个列表的元素
len(list) 列表元素个数
max(list) 返回列表元素最大值
min(list) 返回列表元素最小值
list(seq) 将元组转换为列表
方法 作用
list.append(obj) 在列表末尾添加新的对象
list.count(obj) 统计某个元素在列表中出现的次数
list.extend(seq) 在列表末尾一次性追加另一个序列的多个值(用新列表扩展原来的列表)
list.index(obj) 从列表中找出某个值第一个匹配项的索引位置
list.insert(index, obj) 将对象插入列表
list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并返回该元素的值
list.remove(obj) 移除列表中的某个值的第一个匹配项
list.reverse() 反向列表中的元素
list.sort(cmp=None, key=None, reverse=False) 对原列表进行排序
注意事项
切片:[m:n]从索引m开始,直到索引n为止,但不包括索引n
句尾加逗号:输出在一行中
sort():直接修改原列表,返回None

介绍
集合是一个无序的不重复的元素序列
操作
创建集合:
{}或set(),创建一个空集合必须用set(),{}创建空字典(set(“asdgf”)会创建[‘a’, ‘s’, ‘d’, ‘g’, ‘f’],set()创建多个元素需要两个())
parame = {value01,value02,…}或set(value)
添加元素:
s.add(x)
s.update(x) -> 参数可以是列表,元组,字典等,x可以有多个,用逗号分开

1
2
3
4
5
6
7
thisset = set(("Google", "Runoob", "Taobao"))
thisset.update({1,3})
print(thisset)
{1, 3, 'Google', 'Taobao', 'Runoob'}
thisset.update([1,4],[5,6])
print(thisset)
{1, 3, 4, 5, 6, 'Google', 'Taobao', 'Runoob'}

移除元素:
s.remove(x) 将元素x从集合x移除,如果元素不存在则会发生错误
s.discard(x) 将元素x从集合x移除,如果元素不存在不会发生错误
计算集合元素个数:
len(s)

1
2
thisset = set(("Google", "Runoob", "Taobao"))
len(thisset)

返回3
清空集合:
s.clear()
判断元素x是否在集合s中:
x in s
内置方法

方法 描述
add() 为集合添加元素
clear() 移除集合中的所有元素
copy() 拷贝一个集合
difference() 返回多个集合的差集
difference_update() 移除集合中的元素,该元素在指定的集合也存在
discard() 删除集合中指定的元素
intersection() 返回集合的交集
intersection_update() 删除集合中的元素,该元素在指定的集合中不存在
isdisjoint() 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False
issubset() 判断指定集合是否为该方法参数集合的子集
issuperset() 判断该方法的参数集合是否为指定集合的子集
pop() 随机移除元素
remove() 移除指定元素
symmetric_difference() 返回两个集合中不重复的元素集合
symmetric_difference_update() 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中
union() 返回两个集合的并集
update() 给集合添加元素

1 bi新建已收、已付、应收、应付表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE `order_product_set_pay`(
`id` int(10) unsigned NOT NULL,
`order_product_id` int(10) unsigned NOT NULL,
`parent_order_product_id` int(10) unsigned DEFAULT '0' COMMENT 'parent order_product_id',
`has_settlement` decimal(10,2) NOT NULL DEFAULT '0.00',
`should_settlement` decimal(10,2) NOT NULL DEFAULT '0.00',
`has_pay` decimal(10,2) NOT NULL DEFAULT '0.00',
`should_pay` decimal(10,2) NOT NULL DEFAULT '0.00',
`settlement_pay_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`pay_pay_status` varchar(255) NOT NULL DEFAULT 'Pending',
`pay_pay_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


alter table `order_product_set_pay` drop primary key;
alter table `order_product_set_pay` add `settlement_id` int(10) unsigned NOT NULL;

2 从bi表中查询数据

1 已收
(总收)/比例
比例 =

mysql查询优化

优化结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
SELECT
op.order_product_id,
op.parent_order_product_id,
op.product_retail,
op.product_discount,
op.insurance_retail,
op.order_id,
op.product_cost,
opi.`bill_status` AS bill_status,
fs.settlement_id,
fs.type,
fs.`status`,
fs.paid_usd_amount AS should_usd,
fs.updated_at AS modify_time,
(
SELECT
sum((
CASE
WHEN (cu.`code`='CNY') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"CNY":', - 1), 6), 2)
WHEN (cu.`code`='GBP') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"GBP":', - 1), 6), 2)
WHEN (cu.`code`='AUD') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"AUD":', - 1), 6), 2)
WHEN (cu.`code`='NZD') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"NZD":', - 1), 6), 2)
WHEN (cu.`code`='EUR') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"EUR":', - 1), 6), 2)
WHEN (cu.`code`='CAD') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"CAD":', - 1), 6), 2)
WHEN (cu.`code`='SUR') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"SUR":', - 1), 6), 2)
WHEN (cu.`code`='JPY') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"JPY":', - 1), 6), 2)
WHEN (cu.`code`='ZAR') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"ZAR":', - 1), 6), 2)
WHEN (cu.`code`='NOK') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"NOK":', - 1), 6), 2)
WHEN (cu.`code`='PHP') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"PHP":', - 1), 6), 2)
WHEN (cu.`code`='SEK') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"SEK":', - 1), 6), 2)
WHEN (cu.`code`='CHF') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"CHF":', - 1), 6), 2)
WHEN (cu.`code`='DKK') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"DKK":', - 1), 6), 2)
WHEN (cu.`code`='HKD') THEN
ROUND((opii.`amount`)/LEFT(SUBSTRING_INDEX(o.rate_info, '"HKD":', - 1), 6), 2)
WHEN (cu.`code`='USD') THEN opii.`amount`
END
)) has_paid
FROM
`bi`.`order_product_item` opii
LEFT JOIN `bi`.`order` AS o ON opii.order_id= o.order_id
LEFT JOIN `ori_new`.`financial_bill` AS fb ON opii.bill_id= fb.id
LEFT JOIN `bi`.`order_product` AS opp ON opii.order_product_id= opp.order_product_id
LEFT JOIN `ori_new`.`tff_provider` tp on opp.provider_id=tp.provider_id
LEFT JOIN `bi`.`currency` cu on tp.currency_id=cu.currency_id
WHERE
opii.order_product_id = op.order_product_id
AND (
opii.`bill_status` = 'Finished'
OR opii.`bill_status` = 'Paid'
)
) has_paid,
(
SELECT
fb.updated_at
FROM
`ori_new`.`financial_bill` fb
LEFT JOIN `bi`.`order_product_item` opii ON opii.bill_id= fb.id
WHERE
opii.order_product_id = op.order_product_id
AND opii.`bill_status` = 'Paid'
limit 1
) `pay_pay_time`,
(
SELECT
sum(opa.product_retail) AS total_retail
FROM
`bi`.`order_product` opa
WHERE
opa.order_id = op.order_id
AND opa.product_line != 'combine'
) total_retail,
(
SELECT
sum(opa.insurance_retail) AS insurance_total
FROM
`bi`.`order_product` opa
WHERE
opa.order_id = op.order_id
AND opa.product_line != 'combine'
) insurance_total,
(
SELECT
count(opa.order_product_id) AS op_num
FROM
`bi`.`order_product` opa
WHERE
opa.order_id = op.order_id
) op_num
FROM
`bi`.`order_product` op
LEFT JOIN `bi`.`order_product_item` opi ON op.order_product_id = opi.order_product_id
LEFT JOIN `ori_new`.financial_settlement AS fs ON fs.order_id = op.order_id
LEFT JOIN `ori_new`.financial_payment_method AS p ON fs.payment_method_id = p.payment_method_id
WHERE
op.order_product_id in ({0})
AND op.product_line != 'combine'

用过的命令

1
2
sudo awk -F '[ ;]+' '{if($2>2) print $1,$2}' test.txt | awk  '{print $1}' |xargs  |tr "\n" " "|sed 's/ /,/g'
sudo sed -i 's/api.bi.tff.com/127.0.0.1:5003/g' `find ./dist/ -name '*js'`

argc和argv

$argv代表传递的参数,$argc代表参数个数(相对路径+传的参数)
示例

1
2
3
4
5
6
<?php
echo $argv[0]; echo "\n";
var_dump($argv[1]); echo "\n";
var_dump(intval($argv[2])); echo "\n";
echo $argv[3]; echo "\n";
echo $argc;