Python入門(八) 函數基礎

    1. 定義一個函數:
python

    1)必須以def開頭
c++

    2)參數之間用,隔開
express

    3)函數的內容以冒號:開始,而且縮進
編程

    4)不帶表達式的return,至關於返回None
函數

def function_name(parameters):
    #do something
    ...
    return [expression]
def cal_sum(a,b):
    return (a + b)
   
#調用函數
sum = cal_sum(2, 6)
print(sum)
>>> 8

    2. 函數的參數傳遞    code

    咱們知道在c++中,函數的參數既能夠傳遞值,也能夠傳遞引用。那麼在Python中是怎麼樣的呢?
對象

#改變整數
def change_number(num):
    print("num = ", num)
    num += 1
    print('num = ', num)
    
num = 3
print('before change: num = ', num)
change_number(num)
print('after change: num = ', num)

>>> 
before change: num =  3
num =  3
num =  4
after change: num =  3
#改變字符串
def change_string(string):
    print("string = ", string)
    string = 'hello'
    print('string = ', string)

name = 'billy'
print('before change: name = ', name)
change_string(name)
print('after change: name = ', name)

>>> 
before change: name =  billy
string =  billy
string =  hello
after change: name =  billy
#改變list
def change_list(list_test):
    print(list_test)
    list_test[0] = 111
    #print(list_test)

list1 = [100, 'b']
change_list(list1)
print(list1)

>>> 
[100, 'b']
[111, 'b']

    經過上面的例子,能夠看出,在Python中,對於整數、浮點數、True/False是按照值傳遞的,即會先將本身當前的值賦給函數的參數,在函數內部的任何修改均不影響外部的值。對於字符串、list、dict這種變量類型,是按照引用傳遞的,即函數的參數是傳遞對象的引用,所以在函數內部的修改,均會影響到變量的值。這裏特別說明一下字符串的傳遞與修改過程,首先string參數指向"billy"對象,因爲Python中的字符串是「不可變」對象,以後對string的修改,就是把string參數指向了"hello"對象了,而原先的name變量仍然指向"billy"對象。字符串

    3. 缺省參數:即讓該參數有一個缺省值,這個在GUI編程中常常用到。
string

def create_label(width = 100, height = 10):
    print('width = %d, height = %d' % (width, height))

create_label()
create_label(200)
create_label(200, 30)

>>> 
width = 100, height = 10
width = 200, height = 10
width = 200, height = 30

    4. 命名參數:默認的函數調用過程當中,參數的傳遞是經過位置進行的,若是函數的個數比較多的狀況下,咱們頗有可能會搞不清楚參數的位置,這個時候經過命名參數,就能很好的解決
it

def create_label(name, width, height = 10):
    print('name = %s, width = %d, height = %d' % (name, width, height))

create_label('label1', 200, 40)
create_label(width=200, height=40, name='label2')
>>>
name = label1, width = 200, height = 40
name = label2, width = 200, height = 40

    上述函數調用的效果是同樣的,不過經過命名參數,參數的位置就不用要求name必須防止在前面了。

    5.變長參數:在c語言中,用...來表示函數的參數個數不是固定的,那麼在Python中,咱們首先會想到能夠傳遞一個tuple, list, dict,tuple, list, dict裏面能夠存聽任意數量的值。如:

def cal_sum(num_list):
    sum = 0
    for num in num_list:
        sum += num
    return sum

list1 = [1, 2, 3]
print(cal_sum(list1))
>>>
6

    課時這樣子有個缺陷,就是每次都要把要傳遞的值保存到list中,Python經過*和**來解決,由Python幫咱們完成此操做。

def cal_sum(*var_tuple):
    sum = 0
    for num in var_tuple:
        sum += num
    return sum

print(cal_sum(1, 2, 3, 4))
print(cal_sum(1, 2, 3, 4, 5, 6))
list1 = [1, 2, 3]
print(cal_sum(*list1))
>>>
10
21
6

    *不能傳遞命名參數,必須使用**

def create_window(**var_dict):
    print(var_dict)
    for(k, v) in var_dict.items():
        print(k ,v)

create_window(name='window1', height=300, width=200)
dict1 = {'name':'window2', 'width':200, 'height':300}
create_window(**dict1)
>>>
{'name': 'window1', 'height': 300, 'width': 200}
name window1
height 300
width 200
{'name': 'window2', 'height': 300, 'width': 200}
name window2
height 300
width 200

    Note: 在函數的var_tuple參數前加上*,表示var_tuple接收的是一個tuple, 在var_dict參數前加上**,表示var_dict接收的是一個dict。

    而在調用cal_sum函數時,在list1前面加上*,表示把list1中的元素做爲可變參數傳遞進去。在調用create_window函數時,在dict1前面加上**,表示把dict1中的元素做爲命名的可變參數傳遞進去。

    6. 函數的返回值。在Python中是能夠有多個返回值的

def return_value():
    a = 1
    b = 2
    return a, b, a+b

num1, num2, num3 = return_value()
print(num1, num2, num3)

>>> 
1 2 3

    實際上Python會將全部的返回值存放到一個臨時的tuple中,若是隻有1個變量來接收返回參數,那麼就會將此變量引用此tuple,若是有多個變量來接收返回參數,Python會對tuple變量進行unpack,此時會要求接收變量的個數與返回值的個數同樣才行。

相關文章
相關標籤/搜索