gpt4 book ai didi

python - python中导入模块的函数

转载 作者:行者123 更新时间:2023-12-01 04:48:19 24 4
gpt4 key购买 nike

以下是3个模块,

point.py segment.py 矩形.py

其中 rectangle.py 模块从 segment.py 模块导入函数对象,如上所述,

从段导入 get_size

# point.py
# Representation - start
from operator import sub, mul
from math import sqrt
#Constructor
def make_point(x, y):
return (x, y)

#Selector
def x_coordinate(point):
return point[0]

#Selector
def y_coordinate(point):
return point[1]

#Selector
def distance_between_points(p1, p2):
return sqrt(square(sub(p1[0],p2[0])) + square(sub(p1[1],p2[1])))

#helper for selector
def square(a):
return mul(a, a)

#Representation - end

#Use - start

def get_x_coordinate(point):
return x_coordinate(point)

def get_y_coordinate(point):
return y_coordinate(point)

#Use - end
<小时/>
# segment.py
# Representation - start

from point import distance_between_points, make_point, get_x_coordinate, get_y_coordinate
#Constructor
def make_segment(point1, point2):
return (point1, point2)

#Selector
def start_segment(lineSegment):
return lineSegment[0]

#Selector
def end_segment(lineSegment):
return lineSegment[1]

#Representation - end

#Use -start
def midpoint_segment(lineSegment):
return make_point((get_x_coordinate(start_segment(lineSegment)) + get_x_coordinate(end_segment(lineSegment)))/2, (get_y_coordinate(start_segment(lineSegment)) + get_y_coordinate(end_segment(lineSegment)))/2)

def get_size(lineSegment):
return distance_between_points(start_segment(lineSegment), end_segment(lineSegment))

#Use - end


#Driver code from user
p1 = make_point(1,2)
p2 = make_point(3, 4)
line = make_segment(p1, p2)
midpoint = midpoint_segment(line)
print(midpoint)
<小时/>
# rectangle.py
# Representation - start
from point import make_point, get_x_coordinate, get_y_coordinate
from segment import get_size
from operator import sub, abs
#Constructor
def make_rectangle(p1, p2, p3, p4):
if are_opposite_sides_equal(p1, p2, p3, p4):
return (p1, p2, p3, p4)

#Helper for constructor
def are_opposite_sides_equal(p1, p2, p3, p4):
if (abs(sub(get_x_coordinate(p1), get_x_coordinate(p2))) == abs(sub(get_x_coordinate(p3), get_x_coordinate(p4)))) and (abs(sub(get_y_coordinate(p2), get_y_coordinate(p3))) == abs(sub(get_y_coordinate(p1), get_y_coordinate(p4)))):
return True
else:
return False

#Selector
def get_length_side_segment(quadruple):
return (quadruple[0], quadruple[1])

#Selector
def get_breadth_side_segment(quadruple):
return (quadruple[1], quadruple[2])

#Representation - end


#Use -start
def perimeter(rectangle):
segment1 = get_length_side_segment(rectangle)
segment2 = get_breadth_side_segment(rectangle)
length = get_size(segment1)
breadth = get_size(segment2)
return 2 * (length + breadth)

def area(rectangle):
segment1 = get_length_side_segment(rectangle)
segment2 = get_breadth_side_segment(rectangle)
length = get_size(segment1)
breadth = get_size(segment2)
return (length * breadth)

#Use - end



#Driver code from user
p1 = make_point(1, 1)
p2 = make_point(3, 1)
p3 = make_point(3, 3)
p4 = make_point(1, 3)
rectangle = make_rectangle(p1, p2, p3, p4)
peri = perimeter(rectangle)
area_value = area(rectangle)

print(peri)
print(area_value)
<小时/>

我的问题:

根据rectangle.py的调试,from segment import get_size 行使 segment.py 的驱动程序代码执行并给出输出 (2.0, 3.0)

我正在使用此语句来访问 get_size。我想了解,函数对象的导入如何给出此输出?

最佳答案

在 python 中导入模块基本上意味着您将它们作为脚本执行。这两种情况都会发生,即使您说 import foofrom foo import bar。 Python 需要运行 foo 才能找到函数 bar

在第一种情况(import foo)中,您可以访问完整的命名空间,即您可以使用 foo.getsize()foo.bar( ) 或您的模块提供的任何函数、对象或其他内容。而在后一种情况(from foo import bar)中,您仅将函数 bar 导入到当前命名空间中,即您只能使用 bar() >,但不是 getsize(),例如。

此外,有一种简单的方法可以让 python 执行模块的部分内容,当且仅当该模块作为主模块运行时,而(如果它是导入的)。例如,在 segment.py 中,您可以在脚本末尾编写以下内容:

def main()
#Driver code from user
p1 = make_point(1,2)
p2 = make_point(3, 4)
line = make_segment(p1, p2)
midpoint = midpoint_segment(line)
print(midpoint)

if __name__ == '__main__':
main()

首先,我们定义一个main函数。 main 函数在语句 __name__ == '__main__'True 时被调用。这是什么意思?嗯,__name__是模块本身的固有变量。每次通过 pythonegment.py 运行模块或通过 importsegment 或通过 fromsegmentimportsomething 导入模块时,此变量的设置都不同。

如果您通过python segment.py运行该模块,__name__等于字符串'__main__'。如果导入模块,__name__ 将设置为模块的名称,此处为 'segment'。因此,您可以轻松区分模块是作为主文件运行还是只是由另一个文件导入。

<小时/>

编辑:

详细了解为什么 from foo import bar 需要完全执行 foo!?

如果Python没有执行foo,Python如何知道该模块包含函数bar? Python 是一种解释性语言,因此函数和其他对象实际上仅在运行时从源代码创建。

但是,Python 足够智能,只需执行一次脚本。因此,foo 的其他几个导入(即使在其他脚本中)也不需要重新执行您的模块,因为 foo 的命名空间已经建立。这种行为有一些优点,可以让您在运行时自由修改任何模块/包(也可以来自其他人)。因此,如果您知道自己在做什么,则可以对任何导入模块的函数和对象进行猴子修补。这些修改可能会影响程序的整个范围(包括导入修改后的库的所有其他模块和脚本)。请注意,这通常很危险,但有时却非常有用。

无论如何,THIS也可能是一本有用的读物​​。

/编辑

关于python - python中导入模块的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28938831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com