python函数与参数

温馨提示:

             本文仅限参考,因为每个人理解的函数意思都不一样。

python中函数定义:函数是逻辑结构化和过程化的一种编程方法

python中函数定义方法:

    def test(x):
       "The function definitions"
        x+=1
        return x
    def:定义函数的关键字
    test:函数名
    ():内可定义形参
    "":文档描述(非必要,但是强烈建议为你的函数添加描述信息)
    x+=1:泛指代码块或程序处理逻辑
    return:定义返回值
    调用运行:可以带参数也可以不带
    函数名()

使用函数的好处:
     1.代码重用
     2.保持一致性,易维护
     3.可扩展性

函数和过程:
        过程定义:过程就是简单特殊没有返回值的函数
        这么看来我们在讨论为何使用函数的的时候引入的函数,都没有返回值,没有返回值就是过程,没错,但是在python中有比较神奇的事情

def test01():
            msg = 'hello The little green frog'
            print (msg)

        def test02():
            msg = 'hello WuDaLang'
            return msg

        t1 = test01()

        t2 = test02()

        print ('from test01 return is [%s]' % t1)
        print ('from test02 return is [%s]' % t2)
当一个函数/过程没有使用return显示的定义返回值时,python解释器会直接返回为None,所以在python中即便是过程也可以算作函数。
        def test1():
             pass
        # 补充:
        #    pass:指空代码,无意义,仅仅用于表示代码块

        def test02():
             return 0,10,'hello',['alex','server'],{'sb':'lb'}

        t1=test1()
        t2=test2()

        print ('from test1 return is [%s]: ' %type(t1),t1)
        print ('from test2 return is [%s]: ' %type(t2),t2)
   
  补充:

   返回值数=0:返回None

   返回值数=1:返回object

   返回值数>1:返回tuple

函数参数:

    形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
    实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传 送给形参。因此应预先用赋值,输入等办法使参数获得确定值

def text(x, y):
    # 形参(x, y)
    '''
    :param x:整型数字
    :return: 返回计算结果
    '''
    res = x ** y
    return res
# 常量
text(2,3)
# 实参
a = 2
b = 3
c = text(a,b)
print(c)

一、位置参数

调用函数时根据函数定义的参数位置来传递参数

def text(x, y):
    print(x)
    print(y)
# 位置参数,实参与形参位置一一对应
text(1, 2)

二、关键字参数

位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序的

def text(x,y,z):
    print(x)
    print(y)
    print(z)
# 关键字参数,位置无需固定
text(x=1,y=3,z=2)

三、位置参数与关键字参数混合使用

def test(x,y,z):
    print(x)
    print(y)
    print(z)
# 位置参数一定要在关键字参数左边
test(1,y=2,z=3)

四、默认参数

'''
 默认参数,为参数提供默认值,调用函数时可传可不传该默认参数的值
'''
# 位置参数一定要在默认参数左边否则报错
def handle(x, type="world"):
    print(x)
    print(type)
handle(x=1,type='type')
# 错误:错误的定义方式
# def handle(age=1,x):
# 错误: 注意不能这样写,type参数就变成位置参数了,没有什么意义了
# handle('hello',type)

五、可变参数

1、包裹位置参数

'''
*args将实参中按照位置传值,把多出来的值都给args,args收集起来,合并一个元祖(tuple)的方式呈现
'''
# 参数组(不固定长度参数):*列表 **字典
def text(x, *args):
    print(x)
    print(args)
# 以元组形式展示
text(1, 1, 2, 3)

2、包裹关键字参数

'''
**kwargs将实参按照关键字传值,把多余的值给kwargs,kwargs收集起来,合并一个字典(dict)的方式呈现
'''
# *args只能处理位置参数,关键字参数不能用*args,需要通过**kwargs来处理
test(1,y=2,z=3)
def test(x,**kwargs):
    print(x)
    print(kwargs)
# 以字典形式展示
test(1,y=2,z=3)
# 错误:z=3一个参数不能传两个值,否则报错
# test(1,y=2,z=3,z=3)

六、解包裹参数

*和**,也可以在函数调用的时候使用,称之为解包裹(unpacking)

1、在传递列表或字典时,让的每一个元素对应相应的位置参数

def test(x, *args):
    print(x)
    # 列表索引取值
    print(args[0][0])
    # 字典键值对取值
    print(args[0]['y'])
    # 转化
    print(args)
# 列表
test(1, [1, 2, 3])
# 字典
test(1,{'y':'z'})
# 列如把列表或字典以元组的形式展示,只需要在列表或字典前面加上*
test(1,*[2,3,4,4])
test(1,*{'key':'value','key2':'value'})

​

2、在传递词典字典时,让词典的每个键值对作为一个关键字参数传递给函数

def test(x,**kwargs):
    print(x)
    # 通过索引取值
    print(kwargs)
test(1,**{'key':'value'})
错误:需要在上**如果不加上**则报错
TypeError: test() takes 1 positional argument but 2 were given

七、*args与**kwargs混合使用

补充:def 函数名(x,**kwargs,*args)不能这样写,函数要按照python所支持规定来定义函数(def 函数名(x,*args,*kwargs))

def test(x,*args,**kwargs):
    print(x)
    # 通过索引取值
    print(args,args[1])
    # 通过字典的key取字典的value
    print(kwargs,kwargs['key'])
    # 通过get获取字典的value
    print(kwargs,kwargs.get('key'))
test(1,*[1,2,3],**{'key':1})

八、位置参数、默认参数、可变参数的混合使用

基本原则:先位置参数,包裹位置,默认参数,包裹关键字(定义和调用都应遵循)

def func(x,*args,type='age',**kwargs):
    print(x)
    print(args)
    print(type)
    print(kwargs)
func(1,3,4,1,4,1,type='name',y=2,z=3)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章