函数

  一 参数的传递:

    1 Python的函数参数传递的是实际对象的内存地址。

    2 Python的数据类型分可变数据类型和不可变数据类型。

>>> a=1
>>> def func(a):
...     print('在函数内部修改之前,变量a的内存地址为: %s' % id(a))
...     a=2
...     print('在函数内部修改之后,变量a的内存地址为: %s' % id(a))
...     print('函数内部的a为: %s' % a)
...
>>> print('调用函数之前,变量a的内存地址为: %s' % id(a))
调用函数之前,变量a的内存地址为: 1679419856
>>> func(a)
在函数内部修改之前,变量a的内存地址为: 1679419856
在函数内部修改之后,变量a的内存地址为: 1679419888
函数内部的a为: 2
>>> print('函数外部的a为: %s' %a)
函数外部的a为: 1

  二 参数类型

    1 位置参数,顺序参数,必传参数

    2 默认参数,必须在位置参数之后,尽量指向不变的对象。

def power(x,n=2):
    return x**n

ret1 = power(10)
ret2 = power(10,4)
def func(a=None):    #将a设置为一个类似None、数字或字符串的不可变对象。在函数内部,转变为可变类型,如空列表。如a=[],则结果为['A'],['A','A'],['A','A','A']
    # 注意下面的if语句
    if a is None:
        a = []
    a.append("A")
    return a

print(func())
print(func())
print(func())

    3 动态参数;*args和**kwargs;必须放在所有位置参数和默认参数的后面。

      *args:将实际参数打包成一个元组传入形式参数。如果是一个列表,则将列表当做一个参数传入。可将内部元素逐一作为参数传入,字典将key传入

>>> def func(*args):
...     for arg in args:
...             print (arg)
...
>>> func('a','b','c')
a
b
c
>>> li=[1,2,3]
>>> func(li)
[1, 2, 3]

>>> func(*li)
1
2
3

      **kwargs:接受键值对的动态参数。调用时将实际参数打包成字典

>>> def func(**kwargs):
...     for kwg in kwargs:
...             print(kwg,kwargs[kwg])
...             print(type(kwg))
...
>>> func(k1= 'v1',kw=[0,1,2])
k1 v1
<class 'str'>
kw [0, 1, 2]
<class 'str'>
>>> dic={'k1':'v1','k2':'v2'}
>>> func(dic)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() takes 0 positional arguments but 1 was given
>>> func(**dic)
k1 v1
<class 'str'>
k2 v2
<class 'str'>

    4 关键字参数 使用*将其与位置参数及默认参数分隔。必须传入参数名,必须传递,或缺省值。如已有*args则不需要*

def student(name, age, *, sex):      #必须声明sex参数名
    pass

student(name="jack", age=18, sex='male')

 

posted on 2018-08-15 18:12  voldermorter  阅读(89)  评论(0)    收藏  举报