Python之函數總結

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

一、函數 1、為什麼要用函數 a、避免代碼重用 b、提高代碼的可讀性 2、函數的調用 返回值=函數名(參數1,參數2) 函數定義 返回值 關鍵字:return 3、return的作用: a、結束函數的執行 b、返回要返回的值 4、返回值的兩種情況 a、返回值為None def mylen(): "" ...


一、函數

1、為什麼要用函數

    a、避免代碼重用

    b、提高代碼的可讀性

2、函數的調用

   返回值=函數名(參數1,參數2)

   函數定義---返回值

   關鍵字:return

3、return的作用:

    a、結束函數的執行

    b、返回要返回的值

4、返回值的兩種情況

    a、返回值為None

def mylen():
    """計算s1的長度"""
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    print(length)


str_len = mylen()
print(str_len)
不寫return
def ret():
    print(111)
    return
    print(222)

re = ret()
print(re)
只寫return
def ret():
    print(111)
    return None
    print(222)

re = ret()
print(re)
return None

    b、返回值不為None

         1、返回一個值

def mylen():
    """計算s1的長度"""
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    return length

str_len = mylen()
print(str_len)
返回一個值

          2、返回多個值

5、函數的調用----接受返回值

   a、返回值為None    不接受

   b、返回值不為None

       1、返回一個值

               用一個變數接受

       2、返回多個值

               a、用一個變數接受,接受的結果是一個元祖

               b、有多少個返回值就用多少個值接受

6、參數

    a、參數----站在定義函數的角度

         1、位置參數

         2、預設參數

         3、動態參數

              a、*args

              b、**kwargs

順序:位置參數、*args、預設參數、**kwargs

     b、參數----站在調用函數的角度上

         1、按照位置傳參

         2、按照關鍵字傳參

         3、動態傳參*tup,**dic

7、參數分為形參和實參   

     a、實參:調用函數的時候傳入的參數

8、位置參數

     a、位置參數必須傳值

def aaa(a,b):
    print(a,b)
aaa(1,2)
位置參數

9、預設參數

     a、預設參數可以不傳值

def bbb(x=10):
    print(x)
 bbb()     #x = 10
 bbb(20)  #x = 20
預設參數

10、動態參數

def ccc(*args):#1,2,3,4,5
    print(args)

ccc(1,2,3,4,5)#按位置傳參數

t = (1,2,3,4,5)
ccc(t)  ((1, 2, 3, 4, 5),)
ccc(*t)  (1, 2, 3, 4, 5)
複製代碼
動態參數
def ddd(**kwargs):
    print(kwargs)

 ddd(k = 'a',j = 'b')#按關鍵字傳參數
動態參數+關鍵字參數
def eee(*args,**kwargs):
    print(args,kwargs)

 eee(12,123)
動態,先按位置參數,再按關鍵字參數

11、命名空間

     a、命名空間分為三種

            1、全局命名空間

            2、局部命名空間

            3、內置命名空間

     b、三種命名空間的順序:內置命名空間>全局命名空間>局部命名空間

     c、取值

           1、在局部調用:局部命名空間->全局命名空間->內置命名空間

x = 1
def f(x):
    print(x)

print(10)
View Code

          2、在全局調用:全局命名空間->內置命名空間

x = 1
def f(x):
    print(x)

f(10)
print(x)
View Code

12、作用域

      a、  作用域就是作用範圍,按照生效範圍可以分為全局作用域和局部作用域。

      b、  全局作用域:包含內置名稱空間、全局名稱空間,在整個文件的任意位置都能被引用、全局有效

      c、局部作用域:局部名稱空間,只能在局部範圍生效

作用域:
小範圍的可以用大範圍的
但是大範圍的不能用小範圍的
範圍從大到小(圖)
在小範圍內,如果要用一個變數,是當前這個小範圍有的,就用自己的
如果在小範圍內沒有,就用上一級的,上一級沒有就用上上一級的,以此類推。
如果都沒有,報錯

13、閉包

       a、閉包分為:

            1、閉:內部函數

            2、包:包含對外部函數的作用域中變數的引用

       b、閉包常用的的形式

def hei():
    x = 20
    def inner():
        print(x)  #局部的
    return inner

i = hei()
i()  #全局
閉包常用形式

14、函數值裝飾器

      a、裝飾器的本質:閉包函數

      b、裝飾器的功能:就是在不改變原函數調用方式的情況下,在這個函數的前後加上擴展功能

def timer(func):
    def inner(a):
        start = time.time()
        func(a)
        print(time.time() - start)
    return inner

@timer
def func1(a):
    print(a)

func1(1)
帶參數的裝飾器

15、裝飾器的開放封閉原則:

      a、對擴展是開放的

      b、對修改是封閉的

def timer(func):
    def inner(*args,**kwargs):
        '''執行函數之前要做的'''
        re = func(*args,**kwargs)
        '''執行函數之後要做的'''
        return re
    return inner
裝飾器的固定方式

16、裝飾器應用場景

      a、計算func的執行時間

      b、登錄認證

17、可迭代

      a、字元串,列表,集合,字典,元祖這些度可以for迴圈,說明他們是可迭代的

      b、迭代就是:將某個數據集內的數據一個挨一個的取出來,就 叫做可迭代

      c、可迭代對應標誌:__iter__

18、迭代協議

      a、希望這個數據類型里的東西也可以使用for被一個一個的取出來,那我們就必須滿足for的要求

      b、可迭代協議——凡是可迭代的內部都有一個__iter__方法

19、迭代器協議

      a、迭代器協 : 內部實現了__iter__ __next__方法

 可迭代和迭代器的不同點 : 迭代器多實現了一個__next__方法

 可迭代和迭代器的相同點 : 都可以用for迴圈

20、判斷迭代器和可迭代的方法 

       a、第一種:判斷內部是不是實現了 __next__ 

                           '__next__' in dir(o)

       b、第二種

from collections import Iterable  #可迭代
from collections import Iterator  #迭代器
isinstance(o,Iterable)
isinstance(o,Iterator)

21、生成器

      a、生成器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,

          掛起函數的狀態,以便下次重它離開的地方繼續執行

      b、生成器表達式:類似於列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表

生成器函數

def func():
    print('aaaa')
    a = 1
    yield a    #返回第一個值
    print('bbbb')
    yield 12   #返回第二個值
ret = func()  #拿到一個生成器
print(ret)
print(next(ret)) #取第一個值
print(next(ret)) #取第二個值
print(next(ret)) #取第三個值 會報錯 因為沒有第三個值
生成器函數

22、列表推導式

平常:

for i in range(100):
    print(i*i)
n*n

列表推到:

l =[i*i for i in range(100)]
print(l)
n*n

23、遞歸函數

     a、在一個函數里調用自己

     b、Python遞歸最大層數限制997

     c、最大層數限制是python預設的,可以做修改,但是不建議你修改

     d、遞歸實例

def age(n):
    if n == 1:
        return 40
    else:
        ret = age(n-1)
        return ret + 2
age(5)
算年齡

     e、遞歸結束標誌:return

遞歸三級菜單

menu = {
    '北京': {
        '海澱': {
            '五道口': {
                'soho': {},
                '網易': {},
                'google': {}
            },
            '中關村': {
                '愛奇藝': {},
                '汽車之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龍觀': {},
        },
        '朝陽': {},
        '東城': {},
    },
    '上海': {
        '閔行': {
            "人民廣場": {
                '炸雞店': {}
            }
        },
        '閘北': {
            '火車戰': {
                '攜程': {}
            }
        },
        '浦東': {},
    },
    '山東': {},
}

def threeLM(menu):
    for key in menu:
        print(key)
    k = input(">>>")
    if k in menu:
        threeLM(menu[k])

threeLM(menu)
三級菜單

24、匿名函數

     a、 匿名函數 簡單的需要用函數去解決的問題 匿名函數的函數體 只有一行,也叫lambda

     b、 函數名 = lambda 參數 :返回值

     c、參數可以有多個,用逗號隔開,匿名函數不管邏輯多複雜,只能寫一行,且邏輯執行結束後的內容就是返回值。返回值和正常的函數一樣可以是任意數據類型

add2 = lambda x,y : x+y
ret = add2(1,2)
print(ret)
View Code
l = [1,2,3,4]
print(list(map(lambda x:x*x , l)))
View Code

25、內置函數

    a、isinstance  判斷變數的數據類型

temp = "asdfsdfs"  
  
r = isinstance(temp, list)  
  
print(r)

    b、lambda用法:

def f1():  
  
    return 123  
  
f2 = lambda :123  
  
r1 = f1()  
  
r2 = f2()  
  
print(r1,r2)
def f3(a1,a2):  
  
    return a1 + a2  
  
f4 = lambda a1,a2: a1 + a2  
  
r3 = f3(1,2)  
  
r4 = f4(3,4)  
  
print(r3,r4) 

    c、abs--取絕對值

i = abs(-123)  
  
print(123)

    d、divmod  除商得餘數---例如分頁

a = 10 / 3  
  
print(a)  
  
r = divmod(10,3)  
  
print(r)  
  
結果:  
  
3.33333335  
  
(3,1) 

   e、eval  -----強制不轉換輸入類型的格式

ret = eval("1 + 3")  
  
print(ret)  
  
結果:4 

   f、filter (過濾)

ret = filter(lambda x: x >22, [11,22,33,44])  
  
for i in ret:  
  
    print(i)

  g、map  無論是map還是filter,得到的結果都是可迭代的對象,迭代器的實例

def f1(x):  
  
    if x % 2 == 1:  
  
       return x + 100  
  
    else:  
  
       return x  
  
ret = map(f1, [1,2,3,4,5])  
  
ret2 = map(lambda x: x + 100if x % 2 == 1 else x ,[1,2,3,4,5])  
  
print(ret)  
  
for i in ret :  
  
    print(i) 

   h、max()最大數 min()  最小數

li = [11,22,123,1]  
  
r = max(li)  
  
print(r)  
  
a = min(li)  
  
print(a) 

   g、pow(x,y) ----就是求x的y次方

i = pow(2,100)  
  
print(i) 

   k、zip ---意思就是取兩個變數中索引相對應的值

li1 = [11,22,33,44]  
  
li2 =["a",'VV',"c","E"]  
  
r = zip(li1,li2)  
  
print(r)  
  
for i in r :  
  
    print(i)

  l、、open---打開,關閉,close

模式    描述
r      打開一個文件為只讀。文件指針被放置在文件的開頭。這是預設模式。
rb     打開一個文件只能以二進位格式讀取。文件指針被放置在文件的開頭。這是預設模式。
r+     打開用於讀和寫文件。文件指針置於該文件的開頭。
rb+    打開用於讀取和寫入二進位格式的文件。文件指針置於該文件的開頭。
w      打開一個文件只寫。如果文件存在覆蓋該文件。如果該文件不存在,則創建寫入新文件。
wb     打開一個文件只能以二進位格式寫入。如果文件存在覆蓋該文件。如果該文件不存在,則創建寫入新文件。
w+     打開文件為寫入和讀取模式。如果文件存在覆蓋現有文件。如果該文件不存在,創建用於讀寫操作的新文件。
wb+    打開用於以二進位格式寫入和讀出文件。如果文件存在覆蓋現有文件。如果該文件不存在,創建用於讀寫操作的新文件。
a      打開用於追加的文件。文件指針是在文件是否存在該文件的末尾。也就是說,該文件是在追加模式。如果該文件不存在,它會創建一個用於寫入的新文件。
ab     打開文件用於二進位格式追加。文件指針是在文件是否存在該文件的末尾。也就是說,文件是在追加模式。 如果該文件不存在,它會創建一個用於寫入的新文件。
a+     打開文件為追加和讀取方式。文件指針是在文件是否存在該文件的末尾。該文件以追加模式打開。如果該文件不存在,它將創建用於讀寫操作的新文件。
ab+    打開一個文件以附加和二進位格式讀取模式。如果該文件存在文件指針在該文件的末尾。該文件以追加模式打開。如果該文件不存在,它將創建讀寫操作的新文件。

 

 

 

 

 

 

        

 

 

   

 

 

 

       

 

   


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

-Advertisement-
Play Games
更多相關文章
  • 定義函數: 過程:就是沒有返回值的函數 函數的參數: 形參:只有在被調用時才分配記憶體單元,在調用結束時,即刻釋放所分配的記憶體單元。因此,形參只在函數內部有效。 實參:可以是常量、變數、表達式、函數等,在進行函數調用時,都必須有確定的值,以便把這些值傳給形參。 全局變數和局部變數: 在子程式中定義的變 ...
  • this關鍵字只能在方法內部使用,表示對“調用方法的那個對象”的引用。 構造器內可以用this調用一個構造器,並且必須將構造器調用置於最起始處。除構造器外,編譯器禁止在其他任何方法中調用構造器。 ...
  • 前置操作 軟體名:anaconda 版本:Anaconda3-5.0.1-Windows-x86_64清華鏡像 下載鏈接:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 軟體名:Pycharm 版本:pycharm-professiona ...
  • 1.二維數組中的查找 題目描述 在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。 時間限制:1秒 空間限制:32768K <?php function Find($target, $ ...
  • 一、 什麼是RESTful REST與技術無關,代表的是一種軟體架構風格,REST是Representational State Transfer的簡稱,中文翻譯為“表徵狀態轉移” REST從資源的角度類審視整個網路,它將分佈在網路中某個節點的資源通過URL進行標識,客戶端應用通過URL來獲取資源的 ...
  • 電腦系統分為:硬體,操作系統,應用程式 硬體:目的在於運行軟體發出的指令。硬體包括CPU,記憶體,硬碟 多數CPU都有兩種模式,即內核態與用戶態。 ①當cpu處於內核狀態時,運行的是操作系統,能控制硬體(可以獲取所有cpu的指令集) ②當cpu處於用戶太狀態時,運行的是用戶軟體,不能控制硬體(可以獲 ...
  • (一) Select類 Select類是selenium的一個特定的類,用來與下拉菜單和列表交互。 下拉菜單和列表是通過HTML的<select> 元素實現的。選擇項是通過<select>中的<option>元素實現的。使用前使用下麵的語句導入模塊。 from selenium.webdriver. ...
  • https://www.patest.cn/contests/pat-b-practise/1036 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...