制作python包的函数 Python如何创建包
python常用函数包有哪些?
一些python常用函数包:
专注于为中小企业提供成都网站设计、网站制作、外贸营销网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业瑞安免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了千余家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
1、Urllib3
Urllib3是一个 Python 的 HTTP 客户端,它拥有 Python 标准库中缺少的许多功能:
线程安全
连接池
客户端 SSL/TLS 验证
使用分段编码上传文件
用来重试请求和处理 HTTP 重定向的助手
支持 gzip 和 deflate 编码
HTTP 和 SOCKS 的代理支持
2、Six
six 是一个是 Python 2 和 3 的兼容性库。这个项目旨在支持可同时运行在 Python 2 和 3 上的代码库。它提供了许多可简化 Python 2 和 3 之间语法差异的函数。
3、botocore、boto3、s3transfer、awscli
Botocore是 AWS 的底层接口。Botocore是 Boto3 库(#22)的基础,后者让你可以使用 Amazon S3 和 Amazon EC2 一类的服务。Botocore 还是 AWS-CLI 的基础,后者为 AWS 提供统一的命令行界面。
S3transfer(#7)是用于管理 Amazon S3 传输的 Python 库。它正在积极开发中,其介绍页面不推荐人们现在使用,或者至少等版本固定下来再用,因为其 API 可能发生变化,在次要版本之间都可能更改。Boto3、AWS-CLI和其他许多项目都依赖s3transfer。
4、Pip
pip是“Pip Installs Packages”的首字母递归缩写。
pip很容易使用。要安装一个包只需pip install package name即可,而删除包只需pip uninstall package name即可。
最大优点之一是它可以获取包列表,通常以requirements.txt文件的形式获取。该文件能选择包含所需版本的详细规范。大多数 Python 项目都包含这样的文件。
如果结合使用pip与virtualenv(列表中的 #57),就可以创建可预测的隔离环境,同时不会干扰底层系统,反之亦然。
5、Python-dateutil
python-dateutil模块提供了对标准datetime模块的强大扩展。我的经验是,常规的Python datetime缺少哪些功能,python-dateutil就能补足那一块。
6、Requests
Requests建立在我们的 #1 库——urllib3基础上。它让 Web 请求变得非常简单。相比urllib3来说,很多人更喜欢这个包。而且使用它的最终用户可能也比urllib3更多。后者更偏底层,并且考虑到它对内部的控制级别,它一般是作为其他项目的依赖项。
7、Certifi
近年来,几乎所有网站都转向 SSL,你可以通过地址栏中的小锁符号来识别它。加了小锁意味着与该站点的通信是安全和加密的,能防止窃听行为。
8、Idna
根据其 PyPI 页面,idna提供了“对 RFC5891 中指定的应用程序中国际化域名(IDNA)协议的支持。”
IDNA的核心是两个函数:ToASCII和ToUnicode。ToASCII会将国际 Unicode 域转换为 ASCII 字符串。ToUnicode则逆转该过程。在IDNA包中,这些函数称为idna.encode()和idna.decode()
9、PyYAML
YAML是一种数据序列化格式。它的设计宗旨是让人类和计算机都能很容易地阅读代码——人类很容易读写它的内容,计算机也可以解析它。
PyYAML是 Python 的YAML解析器和发射器,这意味着它可以读写YAML。它会把任何 Python 对象写成YAML:列表、字典,甚至是类实例都包括在内。
10、Pyasn1
像上面的IDNA一样,这个项目也非常有用:
ASN.1 类型和 DER/BER/CER 编码(X.208)的纯 Python 实现
所幸这个已有数十年历史的标准有很多信息可用。ASN.1是 Abstract Syntax Notation One 的缩写,它就像是数据序列化的教父。它来自电信行业。也许你知道协议缓冲区或 Apache Thrift?这就是它们的 1984 年版本。
11、Docutils
Docutils是一个模块化系统,用来将纯文本文档处理为很多有用的格式,例如 HTML、XML 和 LaTeX 等。Docutils能读取reStructuredText格式的纯文本文档,这种格式是类似于 MarkDown 的易读标记语法。
12、Chardet
你可以用chardet模块来检测文件或数据流的字符集。比如说,需要分析大量随机文本时,这会很有用。但你也可以在处理远程下载的数据,但不知道用的是什么字符集时使用它。
13、RSA
rsa包是一个纯 Python 的 RSA 实现。它支持:
加密和解密
签名和验证签名
根据 PKCS#1 1.5 版生成密钥
它既可以用作 Python 库,也能在命令行中使用。
14、Jmespath
JMESPath,发音为“James path”,使 Python 中的 JSON 更容易使用。它允许你声明性地指定如何从 JSON 文档中提取元素。
15、Setuptools
它是用于创建 Python 包的工具。不过,其文档很糟糕。它没有清晰描述它的用途,并且文档中包含无效链接。最好的信息源是这个站点,特别是这个创建 Python 包的指南。
16、Pytz
像dateutils一样,这个库可帮助你处理日期和时间。有时候,时区处理起来可能很麻烦。幸好有这样的包,可以让事情变得简单些。
17、Futures
从 Python 3.2 开始,python 提供current.futures模块,可帮助你实现异步执行。futures 包是该库适用于 Python 2 的 backport。它不适用于 Python3 用户,因为 Python 3 原生提供了该模块。
18、Colorama
使用 Colorama,你可以为终端添加一些颜色:
更多Python知识请关注Python自学网
python内建函数
其实安装python包会自带一个有问号标示“?”的"Python Manuals"可以仔细阅读一下,也可作帮助文档的。
介绍Python的内建函数和异常.许多内建函数的细节及特性可以在这里找到.
内建函数
本节介绍的函数在解释器中总是可用的,他们被包含在 __builtin__ 模块里.另外每个模块的 __builtins__ 属性经常指的是这个模块(除了当在restricted execution环境下运行时).
_(下划线)
默认情况下,变量 _ 用于在交互模式下表示最近一个表达式的运行结果.
参阅 sys.displayhook (118)
__import__(name [, globals [, locals [, fromlist]]])
import语句通过调用这个函数来导入模块. name是包含模块名字的字符串, globals是一个可选的定义全局名称空间的字典, locals是定义局部名称空间的字典, fromlist是from语句目标的列表.例如, import spam语句会调用__import__('spam', globals(), locals(), []) ,而from spam import foo 语句会调用 __import__('spam', globals(), locals(), ['foo']). 如果模块名在包名字之后(如foo.bar)而且fromlist为空时,就返回对应的模块对象.如果fromlist不为空,则只会返回最顶级的包.
这个函数是一个低等级的模块载入接口.它并不执行import语句的所有步骤(通常情况下局部名称空间并不会随模块中包含对象的名称引用的改变而改变.这个函数可以由用户来重新定义,这样为import语句加入新的行为.默认的执行并不会检查locals参数,而globals只用于决定包的内容(这些参数可以使 __import__()能够完整地访问全局和局部名称空间)
abs(x)
返回x的绝对值
apply(func [, args [, keywords]])
对可调用对象func执行函数调用. args是一个包含固定位置参数的元组, keywords是包含关键参数的字典. apply()函数也可以写做func(*args ,**keywords ).
buffer(sequence [, offset [, size]])
创建一个新的缓冲器对象.缓冲器通常是一个序列(如字符串)的字节导向序列.缓冲器和字符串在许多地方是相同的,但是它不支持字符串方法,而且也不能使用string模块的函数.
callable(object)
当object为可调用对象时返回True,否则返回False
chr(i)
将一个0到255的整数转换为一个字符.
cmp(x,y)
比较x和y. x y返回负数; x== y返回零; x y返回整数.它可以比较任意两个对象并返回结果,即使有时候对象的比较豪无意义(例如比较文件对象).在某些环境下,这样的比较会引发异常.
coerce(x,y)
将x和y值转换为同一个数值类型并作为一个元组返回.(第三章,类型和对象)
compile(string, filename, kind)
使用exec()或eval()将字符串编译为代码对象. filename is a string containing the name of the file in which the string was defined. kind为'exec'时代表一个表达式的序列, 'eval'代表一个表达式, 'single'代表一个运行语句.
complex(real [, imag])
创建一个复数
delattr(object, attr)
删除对象的一个属性, attr是一个字符串.与 del object.attr相同
dir([object])
返回包含属性名称的列表.它们来自对象的 __dict__, __methods__,以及 __members__ 属性.如果没有传递给它参数,则会返回当前的local symbol table
divmod(a,b)
返回一个包含商和余数的元组.对于整数,将返回(a / b , a % b ),对于浮点数,将返回(math.floor(a / b ), a % b )
eval(expr [, globals [, locals]])
计算一个表达式的值. expr是一个字符串或由compile()创建的一个代码对象. globals和locals为操作定义的全局和局部名称空间,当省略时,表达式将在调用时的名称空间计算.
execfile(filename [, globals [, locals]])
运行文件filename中的语句. globals和locals定义了文件运行的全局和局部名称空间,当省略时,文件将在调用时的名称空间运行.这个函数不能在一个函数主体里使用,因为它与内嵌范围不相容.
filter(function, list)
使用func()函数来过滤s中的元素.使func返回值为false的元素被丢弃,其它的存入filter函数返回的列表中.如果function是None,则list中值为False的元素就被删除.
float(x)
将x转换为浮点数
getattr(object, name [, default])
返回一个对象的属性. name是一个字符串. default是一个可选的值,代表当没有这个属性时返回的值. 与 object.name 结果相同
globals()
返回一个与全局名称空间对应的字典
hasattr(object, name)
返回object是否有name属性,布尔值
hash(object)
返回一个对象的整数哈希值(如果可能).两个相等对象的哈希值是相同的.模块没有定义一个哈希值.
hex(x)
将一个整数或长整数转换为一个十六进制的字符串
id(object)
返回一个对象的整数id
input([prompt])
相当于eval(raw_input(prompt ))
int(x [, base])
将一个数字或字符串转换为整数. 可选参数base代表从字符串转换时的基础/根据
intern(string)
Checks to see whether string is contained in an internal table of strings. If found, a copy of the internal string is returned. If not, string is added to the internal table and returned. This function is primarily used to get better performance in operations involving dictionary lookups. Interned strings are never garbage-collected. Not applicable to Unicode strings.
isinstance(object, classobj)
检查object是否是classobj的事例或子类.也可用于检查类型
issubclass(class1, class2)
检查class1是否是class2的子类(派生类)
注意: issubclass(A , A )返回True
len(s)
返回序列s中包含的条目数目
list(s)
返回一个包含序列s中条目的新列表
locals()
返回一个与调用时局部名称空间相对应的字典
long(x [, base])
将一个数字或字符串转换为长整数,可选参数base代表从字符串转换时的基础/根据
map(function, list, ...)
将序列list中的每个元素传递给function函数做参数,函数的返回值组成列表并返回.如果提供给多个列表,则函数应包含有多个参数,每个参数从不同的列表获得.如果函数为None,则默认为 identity function(?身份函数).如果None映射到多个列表,则返回一个包含元组的列表,元组的每个元素分别来自各个列表.如果有必要,短的列表将使用None来扩充到与最长列表长度相等. map可以使用list comprehensions 来代替.例如map(function , alist ),可以使用[function (x) for x in alist ]来代替
参阅 zip (105).
max(s [, args, ...])
单个参数时,返回序列s中的最大值.多个参数时,返回值最大的参数
min(s [, args, ...])
单个参数时,返回序列s中的最小值.多个参数时,返回值最小的参数
oct(x)
将一个整数或者长整数转换为八进制字符串
open(filename [, mode [, bufsize]])
打开文件filename并返回一个文件对象(第十章,运行环境). mode代表文件打开的模式. 'r' 表示读, 'w' 表示写, 'a' 表示在文件末尾添加内容. 还有一种更新模式,你只要在读写模式后增加一个'+'就可以使用这种模式,如'r+' 或 'w+'.当一个文件以更新模式打开,你就可以对这个文件进行读写操作.只要在任何读取操作之前刷新所有的输出缓冲就不会有问题.如果一个文件以 'w+' 模式打开,它的长度就度截为 0.当mode省略时,将会使用'w'模式.bufsize参数指定了缓冲行为, 0代表无缓冲,1代表行缓冲,其他正数代表一个大约的字节缓冲器大小,负数代表使用系统默认缓冲器大小(也是默认行为)
ord(c)
返回单个字符c的整数顺序值.普通字符返回[0,255]中的一个值,Unicode字符返回 [0,65535]中的一个值
pow(x, y [, z])
返回x ** y ,如果z存在返回(x ** y ) % z
range([start,] stop [, step])
返回一个从start到stop的整数序列, step代表步进,默认值为1. start默认值为0.负数的step可以创建一个递减的整数序列
参阅xrange (105)
raw_input([prompt])
从标准输入(sys.stdin)中读取一行,并把它作为字符串返回.如果提供了prompt,它将首先打印到标准输出(sys.stdout).当读取到一个EOF时,就会引发一个EOFError异常.如果readline模块被导入,那么这个函数会使用它来提供更高级的功能
reduce(func, seq [, initializer])
函数从一个序列收集信息,然后只返回一个值(例如求和,最大值,等).它首先以序列的前两个元素调用函数,再将返回值和第三个参数作为参数调用函数,依次执行下去,返回最终的值. func函数有且只有两个参数.在seq为空时,将使用初始值initializer.
reload(module)
重新导入一个已经导入的模块. module必须是一个已经存在的模块对象.一般情况下并不鼓励使用这个函数,除了在调试的时候.
当一个模块重导入时,定义它的全局名称空间的字典依然存在.Thus, definitions in the old module that aren’t part of the newly reloaded module are retained.模块可以利用这个来检查他们是否已经被导入.
重导入一个使用C编写的模块通常是不合法的
If any other modules have imported this module by using the from statement, they’ll continue to use the definitions in the previously imported module. This problem can be avoided by either reissuing the from statement after a module has been reloaded or using fully qualified names such as module.name .
如果有使用以前模块中类创建的实例,它们将继续使用以前的模块
repr(object)
返回一个对象的标准字符串表示.与向后的引号 `object` 相同.大多数情况下,返回的字符串可以使用eval()来再次创建这个对象.
round(x [, n])
Returns the result of rounding the floating-point number x to the closest multiple of 10 to the power minus n . If n is omitted, it defaults to 0. If two multiples are equally close, rounding is done away from 0 (例如, 0.5 is rounded to 1.0 and -0.5 is rounded to -1.0).
setattr(object, name, value)
设置一个对象的属性. name是一个字符串. 相当于object.name = value .
slice([start,] stop [, step])
返回一个代表指定数列中一个整数的切片对象.切片对象也可以有扩展切片操作语句来产生.(第三章,序列和映射方法)
str(object)
返回表示对象的可打印形式的字符串.与print语句产生的字符串相同.
tuple(s)
从序列s中创建一个元组.如果s已经是一个元组,则返回s
type(object)
返回object的类型,它是一个types模块中定义type类型
参阅isinstance (102)
unichr(i)
将一个0到65535的整数转换为一个Unicode字符
unicode(string [, encoding [, errors]])
将string转换为Unicode字符串. encoding指定了string的数据编码,它被省略时,将使用sys.getdefaultencoding(). errors指定编码错误处理方式.('strict', 'ignore', 或 'replace' .参阅第三章和第九章中有关Unicode内容)
vars([object])
返回object的 symbol table (通常在object的__dict__属性).如果没有给它提供参数,则返回对应当前局部名称空间的字典.
xrange([start,] stop [, step])
和range函数相似,但返回的是一个XRangeType对象.它生成一个迭代器,就是只有用那个数时才临时通过计算提供值,而不是全部储存它们.这样在处理大的数列时能节省大量的内存.
zip(s1 [, s2 [,..]])
用来将几个序列组合成一个包含元组的序列,序列中的每个元素t[i ] = (s1[i ], s2[i ], ..., sn[i ]).结果与最短序列的长度相等.
在Python中定义Main函数
目录
许多编程语言都有一个特殊的函数,当操作系统开始运行程序时会自动执行该函数。这个函数通常被命名为main(),并且依据语言标准具有特定的返回类型和参数。另一方面,Python解释器从文件顶部开始执行脚本,并且没有自动执行的特殊函数。
尽管如此,为程序的执行定义一个起始点有助于理解程序是如何运行的。Python程序员提出了几种方式对此进行实现。
本文结束时,您将了解以下内容:
Python中的基本main()函数
一些Python脚本中,包含一个函数定义和一个条件语句,如下所示:
此代码中,包含一个main()函数,在程序执行时打印Hello World!。此外,还包含一个条件(或if)语句,用于检查__name__的值并将其与字符串"__main__"进行比较。当if语句为True时,Python解释器将执行main()函数。更多关于Python条件语句的信息可以由此获得。
这种代码模式在Python文件中非常常见,它将作为脚本执行并导入另一个模块。为了帮助理解这段代码的执行方式,首先需要了解Python解释器如何根据代码的执行方式设置__name__。
Python中的执行模式
Python解释器执行代码有两种方式:
更多内容可参考如何运行Python脚本。无论采用哪种方式,Python都会定义一个名为__name__的特殊变量,该变量包含一个字符串,其值取决于代码的使用方式。
本文将如下示例文件保存为execution_methods.py,以 探索 代码如何根据上下文改变行为:
在此文件中,定义了三个对print()函数的调用。前两个打印一些介绍性短语。第三个print()会先打印短语The value __name__ is,之后将使用Python内置的repr()函数打印出__name__变量。
在Python中,repr()函数将对象转化为供解释器读取的形式。上述示例通过使用repr()函数来强调__name__的值为字符串。更多关于repr()的内容可参考Python文档。
在本文中,您将随处可见文件(file),模块(module)和脚本(script)这三个字眼。实际上,三者之间并无太大的差别。不过,在强调代码目的时,还是存在细微的差异:
“如何运行Python脚本”一文也讨论了三者的差别。
基于命令行执行
在这类方法中,Python脚本将通过命令行来执行。
执行脚本时,无法与Python解释器正在执行的代码交互。关于如何通过命令行执行代码的详细信息对本文而言并不重要,但您可以通过展开下框阅读更多有关Windows,Linux和macOS之间命令行差异的内容。
命令行环境
不同的操作系统在使用命令行执行代码时存在细微的差异。
在Linux和macOS中,通常使用如下命令:
美元符号($)之前的内容可能有所不同,具体取决于您的用户名和计算机名称。您键入的命令位于$之后。在Linux或macOS上,Python3的可执行文件名为python3,因此可以通过输入python3 script_name.py来运行python脚本。
在Windows上,命令提示符通常如下所示:
根据您的用户名,之前的内容可能会有所不同,您输入的命令位于之后。在Windows上,Python3的可执行文件通常为python。因此可以通过输入python script_name.py来运行python脚本。
无论哪种操作系统,本文的Python脚本的输出结果都是相同的。因此本文以Linux和macOS为例。
使用命令行执行execution_methods.py,如下所示:
在这个示例中,__name__具有值'__main__',其中引号(')表明该值为字符串类型。
请记住,在Python中,使用单引号(')和双引号(")定义的字符串没有区别。更多关于字符串的内容请参考Python的基本数据类型。
如果在脚本中包含"shebang行"并直接执行它(./execution_methods.py),或者使用IPython或Jupyter Notebook的%run,将会获取相同的结果。
您还可以通过向命令行添加-m参数的方法实现以模块的方式执行。通常情况下,推荐如下方式pip: python3 -m pip install package_name。
添加-m参数将会运行包中__main__.py的代码。更多关于__main__.py文件的内容可参考如何将开源Python包发布到PyPI中。
在三种情况中,__name__都具有相同的值:字符串'__main__'。
技术细节:Python文档中具体定义了__name__何时取值为'__main__'。
当通过标准输入,脚本或者交互提示中读取数据时,模块的__name__将取值为'__main__'。(来源)
__name__与__doc__,__package__和其他属性一起存储在模块的全局命名空间。更多关于属性的信息可参考Python数据模型文档,特别是关于模块和包的信息,请参阅Python Import文档。
导入模块或解释器
接下来是Python解释器执行代码的第二种方式:导入。在开发模块或脚本时,可以使用import关键字导入他人已经构建的模块。
在导入过程中,Python执行指定模块中定义的语句(但仅在第一次导入模块时)。要演示导入execution_methods.py文件的结果,需要启动Python解释器,然后导入execution_methods.py文件:
在此代码输出中,Python解释器执行了三次print()函数调用。前两行由于没有变量,在输出方面与在命令行上作为脚本执行时完全相同。但是第三个输出存在差异。
当Python解释器导入代码时,__name__的值与要导入的模块的名称相同。您可以通过第三行的输出了解这一点。__name__的值为'execution_methods',是Python导入的.py文件。
注意如果您在没有退出Python时再次导入模块,将不会有输出。
注意:更多关于导入在Python中如何工作的内容请参考官方文档和Python中的绝对和相对导入。
Main函数的最佳实践
既然您已经了解两种执行方式上的差异,那么掌握一些最佳实践方案还是很有用的。它们将适用于编写作为脚本运行的代码或者在另一个模块导入的代码。
如下是四种实践方式:
将大部分代码放入函数或类中
请记住,Python解释器在导入模块时会执行模块中的所有代码。有时如果想要实现用户可控的代码,会导致一些副作用,例如:
在这种情况下,想要实现用户控制触发此代码的执行,而不是让Python解释器在导入模块时执行代码。
因此,最佳方法是将大部分代码包含在函数或类中。这是因为当Python解释器遇到def或class关键字时,它只存储这些定义供以后使用,并且在用户通知之前不会实际执行。
将如下代码保存在best_practices.py以证明这个想法:
在此代码中,首先从time模块中导入sleep()。
在这个示例中,参数以秒的形式传入sleep()函数中,解释器将暂停一段时间再运行。随后,使用print()函数打印关于代码描述的语句。
之后,定义一个process_data()函数,执行如下五项操作:
在命令行中执行
当你将此文件作为脚本用命令行执行时会发生什么呢?
Python解释器将执行函数定义之外的from time import sleep和print(),之后将创建函数process_data()。然后,脚本将退出而不做任何进一步的操作,因为脚本没有任何执行process_data()的代码。
如下是这段脚本的执行结果:
我们在这里看到的输出是第一个print()的结果。注意,从time导入和定义process_data()函数不产生结果。具体来说,调用定义在process_data()内部的print()不会打印结果。
导入模块或解释器执行
在会话(或其他模块)中导入此文件时,Python解释器将执行相同的步骤。
Python解释器导入文件后,您可以使用已导入模块中定义的任何变量,类或函数。为了证明这一点,我们将使用可交互的Python解释器。启动解释器,然后键入import best_practices:
导入best_practices.py后唯一的输出来自process_data()函数外定义的print()。导入模块或解释器执行与基于命令行执行类似。
使用__name__控制代码的执行
如何实现基于命令行而不使用Python解释器导入文件来执行呢?
您可以使用__name__来决定执行上下文,并且当__name__等于"__main__"时才执行process_data()。在best_practices.py文件中添加如下代码:
这段代码添加了一个条件语句来检验__name__的值。当值为"__main__"时,条件为True。记住当__name__变量的特殊值为"__main__"时意味着Python解释器会执行脚本而不是将其导入。
条件语块内添加了四行代码(第12,13,14和15行):
现在,在命令行中运行best_practices.py,并观察输出的变化:
首先,输出显示了process_data()函数外的print()的调用结果。
之后,data的值被打印。因为当Python解释器将文件作为脚本执行时,变量__name__具有值"__main__",因此条件语句被计算为True。
接下来,脚本将调用process_data()并传入data进行修改。当process_data执行时,将输出一些状态信息。最终,将输出modified_data的值。
现在您可以验证从解释器(或其他模块)导入best_practices.py后发生的事情了。如下示例演示了这种情况:
注意,当前结果与将条件语句添加到文件末尾之前相同。因为此时__name__变量的值为"best_practices",因此条件语句结果为False,Python将不执行process_data()。
创建名为main()的函数来包含要运行的代码
现在,您可以编写作为脚本由从命令行执行并导入且没有副作用的Python代码。接下来,您将学习如何编写代码并使其他程序员能轻松地理解其含义。
许多语言,如C,C++,Java以及其他的一些语言,都会定义一个叫做main()的函数,当编译程序时,操作系统会自动调用该函数。此函数通常被称为入口点(entry point),因为它是程序进入执行的起始位置。
相比之下,Python没有一个特殊的函数作为脚本的入口点。实际上在Python中可以将入口点定义成任何名称。
尽管Python不要求将函数命名为main(),但是最佳的做法是将入口点函数命名为main()。这样方便其他程序员定位程序的起点。
此外,main()函数应该包含Python解释器执行文件时要运行的任何代码。这比将代码放入条件语块中更好,因为用户可以在导入模块时重复使用main()函数。
修改best_practices.py文件如下所示:
在这个示例中,定义了一个main()函数,它包含了上面的条件语句块。之后修改条件语块执行main()。如果您将此代码作为脚本运行或导入,将获得与上一节相同的输出。
在main()中调用其他函数
另一种常见的实现方式是在main()中调用其他函数,而不是直接将代码写入main()。这样做的好处在于可以实现将几个独立运行的子任务整合。
例如,某个脚本有如下功能:
如果在单独的函数中各自实现这些子任务,您(或其他用户)可以很容易地实现代码重用。之后您可以在main()函数中创建默认的工作流。
您可以根据自己的情况选择是否使用此方案。将任务拆分为多个函数会使重用更容易,但会增加他人理解代码的难度。
修改best_practices.py文件如下所示:
在此示例代码中,文件的前10行具有与之前相同的内容。第12行的第二个函数创建并返回一些示例数据,第17行的第三个函数模拟将修改后的数据写入数据库。
第21行定义了main()函数。在此示例中,对main()做出修改,它将调用数据读取,数据处理以及数据写入等功能。
首先,从read_data_from_web()中创建data。将data作为参数传入process_data(),之后将返回modified_data。最后,将modified_data传入write_data_to_database()。
脚本的最后两行是条件语块用于验证__name__,并且如果if语句为True,则执行main()。
在命令行中运行如下所示:
根据执行结果,Python解释器在执行main()函数时,将依次执行read_data_from_web(),process_data()以及write_data_to_database()。当然,您也可以导入best_practices.py文件并重用process_data()作为不同的数据输入源,如下所示:
在此示例中,导入了best_practices并且将其简写为bp。
导入过程会导致Python解释器执行best_practices.py的全部代码,因此输出显示解释文件用途的信息。
然后,从文件中存储数据而不是从Web中读取数据。之后,可以重用best_practices.py文件中的process_data()和write_data_to_database()函数。在此情况下,可以利用代码重写来取代在main()函数中实现全部的代码逻辑。
实践总结
以下是Python中main()函数的四个关键最佳实践:
结论
恭喜!您现在已经了解如何创建Python main()函数了。
本文介绍了如下内容:
现在,您可以开始编写一些非常棒的关于Python main()函数代码啦!
创建一个python模版,包含两个函数一个计算长方形面积一个计算长方形周长?
可以使用如下代码创建一个Python模板,包含两个函数:一个计算长方形面积的函数,一个计算长方形周长的函数。
# 定义一个函数,用于计算长方形的面积
def rectangle_area(length, width):
return length * width
# 定义一个函数,用于计算长方形的周长
def rectangle_perimeter(length, width):
return 2 * (length + width)
在这段代码中,“rectangle_area”函数用于计算长方形的面积,“rectangle_perimeter”函数用于计算长方形的周长。两个函数都接收两个参数:长方形的长和宽。
要使用这两个函数,可以使用如下代码:
# 输入长方形的长和宽
length = float(input('请输入长方形的长:'))
width = float(
python包含数据包用的什么命令
python包含数据包命令如下。
easy_insert包名。
其中python有多种数据包以下为常用数据包,Numpy提供了两种基本的对象:ndarray和ufunc。ndarray是存储单一数据类型的多维数组,而ufunc是能够对数组进行处理的函数。N维数组,一种快速、高效使用内存的多维数组,他提供矢量化数学运算。可以不需要使用循环,就能对整个数组内的数据进行标准数学运算。非常便于传送数据到用低级语言编写(C\C++)的外部库,也便于外部库以Numpy数组形式返回数据。Numpy不提供高级数据分析功能,但可以更加深刻的理解Numpy数组和面向数组的计算,可以进行:数组的算数和逻辑运算。傅立叶变换和用于图形操作的例程。与线性代数有关的操作。NumPy拥有线性代数和随机数生成的内置函数。2,Scipy是一款方便、易于使用、专门为科学和工程设计的Python包,它包括统计、优化、整合、线性代数模块、傅里叶变换、信号和图像处理、常微分方程求解器等。Scipy依赖于Numpy,并提供许多对用户友好的和有效的数值例程,如数值积分和优化。3、PPandas是Python的一个数据分析包,Pandas最初被用作金融数据分析工具而开发出来,因此Pandas为时间序列分析提供了很好的支持。Pandas是为了解决数据分析任务而创建的,Pandas纳入了大量的库和一些标准的数据模型,提供了高效的操作大型数据集所需要的工具。Pandas提供了大量是我们快速便捷的处理数据的函数和方法。Pandas包含了高级数据结构,以及让数据分析变得快速、简单的工具。它建立在Numpy之上,使得Numpy应用变得简单。
文章题目:制作python包的函数 Python如何创建包
转载来源:http://ybzwz.com/article/hhccjh.html