sort和sorted
annotate_query = sorted(sub_query, key=lambda x: (-x['re_avg_max'],x[), reverse=True)
sort 和sorted的区别
[
{"re_avg_max":1,'field2':33},
{"re_avg_max:2}
]
my_list = [3, 1, 4, 2]
my_list.sort()
print(my_list) # 输出:[1, 2, 3, 4]
sort 是列表的方法,用于原地排序列表本身,即修改列表的顺序,而不返回新的排序结果。它没有返回值,直接在原列表上进行排序操作。
sorted 是内置函数,接受可迭代对象作为参数,并返回一个新的已排序的列表,而不修改原始对象。它返回排序后的结果,不影响原始对象。
my_list = [3, 1, 4, 2]
sorted_list = sorted(my_list)
print(sorted_list) # 输出:[1, 2, 3, 4]
print(my_list) # 输出:[3, 1, 4, 2](原始列表不受影响)
sorted 函数还可以接受额外的参数,例如 key 和 reverse,用于自定义排序规则或指定排序顺序。
my_list = [3, 1, 4, 2]
sorted_list = sorted(my_list, reverse=True) # 降序排序
print(sorted_list) # 输出:[4, 3, 2, 1]
可以按某个key去排序
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
深拷贝和浅拷贝
其实python不推荐一边生成,一边改数据,所以对于保存中间变量这种做法,最好是保存一个n的全局变量去存数据
python 可变的数据类型
dict/list
filter
Python内建的filter()函数用于过滤序列。
和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
例如,在一个list中,删掉偶数,只保留奇数,可以这么写:
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]
匿名函数
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
f = lambda x: x * x
>>>f
--<function <lambda> at 0x101c6ef28>
>>>f(5)
25
同样,也可以把匿名函数作为返回值返回,比如:
def build(x, y):
return lambda: x * x + y * y
装饰函数
就是
@decorated function
def realfunction()
这个装饰函数就在之前定义好了在这个real function前后干活,这样有些通用的功能就能通过装饰器定义,不用每次写功能都重写一次
本质上,decorator就是一个返回函数的高阶函数。所以,我们要定义一个能打印日志的decorator,可以定义如下:
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw) --这一行才是原来的函数,上面那行是包着这个函数的前置执行命令
return wrapper
@log
def now():
print('2015-3-25')
调用now()函数,不仅会运行now()函数本身,还会在运行now()函数前打印一行日志:
>>> now()
call now():
2015-3-25
把@log放到now()函数的定义处,相当于执行了语句:
now = log(now)
由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。
wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。