函數(一)

来源:https://www.cnblogs.com/chengweizhong/archive/2018/02/14/8441426.html
-Advertisement-
Play Games

定義函數: 過程:就是沒有返回值的函數 函數的參數: 形參:只有在被調用時才分配記憶體單元,在調用結束時,即刻釋放所分配的記憶體單元。因此,形參只在函數內部有效。 實參:可以是常量、變數、表達式、函數等,在進行函數調用時,都必須有確定的值,以便把這些值傳給形參。 全局變數和局部變數: 在子程式中定義的變 ...


定義函數:

 

#語法
def 函數名(參數1,參數2,參數3,...):
    '''註釋'''
    函數體
    return 返回的值

#函數名要能反映其意義

過程:就是沒有返回值的函數

 

 

函數的參數:

  • 形參:只有在被調用時才分配記憶體單元,在調用結束時,即刻釋放所分配的記憶體單元。因此,形參只在函數內部有效。
  • 實參:可以是常量、變數、表達式、函數等,在進行函數調用時,都必須有確定的值,以便把這些值傳給形參。 

 

 

def test(x,y,z): #x=1,y=2,z=3
    print(x)
    print(y)
    print(z)

#位置參數,必須一一對應,缺一不行多一也不行
test(1,2,3)

#關鍵字參數,無須一一對應,缺一不行多一也不行
test(y=1,x=2,z=3)

#輸出結果:
1
2
3
2
1
3

 

 

#參數組:**字典 *列表
def test(x,*args,**kwargs):
    print(x)
    print(args,args[-1])
    print(kwargs,kwargs.get('s'))
test(1,*[1,2,3],**{'s':1})

#輸出結果:
1
(1, 2, 3) 3
{'s': 1} 1

 

全局變數和局部變數:

在子程式中定義的變數稱為局部變數,在程式的一開始定義的變數稱為全局變數。

全局變數作用域是整個程式,局部變數作用域是定義該變數的子程式。 當全局變數與局部變數同名時:在定義局部變數的子程式內,局部變數起作用;在其它地方全局變數起作用。  
name='reese'
def change_name():
    print('我的名字',name)
change_name()


def change_name():
    name=''
    print('我的名字',name)
change_name()
print(name)


def change_name():
    global name
    name=''
    print('我的名字',name)
change_name()
print(name)

#輸出結果:
我的名字 reese
我的名字 帥
reese
我的名字 帥
帥

 # 如果函數內部無global關鍵字,優先讀取局部變數,能讀取全局變數,無法對全局變數重新賦值;

    但對於可變類型(除數字、字元串、元祖,其他都可變),可對內部元素進行操作。

# 如果函數內部有global關鍵字,變數本質上是全局變數,可讀取可賦值。

# 一般全局變數名用大寫,局部變數名用小寫。

 

 

遞歸 

#遞歸調用

def calc(n):
    print(n)
    if int(n / 2) == 0:
        return n
    s = calc(int(n / 2))
    return s


calc(10)

#輸出:
10
5
2
1

 

遞歸特性:

1. 必須有一個明確的結束條件

2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少

3. 遞歸效率不高,遞歸層次過多會導致棧溢出(在電腦中,函數調用是通過棧(stack)這種數據結構實現的,

每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出)

 

#問路

import time

person_list=['林克','士官長','奎爺','但丁']
def ask_way(person_list):
    print('-'*60)
    if len(person_list) == 0:
        return '沒人知道'
    person=person_list.pop(0)
    if person == '但丁':
        return '%s說:我知道,路在腳下,走多了,也就知道了' %person
    print('hi 美男[%s],敢問路在何方' %person)
    print('%s回答道:我不知道,但念你慧眼識豬,你等著,我幫你問問%s...' %(person,person_list))
    time.sleep(3)
    res=ask_way(person_list)
    # print('%s問的結果是: %res' %(person,res))
    return res



res=ask_way(person_list)

print(res)

 

函數作用域

 

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

name = "reese"
def s():
    name = "neo"
    def n():
        print(name)
    return n

func = s()
func()

#輸出:
neo

 

 

匿名函數:

不需要顯示的指定函數

def calc(x):
    return x + 10


res = calc(10)
print(res)

#輸出:
20


#用匿名函數:
func = lambda x: x + 10
print(func(10))

#輸出:
20

 

func = lambda x, y, z: x + y + z
print(func(1, 2, 3))

#輸出:
6

 

 

 

map函數:

 

num = [3, 4, 5, 6, 11, 7, 54]
#lambda x:x+1
def add_one(x):   #列表元素自增一
    return x + 1

#lambda x:x-1
def minus_one(x):  #列表元素自減一
    return x - 1


def map_test(func, array):
    ret = []
    for i in num:
        res = func(i)
        ret.append(res)
    return ret
print(map_test(add_one,num))
# print(map_test(lambda x:x+1,num)) #可用匿名函數
print(map_test(minus_one,num))
# print(map_test(lambda x:x-1,num))


#終極版本
def map_test(func,array):
    ret = []
    for i in array:
        res = func(i)
        ret.append(res)
    return ret

print(map_test(lambda x:x+1,num))

#輸出結果:
[4, 5, 6, 7, 12, 8, 55]
[2, 3, 4, 5, 10, 6, 53]
[4, 5, 6, 7, 12, 8, 55]

 

 map:

處理序列中的每個元素,得到的結果是一個列表,該列表元素個數及位置與原來一樣

num = [3, 4, 5, 6, 11, 7, 54]
res=map(lambda x:x+1,num)
print('內置函數map,處理結果',list(res))

print(list(map(minus_one,num)))

msg = "reese"
print(list(map(lambda x:x.upper(),msg)))

#輸出結果:
內置函數map,處理結果 [4, 5, 6, 7, 12, 8, 55]
[2, 3, 4, 5, 10, 6, 53]
['R', 'E', 'E', 'S', 'E']

 

filter函數:

便利序列中的每個元素,判斷每個元素得到布爾值,如果是True則留下來

people = ['reese', 'neo_s', '林克']
print(filter(lambda n: not n.endswith('s'), people))

res = filter(lambda n: not n.endswith('s'), people)
print(list(res))

print(list(filter(lambda n: not n.endswith('s'), people)))

#輸出:
<filter object at 0x04E612B0>
['reese', '林克']
['reese', '林克']

 

 

 

reduce函數:

處理一個序列,然後把序列進行合併操作

#  reduce函數
from functools import reduce

num = [1, 2, 3, 4, 5]
print(reduce(lambda x, y: x + y, num, ))

#輸出:
15

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • <script type="text/javascript"> function showSrc(labelName, obj) { var path = $(obj).prop("files")[0]; var reader = new FileReader(); var callback = f ...
  • 使用html+css+js實現日曆與定時器,看看今天的日期和今天剩餘的時間。 ...
  • HTML-學習筆記 HTML基礎 1.什麼是HTML? HTML是“HyperText Mark-up Language(超文本標記語言)”的縮寫。 超(Hyper)是相對於線性(linear)來說的。在很久以前,那時電腦程式還是線形運行的:當電腦程式執行完一個動作以後,轉向下一行,這行結束後, ...
  • MySQL的事務、JDBC事務操作: 詳細見這篇文章:比較詳細 http://www.cnblogs.com/xuyiqing/p/8430214.html 如何在hibernate中配置隔離級別: 再核心配置文件中: 這裡是二進位,轉換成十進位就是1,2,4,8 項目中管理事務: 沒有學習hibe ...
  • 緩存不止存在與程式中,電腦硬體乃至於生活中都存在緩存 目的:提高效率 比如IO流讀寫位元組,如果沒有緩存,讀一位元組寫一位元組,效率低下 hibernate中的一級緩存:提高操作資料庫的效率 示例: 抽取的工具類 package utils; import org.hibernate.Session; i ...
  • 創建一個實體類: package domain; public class Customer { private Long cust_id; private String cust_name; private String cust_source; private String cust_indus ...
  • 反射的時候通過暴力破解是可以訪問的 用反射的方法調用上面的類 對構造器進行暴力破解後,私有的構造也可以訪問,這個構造器的獲得要通過getDeclaredConstructor()方法 ...
  • 前言 所有編程都喜歡從hello world開始,所以今天我們也從hello world來介紹一下maven的入門程式。 一、maven入門程式的搭建過程以及步驟 1.1maven的目錄結構 1.1.1入門項目的目錄構建 maven的目錄結構大致如下: 首先我們在項目中建立如下結構: 【註意】其中p ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...