亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python3中的函數(shù)與參數(shù)及空值問(wèn)題

 更新時(shí)間:2022年11月28日 15:33:26   作者:AI_LX  
這篇文章主要介紹了python3-函數(shù)與參數(shù)以及空值,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

畫(huà)星星

程序2-7-7主要使用turtle.forward前進(jìn)操作和turtle.left左轉(zhuǎn)操作在屏幕上畫(huà)星星。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-8.py
import turtle
turtle.color('Green','yellow')
while True:
    turtle.forward(200)
    turtle.left(150)
    print(turtle.pos())
    if abs(turtle.pos()) < 1:
        break
print('按回車(chē)鍵退出')
input()

程序2-7-7.py運(yùn)行結(jié)果如下:

同時(shí),程序2-7-7.py還輸出了如下所示的線(xiàn)轉(zhuǎn)角處(繪制一條直線(xiàn)后轉(zhuǎn)角繪制另一個(gè)直線(xiàn),2條直線(xiàn)的交點(diǎn))的位置信息:
(200.00,0.00)
(26.79,100.00)
(126.79,-73.21)
(126.79,126.79)
(26.79,-46.41)
(200.00,53.59)
(0.00,53.59)
(173.21,-46.41)
(73.21,126.79)
(73.21,-73.21)
(173.21,100.00)
(0.00,-0.00)
按回車(chē)鍵退出
現(xiàn)對(duì)程序2-7-7.py分析如下:
1、該程序使用了以下幾個(gè)函數(shù):
(1)forward函數(shù)前進(jìn)200,用于繪制直線(xiàn)。
(2)left函數(shù)左轉(zhuǎn)150度,用于轉(zhuǎn)角,繪制另一條直線(xiàn)。
(3)turtle.pos()返回當(dāng)前位置坐標(biāo) (x,y) (坐標(biāo)為 Vec2D 矢量類(lèi)對(duì)象)。
(4) abs函數(shù)返回一個(gè)數(shù)的絕對(duì)值。 參數(shù)可以是整數(shù)、浮點(diǎn)數(shù)或任何實(shí)現(xiàn)了 abs() 的對(duì)象,當(dāng)參數(shù)是一個(gè)復(fù)數(shù)時(shí),返回它的模。在該程序中, abs的作用如下:
使用pos返回一個(gè)當(dāng)前坐標(biāo)后,abs求該Vec2D坐標(biāo)到原點(diǎn)的距離(從原點(diǎn)出發(fā)的向量長(zhǎng)度)。矢量空間內(nèi)的所有矢量賦予非零的正長(zhǎng)度或大小,在二維的歐氏幾何空間 R中定義歐氏范數(shù),在該矢量空間中,元素被畫(huà)成一個(gè)從原點(diǎn)出發(fā)的帶有箭頭的有向線(xiàn)段,每一個(gè)矢量的有向線(xiàn)段(向量)的長(zhǎng)度即為該矢量的歐氏范數(shù)。
由于Vec2D是一個(gè)二維矢量類(lèi),用來(lái)作為實(shí)現(xiàn)海龜繪圖的輔助類(lèi),也可以在海龜繪圖程序中使用,它派生自元組,因此矢量也屬于元組。Vec2D主要提供以下運(yùn)算 (a, b 為矢量, k 為數(shù)值):
a + b 矢量加法
a - b 矢量減法
a * b 內(nèi)積
k * a 和 a * k 與標(biāo)量相乘
此外,Vec2D類(lèi)還實(shí)現(xiàn)了 abs操作,如下面代碼片斷所示(摘自Vec2D類(lèi)源代碼)。

class Vec2D(tuple):
  ...
    def __abs__(self):
        return (self[0]**2 + self[1]**2)**0.5

2、程序2-7-7.py的執(zhí)行過(guò)程如下:
(1)通過(guò)turtle.color(‘Green’,‘yellow’)函數(shù)設(shè)置顏色為綠色畫(huà)筆、黃色填充。
(2)創(chuàng)建循環(huán)體,循環(huán)體內(nèi)容為:
首先,將海龜定位于原點(diǎn)。
然后,turtle.forward(200)前進(jìn)200步,turtle.left(150)左轉(zhuǎn)150度,print(turtle.pos())打印出當(dāng)前海龜位置。
最后,通過(guò)abs(turtle.pos())判斷當(dāng)前向量(從原點(diǎn)到當(dāng)前海龜位置的向量)的長(zhǎng)度,如果長(zhǎng)度<1,說(shuō)明當(dāng)前位置已經(jīng)回到了起點(diǎn)(原點(diǎn)),就退出循環(huán)。如果長(zhǎng)度>=1,則繼續(xù)循環(huán)。

空值None

Python None 對(duì)象,表示缺乏值、空值。
下面代碼定義了x和y共2個(gè)變量,其中,x初始化值為0,而y設(shè)為了空值,x雖然為0,但仍然屬于有值狀態(tài),而y屬于空值狀態(tài)。

>>>x=0
>>>y=None
>>>x==None
False
>>>y==None
True

函數(shù)與Lambda

一、函數(shù)定義

Python定義函數(shù)使用關(guān)鍵字 def,后跟函數(shù)名與括號(hào)內(nèi)的形參列表。函數(shù)語(yǔ)句從下一行開(kāi)始,并且必須縮進(jìn)。
程序2-7-10-1.py定義了函數(shù)getSum,完成參數(shù)求和后返回 。
#!/usr/bin/env python3

# -*- coding: utf-8 -*-
#2-7-10-1.py
def getSum(x1,x2,x3,x4):
    y=x1+x2+x3+x4
    return y

print(getSum(11,22,33,44))
程序2-7-10-1.py執(zhí)行結(jié)果如下:

110

程序2-7-10-1.py執(zhí)行過(guò)程如下:
1、定義函數(shù)getSum,使用def關(guān)鍵字+函數(shù)名getSum的方式進(jìn)行定義,參數(shù)為括號(hào)內(nèi)的4個(gè)變量x1、x2、x3、x4。
函數(shù)的執(zhí)行體為函數(shù)定義的下一行,共2行。
(1)第1行y=x1+x2+x3+x4,將4個(gè)參數(shù)之和賦值給變量y。其中,y是函數(shù)內(nèi)局部變量,而x1、x2、x3、x4為函數(shù)局部變量。
(2)第2行return y,將y返回,return語(yǔ)句功能是是函數(shù)返回值,沒(méi)有 return 語(yǔ)句的函數(shù)也返回值,只不過(guò)這個(gè)值是 None。
2、調(diào)用getSum函數(shù),并打印函數(shù)返回結(jié)果。

二、引用變量查找

函數(shù)在執(zhí)行時(shí)使用函數(shù)局部變量符號(hào)表,所有函數(shù)變量賦值都存在局部符號(hào)表中;引用變量時(shí),其查找順序?yàn)椋菏紫?,在局部符?hào)表里查找變量,然后,是外層函數(shù)局部符號(hào)表,接著是全局符號(hào)表,最后是內(nèi)置名稱(chēng)符號(hào)表。因此,雖然可以引用全局變量和外層函數(shù)的變量,但是最好不要在函數(shù)內(nèi)直接賦值(除非是 global 語(yǔ)句定義的全局變量,或 nonlocal 語(yǔ)句定義的外層函數(shù)變量)。
程序2-7-10-2.py定義了函數(shù)getSum,完成參數(shù)求和后返回,與2-7-10-1.py基本相同,不同之處在于,在getSum函數(shù)體內(nèi)出現(xiàn)了變量y,而在getSum函數(shù)體外也出現(xiàn)了變量y。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-10-2.py
y=9
def getSum(x1,x2,x3,x4):
    y=x1+x2+x3+x4
    return y

print(y)
print(getSum(11,22,33,44))
print(y)

程序2-7-10-2.py的執(zhí)行結(jié)果為:

9
110
9

觀察程序2-7-10-2.py的執(zhí)行結(jié)果,可發(fā)現(xiàn),雖然,在getSum函數(shù)定義之前(之外),已經(jīng)定義了變量y=9,隨后又在getSum函數(shù)體內(nèi)將變量y的值改為了4個(gè)參數(shù)之和110,那么在執(zhí)行完getSum函數(shù)后,y的值會(huì)變?yōu)?10,但在此處卻仍沒(méi)有變化,還是9。這是什么原因呢?答案是:getSum函數(shù)體內(nèi)的y存在于函數(shù)局部變量符號(hào)表內(nèi),而getSum函數(shù)定義之外的y屬于全局變量,2個(gè)y不屬于同一變量,因此,對(duì)getSum函數(shù)體內(nèi)的y值進(jìn)行的修改并不影響函數(shù)體之外定義的y的值。
那么,如果一定要在getSum函數(shù)體內(nèi)對(duì)函數(shù)體外定義的y進(jìn)行修改,可按程序2-7-10-3.py所示的方法進(jìn)行。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-10-3.py
y=9
def getSum(x1,x2,x3,x4):
     global y    
     y=x1+x2+x3+x4
     return y
print(y)
print(getSum(11,22,33,44))
print(y)

程序2-7-10-3.py的執(zhí)行結(jié)果為:

9
110
110

程序2-7-10-3.py與程序2-7-10-2.py基本一樣,只是在函數(shù)體內(nèi)通過(guò)global y,將y聲明為全局變量,表示在函數(shù)體內(nèi)使用的y就是全局變量y,并非函數(shù)體局部變量。
除了global還有一個(gè)語(yǔ)句nonlocal。nonlocal 語(yǔ)句會(huì)使得所列出的名稱(chēng)指向之前在最近的包含作用域中綁定的除全局變量以外的變量。 這種功能很重要,因?yàn)榻壎ǖ哪J(rèn)行為是先搜索局部命名空間。 這個(gè)語(yǔ)句允許被封裝的代碼重新綁定局部作用域以外且非全局(模塊)作用域當(dāng)中的變量。
與 global 語(yǔ)句中列出的名稱(chēng)不同,nonlocal 語(yǔ)句中列出的名稱(chēng)必須指向之前存在于包含作用域之中的綁定。程序2-7-10-4.py演示了nonlocal的用法。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-10-4.py
def printY():
     y=9
     print(y)
     def getSum(x1,x2,x3,x4):
          nonlocal y    
          y=x1+x2+x3+x4
     getSum(100,2,3,4)
     print(y)
     
printY()

程序2-7-10-4.py的執(zhí)行結(jié)果為:

9
109

對(duì)程序2-7-10-4.py分析如下:
1、該程序有2個(gè)函數(shù)體,這2個(gè)函數(shù)體是嵌套關(guān)系,即:getSum嵌套在printY內(nèi)部。
2、對(duì)于getSum函數(shù)來(lái)說(shuō),在printY函數(shù)內(nèi)部定義的y屬于局部作用域以外且非全局(模塊)作用域當(dāng)中的變量,且屬于最近的包含作用域(getSum包含在printY作用域內(nèi))中,getSum函數(shù)想訪(fǎng)問(wèn)printY函數(shù)的變量,需要聲明該變量為nonlocal變量。
3、在getSum函數(shù)體內(nèi)對(duì)printY函數(shù)體定義的y值的修改是有效的。因此,程序執(zhí)行后,第一次打印出y的值為初始值9,第二次修改后再打印出y的值為修改后的值109。

三、傳值調(diào)用函數(shù)

在調(diào)用函數(shù)時(shí)Python會(huì)將實(shí)際參數(shù)(實(shí)參)引入到被調(diào)用函數(shù)的局部符號(hào)表中,因此,函數(shù)參數(shù)都是使用按值調(diào)用來(lái)傳遞的,所謂按值傳遞,會(huì)將值進(jìn)行復(fù)制生成函數(shù)的局部變量。當(dāng)一個(gè)函數(shù)調(diào)用另外一個(gè)函數(shù)時(shí),會(huì)為該調(diào)用創(chuàng)建一個(gè)新的局部符號(hào)表。
但是,有一點(diǎn)要特別注意,Python中的對(duì)象分為可變對(duì)象與不可變對(duì)象,比如整數(shù)288屬于不可變對(duì)象,而列表[288,11]、[288,]就屬于可變對(duì)象。具體來(lái)說(shuō),strings、tuples和numbers是不可變對(duì)象,而list、dict等則是可變對(duì)象。
對(duì)于不可變對(duì)象的按值傳遞就是直接復(fù)制其值,而可變對(duì)象的按值傳遞是復(fù)制其引用,因?yàn)榭勺儗?duì)象的值在Python內(nèi)部實(shí)質(zhì)表現(xiàn)為一個(gè)指向該對(duì)象的引用(內(nèi)存地址,可理解為指針),順著這個(gè)引用才可在內(nèi)存中找到該對(duì)象真正的值。程序2-7-10-5.py演示了參數(shù)傳遞的用法。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-10-5.py

def swapNum(x,y):
    temp=x
    x=y
    y=temp
def swapNums(nums):
    temp=nums[0]
    nums[0]=nums[1]
    nums[1]=temp

x=11
y=22

swapNum(x,y)
print(x,y)
n=[11,22]
swapNums(n)
print(n)

程序2-7-10-5.py的執(zhí)行結(jié)果如下:

11 22
[22, 11]

對(duì)程序2-7-10-5.py分析如下:
1、該程序定義了2個(gè)函數(shù)swapNum和swapNums。
(1)swapNum函數(shù)想完成的功能是將傳入的2個(gè)參數(shù)值進(jìn)行修改,完成互換,要能完成對(duì)調(diào)用swapNum的函數(shù)實(shí)際參數(shù)進(jìn)行修改,而不是對(duì)函數(shù)局部變量進(jìn)行修改。
(2)swapNums函數(shù)想完成的功能是對(duì)傳入的列表進(jìn)行修改,將其第0個(gè)元素和第1個(gè)元素進(jìn)行互換,并保證修改效果影響到調(diào)用swapNums函數(shù)的變量。
但是,雖然都是傳值傳遞參數(shù),但是swapNum函數(shù)的參數(shù)屬于不可變變量,swapNum函數(shù)體會(huì)復(fù)制它的2個(gè)參數(shù),形成屬于自己的函數(shù)內(nèi)部局部參數(shù),實(shí)質(zhì)已經(jīng)與調(diào)用swapNum的函數(shù)參數(shù)無(wú)關(guān),修改是無(wú)效的;而swapNums函數(shù)的參數(shù)是列表,屬于可變變量,swapNums函數(shù)也會(huì)復(fù)制參數(shù)的值,但這個(gè)參數(shù)值是列表的地址(引用),那么傳遞到swapNums函數(shù)體內(nèi)部的參數(shù)就是該列表的引用,對(duì)該引用的修改直接影響到調(diào)用swapNums的函數(shù),修改是有效的。
2、該程序定義整型變量x和y后,將其作為參數(shù)傳入swapNum,想完成x和y的互換, 這一操作是失敗的,無(wú)法成功,然后該程序又定義了列表n,將其作為 參數(shù)傳入swapNums,想完成第0個(gè)元素與第1個(gè)元素的互換,此操作是成功的。觀察程序2-7-10-5.py的執(zhí)行結(jié)果可驗(yàn)證這一結(jié)論。

四、函數(shù)對(duì)象

函數(shù)定義在當(dāng)前符號(hào)表中把函數(shù)名與函數(shù)對(duì)象關(guān)聯(lián)在一起。解釋器把函數(shù)名指向的對(duì)象作為用戶(hù)自定義函數(shù)。還可以使用其他名稱(chēng)指向同一個(gè)函數(shù)對(duì)象,并訪(fǎng)問(wèn)訪(fǎng)該函數(shù)。程序2-7-10-6.py演示了函數(shù)對(duì)象的用法。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-10-6.py

def swapNums(nums):
    temp=nums[0]
    nums[0]=nums[1]
    nums[1]=temp

swap=swapNums
n=[11,22]
print(n)
swap(n)
print(n)

程序2-7-10-6.py的執(zhí)行結(jié)果如下:

[11, 22]
[22, 11]

程序2-7-10-6.py首先定義了swapNums函數(shù)及其函數(shù)體內(nèi)容;然后,定義一個(gè)變量swap,將swapNums函數(shù)賦值給變量swap(Python中的變量屬于動(dòng)態(tài)類(lèi)型,對(duì)象的類(lèi)型是可改變的),這樣,swap成為了一個(gè)函數(shù)對(duì)象;最后,程序直接使用swap作為函數(shù)名調(diào)用swapNums函數(shù)。

五、函數(shù)文檔

函數(shù)內(nèi)的第一條語(yǔ)句可以是字符串,其意義在于:該字符串是DocString(文檔字符串),利用文檔字符串可以自動(dòng)生成在線(xiàn)文檔或打印版文檔,還可以讓開(kāi)發(fā)者在瀏覽代碼時(shí)直接查閱文檔,Python 開(kāi)發(fā)者最好可以養(yǎng)成在函數(shù)語(yǔ)句下一行中加入文檔字符串的好習(xí)慣。程序2-7-10-7.py演示了函數(shù)文檔的用法。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-10-7.py
def swapNums(nums):
    """
    swapNums函數(shù)接受一個(gè)列表對(duì)象,
    完成將列表對(duì)象的2個(gè)元素互換位置的功能。
    """    
    temp=nums[0]
    nums[0]=nums[1]
    nums[1]=temp

print(swapNums.__doc__)
print("---------------------")
help(swapNums)

程序2-7-10-7.py的輸出結(jié)果如下:
swapNums函數(shù)接受一個(gè)列表對(duì)象,
完成將列表對(duì)象的2個(gè)元素互換位置的功能。

Help on function swapNums in module main:

swapNums(nums)
swapNums函數(shù)接受一個(gè)列表對(duì)象,
完成將列表對(duì)象的2個(gè)元素互換位置的功能。

分析程序2-7-10-7.py,該程序的執(zhí)行過(guò)程如下:
1、定義swapNums函數(shù),函數(shù)功能為:互換列表的2個(gè)元素。
(1)在函數(shù)體的第1行(即:def定義語(yǔ)句的下一行)開(kāi)始用三引號(hào)標(biāo)注了一段字符串,該字符串(是DocString(文檔字符串),用于說(shuō)明函數(shù)功能和用法等事項(xiàng)。在Python中單引號(hào)和雙引號(hào)都可以用來(lái)表示一個(gè)字符串,而三單引號(hào)和三雙引號(hào)包圍的字符串可保持原來(lái)的格式。
(2)函數(shù)體的第5行開(kāi)始,是函數(shù)體的代碼段,完成函數(shù)體的功能。
2、通過(guò)函數(shù)對(duì)象.doc(注意前后都是雙_)屬性,提取將DocString特性,該程序通過(guò)print(swapNums.doc)將函數(shù)swapNums的文檔字符串打印在屏幕上。
3、通過(guò)help()調(diào)用提取DocString屬性并打印在屏幕上。該程序通過(guò)help(swapNums)將函數(shù)swapNums的文檔字符串打印在屏幕上。
2.2.2 Lambda

myfun1= lambda a,b:math.sqrt(pow(a,2)+pow(b,2))
myfun2=lambda x:1 if (x%2==0) else 0
print(myfun1(12,19))
print(myfun2(193))

旋轉(zhuǎn)角度

程序2-7-11.py演示了以30度為步長(zhǎng)逐漸增大角度進(jìn)行旋轉(zhuǎn),從0度開(kāi)始直到360度為止。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-11.py
import turtle
turtle.color('Green','yellow')
lineLine=50
for i in range(0,361,30):
    turtle.home()
    turtle.left(i)  
    turtle.forward(lineLine+i)  
    turtle.write(f"{i}>[{turtle.position()[0]},\n{turtle.position()[1]}]") 
turtle.home()
turtle.color('Black','red')
turtle.write(f"[{turtle.position()[0]},\n{turtle.position()[1]}]") 

print('按回車(chē)鍵退出')
input()

程序2-7-11.py執(zhí)行結(jié)果如下:

程序2-7-11.py的執(zhí)行過(guò)程如下:
1、定義顏色為:畫(huà)筆綠色,填充黃色,設(shè)定直線(xiàn)初始長(zhǎng)度lineLine為50。
2、for循環(huán)繪制直線(xiàn),i為旋轉(zhuǎn)角度,從0度開(kāi)始以30度為步長(zhǎng)遞增,直到360度結(jié)束,每遞增一次就是一個(gè)循環(huán)。
(1)turtle.home()將位置和初始方向進(jìn)行初始化,即:位置為(0.,0.),方向?yàn)?度。
(2)左轉(zhuǎn)i度。
(3)forward繪制直線(xiàn),每循環(huán)1次,直線(xiàn)長(zhǎng)度遞增30.
(4)在直線(xiàn)的一端(除開(kāi)原點(diǎn)的另一個(gè)端),使用write繪制文本,文本內(nèi)容為該直線(xiàn)端的位置。
3、循環(huán)結(jié)束,以黑色畫(huà)筆(紅色填充)繪制原點(diǎn),并繪制原點(diǎn)坐標(biāo)。

繪制函數(shù)圖形

程序2-7-12.py演示了繪制一元二次函數(shù)的圖像。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-7-12.py
import turtle

def getFunY(a,b,c,x):
    y=a*x*x+b*x+c
    return y

x=-10
a=0.6
b=0.2
c=0.8
while x<=10:
    turtle.up()
    turtle.goto(x,getFunY(a,b,c,x))
    turtle.dot(2)
    x+=0.1
input()

程序2-7-12.py的執(zhí)行結(jié)果如下:

程序2-7-12.py的執(zhí)行過(guò)程如下:
1、導(dǎo)入turtle庫(kù),為繪圖做準(zhǔn)備。
2、定義getFunY函數(shù),接收參數(shù)a、b、c以及x,函數(shù)體的代碼完成根據(jù)一元二次函數(shù)值的計(jì)算。
3、定義a、b、c、x值,其中x值初始化為-10
4、while循環(huán),循環(huán)條件是x<=10。
(1)up函數(shù)抬起畫(huà)筆
(2)goto函數(shù)移動(dòng)到(x,y)處,其中x每次循環(huán)遞增0.1,y為根據(jù)a、b、c、x值計(jì)算的getFunY函數(shù)的返回值。
(3)dot函數(shù)落筆畫(huà)點(diǎn)。
x遞增0.1,整個(gè)循環(huán)x的值從-10增加到10。

到此這篇關(guān)于python3-函數(shù)與參數(shù)以及空值的文章就介紹到這了,更多相關(guān)python3函數(shù)與參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論