Python自定义函数

函数是Python内建的一种封装,我们把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂的任务分解成简单的任务,这种分解称为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。Python提供了很多内置函数,比如print(),你也可以自己创建函数,这被叫做自定义函数。

函数的几个概念

  • 基本语法
def 函数名(形式参数):
    函数体
    return 返回值

形式参数和返回值不是必须的,但函数都是有返回值的,如果没有使用关键字return关键字,则函数默认返回None。

  • 形式参数(形参)
  • 实际参数(实参)
  • 返回值

形参的几种形式

  • 缺省参数,又叫默认参数
  • 可变参数 *args

*args 表示可变参数,就是传入的参数个数是可变的,可以是1个,2个到任意个或者0个。其实就是将传入的一堆参数打包成元组使用。

  • 关键字参数 **kwargs

**kwargs 将传入的0个或者多个含参数名的参数打包成字典使用。

  • 不同形式参数之间组合

作用域

在函数外部,locals()和globals()作用完全相同。而当在函数内部调用时,locals()则是获取当前函数堆栈中的名字空间,其中存储的是函数参数、局部变量等信息。

>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}
>>> locals() is globals()
True
>>> def func(a):
...     b = a % 2
...     print(locals())
...     print(locals() is globals())
...
>>> func(5)
{'a': 5, 'b': 1}
False
>>> locals() is globals()
True
def f(arg1, arg2, arg3):
    print(arg1, arg2, arg3)

def f(*args):
    print(type(args))
    print(args)

f(3, 2, 1)

def f(**kwargs):
    print(type(kwargs))
    print(kwargs)

f(name="Andy", lang="Chinese")

def f(*args, **kwargs):
    print(args)
    print(kwargs.items())

f(1, 2, name="Andy", lang="Chinese")

def setParms(**kwargs):

    for k,v in kwargs.items():
        print("Setting parameter {0} to {1}".format(k,v))

setParms(streng=13, resistance=0.7, weigh=100)

return

def double_parm(**kwargs):
    return kwargs["weigh"] * 2

print(double_parm(streng=13, resistance=0.7, weigh=100))

函数赋值

def double_parm(**kwargs):
    return kwargs["weigh"] * 2, kwargs["streng"]

new_func = double_parm

print(new_func(streng=13, resistance=0.7, weigh=100))

函数中套函数

def double_parm(**kwargs):

    def check(weight):
        if weight < 100:
            return False
        else:
            return True

    if check(kwargs["weigh"]):
        return kwargs["weigh"] * 2, kwargs["streng"] * 2
    else:
        return kwargs["weigh"] * 2, kwargs["streng"] * 4

new_func = double_parm

print(new_func(streng=13, resistance=0.7, weigh=60))

import os
from sys import version

PATH = "/tmp/folder/name"


# def localFunc():
#     global version
#     version = 13.3
#     print("Local version", version)

# localFunc()
# print(version)


# def getTempContent():
#     tempdir = os.listdir("C:/")

# getTempContent()
# print(tempdir)


def func1():
    print(mvar)
    print(PATH)


def funcBase():
    mvar = 15
    func1()

funcBase()

默认值(缺省值)对函数重载的作用

len多态函数

len(“andy”) len(range(10))

运算符重载多态性 100 + 200 “hello ” + “python”

Python函数没有重载的概念主要是因为动态语言特性以及缺省值

def function(args):
    code
    return

def foo():
    print("this is function")

foo()

# 形式参数
def sayHello(name):
    print("hello, ", name)

sayHello("andy")

# 缺省参数

def sayHello(name="andy"):
    print("hello, ", name)

sayHello()

# 形式参数>缺省参数>*args>**kwargs
# 可变参数
def sayHello(*names):
    print(names)

sayHello("andy", "tommy")

# 顺序传参,关键字传参
def foo(a, b, c):
    print("a is ", a)
    print("b is ", b)
    print("c is ", c)

foo(1, 2, 3)
foo(a=1, b=2, c=3)
foo(b=2, c=3, a=1)
foo(1, c=3, b=2)

def sayHello(**names):
    print(names, type(names))

sayHello(name="andy", age=30)

def foo(a, b=1, *args, **kwargs):
    pass

# 返回值
def foo():
    return 5

a = foo()
print(a)

def foo(a):
    if a < 0:
        return
    return 100 + a

foo(9)
foo(-9)