python 函數(2)

2019.4.10 S21 day10筆記總結

1、內容回顧

  • 1.面試題相關:python

    • 1.py2和py3的區別git

    • 2.運算符的計算 :3 or 9 and 8面試

    • 3.字符串的反轉centos

    • 4.is和==的區別app

    • 5.v1 = (1) v2 = 1 v3 = (1,)有什麼區別函數

      v1 、v2都是數字,v3是元組操作系統

    • 6.線上操做系統:centos日誌

    • 7.每種數據類型,列舉你瞭解的方法code

    • 8.深淺拷貝作用域

    • 9.文件操做,大文件如何讀取內容(如50G的日誌文件)

      v=open(……)

      for line in v:

      ​ print(line)

      v.close()

    • 10.一行寫出:9*9乘法表

    • git流程

  • 2.函數

    方法(數據類型的)相似於函數,但不是函數 。

    嚴格按照順序傳參數:位置方式傳參

    實際參數能夠是任意類型

    return沒有返回值時,默認返回None

    return的做用:1.返回值 2.終止函數的執行

    函數內部執行過程當中,遇到return就終止

    return能夠返回任意類型

    特殊狀況:return 1,2,'alex' 表示返回的是元組,與return(1,2,'alex')相同

2、今日內容

1. 參數

1.1基本參數知識

  • 參數能夠是任意個數

  • 能夠是任意類型

    def func(a1,a2,a3,a4):
      print(a1,a2,a3,a4)
    
    func(2,'name',[1,2,3],False)

1.2 位置傳參(調用函數並傳入參數)(執行)

調用/執行函數的時候嚴格按照位置的順序傳入參數

def func(a1,a2,a3):
    print(a1,a2,a3)
    
func(66,'alex',3)

1.3 關鍵字傳參(執行)

關鍵字傳參就是將形參放入到實參中去使用

def func(a1,a2):
    print(a1,a2)
    
func(a1=22,a2=8)

關鍵字傳參與位置傳參是能夠混合使用的:位置傳入的參數要放在前面,關鍵字傳參要放在後面,最後等於總參數個數

def func(a1,a2,a3):
    print(a1,a2,a3)
    
func(1,2,a3=3)
func(1,a2=2,a3=3)
func(a1=1,a2=2,a3=3)
func(a1=1,2,3)  # 是錯誤的

def func() : 自定義函數 open() 這兩個爲python的內置函數

​ pass len()

1.4 默認參數

def func(a1,a2,a3=9,a4=10):   # 默認參數a3=9,a4=10
    print(a1,a2,a3,a4)

func(11,22)       # 不給a3,a4傳值,則a3,a4等於默認參數
func(11,22,10)
func(11,22,10,100)
func(11,22,10,a4=100)
func(11,22,a3=10,a4=100)
func(11,a2=22,a3=10,a4=100)
func(a1=11,a2=22,a3=10,a4=100)

1.5 萬能參數(用於打散)

  • *args

    能夠接受任意個數的位置參數,並將參數轉換成元組。

    • 調用函數無*
    def func(*args):
      print(*args)
    
    func(1,2)   ==> (1,2)
    func(1,2,[12,3,4])   ==> (1,2,[12,3,4])
    func((11,22,33))   ==> ((11,22,33))  # 參數是一個元組,打印出來的效果是元組套元組。

    調用函數有*

    def func(*args):
      print(*args)
    
    func(*(11,22,33))   ==>(11,22,33)    # *是用來打散元組的,將元組中的每一個元素做爲參數。
    func(*[11,22,33])   ==>(11,22,33)    # *能夠用來打散列表/元組 /字典/集合,只是循環內部元素

    只能用位置傳參

    def func(*args):
        print(args)
    
    func(1)
    func(1,2)   # args=(1, 2)
    func((11,22,33,44,55))    # args=((11,22,33,44,55),)
    func(*(11,22,33,44,55))   # args=(11,22,33,44,55)
  • **kwargs

    能夠接受任意個數的關鍵字參數,並見參數轉換成字典

    調用函數無*

    def func(**kwargs):
      print(***kwargs)
    
    func(k=1)    **kwargs = {'k':1}
    func(k1=1,k2=3)   **kwargs = {'k1':1,'k2':3}

    調用函數有*

    def func(**kwargs):
      print(**kwargs)
    
    func(**{'k1':1,'k2':4,'k3':9})   **kwargs = {'k1':1,'k2':4,'k3':9}

    只能用關鍵字傳參

  • *args/**kwargs綜合使用:無敵 + 無敵 => 真無敵

    def func(*args,**kwargs):
        print(args,kwargs)
    
    func(1,2,3,4,5,k1=2,k5=9,k19=999)     *arg = (1,2,3,4,5) **kwargs = {'k1':2,'k5':9,'k19':999}
    func(*[1,2,3],k1=2,k5=9,k19=999)      *arg = (1,2,3) **kwargs = {'k1':2,'k5':9,'k19':999}
    func(*[1,2,3],**{'k1':1,'k2':3})      *arg = (1,2,3) **kwargs = {'k1':1,'k2':3}
    func(111,222,*[1,2,3],k11='alex',**{'k1':1,'k2':3})  
    *arg = (111,222,1,2,3)   **kwargs = {'k11':'alex','k1':1,'k2':3}

1.6 參數相關的重點

  • 定義函數

    def func(a1,a2):
      pass
    
    def func(a1,a2=None):  # 對於默認值,不可變類型隨便寫,若是是可變類型(有坑)。
      pass
    
    def func(*args,**kwargs):
      pass
  • 調用函數

    位置參數在前,關鍵字參數在後。

2. 做用域

在python文件中:

  • py文件:全局做用域

  • 函數:局部做用域

    a = 1
    def s1():
        x1 = 666
        print(x1)
        print(a)
        print(b)
    
    b = 2
    print(a)
    s1()
    a = 88888
    def s2():
        print(a,b)
        s1()
    
    s2()
  • 每一個做用域中的數據只有做用域本身能夠調用,若是做用域中調用的數據沒有,能夠調用全局做用域的

    全局做用域只能調用全局的

    在全局做用域中的函數能夠互相調用(調用已經存在的),但不能夠直接調用做用域中的做用域

總結:

  • 1.一個函數就是一個做用域

  • 2.做用域中查找數據規則:優先在本身的做用域找數據,本身沒有就去「父級」-->「父級」-->直到全局,全局沒有就報錯。 (做用域的嵌套)

    注意:父級做用域中的值究竟是多少?

    x = 10
    def func():
        x = 9
        print(x)
    
    func()

    課上練習題

    x = 10
    def func():
        x = 9
        print(x)
        def x1():
            x = 999
            print(x)
    
    func()
    
    
    
    x = 10
    def func():
        x = 9
        print(x)
        def x1():
            x = 999
            print(x)
        x1()
    
    func()
    
    
    x = 10
    def func():
        x = 9
        print(x)
        def x1():
            x = 999
            print(x)
        print(x)
        x1()
    
    func()
    
    x = 10
    def func():
        x = 8
        print(x)
        def x1():
            x = 999
            print(x)
        x1()
        print(x)
    
    func()
    
    
    x = 10
    def func():
        x = 8
        print(x)
        def x1():
            print(x)
        x1()
        print(x)
    
    func()
    
    
    
    x = 10
    def func():
        x = 8
        print(x)
        def x1():
            print(x)
        x = 9
        x1()
        x = 10
        print(x)
    
    func()
    
    x = 10
    def func():
        x = 8
        print(x)
        def x1():
            print(x)    
        x1()
        x = 9
        x1()
        x = 10
        print(x)
    
    func()
  • 3.子做用域中只能只能找到父級中的值,默認沒法從新爲父級的變量進行賦值。

    • 不能進行賦值,只能對可變類型進行內部修改

      # #####################
      name = 'oldboy'
      def func():
          name = 'alex' # 在本身做用域再建立一個這樣的值。
          print(name)
      func()
      print(name)
      
      
      # #####################
      name = [1,2,43]
      def func():
          name.append(999)
          print(name)
      func()
      print(name)
    • 若是非要對全局的變量進行賦值須要加global(強制賦值)

      #示例一
      name = "老男孩「
      def func():
          global name
          name = 'alex'
      func()
      print name
      
      # 示例二
      name = ["老男孩",'alex']
      def func():
          global name
          name = '我'
      func()
      print(name)
      
      # 示例三
      name = "老男孩"
      def func():
          name = 'alex'
          def inner():
              global name
              name = 999
          inner()
          print(name)
      func()
      print(name)
    • 對父級的變量賦值用nonlocal,先找到父級的變量再進行賦值 (強制賦值)

      name = "老男孩"
      def func():
          name = 'alex'
          def inner():
              nonlocal name # 找到上一級的name
              name = 999
          inner()
          print(name)
      func()
      print(name)
  • 補充:全局變量必須所有要大寫

USER_LIST = [11,22,3]

def func():
    name = 'asdf'
    USER_LIST.append(12)
    USER_LIST.append(name)

func()
print(USER_LIST)
相關文章
相關標籤/搜索