簡體   English   中英

了解Python中的函數

[英]Understanding Functions in Python

我正在嘗試在Python中使用Turtle模塊使用單獨的函數繪制美國國旗,首先我使用draw_flag計算所有尺寸,然后使用draw_rectangle實際繪制國旗形狀,然后生出draw_stars等,以繪制星星和線條。

但是,我在理解函數的工作方式時遇到了一些麻煩。到目前為止,這是我的代碼:

import turtle
import time
import random

def draw_rectangle(length, height):
    turtle.up()
    x = length
    y = height

    turtle.begin_fill()
    turtle.setpos(x,y)
    turtle.down()
    turtle.forward(418)
    turtle.right(90)
    turtle.forward(220)
    turtle.right(90)
    turtle.forward(418)
    turtle.right(90)
    turtle.forward(220)
    turtle.end_fill()

    turtle.sleep(2)
    turtle.bye

def draw_flag(A):
    height = int(A)
##    length = height*1.9
##    union_height = height*(7/13)
##    union_length = length*(2/5)
##    E = F = union_height/10
##    G = H = union_length/12
##    stripe_width = height/13
##    diameter_star = stripe_width*(4/5)
    length = height*1.9
    return

A = input("Please enter the height of the flag: ")

draw_rectangle(length, height)

我希望它會通過繪制一個矩形而返回,但是它一直說未定義長度,不確定是否將“長度”放在可以識別變量的位置。

我使用的是Python 3,謝謝。

你有兩個問題。 首先,您定義了函數draw_flag但是您從未調用過它。

但是,如果您確實調用了它,它將無法正常工作,因為您的函數draw_flag並沒有執行任何操作。 它只是在內部定義一些變量,然后在結束時將其丟棄。 您應該返回長度和高度,並return length, height ,然后執行length, height = draw_flag(A)並使用這些值調用draw_rectangle (或者您可以執行draw_rectangle(*draw_flag(A)) 。)

length, height = draw_flag(A)
draw_rectangle(length, height)

函數之間無法神奇地通信。 一個函數接受輸入並產生一個返回值。 如果要在其他地方使用該返回值,則需要在要使用該值的位置調用該函數。

您正在調用函數draw_rectangle ,它需要兩個參數-長度和高度。 長度是由draw_flag函數計算的; 但您不返回該值。

您有幾種解決方法。 一種是簡單地使用用戶提供的高度調用draw_flag函數,保存返回值,然后調用draw_rectangle

def draw_flag(A):
    height = int(A)
##    length = height*1.9
##    union_height = height*(7/13)
##    union_length = length*(2/5)
##    E = F = union_height/10
##    G = H = union_length/12
##    stripe_width = height/13
##    diameter_star = stripe_width*(4/5)
    return height*1.9

A = input("Please enter the height of the flag: ")
length = draw_flag(A)
draw_rectangle(length, int(A))

另一種是將input移至draw_flag函數,然后從draw_rectangle函數內部調用draw_flag函數。 如果執行此操作,那么draw_flag函數根本不需要任何參數:

def draw_flag():
    A = input("Please enter the height of the flag: ")
    height = int(A)
##    length = height*1.9
##    union_height = height*(7/13)
##    union_length = length*(2/5)
##    E = F = union_height/10
##    G = H = union_length/12
##    stripe_width = height/13
##    diameter_star = stripe_width*(4/5)
    draw_rectangle(height*1.9, height)

draw_flag()

我認為您還應該閱讀Python書籍中有關可變范圍的部分。 當您期望打印一些變量但遇到奇怪的錯誤時,它將在以后有所幫助-特別是在使用函數的情況下。

嘗試以下

import turtle
import time
import random

def draw_rectangle(length, height):
   turtle.up()
   x = length
   y = height

   turtle.begin_fill()
   turtle.setpos(x,y)
   turtle.down()
   turtle.forward(418)
   turtle.right(90)
   turtle.forward(220)
   turtle.right(90)
   turtle.forward(418)
   turtle.right(90)
   turtle.forward(220)
   turtle.end_fill()

   turtle.sleep(2)
   turtle.bye

 def draw_flag(A):
   height = int(A)
   length = height*1.9
   draw_rectangle(length,height)
   return

A = input("Please enter the height of the flag: ")

draw_flag(A)

好的,為了回答更籠統的問題,python中的函數在調用它們時會接受參數,這些參數是通過引用傳遞的,這意味着您最終在函數內部獲得的數據與調用空間中的數據相同。 這對於可變類型很重要,因為如果在函數內部更改它們,那么它們也會在函數外部更改。 (str,int,float和tuple不可變,dict和list可變)。 當函數返回時,返回令牌之后的值將被傳遞回調用者,因此,如果您說a=input('input? ') ,則函數輸入將帶有一個參數以使提示顯示給用戶,請注意,這是通過引用傳遞,它不是字符串的副本。 它返回用戶生成的輸入,並將其存儲到中。 您可以從一個函數返回多個值,它們會自動轉換為元組; 如果你有

def test():
    return 1,2
a,b = test()

您將得到a = 1和b = 2。 必須定義函數內部使用的名稱。 首先在函數內部查找它們,然后在任何封閉的名稱空間中查找它們,最后在內置函數中查找它們。 無法使用其他函數中定義的變量,因為它們既不在本地名稱空間中,也不在其任何父級中。 要訪問這些名稱的值,必須將它們傳遞給函數,請注意,函數內部使用的名稱不必與函數外部的名稱匹配。 考慮:

def fun1(a):
    return a * 2
def fun2():
    b = 5
    c = fun1(b)
    print c
fun2()

值5以名稱b存儲在內存中,然后通過引用傳遞到fun1中,這次以名稱a進行了兩次加倍並返回(返回也通過引用),然后將返回值存儲在名稱下c,然后打印。

這是一種思考的好方法。 函數是一個“黑匣子”,它以特定順序接收一定數量的值(稱為arguments) ,並對它們執行某些操作以產生其他值。 當我說“黑盒子”,我的意思是,當你使用的功能,你不必去關心它是如何做它做什么,你只要給它一些值,你會得到一個值返回。

讓我們考慮一個非常簡單的函數,該函數只減去給出的兩個數字:第一個減去第二個。 換句話說,我們將創建一個實現規則“參數1-參數2”的函數。 現在,當您為該函數編寫代碼時,需要某種方式告訴計算機何時要使用參數#1和何時要使用參數#2。 在其他一些編程語言中,您必須通過顯式指定要使用的參數的編號(#1或#2)來實現,但是如果可以給這些值命名,則編寫代碼要容易得多。 因此,Python與大多數其他語言一樣,使您可以使用所選名稱來引用函數的參數。 例如,假設您希望參數#1在名稱x ,而參數#2在名稱y 您可以這樣寫來表明:

def subtract(x, y):

然后是構成函數的代碼。 對於減法示例,它將是

def subtract(x, y):
    return x - y

當Python編譯器遇到此問題時,它將代碼轉換為其內部表示形式“計算值#1-值#2並將其發送回我的調用者”。 然后,它打包該代碼塊,並將其保存為“ subtract (因為這就是您告訴您要命名該函數的名稱)。

希望有意義的是,一旦該代碼塊執行完畢,再也不用引用“ argument#1”或“ argument#2”,因為沒有函數就不能有參數! 同樣,一旦函數完成其工作,則給參數xy賦予的標簽將不再具有任何意義。 標簽僅在功能代碼期間存在。 這稱為作用域 :將標簽限制在代碼中有意義的部分。

正如標簽xy可能是局部作用域一樣 ,正如人們可能會說的那樣,它們甚至是什么都不重要。 例如,如果您在代碼中具有subtract定義,則可以任意決定將它們更改為firstsecond ,而您只需要更改該函數內的代碼即可。 您只需將定義更改為

def subtract(first, second):
    return first - second

就是這樣-您的代碼在功能上完全相同。 在程序中任何其他發生xy ,它們都引用了該函數的參數以外的其他東西,因此在重命名參數時不必更改它們。

在您的情況下,您試圖在標簽length所定義的函數之外的地方使用標簽length (即,已存儲為draw_rectangle的函數)。 Python知道您不能引用您不在的函數的參數,因此它希望您已經定義了length來表示其他含義。 但是你沒有。 這就是為什么您會遇到錯誤。 (好吧,還是有一個錯誤)

return將您返回給調用者的所有內容返回。 不會自動使可用的功能外內局部變量(這些地方是有原因的!)。 還要注意, return不帶任何參數將返回特殊值None (所以它等同於return None )。

因此,如果要返回一些值,請使用return height, length函數內部的return height, length以及外部height, length = draw_flag(A)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM