1. 程式人生 > 實用技巧 >10、函式介紹、函式引數

10、函式介紹、函式引數

一、函式介紹

  1、什麼是函式

  ps:函式時用來盛放程式碼的容器

  具備某一功能的工具-->函式

  事先準備工具的過程-->函式的定義

  遇到應用場景拿來就用-->函式的呼叫

  所以函式的使用原則:

  類似於定義變數

  先定義

  後呼叫

  

  2、為何要用函式

  解決下述問題:

  1、程式碼組織結構不清晰、可讀性差

  2、可拓展性差

  3、如何用函式

  定義的語法:

  def函式名(引數1,引數2,引數3...):

  """函式檔案的註釋"""

  程式碼1

  程式碼2

  程式碼3

  return 返回值

  呼叫的語法

  一、定義函式

  發生的事情

  1、申請記憶體空間把函式體程式碼放進去

  2、將函式記憶體地址繫結給函式名

  #強調:定義函式只檢測語法,不執行程式碼

  

def login():  # login = 函式的記憶體地址
    print(1111)
    print(2222)
    print(3333)
    print(4444)
    print(5555)

  x=10

  print(X)  python對於變數有特殊待遇,輸出為10

  print(login)  輸出為ID

二、呼叫函式:

  發生的事情:

  1、先通過函式名定位到函式的記憶體地址

  2、函式記憶體地址()->觸發函式體程式碼的執行

  強調:呼叫函式才會執行函式體程式碼

  例1:

  def func():

    print(1111

  #這裡python直接報錯,語法錯誤

  例2:

  def func():

    print(1111)

    x

    print(2222)

  func

  例3:

  

# ================
def bar():
    print('from bar')

def foo():
    print('from foo')
    bar()

foo()
================
def foo():
    print('from foo
') bar() def bar(): print('from bar') foo()

三、定義函式的三種方式

  3.1無參

  

def say():
    print('========')
    print('welcome to here')
    print('========')
say()

def login():
    inp_name = input("username>>>: ").strip()
    inp_pwd = input("password>>>: ").strip()
    if inp_name == "egon" and inp_pwd == "123":
        print('login successful')
    else:
        print("username or password error")

login()

  3.2有參

  

def max2(x,y):
    if x > y:
        print(x)
    else:
        print(y)
max2(10,20)

  3.3空

  def login()

    pass

  #這種方法一般用與羅列整體框架

四、呼叫函式的三種形式

  4.1語句

  len(''hello'')

  4.2表示式

  res = len("hello")*10

  print(res)

  4.3可以當做引數傳給另一個引數

  print(len("hello"))

五、引數

  總體分為兩大類:

  1、形參:在函式定義階段括號內指定的引數,稱之為形式引數,簡稱形參-->變數名

  2、實參:在函式呼叫階段括號內傳入的值,稱之為實際引數,簡稱實參-->變數值

  形參與實參的關係是:

  在呼叫函式時,實參值會繫結給形參名,在函式呼叫完畢後解除繫結

  

def func(x,y):
    # x = 111
    # y = 222
    print(x,y)

m=111
n=222
func(111,222)

  細分的話:

===========================形參系列==============================

  1、位置形參:在定義函式時,按照從左到右的順序依次定義的變數名,稱之為位置形參

  特點:內次呼叫,必須被賦值

def func(name,age):
    print(name)
    print(age)

func(1,2,3)
func(1)#被賦的值一個都不能多,一個都不能少,不然就報錯

  二、預設形參:在定義函式時,就已經為了某個形參賦值了,稱之為預設形參

    特點:呼叫函式時,可以不用為其賦值

  

def func(name,age=18):
    print(name)
    print(age)
func("egon")
func("egon",19)

    注意:可以混用位置形參與預設形參,但是

    1、位置形參必須在前面

    2、預設形參的值通常應該是不可變型別

    3、預設形參的值實在函式定義階段賦值的

def func(age=18,name):
    print(name)
    print(age)


def func(name,hobby,hobbies = None):
    if hobbies is None:
        hobbies = []
    hobbies.append(hobby)
    print('%s的愛好是%s' %(name,hobbies))

func('egon','read')
func('tom','play')
func('jack','music')
func('lili','eat',["movie"])


m=1111
def func(x,y,z=m):
    print(x)
    print(y)
    print(z)
m=666#z還是1111
func(1,2)

=========================實參系列============================

  一、位置實參:在呼叫函式時,按照從左到右的順序依次傳入的值,稱之為位置實參

    特點:按照位置為形參賦值,一一對應

    func("egon",18)

    func(18,"egon")

  二、關鍵字實參:在呼叫函式時,按照key=value的形式傳值,稱之為關鍵字實參

    #特點:可以打亂順序,但是任然能夠指名道姓的為指定的引數賦值

  func(age=18,name="egon")

    注意:可以混用位置實參與關鍵字實參,但是

    1、位置實參必須在關鍵字實參的前面

    2、不能為同意形參重複賦值

func("egon",age=18)
func(age=18,"egon")   # 語法錯誤

def foo(x,y,z):
    pass

foo(1,y=2,3)  # 錯誤
foo(1,y=2,z=3,x=4)  # 錯誤

  可變長系列:

  可變長引數值的是在呼叫函式時,傳入的引數個數不固定,對應著必須有特殊形式的形參來接收溢位的實參

  實參無非兩種形式

    溢位的位置實參-->*

    溢位的位置關鍵字實參-->**

=========================*與**在形參中事一種彙總行為===================

  1、*在形參中的應用:*會將溢位的位置實參合併成一個元組,然後複製給緊跟其後的那個形參名

def func(x,*args):  # y = (2,3,4,5)
    print(x)
    print(args)

func(1,2,3,4,5)


def my_sum(*args):
    res = 0
    for i in args:
        res += i
    print(res)

my_sum(1,2)

  2、**在形參中的應用:**會將溢位的關鍵字實參合併成一個字典,然後複製給緊跟氣候的那個形參名

  

def func(x,**kwargs):  # kwargs = {"a":2,"c":4,"b":3}
    print(x)
    print(kwargs)

func(1,a=2,b=3,c=4)

=========================*與**在實參中是一種打散行為====================

  *在實參中的應用:*後可以跟可以被for迴圈遍歷的任意型別,*會將緊跟其後的那個值打散成為位置實參

def func(x,y,z):
    print(x)
    print(y)
    print(z)


func([11,22,33])
func(*[11,22,33])  # func(11,22,33)
func(*"hello")  # func("h","e","l","l","o")
func(*{"k1":111,"k2":2222})  # func("k1","k2")

**在實參中的應用:**只能跟字典型別,**會將字典打散成關鍵字實參
func(**{"k1":111,"k2":2222})  # func(k2=2222,k1=111)
func(**{"x":111,"y":2222,"z":333})

  

例:
def index(x,y,z):
    print(x,y,z)

def wrapper(*args,**kwargs):  # args=(1,2,3,4,5,6)  kwargs={"a":1,"b":2,"c":3}
    index(*args,**kwargs)  # index(*(1,2,3,4,5,6),**{"a":1,"b":2,"c":3})
    #                        index(1,2,3,4,5,6,a=1,b=2,c=3)
# wrapper(1,2,3,4,5,6,a=1,b=2,c=3)
wrapper(1,y=2,z=3)

  瞭解(**):命名關鍵字形參:在*與**中間的形參稱之為命名關鍵字形參

    特點:必須按照key=value的形式傳值

def func(x,m=333,*args,y=222,z,**kwargs):
    print(x)
    print(args)
    print(y)
    print(z)
    print(kwargs)

func(1,2,3,z=4,a=1,b=2,c=3)
func(1,2,3,4,5,6,7)