python小知识点

python小知识点

传递元组

  • 一个函数中返回两个不同的值

  • 案例:

      >>> def get_error_details():
          return (2,"details");
      
      >>> 
      >>> errnum,errstr = get_error_details();
      >>> errnum
      2
      >>> errstr
      'details'
      >>>
    
  • 注意

    • a,b=<some expression>的用法会将表达式的结果解释为具有两个值的一个元组。这也意味着在Python中交换两个变量的最快方法是:

        >>> a=5;b=9;
        >>> a,b
        (5, 9)
        >>> a,b=b
        >>> a,b=b,a
        >>> a,b
        (9, 5)
        >>> 
      

特殊方法

  • 诸如initdel等一些方法对于类来说有特殊意义;特殊方法用来模拟内置类的某些行为
  • 如果你想了解所有的特殊方法,请参阅手册

单语句块

  • 案例:

      >>> flag = True;
      >>> if flag:print('Yes');
      
      Yes
      >>> 
    
  • 单个语句是原地立即使用的,它不会被看作是一个单独的块。


Lambda表格

  • lambda语句可以创建一个新的函数对象。从本质上说,lambda需要一个参数,后跟一个表达式作为函数体,这一表达式执行的值将作为这个新函数的返回值

  • 案例:

      points = [{'x':2,'y':3},
                {'x':4,'y':1}];
      points.sort(key=lambda i: i['y']);
      print(points);
      C:\Users\Administrator\Desktop>python hello.py
      [{'x': 4, 'y': 1}, {'x': 2, 'y': 3}]
    
    • 要注意到一个list的sort方法可以获得一个key参数,用以决定列表的排序方式。在我们的案例中,我们希望进行一次自定义排序,为此我们需要编写一个函数,但是又不是为函数编写一个独立的def块,只在这一个地方使用,因此我们使用Lambda表达式来创建一个新函数

列表推导

  • 列表推导(List Comprehension)用于从一份现有的列表中得到一份新列表

  • 案例:

      listone=[2,3,4];
      listtwo=[2*i for i in listone if i>2];
      print(listtwo);
      C:\Users\Administrator\Desktop>python hello.py
      [6, 8]
    
  • 当满足了某些条件时(if i>2),我们进行指定的操作(2*i),以此来获得一份新的列表。要注意到原始列表依旧保持不变


在函数中接受元组与字典

  • 有一种特殊方法,即分别用*或**作为元组或字典的前缀,来使它们作为一个参数为函数所接收。当函数需要一个可变数量的实参时,这将颇为有用

  • 案例:

      >>> def powersum(power,*argv):
          total = 0;
          for i in argv:
              total += pow(i,power);
      
          return total;
      
      >>> powersum(2,3,4)
      25
    
    • 因为我们在args变量前添加了一个*前缀,函数的所有额外参数都将传递到argv中,并作为一个元组予以存储

assert语句

  • assert语句用以断言某事是真的。如果其不是真的,就抛出一个错误

  • 案例:

      >>> mylist=['ab','ff'];
      >>> assert len(mylist)>=2;
      >>> mylist.pop();
      'ff'
      >>> assert len(mylist)>=2
      Traceback (most recent call last):
        File "<pyshell#30>", line 1, in <module>
          assert len(mylist)>=2
      AssertionError
      >>> 
    

装饰器

  • 装饰器(Decorators)是应用包装函数的快捷方式。这有助于将某一功能与一些代码一遍又一遍地“包装”

  • 举个例子,我为自己创建了一个retry装饰器,这样我可以将其运用到任何函数之中,如果在一次运行中抛出了任何错误,它就会尝试重新运行,直到最大次数5次,并且每次运行期间都会有一定的延迟。这对于你在对一台远程计算机执行网络调用的情况十分有用:

  • 案例:

      from time import sleep
      from functools import wraps
      import logging
      logging.basicConfig()
      log = logging.getLogger("retry")
      def retry(f):
          @wraps(f)
          def wrapped_f(*args,**kwargs):
              MAX_ATTEMPTS = 5;
              for attempt in range(1,MAX_ATTEMPTS+1):
                  try:
                      return f(*args,**kwargs);
                  except:
                      log.exception("Attempt %s/%s failed: %s",
                                      attempt,MAX_ATTEMPTS,
                                      (args,kwargs));
                      sleep(10*attempt);
              log.critical("All %s attempts failed : %s",
                              MAX_ATTEMPTS,(args,kwargs));
          return wrapped_f;
      counter = 0;
      @retry
      def save_to_database(arg):
          print("Write to a database or make a network call or etc.");
          print("This will be automatically retried if exception is thrown");
          global counter;
          counter+=1;
          #这将在第一次调用时抛出异常
          #在第二次运行时将正常工作
          if counter<2:
              raise ValueError(arg);
      if __name__=="__main__":
          save_to_database("Some bad value");
      
      
      C:\Users\Administrator\Desktop>python hello.py powersum(2,3,4)
      Write to a database or make a network call or etc.
      This will be automatically retried if exception is thrown
      ERROR:retry:Attempt 1/5 failed: (('Some bad value',), {})
      Traceback (most recent call last):
        File "hello.py", line 12, in wrapped_f
          return f(*args,**kwargs);
        File "hello.py", line 31, in save_to_database
          raise ValueError(arg);
      ValueError: Some bad value
      Write to a database or make a network call or etc.
      This will be automatically retried if exception is thrown
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容