Python 技巧总结

末日使者
• 阅读 2234

内置函数

enumerate

enumerate(list[,start=0]):遍历list,并索引

my_list = ['apple', 'banana', 'grapes', 'pear']
for i, value in enumerate(my_list, 1):
    print(i, value)

输出:

(1, 'apple')
(2, 'banana')
(3, 'grapes')
(4, 'pear')

divmod(x,y)

如果 xint,返回x÷y的商和余数组成的元组,(x//y, x%y)
如果 xfloat,则返回 (math.floor(x / y), x%y)

可以以此很方便的形成二维数组:

>>>[divmod(i, 3) for i in range(9)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

短路求值

三元运算

利用 python 逻辑运算的短路求值特性,我们可以实现python不支持的三元运算符 bool ? a : b

bool and a or b     # 其中要求 a, b 为真

当然有更pythonic 的实现方法:

a if bool else b

and 与 or 优先级

True or True and False    #=> True

造成结果为True的原因是因为短路求值,不是因为存在臆想中的优先级问题--True or (True and False),orand` 一起使用,遵循自左向右计算原则。

参见:短路求值

装饰器

示例1:

table = [i * i for i in range(5)]

或:

def call(*argv, **kwargs):
    def call_fn(fn):
        return fn(*argv, **kwargs)
    return call_fn
@call(5)
def table(n):
    value = []
    for i in range(n):
        value.append(i*i)
    return value

或:

@list
@call(5)
def table(n):
    for i in range(n):
        yield i * i

结果:

len(table), table[3]    #=> (5, 9)

数组(List)

转置矩阵

m = [[1,2],[3,4]]
zip(*m)

碾平list

a = [1, 2, [3, 4], [[5, 6], [7, 8]]]
flatten = lambda x: [y for l in x for y in flatten(l)] \
    if type(x) is list else [x]
flatten(a)
# [1,2,3,4,5,6,7,8]

list分组

a=[3, 8, 9, 4, 1, 10, 6, 7, 2, 5]
print([a[i:i+3] for i in range(0,len(a),3)])
# [[3, 8, 9], [4, 1, 10], [6, 7, 2], [5]]

字典(Dict)

key,value互换

m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
{v: k for k, v in m.items()}
# {1: 'a', 2: 'b', 3: 'c', 4: 'd'}

Dict.get()

dict.get(key[, default=None]): 如果key存在,返回dict[key],否则返回defaultdefault默认值为None。相比较,dict['key'] 只能获取 dict 中存在的key的值,如果不存在则触发 KeyError。利用此方法,在对字典进行某些运算时会更优雅:

if key not in dct:
    dct[key] = 0
dct[key] = dct[key] + 1
dct[key] = dct.get(key, 0) + 1
d = {
    'a': 1,
    'b': 2,
}
d.get('c', 3)   #=> 3

Dict.setdefault()

Dict.setdefault(key, default):如果存在,返回 dct[key],不存在则把 dct[key] 设为 default 并返回它。当一个默认的值是一个你可以修改的对象的时候这是很有用的。

dct = {}
for key, value in data:
    if key in dct:
        dct[key].append(value)
    else:
        dct[key] = [value]
dct = {}
for (key, value) in data:
    group = dct.setdefault(key, []) # key might exist already
    group.append(value)

参见:Python:字典的剧本

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
虾米大王 虾米大王
3年前
java代码092
code092.jsp通过FindServlet类查询分页数据所有图书信息ID图书名称价格数量作者<%Listlist1(List)request.getAttribute("list");for(code089book:list1)%
虾米大王 虾米大王
3年前
java代码088
code088.jsp通过存储过程获取数据所有图书信息ID图书名称价格数量作者<%Listlist1findBook.findAll();if(list1null||list1.size()
虾米大王 虾米大王
3年前
java代码080
code080.jsp显示图书列表所有图书信息ID图书名称价格数量作者<%Listlist1(List)request.getAttribute("list");if(list1null||list1.size()<inputtype"hidden"nam
Stella981 Stella981
4年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Stella981 Stella981
4年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
4年前
Python中的list详解
Python中内置的一种数据类型list,列表。list是一个有序集合,所谓有序集合就是可以通过Key或者Index进行访问(无序集合,集合的元素只能遍历,比如set)。list能随时随地进行增加和删除。python中list用\\进行表示。例如:\\\friends\'fanbinbin','libinbin','xijin
Stella981 Stella981
4年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
4年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
4年前
Python code question 1
Question1Level1Question:Writeaprogramwhichwillfindallsuchnumberswhicharedivisibleby7butarenotamultipleof5,between2000and3200(bothincluded).The