函数

1、函数定义

def funcname(param) :

            pass

以def打头地称为函数头,函数头以冒号结尾。函数头后面是可选的文档字符串。文档字符串后面所有缩进的代码称为函数体。最后函数使用关键字return 返回一个值。return语句执行时,python跳出函数并返回到调用这个函数的地方。也可以没有return语句,没有返回值。

python文档字符串通常遵循一种标准格式约定:用三引号标识文档字符串的开始和结束位置,用于说明函数的功能。和内置函数一样,可以使用funcname.__doc__查看自己编写的函数的文档字符串。

2、变量

变量的作用域:指变量在程序的哪些地方可访问或可见。

局部变量:

    首次赋值发生在代码块内部的变量称为局部变量。局部变量只能在其所属代码块中使用,在代码块之外,就不能访问了。如函数的参数,内部定义的变量都是局部变量,只能在其所属函数内部使用,在函数外面,不能访问函数的局部变量,函数结束时,其局部变量被自动删除。

全局变量:

    在代码块之外声明的变量称为全局变量,它不属于任何函数和代码块,任何函数和代码块都可读取它。但是在代码块或函数中使用全局变量时,需要注意,必须使用关键字global;否则,会被视为局部变量。

#global_correct.py
name = 'Jack'
def say_hello():
	print('Hello ' + name + ' !')
def change_name(new_name):
	global name
	name = new_name

>>> say_hello()
Hello Jack !
>>> change_name('Pipe')
>>> say_hello()
Hello Pipe !
>>>

 

3、函数参数

按引用传递

    向函数传递参数时,python采用按引用传递的方式,这一位置当你传递参数时,函数将使用新变量名来引用原始值。python不支持按值传递。有些语言如C语言,可按值传递参数。按值传递参数时,将创建其拷贝,并将该拷贝传递给函数。如果传递的值很大,复制可能消耗大量时间和内存。

 

位置参数

    必须按照顺序传入参数。

 

默认参数

    默认参数可以简化函数的调用,设置默认参数时要注意:
           1、必选参数在前,默认参数在后,否则python解释器会报错。
           2、设置默认参数时,当函数有多个参数时,把变化大的参数放在前面,变化小的参数放在后面。变化小的参数就可以作为默认参数。
          有多个默认参数时,调用的时候,既可以按顺序提供默认参数,也可以不按顺序提供部分默认参数,当不按顺序提供部分默认参数时,需要报参数名写上。
            定义默认参数时,必须牢记一点,默认参数必须指向不变对象。
            def add_end(L=[]):
                L.append("end")
                return L
            
            def add_end(L = None):
                if L is None:
                    L = []
                L.append("end")
                return L
        
        
可变参数

    传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
          格式:
                def func(*param):
                    print(param)
    定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号,在函数内部,参数param接收到的是一个tuple,因此函数代码完全一样。
    但是,调用时,可以传入任意个参数,包括0个参数。
            func(p1, p2, p3)
     如果有一个list或tuple,允许在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去。
            nums = [1, 2, 3]
            func(*nums)
            *nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,也很常见。
           

关键字参数

    可变参数允许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
    而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
     在函数调用时,可以只传入必选参数,也可以传入任意个数的关键字参数。
                def person(name, age, **kw):
                    print(name, age, kw)
                当有一个dict时,可以用**dictname将dictname转换为关键字参数,传入到函数中。
                如:extra = {'city':'beijing', 'job':'teacher'}
                    person('jack',30, **extra)
        
命名关键字参数

    对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数,至于到底传入了哪些,就需要在函数内部通过kw检查。
    如果要限制关键字参数的名字,就可以用命名关键字参数。和关键字参数**kw不同,命名关键字参数需要一个特殊的分隔符*,*后面的参数被视为命名关键字参数。
    如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了。命名关键字参数必须传入参数名,这和位置参数不同,如果没有传入参数名,调用将报错。
    命名关键字可以有缺省的默认值,从而简化调用。
    使用命名关键字参数时,特别要注意,如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺少*,python解释器将无法识别位置参数和命名关键字参数。
        
组合参数

     定义函数,可以用必选参数,默认参数,可变参数,关键字参数和命名关键字参数,这五种参数可以组合使用。但是请注意:参数定义的顺序必须是:必选参数,默认参数,可变参数,命名关键字参数,关键字参数。
      在函数调用时,解释器自动按照参数位置和参数名把对应的参数传递进去。
      对于任意函数,都可以通过类似的func(*args, **kw)的形式调用它,无论参数是如何定义的。
      虽然可以组合多达5种参数,但不要使用太多的组合,否则函数接口的可理解性很差。
           

总结:函数具有非常灵活的参数形态,既可以实现简单的调用,也可以传入非常复杂的参数。
     默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误。
     要注意定义可变参数和关键字参数的语法:
                *args是可变参数,args接收的是一个tuple;
                **kw是关键字参数,kw接收的是一个dict。
     

     调用函数时,传入可变参数和关键字参数的语法:
        可变参数既可以直接传入:func(p1, p2, p3),又可以先组装list或tuple,再通过*args传入:func(*list)
                    如:func(1,2,3) 或func(*(1,2,3)) 、 func(*[1,2,3])
       关键字参数既可以直接传入:func(para1 = p1, para2 = p2),又可以先组装dict,再通过**kw传入:func(**dict)
                    如:func(a=1,b=2)或 func(**{'a':1, 'b':2})
        使用*args和**kw是习惯用法,当然也可以用其他参数名,但最好使用习惯用法。
         命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
         定义命名关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。
   

 

转载于:https://my.oschina.net/u/3767248/blog/1605825

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值