python的学习小结

__all__的用法

常常看源码发现__init__.py文件中有__all__,关于它的用法举个栗子:

__all__ = ['bar', 'baz']

waz = 5
bar = 10
def baz(): 
  return 'baz'

__all__仅仅影响from foo import *,会认为没在__all__中的对象无法导入.

from foo import *
print bar
print baz
# waz将会报异常
print waz

但如果使用from foo import waz,则能够导入waz.

classmethod与staticmethod

类方法classmethod常用来创建一个类的实例,非常像c++中的构造函数.

class C: 
  @staticmethod 
  def f(cls, arg1, arg2, ...): # 第一个参数为cls
    cls_ = cls(arg1, arg2)
    return cls_

静态方法staticmethod可以被类调用C.f()实例调用C().f().用于常驻内存,并与实例无关的公共方法场景.

class C: 
  @staticmethod 
  def f(arg1, arg2, ...): 
    pass

uuid

uuid(UUID objects according to RFC 4122),工作中常使用uuid模块来产生唯一通用标示符,代表不同的用户.

import uuid
uuid1()
uuid2()
uuid3()
uuid4()

super()

调用父类方法时.

class C(B): 
def method(self, arg): 
  super(C, self).method(arg)

等价于:

class C(B): 
def method(self, arg): 
  super().method(arg)    

super()只能super().__getitem__(name)来显式调用方法,不能super()[name]这样的隐式调用.

isinstance(a, (b, c, d))

是下面方式的优雅的表达:

if type(a) in (b, c, d):
  return True
else
  return False

创建class

class X:
  a = 1

等价于

X = type('X', (object,), dict(a=1))

class type(name, bases, dict)name是类名,bases是父类,dict是成员的字典.

字典类型初始化

d = {'a':1}
d.get('b',2)  # b不在字典d中,获取时初始化b为2

locals()查看本地变量

注释会在__doc__出现,申明的变量直接出现,__file__是文件绝对路径.

{
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fbdc7a04278>, 
'__doc__': '\n  all is here\n', 
'__file__': '/home/kushao1267/workspace/restless/restless/ss.py', 
'a': [1, 2, 3],  # 申明的变量
'__package__': None, 
'__cached__': None, 
'__name__': '__main__', 
'__builtins__': <module 'builtins' (built-in)>, 
'__spec__': None
}

zip与unzip

a = [1, 2, 3]
b = [4, 5, 6]

def zip_func(a, b):
    """
        [1, 2, 3],[4, 5, 6] --> [(1, 4), (2, 5), (3, 6)]
    """
    zip_ = list(zip(a, b))
    return zip_

def unzip_func(zip_):
    """
        [(1, 4), (2, 5), (3, 6)] --> [(1, 2, 3), (4, 5, 6)]
    """
    a, b = list(zip(*zip_))  # zip(*) 是解压
    return list(a), list(b)

if __name__ == '__main__':
    zip_ = zip_func(a, b)
    a, b = unzip_func(zip_)
    print(zip_, a, b)

关键词使用

常常在开发中使用python已有的关键词,例如class,type,所以我们常常用class_,type_以区分,因为class和type都是对象,能够被赋值,后面coding时容易出现错误.

try...except...else语句

try:
  todo
except:
  # catch Exception
else:
  todo  # try未触发异常时执行此处

python下的路径

import os
def function():
    print(os.path.abspath(__file__))  # 当前脚本所在绝对路径
    print(os.path.dirname(os.path.abspath(__file__)))  # 当前脚本所在的路径
    print(os.path.dirname(os.path.dirname(
        os.path.abspath(__file__))))  # 当前脚本所在的上移级路径

if __name__ == '__main__':
    function()

输出为

/home/kushao1267/ss_work/test.py
/home/kushao1267/ss_work
/home/kushao1267
[Finished in 0.3s]

所以,__file__代表即为当前脚本文件,os.path.abspath()方法获取一个文件的绝对路径,os.path.dirname()获取其路径名或上一级路径名.

itertools的chain()

很多时候需要对不同的容器中的对象进行相同处理

import itertool
a = [1,2,3]
b= [3,4,5]
for i in itertool.chain(a,b):
print(i)

而下面的方式内存消耗将会大很多,因为会创建a+b的一个容器

for i in a+b:
print(i)

with语句

with语句的上下文context是通过来实现嵌套的.
比如:

with A() as a, B() as b: 
  suite

等价于

withA()asa:
  withB()asb:
    suite

上下文管理器contextmanager

@contextlib.contextmanager 修饰器可用于with语句中,且免于自己定义__enter__()__exit__()方法
例如:

fromcontextlibimportcontextmanager
@contextmanager
deftag(name):
  print("<%s>"%name)//此处的code相当于__enter__()
  yield//等待todo语句完成
  print("</%s>"%name)//此处的code相当于__exit__()
>>>withtag("h1"):
...  print("foo")//todo语句
...
<h1>
foo
</h1>

上下文装饰器ContextDecorator

定义上下文装饰器

from contextlib import ContextDecorator
class mycontext(ContextDecorator): 
  def __enter__(self): 
    print('Starting') 
    return self 
  def __exit__(self, *exc): 
    print('Finishing') 
    return False

装饰器方式如下:

>>> @mycontext()  
... def function():
... print('The bit in the middle')
...
>>> function()
Starting
The bit in the middle
Finishing

with语句方式如下:

   >>> with mycontext():  
   ... print('The bit in the middle')
   ...Starting
      The bit in the middle
      Finishing

function()中的内容将在继承ContextDecorator的装饰器mycontext()的__enter__()__exit__()之间执行.

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

推荐阅读更多精彩内容