Java法式中添加播放MIDI音樂功效的完成辦法詳解。本站提示廣大學習愛好者:(Java法式中添加播放MIDI音樂功效的完成辦法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java法式中添加播放MIDI音樂功效的完成辦法詳解正文
Python是一門簡略而文字繁復的說話。浏覽好的Python法式感到就像浏覽英語,雖然長短常嚴厲的英語。Python的這類偽代碼特征是其最年夜強項之一,它可以讓你專注於處理成績的方法而不是說話自己。
在應用Python多年今後,我有時發明了一些我們曩昔不曉得的功效和特征。一些可以說長短常有效,但卻沒有充足應用。斟酌到這一點,我編纂了一些的你應當懂得的Pyghon功效特點。
帶隨意率性數目參數的函數
你能夠曾經曉得了Python許可你界說可選參數。但還有一個辦法,可以界說函數隨意率性數目的參數。
起首,看上面是一個只界說可選參數的例子
def function(arg1="",arg2=""): print "arg1: {0}".format(arg1) print "arg2: {0}".format(arg2) function("Hello", "World") # prints args1: Hello # prints args2: World function() # prints args1: # prints args2:
如今,讓我們看看怎樣界說一個可以接收隨意率性參數的函數。我們應用元組來完成。
def foo(*args): # just use "*" to collect all remaining arguments into a tuple numargs = len(args) print "Number of arguments: {0}".format(numargs) for i, x in enumerate(args): print "Argument {0} is: {1}".format(i,x) foo() # Number of arguments: 0 foo("hello") # Number of arguments: 1 # Argument 0 is: hello foo("hello","World","Again") # Number of arguments: 3 # Argument 0 is: hello # Argument 1 is: World # Argument 2 is: Again
應用Glob()查找文件
年夜多Python函數有著長且具有描寫性的名字。然則定名為glob()的函數你能夠不曉得它是干甚麼的除非你從別處曾經熟習它了。
它像是一個更壯大版本的listdir()函數。它可讓你經由過程應用形式婚配來搜刮文件。
import glob # get all py files files = glob.glob('*.py') print files # Output # ['arg.py', 'g.py', 'shut.py', 'test.py']
你可以像上面如許查找多個文件類型:
import itertools as it, glob def multiple_file_types(*patterns): return it.chain.from_iterable(glob.glob(pattern) for pattern in patterns) for filename in multiple_file_types("*.txt", "*.py"): # add as many filetype arguements print filename # output #=========# # test.txt # arg.py # g.py # shut.py # test.py
假如你想獲得每一個文件的相對途徑,你可以在前往值上挪用realpath()函數:
import itertools as it, glob, os def multiple_file_types(*patterns): return it.chain.from_iterable(glob.glob(pattern) for pattern in patterns) for filename in multiple_file_types("*.txt", "*.py"): # add as many filetype arguements realpath = os.path.realpath(filename) print realpath # output #=========# # C:\xxx\pyfunc\test.txt # C:\xxx\pyfunc\arg.py # C:\xxx\pyfunc\g.py # C:\xxx\pyfunc\shut.py # C:\xxx\pyfunc\test.py
調試
上面的例子應用inspect模塊。該模塊用於調試目標時長短常有效的,它的功效遠比這裡描寫的要多。
這篇文章不會籠罩這個模塊的每一個細節,但會展現給你一些用例。
import logging, inspect logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)-8s %(filename)s:%(lineno)-4d: %(message)s', datefmt='%m-%d %H:%M', ) logging.debug('A debug message') logging.info('Some information') logging.warning('A shot across the bow') def test(): frame,filename,line_number,function_name,lines,index=\ inspect.getouterframes(inspect.currentframe())[1] print(frame,filename,line_number,function_name,lines,index) test() # Should print the following (with current date/time of course) #10-19 19:57 INFO test.py:9 : Some information #10-19 19:57 WARNING test.py:10 : A shot across the bow #(, 'C:/xxx/pyfunc/magic.py', 16, '', ['test()\n'], 0)
生成獨一ID
在有些情形下你須要生成一個獨一的字符串。我看到許多人應用md5()函數來到達此目標,但它確切不是以此為目標。
其實有一個名為uuid()的Python函數是用於這個目標的。
import uuid result = uuid.uuid1() print result # output => various attempts # 9e177ec0-65b6-11e3-b2d0-e4d53dfcf61b # be57b880-65b6-11e3-a04d-e4d53dfcf61b # c3b2b90f-65b6-11e3-8c86-e4d53dfcf61b
你能夠會留意到,即便字符串是獨一的,但它們後邊的幾個字符看起來很類似。這是由於生成的字符串與電腦的MAC地址是相接洽的。
為了削減反復的情形,你可使用這兩個函數。
import hmac,hashlib key='1' data='a' print hmac.new(key, data, hashlib.sha256).hexdigest() m = hashlib.sha1() m.update("The quick brown fox jumps over the lazy dog") print m.hexdigest() # c6e693d0b35805080632bc2469e1154a8d1072a86557778c27a01329630f8917 # 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
序列化
你已經須要將一個龐雜的變量存儲在數據庫或文本文件中吧?你不須要想一個獨特的辦法將數組或對象格轉化為式化字符串,由於Python曾經供給了此功效。
import pickle variable = ['hello', 42, [1,'two'],'apple'] # serialize content file = open('serial.txt','w') serialized_obj = pickle.dumps(variable) file.write(serialized_obj) file.close() # unserialize to produce original content target = open('serial.txt','r') myObj = pickle.load(target) print serialized_obj print myObj #output # (lp0 # S'hello' # p1 # aI42 # a(lp2 # I1 # aS'two' # p3 # aaS'apple' # p4 # a. # ['hello', 42, [1, 'two'], 'apple']
這是一個原生的Python序列化辦法。但是近幾年來JSON變得風行起來,Python添加了對它的支撐。如今你可使用JSON來編解碼。
import json variable = ['hello', 42, [1,'two'],'apple'] print "Original {0} - {1}".format(variable,type(variable)) # encoding encode = json.dumps(variable) print "Encoded {0} - {1}".format(encode,type(encode)) #deccoding decoded = json.loads(encode) print "Decoded {0} - {1}".format(decoded,type(decoded)) # output # Original ['hello', 42, [1, 'two'], 'apple'] - <type 'list'=""> # Encoded ["hello", 42, [1, "two"], "apple"] - <type 'str'=""> # Decoded [u'hello', 42, [1, u'two'], u'apple'] - <type 'list'="">
如許更緊湊,並且最主要的是如許與JavaScript和很多其他說話兼容。但是關於龐雜的對象,個中的一些信息能夠喪失。
緊縮字符
當談起緊縮時我們平日想到文件,好比ZIP構造。在Python中可以緊縮長字符,不觸及任何檔案文件。
import zlib string = """ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ut elit id mi ultricies adipiscing. Nulla facilisi. Praesent pulvinar, sapien vel feugiat vestibulum, nulla dui pretium orci, non ultricies elit lacus quis ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam pretium ullamcorper urna quis iaculis. Etiam ac massa sed turpis tempor luctus. Curabitur sed nibh eu elit mollis congue. Praesent ipsum diam, consectetur vitae ornare a, aliquam a nunc. In id magna pellentesque tellus posuere adipiscing. Sed non mi metus, at lacinia augue. Sed magna nisi, ornare in mollis in, mollis sed nunc. Etiam at justo in leo congue mollis. Nullam in neque eget metus hendrerit scelerisque eu non enim. Ut malesuada lacus eu nulla bibendum id euismod urna sodales. """ print "Original Size: {0}".format(len(string)) compressed = zlib.compress(string) print "Compressed Size: {0}".format(len(compressed)) decompressed = zlib.decompress(compressed) print "Decompressed Size: {0}".format(len(decompressed)) # output # Original Size: 1022 # Compressed Size: 423 # Decompressed Size: 1022
注冊Shutdown函數
有可模塊叫atexit,它可讓你在劇本運轉完後立馬履行一些代碼。
假設你想在劇本履行停止時丈量一些基准數據,好比運轉了多長時光:
打眼看來很簡略。只須要將代碼添加到劇本的最底層,它將在劇本停止前運轉。但假如劇本中有一個致命毛病或許劇本被用戶終止,它能夠就不運轉了。
當你應用atexit.register()時,你的代碼都將履行,豈論劇本由於甚麼緣由停滯運轉。
結論
你能否認識到那些不是廣為人知Python特征很有效?請在評論處與我們分享。感謝你的浏覽!