正文
python中特殊函数 python中的特殊符号
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
Python中几个特殊的函数
1、 定义一个特殊python中特殊函数的 __slots__ 变量python中特殊函数,来限制该class实例能添加的属性
2、 内置的 @property(关键字) 装饰器就是负责把一个方法变成属性调用的。@property.setter(这里的property是类里面的属性名)负责把一个setter方法变成属性赋值。
3、 __str__()python中特殊函数,__repr__(),__iter__(),__next__(),__getitem__(),__setitem__(),__delitem__(),__getattr__(),__call__()
python中plt.post是什么函数
2018-05-04 11:11:36
122点赞
qiurisiyu2016
码龄7年
关注
matplotlib
1、plt.plot(x,y)
plt.plot(x,y,format_string,**kwargs)
x轴数据,y轴数据,format_string控制曲线的格式字串
format_string 由颜色字符,风格字符,和标记字符
import matplotlib.pyplot as plt
plt.plot([1,2,3,6],[4,5,8,1],’g-s’)
plt.show()
结果
**kwards:
color 颜色
linestyle 线条样式
marker 标记风格
markerfacecolor 标记颜色
markersize 标记大小 等等
plt.plot([5,4,3,2,1])
plt.show()
结果
plt.plot([20,2,40,6,80]) #缺省x为[0,1,2,3,4,...]
plt.show()
结果
plt.plot()参数设置
Property Value Type
alpha 控制透明度,0为完全透明,1为不透明
animated [True False]
antialiased or aa [True False]
clip_box a matplotlib.transform.Bbox instance
clip_on [True False]
clip_path a Path instance and a Transform instance, a Patch
color or c 颜色设置
contains the hit testing function
dash_capstyle [‘butt’ ‘round’ ‘projecting’]
dash_joinstyle [‘miter’ ‘round’ ‘bevel’]
dashes sequence of on/off ink in points
data 数据(np.array xdata, np.array ydata)
figure 画板对象a matplotlib.figure.Figure instance
label 图示
linestyle or ls 线型风格[‘-’ ‘–’ ‘-.’ ‘:’ ‘steps’ …]
linewidth or lw 宽度float value in points
lod [True False]
marker 数据点的设置[‘+’ ‘,’ ‘.’ ‘1’ ‘2’ ‘3’ ‘4’]
markeredgecolor or mec any matplotlib color
markeredgewidth or mew float value in points
markerfacecolor or mfc any matplotlib color
markersize or ms float
markevery [ None integer (startind, stride) ]
picker used in interactive line selection
pickradius the line pick selection radius
solid_capstyle [‘butt’ ‘round’ ‘projecting’]
solid_joinstyle [‘miter’ ‘round’ ‘bevel’]
transform a matplotlib.transforms.Transform instance
visible [True False]
xdata np.array
ydata np.array
zorder any number
确定x,y值,将其打印出来
x=np.linspace(-1,1,5)
y=2*x+1
plt.plot(x,y)
plt.show()
2、plt.figure()用来画图,自定义画布大小
fig1 = plt.figure(num='fig111111', figsize=(10, 3), dpi=75, facecolor='#FFFFFF', edgecolor='#0000FF')
plt.plot(x,y1) #在变量fig1后进行plt.plot操作,图形将显示在fig1中
fig2 = plt.figure(num='fig222222', figsize=(6, 3), dpi=75, facecolor='#FFFFFF', edgecolor='#FF0000')
plt.plot(x,y2) #在变量fig2后进行plt.plot操作,图形将显示在fig2中
plt.show()
plt.close()
结果
fig1 = plt.figure(num='fig111111', figsize=(10, 3), dpi=75, facecolor='#FFFFFF', edgecolor='#0000FF')
plt.plot(x,y1)
plt.plot(x,y2)
fig2 = plt.figure(num='fig222222', figsize=(6, 3), dpi=75, facecolor='#FFFFFF', edgecolor='#FF0000')
plt.show()
plt.close()
结果:
3、plt.subplot(222)
将figure设置的画布大小分成几个部分,参数‘221’表示2(row)x2(colu),即将画布分成2x2,两行两列的4块区域,1表示选择图形输出的区域在第一块,图形输出区域参数必须在“行x列”范围 ,此处必须在1和2之间选择——如果参数设置为subplot(111),则表示画布整个输出,不分割成小块区域,图形直接输出在整块画布上
plt.subplot(222)
plt.plot(y,xx) #在2x2画布中第二块区域输出图形
plt.show()
plt.subplot(223) #在2x2画布中第三块区域输出图形
plt.plot(y,xx)
plt.subplot(224) # 在在2x2画布中第四块区域输出图形
plt.plot(y,xx)
4、plt.xlim设置x轴或者y轴刻度范围
如
plt.xlim(0,1000) # 设置x轴刻度范围,从0~1000 #lim为极限,范围
plt.ylim(0,20) # 设置y轴刻度的范围,从0~20
5、plt.xticks():设置x轴刻度的表现方式
fig2 = plt.figure(num='fig222222', figsize=(6, 3), dpi=75, facecolor='#FFFFFF', edgecolor='#FF0000')
plt.plot(x,y2)
plt.xticks(np.linspace(0,1000,15,endpoint=True)) # 设置x轴刻度
plt.yticks(np.linspace(0,20,10,endpoint=True))
结果
6、ax2.set_title('xxx')设置标题,画图
#产生[1,2,3,...,9]的序列
x = np.arange(1,10)
y = x
fig = plt.figure()
ax1 = fig.add_subplot(221)
#设置标题
ax1.set_title('Scatter Plot1')
plt.xlabel('M')
plt.ylabel('N')
ax2 = fig.add_subplot(222)
ax2.set_title('Scatter Plot2clf')
#设置X轴标签
plt.xlabel('X') #设置X/Y轴标签是在对应的figure后进行操作才对应到该figure
#设置Y轴标签
plt.ylabel('Y')
#画散点图
ax1.scatter(x,y,c = 'r',marker = 'o') #可以看出画散点图是在对figure进行操作
ax2.scatter(x,y,c = 'b',marker = 'x')
#设置图标
plt.legend('show picture x1 ')
#显示所画的图
plt.show()
结果
7、plt.hist()绘制直方图(可以将高斯函数这些画出来)
绘图都可以调用matplotlib.pyplot库来进行,其中的hist函数可以直接绘制直方图
调用方式:
n, bins, patches = plt.hist(arr, bins=10, normed=0, facecolor='black', edgecolor='black',alpha=1,histtype='bar')
hist的参数非常多,但常用的就这六个,只有第一个是必须的,后面四个可选
arr: 需要计算直方图的一维数组
bins: 直方图的柱数,可选项,默认为10
normed: 是否将得到的直方图向量归一化。默认为0
facecolor: 直方图颜色
edgecolor: 直方图边框颜色
alpha: 透明度
histtype: 直方图类型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’
返回值 :
n: 直方图向量,是否归一化由参数normed设定
bins: 返回各个bin的区间范围
patches: 返回每个bin里面包含的数据,是一个list
from skimage import data
import matplotlib.pyplot as plt
img=data.camera()
plt.figure("hist")
arr=img.flatten()
n, bins, patches = plt.hist(arr, bins=256, normed=1,edgecolor='None',facecolor='red')
plt.show()
例:
mu, sigma = 0, .1
s = np.random.normal(loc=mu, scale=sigma, size=1000)
a,b,c = plt.hist(s, bins=3)
print("a: ",a)
print("b: ",b)
print("c: ",c)
plt.show()
结果:
a: [ 85. 720. 195.] #每个柱子的值
b: [-0.36109509 -0.1357318 0.08963149 0.31499478] #每个柱的区间范围
c: a list of 3 Patch objects #总共多少柱子
8、ax1.scatter(x,y,c = 'r',marker = 'o')
使用注意:确定了figure就一定要确定象限,然后用scatter,或者不确定象限,直接使用plt.scatter
x = np.arange(1,10)
y = x
fig = plt.figure()
a=plt.subplot() #默认为一个象限
# a=fig.add_subplot(222)
a.scatter(x,y,c='r',marker='o')
plt.show()
结果
x = np.arange(1,10)
y = x
plt.scatter(x,y,c='r',marker='o')
plt.show()
结果
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1,10)
y = x
plt.figure()
plt.scatter(x,y,c='r',marker='o')
plt.show()
结果
文章知识点与官方知识档案匹配
Python入门技能树基础语法函数
211242 人正在系统学习中
打开CSDN APP,看更多技术内容
plt的一些函数的使用_班花i的博客_plt函数
plt.函数 Fwuyi的博客 6513 1plt.figure( )函数:创建画布 2plt.plot(x, y, format_string, label="图例名"):绘制点和线, 并控制样式。 其中x是x轴数据,y是y轴数据,xy一般是列表和数组。format_string 是字符串的格式包括线...
继续访问
Python的数据科学函数包(三)——matplotlib(plt)_hxxjxw的博客...
import matplotlib.pyplot as plt plt.imshow(img) plt.show() plt.imshow()有一个cmap参数,即指定颜色映射规则。默认的cmap即颜料板是十色环 哪怕是单通道图,值在0-1之间,用plt.imshow()仍然可以显示彩色图,就是因为颜色映射的关...
继续访问
对Python中plt的画图函数详解
今天小编就为大家分享一篇对Python中plt的画图函数详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
plt.plot()函数详解
plt.plot()函数详细介绍 plt.plot(x, y, format_string, **kwargs) 参数 说明 x X轴数据,列表或数组,可选 y Y轴数据,列表或数组 format_string 控制曲线的格式字符串,可选 **kwargs 第二组或更多(x,y,format_string),可画多条曲线 format_string 由颜色字符、风格字符、标记字符组成 颜色字符 'b' 蓝色 'm' 洋红色 magenta 'g' 绿色 'y.
继续访问
python图像处理基础知识(plt库函数说明)_小草莓爸爸的博客_p...
1.画图(plt库)1.1 plt.figure(num=’’,figsize=(x, y),dpi= ,facecolor=’’,edgecolor=’’)num:表示整个图标的标题 figsize:表示尺寸 facecolor:表示1.2 plt.plot(x,y,format_string,**kwargs)...
继续访问
plt的一些函数使用_neo3301的博客_plt函数
1、plt.plot(x,y) plt.plot(x,y,format_string,**kwargs) x轴数据,y轴数据,format_string控制曲线的格式字串 format_string 由颜色字符,风格字符,和标记字符 import matplotlib.pyplot as plt ...
继续访问
最新发布 python plt 绘图详解(plt.版本)
python plt绘图详解
继续访问
python图像处理基础知识(plt库函数说明)
import matplotlib.pyplot as plt的一些基础用法,包括直方图
继续访问
plt.subplot() 函数解析_Ensoleile。的博客_plt.subplot
plt.subplot()函数用于直接制定划分方式和位置进行绘图。 函数原型 subplot(nrows, ncols, index, **kwargs),一般我们只用到前三个参数,将整个绘图区域分成 nrows 行和 ncols 列,而 index 用于对子图进行编号。
继续访问
...中plt的画图函数_Ethan的博客的博客_python的plt函数
1、plt.legend plt.legend(loc=0)#显示图例的位置,自适应方式 说明: 'best' : 0, (only implemented for axes legends)(自适应方式) 'upper right' : 1, 'upper left' : 2, 'lower left' : 3, 'lower right' : 4, ...
继续访问
plt.函数
1 plt.figure( ) 函数:创建画布 2 plt.plot(x, y, format_string, label="图例名"):绘制点和线, 并控制样式。 其中x是x轴数据,y是y轴数据,xy一般是列表和数组。format_string 是字符串的格式包括线条颜色、点类型、线类型三个部分。向参数label传入图例名,使用plt.legend( )创建图例。 2.1 画一条含x、y的线条 import matplotlib.pyplot as plt x = [1, 2, 3, 4] y
继续访问
Python深度学习入门之plt画图工具基础使用(注释详细,超级简单)
Python自带的plt是深度学习最常用的库之一,在发表文章时必然得有图作为支撑,plt为深度学习必备技能之一。作为深度学习入门,只需要掌握一些基础画图操作即可,其他等要用到的时候看看函数API就行。 1 导入plt库(名字长,有点难记) import matplotlib.pyplot as plt 先随便画一个图,保存一下试试水: plt.figure(figsize=(12,8), dpi=80) plt.plot([1,2,6,4],[4,5,6,9]) plt.savefig('./plt_pn
继续访问
python画图plt函数学习_dlut_yan的博客_python plt
figure()函数可以帮助我们同时处理生成多个图,而subplot()函数则用来实现,在一个大图中,出现多个小的子图。 处理哪个figure,则选择哪个figure,再进行画图。 参考博客 importmatplotlib.pyplotaspltimportnumpyasnp x=np.arange(-1,1,0.1...
继续访问
plt.plot()函数_安之若醇的博客_plt.plot()函数
plt.plot()函数是matplotlib.pyplot用于画图的函数传一个值列表:import numpy as npimport matplotlib.pyplot as pltt=[1,2,3,4,5]y=[3,4,5,6,7]plt.plot(t, y)当x省略的时候,默认[0,1…,N-1]递增可以传元组也可以传...
继续访问
python画图plt函数学习
python中的绘图工具 :matplotli,专门用于画图。 一. 安装与导入 工具包安装:conda install matplotli 导入:import matplotlib.pyplot as plt 画图主要有:列表绘图;多图绘图;数组绘图 二. 列表绘图 1. 基础绘图:plt.plot;plt.show import matplotlib.pyplot as plt x = [1, 2, 3, 4] y = [1, 4, 9, 16] plt.plot(x, y) plt.show()
继续访问
python中plt的含义_对Python中plt的画图函数详解
1、plt.legendplt.legend(loc=0)#显示图例的位置,自适应方式说明:'best' : 0, (only implemented for axes legends)(自适应方式)'upper right' : 1,'upper left' : 2,'lower left' : 3,'lower right' : 4,'right' : 5,'cent...
继续访问
Python中plt绘图包的基本使用方法
其中,前两个输入参数表示x轴和y轴的坐标,plot函数将提供的坐标点连接,即成为要绘制的各式线型。常用的参数中,figsize需要一个元组值,表示空白画布的横纵坐标比;plt.xticks()和plt.yticks()函数用于设置坐标轴的步长和刻度。plt.xlabel()、plt.ylabel()和plt.title()函数分别用于设置x坐标轴、y坐标轴和图标的标题信息。的数据处理时,发现了自己对plt的了解和使用的缺失,因此进行一定的基础用法的学习,方便之后自己的使用,而不需要频繁的查阅资料。...
继续访问
python-plt.xticks与plt.yticks
栗子: plt.figure(figsize=(10, 10)) for i in range(25): plt.subplot(5, 5, i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(train_images[i], cmap=plt.cm.binary) plt.xlabel(class_names[train_labels[i]]) plt.show() 设置x或y轴对应显
继续访问
plt绘图总结
matplotlib绘图
继续访问
Python的数据科学函数包(三)——matplotlib(plt)
继续访问
热门推荐 python plt 画图
使用csv数据文件在百度网盘 import pandas as pd unrate = pd.read_csv('unrate.csv') # pd.to_datetime() 转换成日期格式,即由 1948/1/1 转换为 1948-01-01 unrate['DATE'] = pd.to_datetime(unrate['DATE']) print(unrate.head(12)) ...
继续访问
python数据可视化实现步骤,Python数据可视化图实现过程详解
Python数据可视化图实现过程详解更多python视频教程请到菜鸟教程画分布图代码示例:# encoding=utf-8import matplotlib.pyplot as pltfrom pylab import * # 支持中文mpl.rcParams[‘font.sans-serif’] = [‘SimHei’]‘mention...
继续访问
matplotlib-plt.plot用法
文章目录 英语好的直接参考这个网站 matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs) 将x,y绘制为线条或标记 参数: x, y:数据点的水平/垂直坐标。x值是可选的,默认为range(len(y))。通常,这些参数是 一维数组。它们也可以是标量,也可以是二维的(在这种情况下,列代表单独的数据集)。 这些参数不能作为关键字传递。 fmt:格式字符串,格式字符串只是用于快速设置基本行属性的缩
继续访问
python Plt学习
plt的简单学习
继续访问
plt.show()和plt.imshow()的区别
问题:plt.imshow()无法显示图像 解决方法:添加:plt.show(),即 plt.imshow(image) #image表示待处理的图像 plt.show() 原理:plt.imshow()函数负责对图像进行处理,并显示其格式,而plt.show()则是将plt.imshow()处理后的函数显示出来。 ...
继续访问
python题库刷题网站_python在线刷题网站
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台;社区覆盖了云计算、大数据、人工智能、IoT、云原生、数据库、微服务、安全、开发与运维9大技术领域。","link1":...
继续访问
python xticks_Python Matplotlib.pyplot.yticks()用法及代码示例
Matplotlib是Python中的一个库,它是数字的-NumPy库的数学扩展。 Pyplot是Matplotlib模块的基于状态的接口,该模块提供了MATLAB-like接口。Matplotlib.pyplot.yticks()函数matplotlib库的pyplot模块中的annotate()函数用于获取和设置y轴的当前刻度位置和标签。用法: matplotlib.pyplot.yticks...
继续访问
python的plt函数_plt.plot画图函数
[‘font.sans-serif’]=[‘SimHei’]plt.rcParams[‘axes.unicode_minus’] = False#设置横纵坐标的名称以及对应字体格式font1 = {‘weight’ : ‘normal’,‘size’ : 15,...
继续访问
plt函数
写评论
7
794
122
在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如何调用特殊函数
__call__
在Python中,函数其实是一个对象:
f = abs
f.__name__
'abs'
f(-123)
由于 f 可以被调用,所以,f 被称为可调用对象。
所有的函数都是可调用对象。
一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。
我们把 Person 类变成一个可调用对象:
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __call__(self, friend):
print 'My name is %s...' % self.name
print 'My friend is %s...' % friend
现在可以对 Person 实例直接调用:
p = Person('Bob', 'male')
p('Tim')
My name is Bob...
My friend is Tim...
单看 p('Tim') 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。
任务
改进一下前面定义的斐波那契数列:
class Fib(object):
???
请加一个__call__方法,让调用更简单:
f = Fib()
print f(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
python中特殊函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于python中的特殊符号、python中特殊函数的信息别忘了在本站进行查找喔。