1. 程式人生 > >06-python基礎知識-函式使用

06-python基礎知識-函式使用

函式使用

變數作用域

  • 塊級作用域

    if True:
        name = 'xiaoming'
    
    # 沒有塊級作用域
    print(name)
    
  • 區域性作用域

    def test():
        a = 10
    
    test()
    # 區域性變數:在函式內部定義的變數,只能在函式內部使用
    # print(a)
    
  • 全域性作用域

    # 全域性變數:定義在函式外部的變數,擁有全域性的作用
    num = 10
    
    def show():
        # 函式內部可以使用外部定義的變數
        # print(num)
        # 若想更改外部變數,需要進行global宣告
        global
    num # 不能更改外部的全域性變數,而是定義了一個區域性變數 num = 20 show() print(num)
  • nonlocal使用

    def wai():
        n = 100
        def nei():
            # 使用外部函式的區域性變數,需要進行宣告才可更改
            nonlocal n
            # 內部函式可以使用外部函式的區域性變數,但是不能更改
            n = 200
            print(n)
        nei()
        print(n)
    wai() 
    

匿名函式

  • 函式可以像普通變數一樣進行賦值

    def test():
        print('for test')
        
    print(test.__name__)    
    
    # 函式可以像普通變數一樣進行賦值
    a = test
    print(a.__name__)
    a()
    
  • 函式可以作為一個函式的引數

    def show(func):
        func()
    
    # 函式作為引數傳遞
    show(test)
    
  • 匿名函式

    • 說明:當將函式作為引數傳遞時,若函式只需要一次,沒有必要單獨定義函式,可以使用匿名函式解決。
    • 格式:lambda 引數列表: 表示式
      • 引數列表與定義函式是一樣,可以是多個,多個引數之間使用逗號分隔
      • 表示式就是返回值,不需要使用return關鍵字
    • 示例:
    lt = [
        {'name': 'dahua', 'age': 18, 'height': 165},
        {'name': 'erhua', 'age': 16, 'height': 160},
        {'name': 'dagou', 'age': 20, 'height': 175},
        {'name': 'ergou', 'age': 15, 'height': 155}
    ]
    
    def key(d):
        return d['height']
    
    # lt.sort(key=key)
    lt.sort(key=lambda d: d['age'])
    
    for i in lt:
    	print(i)  
    

閉包使用

  • 定義:具有執行環境的函式

    • 外部函式中定義一個內部函式
    • 內部函式中使用外部函式的區域性變數
    • 外部函式將內部函式作為返回值返回
    • 此時的內部函式就叫閉包
  • 示例:

    def wai(n):
        # 定義內部函式
        def nei():
        	# 內部函式中使用外部函式的區域性變數
            return n * n
        # 內部函式作為返回值
        return nei
    
    f1 = wai(10)
    f2 = wai(4)
    print(f1())
    print(f2())
    
    

裝飾器

  • 作用:當需要改變一個函式原有的功能時,但是不想/不能改變原來的函式,可以通過裝飾器解決

  • 使用:

    • 裝飾器其實就是一個函式,該函式有一個引數(函式型別),返回一個閉包
    • 在返回的閉包中呼叫傳遞進來的函式,然後在呼叫函式的前後就可以新增內容
  • 示例:

    def zhuangshiqi(func):
      	def wrapper():
            print('開始裝飾')
            func()
            print('裝飾結束')
    
        return wrapper
    
    @zhuangshiqi
    # 相當於執行了:test = zhuangshiqi(test)
    def test():
    	print('for test')    
        
    # t2 = zhuangshiqi(test)
    # t2()
    # test = zhuangshiqi(test)
    
    test()
    
    @zhuangshiqi
    def demo():
    	print('原有內容')
    
    demo()
    
  • 分類:

    • 裝飾無參無返回值的函式
    def shuai(func):
          def wrapper():
              print('拉風的暴龍眼鏡')
              func()
              print('鱷魚牌大頭皮鞋')
          return wrapper
    
      @shuai
      def diaosi():
      	print('傑哥,屌絲一枚')
          
      diaosi()
    
    • 裝飾帶參無返回值的函式
    def zhuangshiqi(func):
        def wrapper(*args, **kwargs):
            print('開始裝飾')
            func(*args, **kwargs)
            print('裝飾結束')
    	return wrapper
    
    @zhuangshiqi
    def test(n):
          print('I like num {}'.format(n)) 
            
    test(250)
    
    • 裝飾帶參有返回值的函式
    def zhuangshiqi(func):
        def wrapper(*args, **kwargs):
            print('開始裝飾')
            ret = func(*args, **kwargs)
            print(ret)
            print('裝飾結束')
            return ret
        return wrapper
    
    @zhuangshiqi
    def add(a, b):
    	return a + b
    
    print(add(3, 5))         
    

遞迴函式(瞭解)

  • 定義:在函式內部呼叫自己的函式就叫遞迴函式。
  • 組成:
    • 函式內部呼叫自己
    • 終止條件(停止呼叫自己的條件)
    • 核心演算法
  • 特點:
    • 程式碼簡介
    • 可讀性差
    • 瞬間佔用記憶體比較大,終止條件出錯立即崩潰
    • 能不使用就不使用,就是在不得不用的時候再使用(遍歷目錄)