1. 程式人生 > >Python基礎day-6[函數,命名空間,作用域]

Python基礎day-6[函數,命名空間,作用域]

必須 數據類型 一個 none locals 函數 嵌套 補充 元組

函數的返回值

  通常有參函數是需要返回值的。
  返回值的幾種形式:
    1.如果函數內沒有return就返回None
    2.return 返回的數據類型沒有限制,也可以返回多個值,以元組形式,括號可加可不加
  return的效果:
    終止函數的執行,只能返回一次值.

  函數參數的使用
    python是一種弱類型的語言,參數可以傳入任何類型數據
    形參與實參:可以理解為形參就是變量名,而實參就是變量值
def foo(x,y) #x,y 是形參
  return x+y
foo(1,2) #1,2 是實參
    位置參數

:按照從左到右的順序依次定義的參數叫位置參數。
def foo(x,y): #按位置定義的形參,必須被傳值,多一個少一個都不行。
  print(x)
  print(y)
foo(1,2) #按位置定義的實參,會一一跟形參對應。
    關鍵字參數:指的是實參在定義時,按照key=value形式定義。
def foo(x,y): #形參還是按位置定義的。
  print(x)
  print(y)
foo(y=1,x=2) #打破位置的限制,不需要跟形參一一對應,直接指定傳值。但是還要遵循不能多不能少。
  註意的問題:
    1.位置實參可以和關鍵字實參混合使用,但是位置實參必須在關鍵字實參的前面。
    2.位置實參可以和關鍵字實參混合使用,但是一個形參只能被傳值一次不能被重復傳值。
    默認參數
:定義函數階段,就已經為形參賦值。
def foo(x, y=10): # 形參在定義的時候賦值。
  print(x)
  print(y)
foo(x=2) # 實參可以不輸入對應的形參,如果輸入了就不使用默認參數。
  註意的問題:
    1.必須放在位置參數後面。
    2.默認參數通常要定義成不可變類型。
    3.默認參數只在定義時被賦值一次。


形參的應用:值經常變化的需要定義成位置形參,值大多數情況下都一樣需要定義默認參數。
實參的應用:怎麽爽怎麽用,但是要遵循相應的規則。

    可變長參數:可變長值得是實參的個數不固定 *號等同位置參數
      按位置定義的可變長實參:*
      按關鍵字定義的可變長實參:**
def func(x,y,*args): #x=1 y=2, args=(3,4,5,6)元組形式
  print(x,y)
  print(args)
func(1,2,3,4,5,6) #實參為位置參數使用*args
func(1,2,*(3,4,5,6)) #等同於 func(1,2,3,4,5,6)

D:\Python\Python36-32\python.exe E:/Python/DAY-6/tmp.py
1 2
(3, 4, 5, 6)
1 2
(3, 4, 5, 6)

Process finished with exit code 0

def func(x, y, **kwargs): # x=1 y=2, kwargs={‘z’:6} 字典形式
  print(x, y)
  print(kwargs)
func(x=2, y=4, z=6) #實參為關鍵字使用**kwargs

D:\Python\Python36-32\python.exe E:/Python/DAY-6/tmp.py
2 4
{z: 6}

Process finished with exit code 0

    命名關鍵字參數:*後面定義的形參(*,name,age)必須以關鍵字形式被傳值
def regist(*,name,age):
  print(name)
  print(age)
regist(name=‘abc‘,age=11)

D:\Python\Python36-32\python.exe E:/Python/DAY-6/tmp.py
abc
11

Process finished with exit code 0

形參:位置參數,默認參數,*.args 命名關鍵字參數,**kwargs #一般定義形參就按照這種順序


  函數的嵌套調用
def max2(x,y):
  if x > y:
    return x
  else:
    return y
def mx4(a,b,c,d):
  res1=max2(a,b)
  res2=max2(res1,c)
  res3=max2(res2,d)
  return res3
  函數的嵌套定義:函數中定義函數,並且只能在同級調用
def f1():
  def f2():
    def f3:
      print(‘f3‘)
    print(‘f2‘)
  print(‘f1‘)

名稱空間與作用域
  命名空間:存放名字與值的綁定關系
  種類:
  內置名稱空間
    內置在Python解釋器內的自帶的名字,解釋器一啟動就生成這個空間
  全局名稱空間
    文件級別定義的名字都會存放於全局名稱空間,執行python文件時會產生,下面示例
x = 1
def func():
  pass
class foo:
  pass
import os
if 1 > 2:
  y = 3 #這裏y沒有頂頭寫但也是全局變量
  局部名稱空間
    定義在函數內部的名字,
    局部名稱空間只有在調用函數的時候生效,執行完畢失效


三種加載順序:內置=====>全局======>局部
取值:局部>全局>內置

示例:
max = 10
def tmp():
max = 20
print(max)
tmp() #會打印出20 因為局部優先於全局


  作用域:作用範圍
  種類:
    全局作用域
      內置名稱空間和全局名稱空間的名字,作用範圍是全局範圍。在整個文件的任意位置都能被引用,全局有效。
    局部作用域
      局部名稱空間中的名字,作用範圍是局部範圍生效。只在函數內部可被引用,局部有效

局部作用域=====>全局作用域
函數的作用域在定義的時候就已經固定死了。
補充:
搜尋變量時,只能由“內”看“外”。不可以反過來。例如在函數內部定義的變量,無法在全局被直接引用。
但是如果在函數內部引用一個變量,但是函數內沒有定義,那麽會去全局作用域搜尋變量。
x = 1
def func():
x =2
print(globals()) #打印全局作用域name
print(locals()) #打印局部作用域name
func()


函數對象:函數是第一類對象,指的是函數可以被當數據傳遞
可以被引用,可以當函數的返回值,可以當容器的元素

Python基礎day-6[函數,命名空間,作用域]