Python 知识碎片1

1. 巧用tuple

当我们想要分割字符串,获取特定的下标对应某个值时,比如 2019-10-12 取年、月、日

date_str = '2019-10-12'
year,month,day = tuple(date_str.split('-'))
print(year,month,day)
2. 了解try except finally

基本执行顺序

try:
    print("start")
    raise KeyError
except KeyError as e:
    # 捕获 KeyError 异常
    print('Key Error')
else:
    # 没有进Except时执行
    print('No error')
finally:
    # 最后执行
    print('finally')

--------打印结果---------
start
Key Error
finally

下面看一个易错点:

def try_test():
    try:
        print("start")
        raise KeyError
        return 1
    except KeyError as e:
        print('Key Error')
        return 2
    else:
        print('No error')
        return 3
    finally:
        print('finally')
        return 4

result = try_test()
print(result)

result是几呢? 正常都会觉得是 2 。但是实际却是 4 ,因为 Python 会将整个方法执行完,将所有return都放到栈里,最后取第一个返回, 最后压进栈里的是 finally 里的4 。 如果 finally 中没有 return 则返回2 。

3. with 上下文管理器

如何使我们自己的对象支持上下文管理器?实现两个魔法函数。

class Sample:
    def __enter__(self):
        print('enter')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        # 可以在此处释放资源
        print('exit')

    def do_something(self):
        print('这里具体要处理的事情')

with Sample() as sample:
    sample.do_something()

--------打印结果---------
enter
这里具体要处理的事情
exit
4. 列表的 append 和 extend
a = [1,2]
# 会把元素当一个整体加入
a.append([0,3])
print(a)  # 结果 [1, 2, [0, 3]]

a = [1,2]
# 会将元素迭代后加进去 可以为任何可迭代对象
a.extend([0,3])
print(a) # 结果 [1, 2, 0, 3]

# 内部使用extend实现
a = [1,2]
a += (0,3)
print(a) # 结果 [1, 2, 0, 3]
5. 切片的一些基础用法

切片的模式
模式[start:end:step]
start默认是0 end默认为列表长度 step步长 默认1 为负数表示反向
为默认值时都可以省略

alist = [1,2,3,4,5,6,7,8,9,10,11,12,13]

print(alist[::]) # 返回包含列表所有元素的新列表
print(alist[::-1]) # 返回包含列表所有元素的逆序列 [13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
print(alist[::2]) # 隔一个取一个 从第一个开始 [1, 3, 5, 7, 9, 11, 13]
print(alist[1::2]) # 隔一个取一个 从第二个开始 [2, 4, 6, 8, 10, 12]
print(alist[3:6]) # 取 第3-6 位置的元素 [4, 5, 6]
print(alist[:100]) # 结束位置自动变成列表最大 [1,2,3,4,5,6,7,8,9,10,11,12,13]
print(alist[100:]) # 返回空列表 []

# 切片赋值
alist[len(alist):] = [14,15] # 在列表的尾部增加元素
print(alist)
alist[:0] = [-2,-1] # 在列表头部增加元素
alist[3:3] = [3,4,5] #在列表中间位置插入元素
alist[:2] = [1,2] # 替换列表元素

# 删除元素
del alist[:3]
del alist[::2]
6. 实现可切片对象

实现可切片对象 切片后返回新的对象

import numbers
class Group:
    def __init__(self,name,items):
        self.name = name
        self.items = items

    def __reversed__(self):
        self.items.reverse()

    def __getitem__(self, item):
        cls = type(self)
        # 传进来的是一个切片对象
        if isinstance(item , slice):
            return cls(name=self.name,items=self.items[item])
        # 传进来是一个int 下标
        elif isinstance(item,numbers.Integral):
            return cls(name=self.name, items=[self.items[item]])

    def __len__(self):
        return len(self.items)

    def __iter__(self):
        return iter(self.items)

    def __contains__(self, item):
        if item in self.items:
            return True
        else:
            return False

group = Group(name='g1' , items= ['t1', 't2' , 't3'])
print(group.items) # ['t1', 't2', 't3']
sub_group = group[1:]
print(sub_group.items) # ['t1', 't2', 't3']
7. 使用bisect来维护已排序的序列

用来处理已排序的序列,用来维持已排序的序列,升序
二分查找 bisect = bisect_right

import bisect
inter_list = []
bisect.insort(inter_list,3)
bisect.insort(inter_list,2)
bisect.insort(inter_list,5)
bisect.insort(inter_list,1)
bisect.insort(inter_list,6)
print(inter_list) # [1, 2, 3, 5, 6]
8. 一些生成式
# 列表生成式
# 提取出1-20之间的奇数
l1 = [i for i in range(20) if i % 2 == 1]
print(l1) # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

def handle_item(item):
    return item*item
l2 = [handle_item(i) for i in range(20) if i%2 == 1]
print(l2) # [1, 9, 25, 49, 81, 121, 169, 225, 289, 361]

# 生成器表达式
# 这里并不会生成一个set或者tuple 而是一个generator
g1 = (i for i in range(20) if i % 2 == 1)
print(g1) # <generator object <genexpr> at 0x1033beeb8>
# 也可以将生成器直接转成list
l3 = list(g1)

# 字典推导式
dic = { 'a': 2 , 'b': 3 , "c": 4 }
d1 = { v:k for k,v in dic.items() }
print(d1) # {2: 'a', 3: 'b', 4: 'c'}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,585评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,923评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,314评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,346评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,718评论 3 291
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,828评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,020评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,758评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,486评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,722评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,196评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,546评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,211评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,132评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,916评论 0 200
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,904评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,758评论 2 274

推荐阅读更多精彩内容