如何在Python中的函数中嵌套函数

如何在Python中的函数中嵌套函数,python,turtle-graphics,Python,Turtle Graphics,我正在编写一些测试代码,因为我刚刚学习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(ang

我正在编写一些测试代码,因为我刚刚学习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)

首先,你的缩进是错误的

第二,在一个正方形中,你不能选择角度(这是一个已经完成的交易)

第三-
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)确保没有其他函数可以调用内部函数时,Python才允许您将函数嵌套在另一个函数中。

要回答标题中的问题(搜索此函数的人会发现这个问题),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提供了一个合适的答案

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

我不知道为什么每个人都在指责你缺乏循环,以至于把它称为一个问题。不清楚为什么要嵌套这些函数,但您肯定可以做到:

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()

您确定不想在另一个函数中调用函数吗?这可能不是代码中的缩进。当您询问嵌套函数时,了解哪些函数缩进了多少可能有点重要。您需要正确缩进代码。如前所述,它没有多大用处。所以。。。你所拥有的代码有什么问题,你如何期望将一个函数嵌套在另一个函数中来帮助你做任何事情?…不,嵌套根本不能做到这一点。你需要了解循环。当不使用迭代器时,通常将其称为
@IzaakvanDongen:我知道这一点,并且自己也使用它,但不想解释额外的复杂性;-)是的,这很公平。别担心,我会把我的评论放在上面,以防有人因为这个原因而顿悟it@IzaakvanDongen当前位置-现在我们每个都有一个!你的代码让它工作了,但我以前的代码是画4个八角形,所以要回到八角形,我该如何编辑代码来画八角形?@Odinosuarus,我已经修改了我的代码,以模仿您的原始代码。我们讨论的是缺少循环,因为提问者反复表示相信嵌套函数会以某种方式防止它们重新键入同样多的内容。嵌套函数没有这种效果;提问者需要的是一个循环。@user2357112,最初的讨论集中在
square()
函数中不需要循环的循环上。但从那时起,讨论已经发生了很大的变化。在
repeat()
函数中需要一个循环似乎仍然悬而未决,因为我不知道OP试图画什么。是吗?某种正方形…八角形…东西?没有线索。