【问题标题】:How to nest a function inside a function in Python如何在 Python 中将函数嵌套在函数中
【发布时间】:2017-08-22 22:43:53
【问题描述】:

我正在编写一些测试代码,因为我刚刚学习 Python,我想知道如何将一个函数嵌套在 Python 中的另一个函数中(如果可能的话)。这是我正在使用的代码。

import turtle

my_turtle = turtle.Turtle()

def square(length, angle):
    my_turtle.forward(length)
    my_turtle.left(angle)
    my_turtle.forward(length)
    my_turtle.left(angle)
    my_turtle.forward(length)
    my_turtle.left(angle)
    my_turtle.forward(length)

def repeat(length, angle):
    square(length, angle)
    my_turtle.left(angle)
    square(length, angle)

repeat(50, 45)

【问题讨论】:

  • 您确定不想在另一个函数中调用一个函数吗?
  • 大概这不是您代码中的缩进。当您询问嵌套函数时,了解哪些函数缩进多少可能很重要。
  • 您需要正确缩进您的代码。正如所写,它不会有太多用处。
  • 那么...您的代码有什么问题,您希望如何将一个函数嵌套在另一个函数中以帮助解决任何问题?
  • ...不,嵌套根本不会这样做。您需要了解循环。

标签: python turtle-graphics


【解决方案1】:

首先 - 你的缩进是错误的。

其次 - 在正方形中,您无法选择角度(这是一种完成的交易)。

第三个 - for 循环是一件好事:

def square(length):
    for i in range(4):
        my_turtle.forward(length)
        my_turtle.left(90)

然后你可以从另一个函数中使用它,比如

def three_squares():
    for i in range(20, 80, 20):   # gives [20, 40, 60]
        square(i)
        my_turtle.left(10)

Python 还允许您将函数传递给函数,例如

def multi(times, inter_angle, action, *args):
    # This will let you choose **what action** to repeat
    for _ in range(times):
        action(*args)
        my_turtle.left(inter_angle)

multi(2, 45, square, 50)   # draws two squares offset at 45 degrees

虽然您可以在函数内部定义函数,正如@cdlane 所展示的那样,但这并不常见;通常只有在 (a) 您将外部函数的值绑定到内部函数或 (b) 如果您想确保没有其他函数可以调用内部函数时。

【讨论】:

  • 在不使用迭代器的时候,通常习惯称它为_
  • @IzaakvanDongen:我知道这一点,并自己使用它,但不想解释那个额外的复杂性 ;-)
  • 是的,这很公平。不用担心 - 如果有人因此而顿悟,我会留下我的评论
  • @IzaakvanDongen:那里 - 现在我们各有一个!
【解决方案2】:

我想知道如何将一个函数嵌套在另一个函数中 蟒蛇

我不确定为什么每个人都在指责你缺少循环,甚至称其为问题。不清楚为什么要嵌套这些函数,但你当然可以这样做:

import turtle

def repeat(length, angle):

    def shape(length, angle):
        my_turtle.forward(length)
        my_turtle.left(angle)
        my_turtle.forward(length)
        my_turtle.left(angle)
        my_turtle.forward(length)
        my_turtle.left(angle)
        my_turtle.forward(length)

    shape(length, angle)
    my_turtle.left(angle)
    shape(length, angle)

my_turtle = turtle.Turtle()

repeat(50, 45)

turtle.done()

【讨论】:

  • 您的代码可以正常工作,但我之前的代码是绘制 4 个八边形,所以要让它回到八边形,我将如何编辑代码以绘制八边形?
  • @Odinosuarus,我已经更正了我的代码以模仿您的原始代码。
  • 我们正在谈论缺少循环,因为提问者反复表达了一种信念,即嵌套函数会以某种方式防止它们不得不重新输入。嵌套函数没有这样的效果;提问者需要的是一个循环。
  • @user2357112,最初的讨论集中在不需要循环的square() 函数中的循环上。但从那时起,讨论发生了很大变化。 repeat() 函数中对循环的需求似乎仍然悬而未决,因为我不知道 OP 试图绘制什么。你呢?
  • 某种方形...八角形...什么的?没有线索。
【解决方案3】:

为了回答标题中的问题(搜索此内容的人会找到什么),Python 将允许您将函数嵌套在另一个函数中:

def first():
    print("in first")
    second()
    def first_a(): #You can only access this function within the "first" function.
        print("in a of first")
    first_a()

def second():
    #This function CANNOT ACCESS first_a() directly; it will return a NameError
    print("in second")


#You CANNOT ACCESS first_a() here outside of the functions either, same error.   
first()


# Prints "in first", "in second", and "in a of first"

如果您知道如何正确使用嵌套函数,它们会非常有用。

在我看来,像@Hugh Bothwell 已经提供的循环会是更好的方法,所以希望你能够弄清楚你想要完成什么。

如果你还想嵌套函数,@cdlane 提供了一个合适的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多