亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

一波神奇的Python語句、函數與方法的使用技巧總結

2020-01-04 17:55:04
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了一波神奇的Python函數與方法的使用技巧總結,包括裝飾器和with語句等的不常見用法,需要的朋友可以參考下
 

顯示有限的接口到外部
當發布python第三方package時,并不希望代碼中所有的函數或者class可以被外部import,在__init__.py中添加__all__屬性,該list中填寫可以import的類或者函數名, 可以起到限制的import的作用, 防止外部import其他函數或者類。

#!/usr/bin/env python# -*- coding: utf-8 -*-from base import APIBasefrom client import Clientfrom decorator import interface, export, streamfrom server import Serverfrom storage import Storagefrom util import (LogFormatter, disable_logging_to_stderr,            enable_logging_to_kids, info)__all__ = ['APIBase', 'Client', 'LogFormatter', 'Server',      'Storage', 'disable_logging_to_stderr', 'enable_logging_to_kids',      'export', 'info', 'interface', 'stream']

with的魔力
with語句需要支持上下文管理協議的對象, 上下文管理協議包含__enter__和__exit__兩個方法。 with語句建立運行時上下文需要通過這兩個方法執行進入和退出操作。

其中上下文表達式是跟在with之后的表達式, 該表達式返回一個上下文管理對象。

# 常見with使用場景with open("test.txt", "r") as my_file: # 注意, 是__enter__()方法的返回值賦值給了my_file,  for line in my_file:    print line

知道具體原理,我們可以自定義支持上下文管理協議的類,類中實現__enter__和__exit__方法。

#!/usr/bin/env python# -*- coding: utf-8 -*-class MyWith(object):  def __init__(self):    print "__init__ method"  def __enter__(self):    print "__enter__ method"    return self # 返回對象給as后的變量  def __exit__(self, exc_type, exc_value, exc_traceback):    print "__exit__ method"    if exc_traceback is None:      print "Exited without Exception"      return True    else:      print "Exited with Exception"      return Falsedef test_with():  with MyWith() as my_with:    print "running my_with"  print "------分割線-----"  with MyWith() as my_with:    print "running before Exception"    raise Exception    print "running after Exception"if __name__ == '__main__':  test_with()

執行結果如下:

__init__ method__enter__ methodrunning my_with__exit__ methodExited without Exception------分割線-----__init__ method__enter__ methodrunning before Exception__exit__ methodExited with ExceptionTraceback (most recent call last): File "bin/python", line 34, in <module>  exec(compile(__file__f.read(), __file__, "exec")) File "test_with.py", line 33, in <module>  test_with() File "test_with.py", line 28, in test_with  raise ExceptionException

證明了會先執行__enter__方法, 然后調用with內的邏輯, 最后執行__exit__做退出處理, 并且, 即使出現異常也能正常退出

filter的用法
相對filter而言, map和reduce使用的會更頻繁一些, filter正如其名字, 按照某種規則過濾掉一些元素。

#!/usr/bin/env python# -*- coding: utf-8 -*-lst = [1, 2, 3, 4, 5, 6]# 所有奇數都會返回True, 偶數會返回False被過濾掉print filter(lambda x: x % 2 != 0, lst)#輸出結果[1, 3, 5]

一行作判斷
當條件滿足時, 返回的為等號后面的變量, 否則返回else后語句。

lst = [1, 2, 3]new_lst = lst[0] if lst is not None else Noneprint new_lst# 打印結果1

裝飾器之單例
使用裝飾器實現簡單的單例模式

# 單例裝飾器def singleton(cls):  instances = dict() # 初始為空  def _singleton(*args, **kwargs):    if cls not in instances: #如果不存在, 則創建并放入字典      instances[cls] = cls(*args, **kwargs)    return instances[cls]  return _singleton@singletonclass Test(object):  passif __name__ == '__main__':  t1 = Test()  t2 = Test()  # 兩者具有相同的地址  print t1, t2

staticmethod裝飾器
類中兩種常用的裝飾, 首先區分一下他們:

普通成員函數, 其中第一個隱式參數為對象

  • classmethod裝飾器, 類方法(給人感覺非常類似于OC中的類方法), 其中第一個隱式參數為類
  • staticmethod裝飾器, 沒有任何隱式參數. python中的靜態方法類似與C++中的靜態方法
#!/usr/bin/env python# -*- coding: utf-8 -*-class A(object):  # 普通成員函數  def foo(self, x):    print "executing foo(%s, %s)" % (self, x)  @classmethod  # 使用classmethod進行裝飾  def class_foo(cls, x):    print "executing class_foo(%s, %s)" % (cls, x)  @staticmethod # 使用staticmethod進行裝飾  def static_foo(x):    print "executing static_foo(%s)" % xdef test_three_method():  obj = A()  # 直接調用噗通的成員方法  obj.foo("para") # 此處obj對象作為成員函數的隱式參數, 就是self  obj.class_foo("para") # 此處類作為隱式參數被傳入, 就是cls  A.class_foo("para") #更直接的類方法調用  obj.static_foo("para") # 靜態方法并沒有任何隱式參數, 但是要通過對象或者類進行調用  A.static_foo("para")if __name__ == '__main__':  test_three_method()  # 函數輸出executing foo(<__main__.A object at 0x100ba4e10>, para)executing class_foo(<class '__main__.A'>, para)executing class_foo(<class '__main__.A'>, para)executing static_foo(para)executing static_foo(para)

property裝飾器
定義私有類屬性

將property與裝飾器結合實現屬性私有化(更簡單安全的實現get和set方法)。

#python內建函數property(fget=None, fset=None, fdel=None, doc=None)

fget是獲取屬性的值的函數,fset是設置屬性值的函數,fdel是刪除屬性的函數,doc是一個字符串(像注釋一樣)。從實現來看,這些參數都是可選的。

property有三個方法getter(), setter()和delete() 來指定fget, fset和fdel。 這表示以下這行:

class Student(object):  @property #相當于property.getter(score) 或者property(score)  def score(self):    return self._score  @score.setter #相當于score = property.setter(score)  def score(self, value):    if not isinstance(value, int):      raise ValueError('score must be an integer!')    if value < 0 or value > 100:      raise ValueError('score must between 0 ~ 100!')    self._score = value

iter魔法
通過yield和__iter__的結合,我們可以把一個對象變成可迭代的
通過__str__的重寫, 可以直接通過想要的形式打印對象

#!/usr/bin/env python# -*- coding: utf-8 -*-class TestIter(object):  def __init__(self):    self.lst = [1, 2, 3, 4, 5]  def read(self):    for ele in xrange(len(self.lst)):      yield ele  def __iter__(self):    return self.read()  def __str__(self):    return ','.join(map(str, self.lst))    __repr__ = __str__def test_iter():  obj = TestIter()  for num in obj:    print num  print objif __name__ == '__main__':  test_iter()

神奇partial
partial使用上很像C++中仿函數(函數對象)。

在stackoverflow給出了類似與partial的運行方式:

def partial(func, *part_args):  def wrapper(*extra_args):    args = list(part_args)    args.extend(extra_args)    return func(*args)  return wrapper

利用用閉包的特性綁定預先綁定一些函數參數,返回一個可調用的變量, 直到真正的調用執行:

#!/usr/bin/env python# -*- coding: utf-8 -*-from functools import partialdef sum(a, b):  return a + bdef test_partial():  fun = partial(sum, 2)  # 事先綁定一個參數, fun成為一個只需要一個參數的可調用變量  print fun(3) # 實現執行的即是sum(2, 3)if __name__ == '__main__':  test_partial()  # 執行結果5

神秘eval
eval我理解為一種內嵌的python解釋器(這種解釋可能會有偏差), 會解釋字符串為對應的代碼并執行, 并且將執行結果返回。

看一下下面這個例子:

#!/usr/bin/env python# -*- coding: utf-8 -*-def test_first():  return 3def test_second(num):  return numaction = { # 可以看做是一個sandbox    "para": 5,    "test_first" : test_first,    "test_second": test_second    }def test_eavl():   condition = "para == 5 and test_second(test_first) > 5"  res = eval(condition, action) # 解釋condition并根據action對應的動作執行  print resif __name__ == '_

exec
exec在Python中會忽略返回值, 總是返回None, eval會返回執行代碼或語句的返回值
exec和eval在執行代碼時, 除了返回值其他行為都相同
在傳入字符串時, 會使用compile(source, '<string>', mode)編譯字節碼。 mode的取值為exec和eval

#!/usr/bin/env python# -*- coding: utf-8 -*-def test_first():  print "hello"def test_second():  test_first()  print "second"def test_third():  print "third"action = {    "test_second": test_second,    "test_third": test_third    }def test_exec():  exec "test_second" in actionif __name__ == '__main__':  test_exec() # 無法看到執行結果

getattr
getattr(object, name[, default])返回對象的命名屬性,屬性名必須是字符串。如果字符串是對象的屬性名之一,結果就是該屬性的值。例如, getattr(x, ‘foobar') 等價于 x.foobar。 如果屬性名不存在,如果有默認值則返回默認值,否則觸發 AttributeError 。

# 使用范例class TestGetAttr(object):  test = "test attribute"  def say(self):    print "test method"def test_getattr():  my_test = TestGetAttr()  try:    print getattr(my_test, "test")  except AttributeError:    print "Attribute Error!"  try:    getattr(my_test, "say")()  except AttributeError: # 沒有該屬性, 且沒有指定返回值的情況下    print "Method Error!"if __name__ == '__main__':  test_getattr()  # 輸出結果test attributetest method

命令行處理

def process_command_line(argv):  """  Return a 2-tuple: (settings object, args list).  `argv` is a list of arguments, or `None` for ``sys.argv[1:]``.  """  if argv is None:    argv = sys.argv[1:]  # initialize the parser object:  parser = optparse.OptionParser(    formatter=optparse.TitledHelpFormatter(width=78),    add_help_option=None)  # define options here:  parser.add_option(   # customized description; put --help last    '-h', '--help', action='help',    help='Show this help message and exit.')  settings, args = parser.parse_args(argv)  # check number of arguments, verify values, etc.:  if args:    parser.error('program takes no command-line arguments; '           '"%s" ignored.' % (args,))  # further process settings & args if necessary  return settings, argsdef main(argv=None):  settings, args = process_command_line(argv)  # application code here, like:  # run(settings, args)  return 0    # successif __name__ == '__main__':  status = main()  sys.exit(status)

讀寫csv文件

# 從csv中讀取文件, 基本和傳統文件讀取類似import csvwith open('data.csv', 'rb') as f:  reader = csv.reader(f)  for row in reader:    print row# 向csv文件寫入import csvwith open( 'data.csv', 'wb') as f:  writer = csv.writer(f)  writer.writerow(['name', 'address', 'age']) # 單行寫入  data = [      ( 'xiaoming ','china','10'),      ( 'Lily', 'USA', '12')]  writer.writerows(data) # 多行寫入
各種時間形式轉換
只發一張網上的圖, 然后查文檔就好了, 這個是記不住的

一波神奇的Python語句、函數與方法的使用技巧總結

字符串格式化
一個非常好用, 很多人又不知道的功能:

>>> name = "andrew">>> "my name is {name}".format(name=name)'my name is andrew'

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美午夜无遮挡| 国产日韩欧美在线视频观看| 国产中文字幕亚洲| 国产亚洲aⅴaaaaaa毛片| 国产亚洲欧美日韩美女| 欧美电影院免费观看| 亚洲国产福利在线| 亚洲自拍偷拍在线| 久久久成人精品视频| 奇米成人av国产一区二区三区| 91国内产香蕉| 亚洲国产高清高潮精品美女| 日韩视频在线一区| 国产精品久久中文| 日韩中文有码在线视频| 久久久久久伊人| 精品人伦一区二区三区蜜桃免费| 这里只有精品视频| 欧美一级视频一区二区| 国内久久久精品| 欧美丝袜第一区| 在线播放精品一区二区三区| 国内精品美女av在线播放| www.亚洲男人天堂| 亚洲国产精品久久久久久| 久久伊人精品天天| 亚洲美女中文字幕| 国产成人a亚洲精品| 日韩在线精品一区| 亚洲男人天堂2024| 亚洲男人天堂2023| 成人写真视频福利网| 91精品视频专区| 91夜夜未满十八勿入爽爽影院| 亚洲美女久久久| 在线播放日韩av| 精品国产欧美一区二区五十路| 久久天天躁日日躁| 中文字幕日韩欧美| 国产精品一区二区三区免费视频| 日韩精品在线观看视频| 欧美精品日韩www.p站| 亚洲欧美综合精品久久成人| 26uuu久久噜噜噜噜| 国产视频一区在线| 亚洲欧美成人在线| 国产一区二区三区在线播放免费观看| 欧美黑人xxxx| 91午夜理伦私人影院| 国产精品美女无圣光视频| 日韩电影中文字幕在线观看| 奇米成人av国产一区二区三区| 成人国产精品色哟哟| 亚洲18私人小影院| 国产99久久精品一区二区| 国产激情久久久| 亚洲精品午夜精品| 成人日韩av在线| 日本成熟性欧美| 在线电影欧美日韩一区二区私密| 久久天天躁夜夜躁狠狠躁2022| 国产91久久婷婷一区二区| 国产视频在线观看一区二区| 久久亚洲精品小早川怜子66| 欧美理论电影在线观看| 亚洲毛片在线观看.| 国产区亚洲区欧美区| 中文字幕亚洲激情| 亚洲一区中文字幕| 欧美超级免费视 在线| 欧洲永久精品大片ww免费漫画| 久久6精品影院| 国产精品1区2区在线观看| 777午夜精品福利在线观看| 国产女人精品视频| 国产91精品久| 日韩风俗一区 二区| 国产999在线| 亚洲黄一区二区| 久久在线免费观看视频| 青草青草久热精品视频在线观看| 在线电影欧美日韩一区二区私密| 国产精品夜间视频香蕉| 欧美在线观看日本一区| 亚洲第一精品久久忘忧草社区| 亚洲精品久久久久中文字幕二区| 国产精品露脸自拍| 欧美成人精品激情在线观看| 亚洲欧美日韩国产中文| 国产香蕉一区二区三区在线视频| 中文字幕日本欧美| 66m—66摸成人免费视频| 亚洲大尺度美女在线| 久久精品99国产精品酒店日本| 国产精品视频免费观看www| 精品成人av一区| 2019日本中文字幕| 亚洲精品456在线播放狼人| 韩国欧美亚洲国产| 欧美大人香蕉在线| 欧美激情一区二区久久久| 欧美日韩国产专区| 亚洲美女激情视频| 成人免费视频在线观看超级碰| 日韩精品久久久久久福利| 亚洲视频第一页| 亚洲视频777| 国产精品黄视频| 91干在线观看| 欧美精品一本久久男人的天堂| 国产精品久久国产精品99gif| 久久久精品影院| 欧美国产激情18| 中文字幕无线精品亚洲乱码一区| 亚洲国产另类 国产精品国产免费| 久久免费在线观看| 久久久久久久久久久av| 亚洲va男人天堂| 久久天堂av综合合色| 国产精品视频自在线| 国产成人综合av| 欧美与黑人午夜性猛交久久久| 久久久久久久电影一区| 亚洲精品成人久久| 久久久999国产| 国产精品欧美久久久| 一区三区二区视频| 欧美黑人巨大xxx极品| 亚洲激情在线视频| 日韩欧美主播在线| 亚洲激情 国产| 久久视频中文字幕| 91在线免费观看网站| 欧美极品少妇xxxxⅹ裸体艺术| 韩国美女主播一区| 国产午夜精品视频免费不卡69堂| 久久久久久久久中文字幕| 韩剧1988在线观看免费完整版| 亚洲人成电影在线播放| 日韩电影在线观看永久视频免费网站| 日韩福利在线播放| 精品久久久久久亚洲精品| 中文字幕久精品免费视频| 亚洲欧洲日韩国产| 色吧影院999| 91精品91久久久久久| 在线成人免费网站| 欧美日韩激情网| 成人国产精品久久久| 国产精品第一第二| 久久久精品免费视频| 懂色av一区二区三区| 福利微拍一区二区| 国产精品精品视频| 91亚洲国产成人精品性色| 亚洲国产成人爱av在线播放| 亚洲桃花岛网站| 久久久久久久久久av| 精品视频一区在线视频| 国模极品一区二区三区| 欧美大学生性色视频| 色偷偷88888欧美精品久久久| 国产欧美在线看| 亚洲美女视频网站|