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

教小朋友學 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

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

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

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



分享到:


相關文章: