教小朋友學 Python -- 函數與Lambda表達式


背景

到目前為止,我們已經學習了以下四部分內容:

教小朋友學 Python -- 變量、運算符與數據類型教小朋友學 Python -- 條件與循環教小朋友學 Python -- 列表與元組教小朋友學 Python -- 字符串與序列

今天,我們一起來學習第五部分的內容:函數與 Lambda 表達式。

Python 基礎語法

1. 函數

函數的定義

函數以def關鍵詞開頭,後接函數名和圓括號()。函數執行的代碼以冒號起始,並且縮進。return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回None。

def functionname(parameters): "函數_文檔字符串" function_suite return [expression]

函數的調用

Sample01:

def printme(str): print(str) printme("我要調用用戶自定義函數!") # 我要調用用戶自定義函數! printme("再次調用同一函數") # 再次調用同一函數 temp = printme('hello') # hello print(temp) # None

Sample02:

def add(a, b): print(a + b) add(1, 2) # 3 add([1, 2, 3], [4, 5, 6]) # [1, 2, 3, 4, 5, 6]

函數文檔

def MyFirstFunction(name): "函數定義過程中name是形參" # 因為Ta只是一個形式,表示佔據一個參數位置 print('傳遞進來的{0}叫做實參,因為Ta是具體的參數值!'.format(name)) MyFirstFunction('老馬的程序人生') # 傳遞進來的老馬的程序人生叫做實參,因為Ta是具體的參數值! print(MyFirstFunction.__doc__) # 函數定義過程中name是形參 help(MyFirstFunction) # Help on function MyFirstFunction in module __main__: # MyFirstFunction(name) # 函數定義過程中name是形參

關鍵字參數

使用關鍵字參數允許函數調用時參數的順序與聲明時不一致,因為 Python 解釋器能夠用參數名匹配參數值。

def printinfo(name, age): print('Name:{0},Age:{1}'.format(name, age)) printinfo(age=8, name='小馬') # Name:小馬,Age:8

默認參數

調用函數時,默認參數的值如果沒有傳入,則被認為是默認值。

def printinfo(name, age=8): print('Name:{0},Age:{1}'.format(name, age)) printinfo('小馬') # Name:小馬,Age:8 printinfo('小馬', 10) # Name:小馬,Age:10

不定長參數

def functionname([formal_args,] *var_args_tuple ): "函數_文檔字符串" function_suite return [expression] 加了星號(*)的變量名會存放所有未命名的變量參數。

def printinfo(arg1, *vartuple): print(arg1) for var in vartuple: print(var) printinfo(10) # 10 printinfo(70, 60, 50) # 70 # 60 # 50

函數的返回值

Sample01:

def add(a, b): return a + b print(add(1, 2)) # 3 print(add([1, 2, 3], [4, 5, 6])) # [1, 2, 3, 4, 5, 6]

Sample02:

def back(): return [1, '小馬的程序人生', 3.14] print(back()) # [1, '小馬的程序人生', 3.14]

Sample03:

def back(): return 1, '小馬的程序人生', 3.14 print(back()) # (1, '小馬的程序人生', 3.14)

Sample04:

def printme(str): print(str) temp = printme('hello') # hello print(temp) # None print(type(temp)) #

變量作用域

Python 中,程序的變量並不是在哪個位置都可以訪問的,訪問權限決定於這個變量是在哪裡賦值的。定義在函數內部的變量擁有局部作用域,該變量稱為局部變量。定義在函數外部的變量擁有全局作用域,該變量稱為全局變量。局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個程序範圍內訪問。

def discounts(price, rate): final_price = price * rate return final_price old_price = float(input('請輸入原價:')) # 98 rate = float(input('請輸入折扣率:')) # 0.9 new_price = discounts(old_price, rate) print('打折後價格是:%.2f' % new_price) # 88.20 當內部作用域想修改外部作用域的變量時,就要用到global和nonlocal關鍵字了。

num = 1 def fun1(): global num # 需要使用 global 關鍵字聲明 print(num) # 1 num = 123 print(num) # 123 fun1() print(num) # 123

內嵌函數

def outer(): print('outer函數在這被調用') def inner(): print('inner函數在這被調用') inner() # 該函數只能在outer函數內部被調用 outer() # outer函數在這被調用 # inner函數在這被調用

閉包

是函數式編程的一個重要的語法結構,是一種特殊的內嵌函數。如果在一個內部函數里對外層非全局作用域的變量進行引用,那麼內部函數就被認為是閉包。通過閉包可以訪問外層非全局作用域的變量,這個作用域稱為閉包作用域。

def funX(x): def funY(y): return x * y return funY i = funX(8) print(type(i)) # print(i(5)) # 40 如果要修改閉包作用域中的變量則需要 nonlocal 關鍵字

def outer(): num = 10 def inner(): nonlocal num # nonlocal關鍵字聲明 num = 100 print(num) inner() print(num) outer() # 100 # 100

遞歸

如果一個函數在內部調用自身本身,這個函數就是遞歸函數。

Sample01:n! = 1 x 2 x 3 x ... x n

循環:

n = 5 for k in range(1, 5): n = n * k print(n) # 120

遞歸:

def factorial(n): if n == 1: return 1 return n * fact(n - 1) print(factorial(5)) # 120

Samp02:斐波那契數列 f(n)=f(n-1)+f(n-2), f(0)=0 f(1)=1

循環:

i = 0 j = 1 lst = list([i, j]) for k in range(2, 11): k = i + j lst.append(k) i = j j = k print(lst) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

遞歸:

def recur_fibo(n): if n <= 1: return n return recur_fibo(n - 1) + recur_fibo(n - 2) lst = list() for k in range(11): lst.append(recur_fibo(k)) print(lst) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 設置遞歸的層數,Python默認遞歸層數為 100

import sys sys.setrecursionlimit(1000)

Lambda 表達式

匿名函數

所謂匿名,即不再使用def語句定義一個函數。python 使用 lambda 來創建匿名函數。lambda 只是一個表達式,函數體比def簡單很多。lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間裡的參數。

sumary = lambda arg1, arg2: arg1 + arg2 print(sumary(10, 20)) # 30

Lambda 表達式的應用

filter(function, iterable) 過濾序列,過濾掉不符合條件的元素,返回一個迭代器對象,如果要轉換為列表,可以使用 list() 來轉換。

odd = lambda x: x % 2 == 1 templist = filter(odd, [1, 2, 3, 4, 5, 6, 7, 8, 9]) print(list(templist)) # [1, 3, 5, 7, 9] map(function, iterable, …) 根據提供的函數對指定序列做映射。

m1 = map(lambda x: x ** 2, [1, 2, 3, 4, 5]) print(list(m1)) # [1, 4, 9, 16, 25] m2 = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]) print(list(m2)) # [3, 7, 11, 15, 19]

總結

好了,到此為止有關於函數和 Lambda 表達式部分就介紹完了,小朋友們要根據上面的例子多多體會,只有刻意練習才能掌握一門技術,沒有捷徑的,加油啊!See You!

相關圖文

資料分享:數學建模資料分享 -- 圖論部分資料分享:數學建模資料分享 -- 神經網絡部分如何利用 C# 實現 K 最鄰近算法?如何利用 C# 實現 K-D Tree 結構?如何利用 C# + KDTree 實現 K 最鄰近算法?如何利用 C# 對神經網絡模型進行抽象?如何利用 C# 實現神經網絡的感知器模型?如何利用 C# 實現 Delta 學習規則?如何利用 C# 實現 誤差反向傳播 學習規則?如何利用 C# 爬取帶 Token 驗證的網站數據?如何利用 C# 向 Access 數據庫插入大量數據?如何利用 C# + Python 破解貓眼電影的反爬蟲機制?

經過8年多的發展,LSGO軟件技術團隊在「地理信息系統」、「數據統計分析」、「計算機視覺」等領域積累了豐富的研發經驗,也建立了人才培養的完備體系,由於自己準備在「量化交易」領域精進技能,如果大家對這個領域感興趣可以與我聯繫,加入我們的量化學習群一起學習探討。

在這個領域我已做了以下積累:

策略部分:

數字貨幣 One 的投資價值分析數字資產量化中的跨市場套利策略數字資產量化中的同市場套利策略數字資產量化中的網格交易法我們能否效仿李笑來的投資策略?賺錢是剛需,如何正確的交易股票?

數據部分:

如何利用 C# 爬取 One 的交易數據?如何利用 C# 爬取 One 持有者返利數據?如何利用 C# 爬取BigOne交易所的公告?如何利用 C# 爬取Gate.io交易所的公告?如何利用 C# 爬取「財報說」中的股票數據?

自動化交易部分:

封裝BigOne API:身份驗證封裝BigOne API:獲取賬戶資產封裝BigOne API:訂單系統封裝BigOne API:網格交易法封裝BigOne API:代碼的重構進一步完善自動化交易系統 01進一步完善自動化交易系統 02進一步完善自動化交易系統 03進一步完善自動化交易系統 04如何開發「股票數據分析軟件」(上)如何開發「股票數據分析軟件」(中)如何開發「股票數據分析軟件」(下)進一步完善「股票數據分析軟件」 - 01

後臺回覆「搜搜搜」,隨機獲取電子資源!

歡迎關注,請掃描二維碼: