码迷,mamicode.com
首页 > 编程语言 > 详细

Python入门(八) 函数基础

时间:2015-08-15 01:41:22      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

    1. 定义一个函数:

    1)必须以def开头

    2)参数之间用,隔开

    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. 函数的参数传递    

    我们知道在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编程中经常用到。

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. 命名参数:默认的函数调用过程中,参数的传递是通过位置进行的,如果函数的个数比较多的情况下,我们很有可能会搞不清楚参数的位置,这个时候通过命名参数,就能很好的解决

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,此时会要求接收变量的个数与返回值的个数一样才行。


Python入门(八) 函数基础

标签:

原文地址:http://my.oschina.net/kaedehao/blog/492808

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!