python--006

来源:https://www.cnblogs.com/zp0923/archive/2019/06/27/11100131.html
-Advertisement-
Play Games

一、函數的作用域 1、作用域在定義函數時就已經固定住了,不會隨著調用位置的改變而改變 二、匿名函數 三、函數式編程 函數的參數傳入,是函數吃進去的食物,而函數return的返回值,是函數拉出來的結果,面向過程的思路就是,把程式的執行當做一串首尾相連的函數,一個函數吃,拉出的東西給另外一個函數吃,另外 ...


一、函數的作用域

1、作用域在定義函數時就已經固定住了,不會隨著調用位置的改變而改變

例一:
name='alex'

def foo():
    name='lhf'
    def bar():
        print(name)
    return bar

func=foo()
func()


例二:
name='alex'

def foo():
    name='lhf'
    def bar():
        name='wupeiqi'
        def tt():
            print(name)
        return tt
    return bar

func=foo()
func()()
foo()()()

 二、匿名函數

#匿名函數
#格式:lambda關鍵字  形參:表達式
fun=lambda  x:x+1
print(fun(3))

 

name='張鵬'
fun=lambda  x:x+'帥鍋'
red=fun(name)
print(red)

 

 

name='name'
funn=lambda x,y:(x.startswith('n'),y+'1')
print(funn('knnnn','dddddd'))

三、函數式編程

函數的參數傳入,是函數吃進去的食物,而函數return的返回值,是函數拉出來的結果,

面向過程的思路就是,把程式的執行當做一串首尾相連的函數,一個函數吃,拉出的東西給另外一個函數吃,另外一個函數吃了再繼續拉給下一個函數吃。。。

 

1、不可變,不用變了保存狀態,不修改變數

2、第一類對象:函數即‘變數’

  函數名可以當參數傳遞

  返回值可以是函數名
例如:
用戶登錄流程:前端接收處理用戶請求-》將用戶信息傳給邏輯層,邏輯詞處理用戶信息-》將用戶信息寫入資料庫
驗證用戶登錄流程:資料庫查詢/處理用戶信息-》交給邏輯層,邏輯層處理用戶信息-》用戶信息交給前端,前端顯示用戶信息

 

 

 

函數式編程: 

(以下部分內容摘自網路)

11 高階函數

滿足倆個特性任意一個即為高階函數

1.函數的傳入參數是一個函數名(把函數當做參數,傳給另外一個函數;)

1 def foo (n):
2     print(n )
3 def bar(name):
4     print('my name is %s'%name)
5 foo(bar('張三'))

 

2.函數的返回值是一個函數名(返回值中包含函數)

 

尾調用

 

map()函數

array=[1,3,4,71,2]

ret=[]
for i in array:
ret.append(i**2)
print(ret)

#如果我們有一萬個列表,那麼你只能把上面的邏輯定義成函數
def map_test(array):
ret=[]
for i in array:
ret.append(i**2)
return ret

print(map_test(array))

#如果我們的需求變了,不是把列表中每個元素都平方,還有加1,減一,那麼可以這樣
def add_num(x):
return x+1
def map_test(func,array):
ret=[]
for i in array:
ret.append(func(i))
return ret

print(map_test(add_num,array))
#可以使用匿名函數
print(map_test(lambda x:x-1,array))


#上面就是map函數的功能,map得到的結果是可迭代對象
print(map(lambda x:x-1,range(5)))

  map函數

 

array=[1,3,4,71,2]

ret=[]
for i in array:
    ret.append(i**2)
print(ret)

#如果我們有一萬個列表,那麼你只能把上面的邏輯定義成函數
def map_test(array):
    ret=[]
    for i in array:
        ret.append(i**2)
    return ret

print(map_test(array))

#如果我們的需求變了,不是把列表中每個元素都平方,還有加1,減一,那麼可以這樣
def add_num(x):
    return x+1
def map_test(func,array):
    ret=[]
    for i in array:
        ret.append(func(i))
    return ret

print(map_test(add_num,array))
#可以使用匿名函數
print(map_test(lambda x:x-1,array))


#上面就是map函數的功能,map得到的結果是可迭代對象
print(map(lambda x:x-1,range(5)))


  

filter()函數
move_people=['zp','sb','sb_ls','alex']
ret=[]
for p in move_people:
    if not p.startswith('sb'):
        ret.append(p)
print(ret)
move_people1=['sgzp','sb','sb_lssb','sbalexsb','sbooppp','sssddhfhfhhdhsb']
"""
開始位置查詢或排除
"""
def sb_(p):
    return p.endswith('sb')
'''
結尾處查找或排除
'''
def _sb(p):
    return p.startswith('sb')
'''
總的調用
'''
def save(area,func):
    ret = []
    for p in area:
        if not func(p):
            ret.append(p)
    return ret
n=save(move_people1,sb_)
print('好人1:',n)
n=save(move_people1,_sb)
print('好人2:',n)
'''終極版
'''
n=save(move_people1,lambda  x: p.startswith('sss'))
print('好人3:',n)
print('好人4',list(filter(lambda  p:not p.endswith('hsb'),move_people1)))#move_people1是一個可迭代對象

 reduce()函數

 1 from functools import reduce
 2 #合併,得一個合併的結果
 3 array_test=[1,2,3,4,5,6,7]
 4 array=range(100)
 5 
 6 #報錯啊,res沒有指定初始值
 7 def reduce_test(func,array):
 8     l=list(array)
 9     for i in l:
10         res=func(res,i)
11     return res
12 
13 # print(reduce_test(lambda x,y:x+y,array))
14 
15 #可以從列表左邊彈出第一個值
16 def reduce_test(func,array):
17     l=list(array)
18     res=l.pop(0)
19     for i in l:
20         res=func(res,i)
21     return res
22 
23 print(reduce_test(lambda x,y:x+y,array))
24 
25 #我們應該支持用戶自己傳入初始值
26 def reduce_test(func,array,init=None):
27     l=list(array)
28     if init is None:
29         res=l.pop(0)
30     else:
31         res=init
32     for i in l:
33         res=func(res,i)
34     return res
35 
36 print(reduce_test(lambda x,y:x+y,array))
37 print(reduce_test(lambda x,y:x+y,array,50))
38 
39 reduce函數

 

 總結

map()
處理序列中的每個元素,得到的結果是一個’列表‘,該‘列表’元素個數及位置與原來一樣
filter()
遍歷序列中的每個元素,得到的每個元素得到的布爾值,如果是true則保留下來
reduce()
處理一個序列,然後將序列合併操作

 1 #當然了,map,filter,reduce,可以處理所有數據類型
 2 
 3 name_dic=[
 4     {'name':'alex','age':1000},
 5     {'name':'wupeiqi','age':10000},
 6     {'name':'yuanhao','age':9000},
 7     {'name':'linhaifeng','age':18},
 8 ]
 9 #利用filter過濾掉千年王八,萬年龜,還有一個九千歲
10 def func(x):
11     age_list=[1000,10000,9000]
12     return x['age'] not in age_list
13 
14 
15 res=filter(func,name_dic)
16 for i in res:
17     print(i)
18 
19 res=filter(lambda x:x['age'] == 18,name_dic)
20 for i in res:
21     print(i)
22 
23 
24 #reduce用來計算1到100的和
25 from functools import reduce
26 print(reduce(lambda x,y:x+y,range(100),100))
27 print(reduce(lambda x,y:x+y,range(1,101)))
28 
29 #用map來處理字元串列表啊,把列表中所有人都變成sb,比方alex_sb
30 name=['alex','wupeiqi','yuanhao']
31 
32 res=map(lambda x:x+'_sb',name)
33 for i in res:
34     print(i)
總結

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 3.3 如何從ubuntu或PC傳遞文件到板子,ubuntu如何上網? 答:以下將分別介紹如何在ubuntu和windows下如何傳遞文件。 ubuntu如何配置上網?ubuntu 上網:打開Oracle VM VirtualBox(虛擬機軟體,筆者以此軟體為例,也可用其他虛擬機軟體)管理器中的設置 ...
  • 編者註:前段時間筆者在團隊內部分享了sentinel原理設計與實現,主要講解了sentinel基礎概念和工作原理,工作原理部分大家聽了基本都瞭解了,但是對於sentinel的幾個概念及其之間的關係還有挺多同學有點模糊的,趁著這幾天比較空,針對sentinel的幾個核心概念,做了一些總結,希望能幫助一 ...
  • [TOC] 一、概述 做客戶端開發已經有好幾個年頭了,今天看到同事發了一篇關於富途牛牛的文章,核心思想就是想說,新版本的富途支持多進程架構了,效率大大提升啦,可以更好的適應多核CPU,提高軟體運行效率。 聽到這個消息,我不僅感嘆,我靠,真的好牛逼。 但是心裡又在默默的想,這個東西到底有什麼好處,多進 ...
  • 知識點講解:python系列——文件操作 ...
  • Python面向對象中的繼承、多態和封裝 一、面向對象的三大特性 1. 封裝:把很多數據封裝到⼀個對象中,把固定功能的代碼封裝到⼀個代碼塊, 函數,對象, 打包成模塊。 這都屬於封裝思想。 2. 繼承:⼦類可以⾃動擁有⽗類中除了私有屬性外的其他所有內容。 說⽩了, ⼉⼦可以隨便⽤爹的東⻄。 3. 多 ...
  • 一、高階函數-排序 1.定義:把一個序列按照給定演算法進行排序 2.key:在排序前對每一個元素進行key函數運算,可以理解成按照key函數定義的邏輯進行排序 3.python2和python3相差巨大 二、返回函數 1.函數也可以返回具體的值;也可以返回一個函數作為結果 2.我們接下來舉例,只舉第二 ...
  • 因為之前剛寫了461號題目,這個題目與那個很相似, 461號題目用異或來算兩個不一樣的部分, 那這個題目需要排除一樣的部分,並找到不一樣的部分。 那麼可以再利用一下異或的特性: 1、相同為0,所以,a ^ a = 0。 2、不同為0,所以,0 ^ b = b。 所以,假設數組裡面的數分別就是 a,a ...
  • 幕布視圖:https://mubu.com/doc/alG8r_3iSw 參考文獻:嵩天的Python課程講義 方式一: 示例 rcParams的屬性 方式二:(推薦使用) 示例: 中文字體種類 幕布視圖:https://mubu.com/doc/alG8r_3iSw 示例 rcParams的屬性 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...