Python functions and features you need to know, useful

After using Python for many years, I stumbled upon something that we don't know the function and characteristics of the past. Some may say that is very useful, but it does not make full use of. Considering this, I compiled some of the Pyghon features you should know.

Function with any number of parameters

You may already know Python allows you to define an optional parameter. But there is another method, the number of parameters defined functions can be arbitrary.

First of all, see below is a defined only optional example

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:


Now, let us have a look how to define a can accept any arbitrary parameter. We use the tuple to achieve.

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


Using Glob () to find the file

Most of the Python function has a long and has a descriptive name. However, named glob () function you might not know what it is unless you are already familiar with it from elsewhere. It is like a more powerful version of the listdir () function. It allows you to search for files by using pattern matching.

import glob

# get all py files
files = glob.glob('*.py')
print files

# Output
# ['arg.py', 'g.py', 'shut.py', 'test.py']


You can look like the following to find multiple file types:

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


If you want to get the absolute path for each file, you can call realpath () returns the value of a function:

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


Debugging

This example uses the inspect module. The module is used for debugging purposes is very useful, it's more functions than described here.

Every detail of this article does not cover the module, but will show you some cases.

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)


Generate a unique ID

In some cases you need to generate a unique string. I see a lot of people use MD5 () function to achieve this purpose, but it is not for this purpose. In fact, there is a name for the UUID () function Python is used for this purpose.

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


You may notice that, even if the string is the only, but a few characters behind them look very similar. This is because the string and computer generated MAC address is associated with.

In order to reduce duplication of the situation, you can use these two functions.

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
Serialization

Have you ever needed a complex variable is stored in a database or text file? You don't need to think of a peculiar method takes an array or object lattice is transformed into the type string, because the Python provides this function.

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']


This is a native Python serialization method. However, in recent years, JSON becomes popular, Python adds support for it. Now you can use JSON to encode and decode.

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'="">


This is more compact, and the most important is that with JavaScript and many other language compatible. However, for complex object, some of this information may be lost.

Compression character

When talking about compression we usually think of files, such as ZIP structure. You can compress the long character in Python, does not involve any files.

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




Register the Shutdown function

A module called atexit, which allows you to run after immediately to execute some code.

If you want to measure some reference data in the script at the end of the execution, such as running for a long time:

import atexit
import time
import math

def microtime(get_as_float = False) :
if get_as_float:
return time.time()
else:
return '%f %d' % math.modf(time.time())
start_time = microtime(False)
atexit.register(start_time)

def shutdown():
global start_time
print "Execution took: {0} seconds".format(start_time)

atexit.register(shutdown)

# Execution took: 0.297000 1387135607 seconds
# Error in atexit._run_exitfuncs:
# Traceback (most recent call last):
# File "C:\Python27\lib\atexit.py", line 24, in _run_exitfuncs
# func(*targs, **kargs)
# TypeError: 'str' object is not callable
# Error in sys.exitfunc:
# Traceback (most recent call last):
# File "C:\Python27\lib\atexit.py", line 24, in _run_exitfuncs
# func(*targs, **kargs)
# TypeError: 'str' object is not callable


It seems very simple drilling. Only need to add code to the bottom of the script, it will end in a script. But if the script has a fatal error or script terminated by user, it may not run.

When you use the atexit.register (), your code will execute the script, whether because of what reason to stop running.

Conclusion

Are you aware that those not well-known Python characteristics useful? Please share with us in the comments. Thank you for readingļ¼

After using Python for many years, I stumbled upon something that we don't know the function and characteristics of the past. Some may say that is very useful, but it does not make full use of. Considering this, I compiled some of the Pyghon features you should know.

Function with any number of parameters

You may already know Python allows you to define an optional parameter. But there is another method, the number of parameters defined functions can be arbitrary.

First of all, see below is a defined only optional example

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:


Now, let us have a look how to define a can accept any arbitrary parameter. We use the tuple to achieve.

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


Using Glob () to find the file

Most of the Python function has a long and has a descriptive name. However, named glob () function you might not know what it is unless you are already familiar with it from elsewhere. It is like a more powerful version of the listdir () function. It allows you to search for files by using pattern matching.

import glob

# get all py files
files = glob.glob('*.py')
print files

# Output
# ['arg.py', 'g.py', 'shut.py', 'test.py']


You can look like the following to find multiple file types:

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


If you want to get the absolute path for each file, you can call realpath () returns the value of a function:

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


Debugging

This example uses the inspect module. The module is used for debugging purposes is very useful, it's more functions than described here.

Every detail of this article does not cover the module, but will show you some cases.

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)


Generate a unique ID

In some cases you need to generate a unique string. I see a lot of people use MD5 () function to achieve this purpose, but it is not for this purpose. In fact, there is a name for the UUID () function Python is used for this purpose.

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


You may notice that, even if the string is the only, but a few characters behind them look very similar. This is because the string and computer generated MAC address is associated with.

In order to reduce duplication of the situation, you can use these two functions.

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
Serialization

Have you ever needed a complex variable is stored in a database or text file? You don't need to think of a peculiar method takes an array or object lattice is transformed into the type string, because the Python provides this function.

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']


This is a native Python serialization method. However, in recent years, JSON becomes popular, Python adds support for it. Now you can use JSON to encode and decode.

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'="">


This is more compact, and the most important is that with JavaScript and many other language compatible. However, for complex object, some of this information may be lost.

Compression character

When talking about compression we usually think of files, such as ZIP structure. You can compress the long character in Python, does not involve any files.

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




Register the Shutdown function

A module called atexit, which allows you to run after immediately to execute some code.

If you want to measure some reference data in the script at the end of the execution, such as running for a long time:

import atexit
import time
import math

def microtime(get_as_float = False) :
if get_as_float:
return time.time()
else:
return '%f %d' % math.modf(time.time())
start_time = microtime(False)
atexit.register(start_time)

def shutdown():
global start_time
print "Execution took: {0} seconds".format(start_time)

atexit.register(shutdown)

# Execution took: 0.297000 1387135607 seconds
# Error in atexit._run_exitfuncs:
# Traceback (most recent call last):
# File "C:\Python27\lib\atexit.py", line 24, in _run_exitfuncs
# func(*targs, **kargs)
# TypeError: 'str' object is not callable
# Error in sys.exitfunc:
# Traceback (most recent call last):
# File "C:\Python27\lib\atexit.py", line 24, in _run_exitfuncs
# func(*targs, **kargs)
# TypeError: 'str' object is not callable


It seems very simple drilling. Only need to add code to the bottom of the script, it will end in a script. But if the script has a fatal error or script terminated by user, it may not run.

When you use the atexit.register (), your code will execute the script, whether because of what reason to stop running.

Conclusion

Are you aware that those not well-known Python characteristics useful? Please share with us in the comments. Thank you for readingļ¼

From the open source community: Chinese

English text: Useful Python Functions and Features You Need to Know

This article from the ChinaUnix news channel, if you look at the original point

Started by Byron at February 23, 2016 - 1:11 PM

Thanks for sharing, see glob for the first time, looked very convenient, just glob.glob this name to be tangled, but since it is the standard library should be assured.

The other: look a bit messy, if paragraph headings is bold is better

Posted by Elliott at February 26, 2016 - 1:30 PM

Indeed, the praise, typesetting Is it right? Repeated?

Posted by Len at March 01, 2016 - 1:37 PM

xuexile

Posted by Christopher at March 13, 2016 - 1:56 PM

Good stuff ah, dry cargo

Posted by Crystal at March 15, 2016 - 1:59 PM

Good stuff

Posted by Gaby at March 19, 2016 - 2:05 PM