在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性。一些可以说是非常有用,但却没有充分利用。考虑到这一点,我编辑了一些你应该了解的Python功能特色。
带任意数量参数的函数
你可能已经知道了Python允许你定义可选参数。但还有一个方法,可以定义函数任意数量的参数。
首先,看下面是一个只定义可选参数的例子
01 |
def function(arg1 = " ",arg2=" "):
|
02 |
print "arg1: {0}" . format (arg1)
|
03 |
print "arg2: {0}" . format (arg2)
|
04 |
|
05 |
function( "Hello" , "World" )
|
06 |
# prints args1: Hello |
07 |
# prints args2: World |
08 |
|
09 |
function() |
10 |
# prints args1: |
11 |
# prints args2: |
现在,让我们看看怎么定义一个可以接受任意参数的函数。我们利用元组来实现。
01 |
def foo( * args): # just use "*" to collect all remaining arguments into a tuple
|
02 |
numargs = len (args)
|
03 |
print "Number of arguments: {0}" . format (numargs)
|
04 |
for i, x in enumerate (args):
|
05 |
print "Argument {0} is: {1}" . format (i,x)
|
06 |
|
07 |
foo() |
08 |
# Number of arguments: 0 |
09 |
|
10 |
foo( "hello" )
|
11 |
# Number of arguments: 1 |
12 |
# Argument 0 is: hello |
13 |
|
14 |
foo( "hello" , "World" , "Again" )
|
15 |
# Number of arguments: 3 |
16 |
# Argument 0 is: hello |
17 |
# Argument 1 is: World |
18 |
# Argument 2 is: Again |
使用Glob()查找文件
大多Python函数有着长且具有描述性的名字。但是命名为glob()的函数你可能不知道它是干什么的除非你从别处已经熟悉它了。
它像是一个更强大版本的listdir()函数。它可以让你通过使用模式匹配来搜索文件。
1 |
import glob
|
2 |
|
3 |
# get all py files |
4 |
files = glob.glob( '*.py' )
|
5 |
print files
|
6 |
|
7 |
# Output |
8 |
# ['arg.py', 'g.py', 'shut.py', 'test.py'] |
你可以像下面这样查找多个文件类型:
01 |
import itertools as it, glob
|
02 |
|
03 |
def multiple_file_types( * patterns):
|
04 |
return it.chain.from_iterable(glob.glob(pattern) for pattern in patterns)
|
05 |
|
06 |
for filename in multiple_file_types( "*.txt" , "*.py" ): # add as many filetype arguements
|
07 |
print filename
|
08 |
|
09 |
# output |
10 |
#=========# |
11 |
# test.txt |
12 |
# arg.py |
13 |
# g.py |
14 |
# shut.py |
15 |
# test.py |
如果你想得到每个文件的绝对路径,你可以在返回值上调用realpath()函数:
01 |
import itertools as it, glob, os
|
02 |
|
03 |
def multiple_file_types( * patterns):
|
04 |
return it.chain.from_iterable(glob.glob(pattern) for pattern in patterns)
|
05 |
|
06 |
for filename in multiple_file_types( "*.txt" , "*.py" ): # add as many filetype arguements
|
07 |
realpath = os.path.realpath(filename)
|
08 |
print realpath
|
09 |
|
10 |
# output |
11 |
#=========# |
12 |
# C:\xxx\pyfunc\test.txt |
13 |
# C:\xxx\pyfunc\arg.py |
14 |
# C:\xxx\pyfunc\g.py |
15 |
# C:\xxx\pyfunc\shut.py |
16 |
# C:\xxx\pyfunc\test.py |
调试
下面的例子使用inspect模块。该模块用于调试目的时是非常有用的,它的功能远比这里描述的要多。
这篇文章不会覆盖这个模块的每个细节,但会展示给你一些用例。
01 |
import logging, inspect
|
02 |
|
03 |
logging.basicConfig(level = logging.INFO,
|
04 |
format = '%(asctime)s %(levelname)-8s %(filename)s:%(lineno)-4d: %(message)s' ,
|
05 |
datefmt = '%m-%d %H:%M' ,
|
06 |
)
|
07 |
logging.debug( 'A debug message' )
|
08 |
logging.info( 'Some information' )
|
09 |
logging.warning( 'A shot across the bow' )
|
10 |
|
11 |
def test():
|
12 |
frame,filename,line_number,function_name,lines,index = \
|
13 |
inspect.getouterframes(inspect.currentframe())[ 1 ]
|
14 |
print (frame,filename,line_number,function_name,lines,index)
|
15 |
|
16 |
test() |
17 |
|
18 |
# Should print the following (with current date/time of course) |
19 |
#10-19 19:57 INFO test.py:9 : Some information |
20 |
#10-19 19:57 WARNING test.py:10 : A shot across the bow |
21 |
#(, 'C:/xxx/pyfunc/magic.py', 16, '', ['test()\n'], 0) |
生成唯一ID
在有些情况下你需要生成一个唯一的字符串。我看到很多人使用md5()函数来达到此目的,但它确实不是以此为目的。
其实有一个名为uuid()的Python函数是用于这个目的的。
1 |
import uuid
|
2 |
result = uuid.uuid1()
|
3 |
print result
|
4 |
|
5 |
# output => various attempts |
6 |
# 9e177ec0-65b6-11e3-b2d0-e4d53dfcf61b |
7 |
# be57b880-65b6-11e3-a04d-e4d53dfcf61b |
8 |
# c3b2b90f-65b6-11e3-8c86-e4d53dfcf61b |
你可能会注意到,即使字符串是唯一的,但它们后边的几个字符看起来很相似。这是因为生成的字符串与电脑的MAC地址是相联系的。
为了减少重复的情况,你可以使用这两个函数。
01 |
import hmac,hashlib
|
02 |
key = '1'
|
03 |
data = 'a'
|
04 |
print hmac.new(key, data, hashlib.sha256).hexdigest()
|
05 |
|
06 |
m = hashlib.sha1()
|
07 |
m.update( "The quick brown fox jumps over the lazy dog" )
|
08 |
print m.hexdigest()
|
09 |
|
10 |
# c6e693d0b35805080632bc2469e1154a8d1072a86557778c27a01329630f8917 |
11 |
# 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12 |
序列化
你曾经需要将一个复杂的变量存储在数据库或文本文件中吧?你不需要想一个奇特的方法将数组或对象格转化为式化字符串,因为Python已经提供了此功能。
01 |
import pickle
|
02 |
|
03 |
variable = [ 'hello' , 42 , [ 1 , 'two' ], 'apple' ]
|
04 |
|
05 |
# serialize content |
06 |
file = open ( 'serial.txt' , 'w' )
|
07 |
serialized_obj = pickle.dumps(variable)
|
08 |
file .write(serialized_obj)
|
09 |
file .close()
|
10 |
|
11 |
# unserialize to produce original content |
12 |
target = open ( 'serial.txt' , 'r' )
|
13 |
myObj = pickle.load(target)
|
14 |
|
15 |
print serialized_obj
|
16 |
print myObj
|
17 |
|
18 |
#output |
19 |
# (lp0 |
20 |
# S'hello' |
21 |
# p1 |
22 |
# aI42 |
23 |
# a(lp2 |
24 |
# I1 |
25 |
# aS'two' |
26 |
# p3 |
27 |
# aaS'apple' |
28 |
# p4 |
29 |
# a. |
30 |
# ['hello', 42, [1, 'two'], 'apple'] |
这是一个原生的Python序列化方法。然而近几年来JSON变得流行起来,Python添加了对它的支持。现在你可以使用JSON来编解码。
01 |
import json
|
02 |
|
03 |
variable = [ 'hello' , 42 , [ 1 , 'two' ], 'apple' ]
|
04 |
print "Original {0} - {1}" . format (variable, type (variable))
|
05 |
|
06 |
# encoding |
07 |
encode = json.dumps(variable)
|
08 |
print "Encoded {0} - {1}" . format (encode, type (encode))
|
09 |
|
10 |
#deccoding |
11 |
decoded = json.loads(encode)
|
12 |
print "Decoded {0} - {1}" . format (decoded, type (decoded))
|
13 |
|
14 |
# output |
15 |
|
16 |
# Original ['hello', 42, [1, 'two'], 'apple'] - <type 'list'=""> |
17 |
# Encoded ["hello", 42, [1, "two"], "apple"] - <type 'str'=""> |
18 |
# Decoded [u'hello', 42, [1, u'two'], u'apple'] - <type 'list'=""> |
这样更紧凑,而且最重要的是这样与JavaScript和许多其他语言兼容。然而对于复杂的对象,其中的一些信息可能丢失。
压缩字符
当谈起压缩时我们通常想到文件,比如ZIP结构。在Python中可以压缩长字符,不涉及任何档案文件。
01 |
import zlib
|
02 |
|
03 |
string = """ Lorem ipsum dolor sit amet, consectetur
|
04 |
adipiscing elit. Nunc ut elit id mi ultricies
|
05 |
adipiscing. Nulla facilisi. Praesent pulvinar,
|
06 |
sapien vel feugiat vestibulum, nulla dui pretium orci,
|
07 |
non ultricies elit lacus quis ante. Lorem ipsum dolor
|
08 |
sit amet, consectetur adipiscing elit. Aliquam
|
09 |
pretium ullamcorper urna quis iaculis. Etiam ac massa
|
10 |
sed turpis tempor luctus. Curabitur sed nibh eu elit
|
11 |
mollis congue. Praesent ipsum diam, consectetur vitae
|
12 |
ornare a, aliquam a nunc. In id magna pellentesque
|
13 |
tellus posuere adipiscing. Sed non mi metus, at lacinia
|
14 |
augue. Sed magna nisi, ornare in mollis in, mollis
|
15 |
sed nunc. Etiam at justo in leo congue mollis.
|
16 |
Nullam in neque eget metus hendrerit scelerisque
|
17 |
eu non enim. Ut malesuada lacus eu nulla bibendum
|
18 |
id euismod urna sodales. """
|
19 |
|
20 |
print "Original Size: {0}" . format ( len (string))
|
21 |
|
22 |
compressed = zlib.compress(string)
|
23 |
print "Compressed Size: {0}" . format ( len (compressed))
|
24 |
|
25 |
decompressed = zlib.decompress(compressed)
|
26 |
print "Decompressed Size: {0}" . format ( len (decompressed))
|
27 |
|
28 |
# output |
29 |
|
30 |
# Original Size: 1022 |
31 |
# Compressed Size: 423 |
32 |
# Decompressed Size: 1022 |
注册Shutdown函数
有可模块叫atexit,它可以让你在脚本运行完后立马执行一些代码。
假如你想在脚本执行结束时测量一些基准数据,比如运行了多长时间:
01 |
import atexit
|
02 |
import time
|
03 |
import math
|
04 |
|
05 |
def microtime(get_as_float = False ) :
|
06 |
if get_as_float:
|
07 |
return time.time()
|
08 |
else :
|
09 |
return '%f %d' % math.modf(time.time())
|
10 |
start_time = microtime( False )
|
11 |
atexit.register(start_time) |
12 |
|
13 |
def shutdown():
|
14 |
global start_time
|
15 |
print "Execution took: {0} seconds" . format (start_time)
|
16 |
|
17 |
atexit.register(shutdown) |
18 |
|
19 |
# Execution took: 0.297000 1387135607 seconds |
20 |
# Error in atexit._run_exitfuncs: |
21 |
# Traceback (most recent call last): |
22 |
# File "C:\Python27\lib\atexit.py", line 24, in _run_exitfuncs |
23 |
# func(*targs, **kargs) |
24 |
# TypeError: 'str' object is not callable |
25 |
# Error in sys.exitfunc: |
26 |
# Traceback (most recent call last): |
27 |
# File "C:\Python27\lib\atexit.py", line 24, in _run_exitfuncs |
28 |
# func(*targs, **kargs) |
29 |
# TypeError: 'str' object is not callable |
打眼看来很简单。只需要将代码添加到脚本的最底层,它将在脚本结束前运行。但如果脚本中有一个致命错误或者脚本被用户终止,它可能就不运行了。
当你使用atexit.register()时,你的代码都将执行,不论脚本因为什么原因停止运行。
结论
你是否意识到那些不是广为人知Python特性很有用?请在评论处与我们分享。谢谢你的阅读!
相关推荐
在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性。一些可以说是非常有用,但却没有充分利用。考虑到这一点,我编辑了一些的你应该了解的Pyghon功能特色。 带任意数量参数的函数 你可能已经...
- 对于需要安全传输和身份验证的场景非常有用,如电子商务、电子政务等领域。 - 帮助企业和个人保护他们的信息不被未授权访问或篡改。 - 可以作为学习和教育用途,帮助理解非对称加密和数字签名的原理及应用。 4. **...
以下是关于这个系统的简要介绍:功能特点:自动识别题目类型:系统可以识别不同类型的主观题,如填空题、选择题、简答题等,从而为每种类型的题目提供相应的评分标准。智能评分:系统通过深度学习算法对学生的答案...
这个类对于需要进行进制转换的开发者来说非常有用,因为它简化了进制转换的过程,使得开发者可以更加高效地进行数据处理和计算。 功能特点 1、十进制转二进制:该类提供了一个方法,可以将输入的十进制数转换为二...
3. **功能特点**:系统旨在提供一种方便的考勤管理方式,通过识别身份证来实现自动化考勤,提高考勤管理的效率和准确性。 4. **资源内容**:项目资源可能包括完整的源代码、系统文档说明以及可能的数据集下载链接。...
这个系统通常需要具备用户友好、响应速度快和易于分析结果的特点。使用Python项目框架开发的此类系统可以利用各种Web技术来实现这些功能。 主要特性和功能可能包括: 1. **实时投票**:允许学生通过移动设备或...
3. **功能特点**:系统旨在提供一种方便的门禁管理方式,通过人脸识别来实现自动化门禁控制,提高门禁管理的效率和安全性。 4. **资源内容**:项目资源可能包括完整的源代码、系统文档说明以及可能的数据集下载链接...
文本相似度计算系统是一个基于Python的项目,旨在通过自然语言处理和机器学习技术来计算两个文本之间的相似度。以下是对该系统的介绍: 1. **数据预处理**:系统首先需要对输入的文本进行预处理,包括去除停用词、...
选课分析系统是一个基于Python的项目,旨在通过数据分析和可视化技术帮助学生更好地了解课程信息、教师评价以及选课策略。以下是对该系统的介绍: 1. **数据收集**:系统从教务系统中获取课程信息、教师评价等数据...
3. **功能特点**:系统旨在提供一种方便的情感分析方式,通过自动化分析中文文本来判断其情感倾向,提高用户对舆论情绪的了解效率。 4. **资源内容**:项目资源可能包括完整的源代码、系统文档说明以及可能的数据集...
3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于python的心电图信号设计模型结构完成5分类任务(源码+模型+项目说明).zip ## 1. 介绍 心血管疾病是指影响心脏和...
我只计划在需要时填写这些功能。 使用风险自负。 这是我创建的一个库,目的是制作一个以学习 API 为目标的复制工具。 也就是说,它确实适用于我的环境,并且可能对使用 API 的其他人有用。 ####测试: OneFS 7.2...
3. **功能特点**:系统旨在提供一种方便的疲劳检测方式,通过自动化分析摄像头捕捉的图像来判断驾驶员是否疲劳,提高驾驶安全性。 4. **资源内容**:项目资源可能包括完整的源代码、系统文档说明以及可能的数据集...
3. **功能特点**:系统旨在提供一种方便的电影评价分析方式,通过自动化分析电影评论来判断其情感倾向,提高用户对电影口碑的了解效率。 4. **资源内容**:项目资源可能包括完整的源代码、系统文档说明以及可能的...
2. **功能特点**: - 系统能够计算两段文本之间的相似度,这在许多应用场景中非常有用,如搜索引擎、智能客服、文档比对等。 - 可能还包括用户界面,允许用户上传文本并接收相似度评分结果。 3. **资源内容**: - ...
招聘数据分析可视化系统是一个基于Python和Django框架的项目,旨在通过数据收集、处理和可视化技术对招聘信息进行分析,为求职者和招聘者提供有价值的信息。以下是对该系统的介绍: 1. **数据收集**:系统从各大...
Trigger是一个用Python编写的强大的网络自动化工具包,旨在与网络设备接口以及管理网络配置和安全策略。 它提高了管理大型网络的速度和效率,同时降低了人为错误的风险。 Trigger由AOL网络安全团队于2006年成立,...
它可以帮助人们更好地了解旅游目的地的特点和热门话题,为旅行计划提供参考。随着技术的发展,未来这个系统可能会集成更多的高级数据分析工具,提供更深入的数据洞察,并可能结合人工智能辅助进行个性化推荐。此外,...
过时的 终端中的表格打印和线图 示范 它是什么? Outfancy是一个Python3.6库,用于在Terminal中打印表。 当您没有GUI且可以轻松地... 执行Oneline打印,对实时应用程序有用(屏幕功能报告)。 将颜色添加到表格的