关于函数参数不可不知的知识

定义函数

    def 函数名(函数形参1,....):
        函数实现代码

函数调用

函数传参

参数类型

immutable

mutable

默认形参值

在函数实参不传值的情况下该形参具备一个默认的值。

减少调用函数时一般情况下传递的参数的数量,便于简化的了编程的繁杂程度。

注意默认参数一般都需要时immutable类型的数据。
    def add_end(L=None):  
        if L is None:  
            L=[]  
        L.append('END')  
        return L

指定形参名称传递值

sender

#coding=utf-8
from socket import *
def sendMessage(host='127.0.0.1',port=8668):
    udpsock = socket(AF_INET,SOCK_DGRAM)
    udpsock.sendto("Hi ,I love you",(host,port))
    recv_data,remote_addr = udpsock.recvfrom(1024)
    print ("recv from %s's data is %s"%(remote_addr,recv_data))
    udpsock.close()

if __name__ == '__main__':
    sendMessage(port=8888,host='8.8.8.8')



server
#coding=utf-8

from socket import *
host='127.0.0.1'
port=8668

udpsock = socket(AF_INET,SOCK_DGRAM)
udpsock.bind((host,port))

for i in range(100):
    recv_data,remote_addr = udpsock.recvfrom(1024)
    print ("recv from %s's data is %s"%(remote_addr,recv_data))
    udpsock.sendto("I love you too", remote_addr)

udpsock.close()

不定长参数

使用* 表示可变参数

#coding=utf-8

def append_list(lst,*args): #函数功能是将可变参数args中的所有数据追加到lst中
    print (type(args))      #<type 'tuple'>
    for data in args:
        lst.append(data)
if __name__ == '__main__':
    lst = [1,23,4,6]
    append_list(lst,1,3,4,6,6,6)
    print (lst)             # [1, 23, 4, 6, 1, 3, 4, 6, 6, 6]

通过现象我们可以得知 *args表示可变数量的参数,在函数调用时将传入的参数为以元组形式存到args中

使用**表示关键字参数

kwargs,keyword args顾名思义就是关键字参数。
    def func(*args,**kw):
        ...
在函数调用时 所有正常形参之外的其他的关键字参数都将以字典形式存在参数kwargs中
def append_list(lst,*args,**kwargs):
    print (type(args))              #<type 'tuple'>
    print (type(kwargs))            #<type 'dict'>
    for data in args:             
        lst.append(data)            #{'a': 1, 'b': 1}
    print (kwargs)

if __name__ == '__main__':
    lst = [1,23,4,6]
    append_list(lst,7,8,9,a=1,b=1)  #[1, 23, 4, 6, 7, 8, 9]
    print (lst)

参数定义的顺序一定要遵循的规则

必选参数、默认参数、可变参数和关键字参数

函数返回值

python不仅可通过return返回一个返回值,还可以返回由多个返回值构成的元组。

#coding=utf-8

def test_func_ret():
    return (1,2,3,4)

if '__main__' == __name__:

    ret = test_func_ret()
    print (type(ret),ret)   # (<type 'tuple'>, (1, 2, 3, 4))

这时候当你接收到元组了,你就可以去遍历元组了。

当然也可以直接用固定的几个变量接收元组中的数据,位置如同要接收的数据在元组中的位置。

#coding=utf-8

def sub(number):
    import math
    s = math.sqrt(number)
    return (s,-s)

if '__main__' == __name__:
    s1,s2 = sub(100)     
    print (s1,s2)          #10.0 -10.0

results matching ""

    No results matching ""