1. 程式人生 > >Python之路-Day08函數語言程式設計與內建函式

Python之路-Day08函數語言程式設計與內建函式

return可以返回任何值

當你在一個函式當中返回一個函式名的時候,其實返回的是這個函式在記憶體當中的地址,如果你用一個變數去接收它,然後以這個變數名執行的話,就會執行你返回的記憶體地址對應的那個函式.

def test1():
    print("in the test1")


def test():
    print("in the test")
    return test1


res = test()
print(res())
輸出結果:
in the test
in the test1
None  這裡返回none的意思是print(res())這個函式沒有返回值,所以返回空

函式呼叫和它在什麼位置沒關係,和函式定義在什麼位置有關係

name = "123"
def test1():
    name = "456"
    def test():
        name = "789" 
        def test2():
            print(name)
        return test2
    return test

test1()()()

匿名函式

匿名函式是用lambada關鍵字去定義的
定義匿名函式時最好一行搞定,切忌複雜冗長.

lambda x:x+1
    #這兩個函式的功能是一樣的
def test(x):
    return x+1

res = test(10)
print(res)

匿名函式的使用方法如下:

func = lambda x:x+1
print(func(10))

總結的小技巧:如果不知道一個匿名函式怎麼寫的話,可以先寫一個函式,然後執行一遍成功後,在把函式改為匿名函式

li = ["123", "456", "789"]
start_swith = lambda name: str(name).startswith("1")
for itsm in li:
    print(start_swith(itsm))

函數語言程式設計

高階函式:滿足兩個特性任意一個即為高階函式
1.函式的傳入引數是一個函式名
2.函式的返回值是一個函式名
函數語言程式設計: 函式式 = 程式語言定義的函式+數字意義的函式
通俗來講,函式式就是用程式語言去實現數學函式.這種函式內物件是永恆不變的,要麼引數是函式,要麼返回值是函式,沒有for和while迴圈,所有的迴圈都由遞迴去實現,無變數的賦值(即不用變數去儲存狀態),五賦值即不改變.

y = x * 2 + 1#這是數學意義的函式
def test(x):
    return x * 2 + 1#這是程式語言定義的函式

先執行括號裡面的,在執行括號外面的方法
把函式當作引數傳給另外一個函式

def foo(n):
    print(n)
def bar(name):
    print("my name is %s"%name)
foo(bar("zhoujielun"))

python中的map函式

map()是 Python 內建的高階函式,它接收一個函式 f 和一個 list,並通過把函式 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。
例如,對於list [1, 2, 3, 4, 5, 6, 7, 8, 9]

def f(x):
    return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])

[1, 4, 9, 10, 25, 36, 49, 64, 81]
注意:map()函式不改變原有的 list,而是返回一個新的 list。
  利用map()函式,可以把一個 list 轉換為另一個 list,只需要傳入轉換函式。
由於list包含的元素可以是任何型別,因此,map() 不僅僅可以處理只包含數值的 list,事實上它可以處理包含任意型別的 list,只要傳入的函式f可以處理這種資料型別。
任務:
假設使用者輸入的英文名字不規範,沒有按照首字母大寫,後續字母小寫的規則,請利用map()函式,把一個list(包含若干不規範的英文名字)變成一個包含規範英文名字的list:
輸入:[‘adam’, ‘LISA’, ‘barT’]
輸出:[‘Adam’, ‘Lisa’, ‘Bart’]
程式碼:

def format_name(s):
     a = s[0].upper()
     b = s[1:].lower()
     return a+b
print(list(map(format_name,['adam','LISA','barT'])))

python中reduce函式

reduce()函式也是Python內建的一個高階函式。reduce()函式接收的引數和 map()類似,一個函式 f,一個list,但行為和 map()不同,reduce()傳入的函式 f 必須接收兩個引數,reduce()對list的每個元素反覆呼叫函式f,並返回最終結果值。

例如,編寫一個f函式,接收x和y,返回x和y的和:

def f(x, y):
return x + y
呼叫 reduce(f, [1, 3, 5, 7, 9])時,reduce函式將做如下計算:

先計算頭兩個元素:f(1, 3),結果為4;
再把結果和第3個元素計算:f(4, 5),結果為9;
再把結果和第4個元素計算:f(9, 7),結果為16;
再把結果和第5個元素計算:f(16, 9),結果為25;
由於沒有更多的元素了,計算結束,返回結果25。
上述計算實際上是對 list 的所有元素求和。雖然Python內建了求和函式sum(),但是,利用reduce()求和也很簡單。

reduce()還可以接收第3個可選引數,作為計算的初始值。如果把初始值設為100,計算:

reduce(f, [1, 3, 5, 7, 9], 100)
結果將變為125,因為第一輪計算是:

計算初始值和第一個元素:f(100, 1),結果為101。

注意:在python3.x後的版本中,reduce函式被劃歸到的functools庫,因此使用reduce函式之前必須先引入functools庫

python中的filter()函式

filter()函式是 Python 內建的另一個有用的高階函式,filter()函式接收一個函式 f 和一個list,這個函式 f 的作用是對每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。

例如,要從一個list [1, 4, 6, 7, 9, 12, 17]中刪除偶數,保留奇數,首先,要編寫一個判斷奇數的函式:

def is_odd(x):
return x % 2 == 1
然後,利用filter()過濾掉偶數:

filter(is_odd, [1, 4, 6, 7, 9, 12, 17])
結果:[1, 7, 9, 17]

利用filter(),可以完成很多有用的功能,例如,刪除 None 或者空字串:

def is_not_empty(s):
return s and len(s.strip()) > 0
filter(is_not_empty, [‘test’, None, ‘’, ‘str’, ’ ', ‘END’])
結果:[‘test’, ‘str’, ‘END’]

注意: s.strip(rm) 刪除 s 字串中開頭、結尾處的 rm 序列的字元。

當rm為空時,預設刪除空白符(包括’\n’, ‘\r’, ‘\t’, ’ '),如下:

a = ’ 123’
a.strip()
結果: ‘123’

a=’\t\t123\r\n’
a.strip()
結果:‘123’

內建函式

abs():取一個數的絕對值
all():把括號內的值全部拿來做bool運算,只有所有為真才為真,空值為false.(none)不算,如果括號裡面只有一個引數,那麼無論如何都會返回true.
any():只要有一個值是true就返回true
bin():把括號裡面的數轉換為二進位制
bool():判斷括號裡面的值是不是空的<“為false,None也是false”,0也是false
bytes():把一個字串轉換成一個位元組.字串後面跟上編碼表,encoding=“utf-8”
chr():把括號裡面的是十進位制數轉換成ascii碼錶裡面的字元
dir():在括號裡面填入一個物件,然後輸出這個物件裡面的所有方法名(檢視作用)
divmod(10,3),輸出結果是(3,1),取商得餘數,(可以用來做網站的分頁功能)
eval():把字串當中的資料結構提取出來生成字典,key和value對應,還可以在括號裡面輸出一個表示式計算其結果.
hash():資料型別包含可hash的就是不可變型別和不可hash的就是可變型別,在括號裡面隨便輸入一個字串,它會把它轉換成hash值.不管你傳入的引數有多長,得到的數就是固定長度,不能根據hash值進行反推,
help():列印方法的幫助或者說用法.
hex():用法類似於bin,十進位制轉十六進位制
cot():十進位制轉八進位制
isstance(1,int),可以判斷第一個引數是不是第二個引數所表示的資料型別.
globals():列印全域性變數
locals():列印區域性變數

max():取最大值

1.max函式處理的是可迭代物件,相當於一個for迴圈取出每個元素進行比較,注意,不同型別之間不能進行比較.
2.每個元素間進行比較,是從每個元素的第一個位置依次比較,如果這一個位置分出大小,後面的都不需要比較了,直接得出這倆元素的大小.

min():取最小值
zip(),每個字母都對應了一個數字,如果字母或者數字多出一個,是不會輸出的.例如:a和1組成一個元組

print(list(zip(('a','b','c'),(1,2,3,4))))
person = {'name' : "zhoujielun","age" :18,"gender":"none"}
print(list(zip(person.keys(),person.values())))
print(list(zip("hello","12345")))

ord()寫一個字元會出現對應的ascll碼錶對應的字元
sorted():排序,排序本質就是在比較大小,不同型別之間不可以比較大小.
import():匯入一個模組,任何一個PY檔案都是一個模組,例如:我們建立了一個py檔案,裡面有一個方法叫test,如果需要在別的PY檔案呼叫這個方法,首先import PY檔名,然後使用檔名.方法名的形式呼叫.