第3章 函式

2021-07-26 21:13:43 字數 3608 閱讀 3222

變數本質上是佔位符

def 函式名(引數1,引數2,…,引數n):

函式體(語句塊)

這裡的引數沒有型別,只有物件才有型別。

python中為物件編寫介面,而不是為資料型別編寫。

result = add(3,4)

add(x,y)被執行之前,在計算機內是不存在的,直到**執行到這裡的時候,在計算機中就建立起來了乙個物件,這個物件與變數result引用關係,並且add(x,y)將運算結果返回。

函式呼叫的引數賦值時可以直接把賦值語句寫在裡面。例如:

add(x=3,y=10)

需要返回多個值時是以元組形式返回。

return還有乙個作用,就是結束正在執行的函式。有點類似迴圈中的break的作用。

def

add(x,y):

""" add x and y."""

return x+y

此時,使用print(add.doc)可以列印出新增的注釋。

x=2

deffuncx

():global x #global說明這裡的x和外面的x是同乙個

x=9

命名空間(namespace)表示識別符號(identifier)的可見範圍。

乙個識別符號可在多個命名空間中定義。

變數和值的關係就有點類似「鍵」和「值」的關係,有乙個內建函式vars()可以幫助研究一下這種對應關係。

我們還要解決函式的引數個數不確定的情況。

def

func

(x, *arg):

如果引數的輸入個數不確定,其他引數全部通過*arg,

以元組的形式由arg收集起來

(arg名稱可以不一樣,但是*一定要有)。

deffoo

(**karg):

foo(a=1,b=2,c=3)

使用**kargs的形式收集值,會得到字典型別的資料,

但是,需要在傳值的時候說明「鍵」和「值」。

bars =(2,3)

add(*bars)

先把要傳的值放到元組中,賦值給乙個變數bars,然後再把值傳到函式內

使用乙個*號,以元組的形式傳值,如果使用**方式,則是以字典的形式傳值。

「函式式程式設計」的代表

遞迴不是函式,而是一種思想,這裡只是說明其思想。然後講述幾個特殊函式。

遞迴(recursion),是指函式的定義中使用函式自身的方法。

一般情況下,遞迴是能夠被迭代或迴圈替代的,而且後者的效率常常比遞迴要高。

這裡的特殊在於跟「函式式程式設計」扯上了關係。

python是支援多種范型的語言。可以進行函式式程式設計,其突出體現在有這麼幾個函式:

filter,map,reduce,lambda,yield

有了它們,最大的好處是程式更簡潔。

1. lambda

lambda函式是乙個只用一行就能解決問題的函式。

>>> lam = lambda x: x+3

>>> n2 =

>>> number=range(10)

>>> for i in number:

...

>>> n2

[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

>>> g = lambda x,y: x+y

>>> g(3,4)

7>>> (lambda x : x**2)(4)

16

lambda使用方法:

* 在lambda後面直接跟變數。

* 變數後面是冒號。

* 冒號後面是表示式,表示式計算結果就是本函式的返回值。

注意:雖然lambda函式可以接收任意多個引數,但是lambda函式不能包含命令,包含的表示式也不能超過乙個,如果需要更複雜的東西,應該定義乙個普通的函式。

lambda並沒有給程式帶來效能上的提公升,但帶來的是**的簡介。

>>> lamb = [lambda x:x, lambda x:x**2, lambda x:x**3, lambda x:x**4]

>>> for i in lamb:

... print(i(3))

...3927

81

map

>>> number = range(10)

>>> map(lambda x:x+3, number)

0x7fed4ed4f390>

>>> list(map(lambda x:x+3, number))

[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

map()是python的乙個內建函式,它的基本樣式是:

map(func,seq)

>>> lst1 = [1,2,3,4,5]

>>> lst2 = [6,7,8,9,0]

>>> lst3 = [7,8,9,2,1]

>>> map(lambda x,y,z: x+y+z, lst1, lst2, lst3)

0x7fed4ed4f4e0>

>>> list(map(lambda x,y,z: x+y+z, lst1, lst2, lst3))

[14, 17, 20, 15, 6]

python3中,reduce從全域性名字空間中移除,使用需匯入functools

>>> 

import functools

>>> functools.reduce(lambda x,y: x+y, [1,2,3,4,5])

15

對比map()的運算,reduce()是橫著逐個元素進行運算((((1+2)+3)+4)+5)。

3. filter

中文含義是過濾器,在python中,它起過濾器的作用。

>>> numbers = range(-5,5)

>>> numbers

range(-5, 5)

>>> filter(lambda x: x>0,numbers)

0x7fed4e596f60>

>>> list(filter(lambda x: x>0,numbers))

[1, 2, 3, 4]

import math

defquadratic_equation

(a,b,c):

delta = b**2-4*a*c

if delta < 0:

return

false

elif delta == 0:

return -(b/2/a)

else:

sqrt_delta = math.sqrt(delta)

x1 = (-b+sqrt_delta)/2/a

x2 = (-b-sqrt_delta)/2/a

return x1,x2

第3章函式

第3章函式 知識梳理 遞迴呼叫函式可以直接或者間接地呼叫自身 遞推 回歸 值傳遞引數值的單向傳遞 引用傳遞引用是一種特殊型別的變數,可以被認為是另乙個變數的別名 帶預設形參值的函式預設形參值必須靠右 例 int add int x,int y 5,int z 6 在相同的作用域內,不允許在同乙個函式...

第3章 函式 1

計算x的n次方 include using namespace std double pow double x,int n return val int main 輸入乙個8位二進位制數,將其轉換為十進位制數輸出。例如 從鍵盤輸入1101 11012 1 23 1 22 0 21 1 20 1310...

第3章 模板

這章主要將一些jinja2的頁面模板,個人覺得這種輪子或者黑盒的使用不必太過仔細,必要的時候再記就行了。3.4 鏈結 這種引入了url rof 函式,其作用是傳入檢視函式的名字,以及一些引數,生產對應的url鏈結 1 例如 url rof index external true http local...