python函数

一.函数的优点

使代码模块化

代码复用,减少冗余

保证了代码的一致性

python中的函数分为内置函数和自定义函数

内置函数: 如int(), str(), len(), range(), id(), max(), print()等,所有的内置函数参考

本章节来说说自定义函数的定义和使用

二.函数的定义和调用

定义格式:

def 函数名(参数列表):

  语句1

  语句2

  ...

参数列表可以为空,但是括号不能省略

理解形参,实参,位置参数,关键字参数

# 无参定义
def say_hello():    #函数定义
    print("hello dear.")


say_hello()     # 函数调用


# 带有参数的定义
def get_max(a, b):      # 形参(形式参数)
    if a > b:
        print(a)
    else:
        print(b)


get_max(3, 5)       # 传递实参,与形参位置对应,个数也与形参相对应,会按顺序传参(位置参数)
get_max(b=5, a=12)  # 关键字参数调用,这里就可以与参数顺序无关了

输出结果
hello dear.
5
12

默认值参数:就是不传参数,会用默认的值,传了参数的就会使用传的参数

def connect_mysql(host, user, password, port=3306):    # port=3306为默认参数
    pass                            # pass就类似一个占位符,保证函数完整,没有语法错误


host = input("input host:")
user = input("input user:")
password = input("password")

connect_mysql(host, user, password)            # 不用再传port的值的,默认就是3306;也可以传一个新的值替代3306

可变长参数:参数的个数不确定,理论上有无限多个,但一般不会超过6或7个

# 可变长参数
def get_sum(*num):      # 求和,参数名前面加*(变量名可以自定义)就可以定义为可变长参数
    summ = 0
    for i in num:
        summ += i
    return summ


print(get_sum(1, 2, 3, 4, 5, 6, 7, 8, 9))


def print_alpha(*args):     # 打印字符串
    for i in args:
        print(i)


print_alpha("a", "b", "c")

输出结果
45
a
b
c

多个关键字参数转字典

def test(**kwargs):            # **两个后面加变量(变量名可以自定义),这样后面传多个值(需要传关键字参数),并且结果为字典
    print(kwargs)

    
test(name="zhangsan", age=18, gender="M")

def people(name, *args, age=18, **kwargs):
    print(name)
    print(args)
    print(age)
    print(kwargs)

    
people("zhangsan", "man", 25, salary=20000, department="IT")
people("zhangsan", "man", 180, age=25, salary=20000, department="IT")
people("zhangsan", "man", 180, 25, salary=20000, department="IT")

三.函数返回值

函数的功能是单一的,一个函数只完成一个功能

调用函数时,函数执行完成会有一个执行结果,将执行结果返回给调用者,函数使用return关键字

当执行到return时,说明函数执行完成,会退出函数

def test(a, b):
    c = a + b
    return c
    print("haha")    # 返回值后面的代码不执行,也就是说函数执行到return就结束了

test(1, 2)        # 再回顾一下,这是函数的调用,执行函数体内的代码,但这样得不到函数返回值

d = test(1, 2)
print(d)            # 这样终于得到函数的返回值了

print(test(1,2))    # 不赋值给变量,直接打印也是可以得到函数的返回值

四.变量的作用域

局部变量和全局变量

name = "zhangsan"       # 全局变量

def change_name():
    name = "lisi"    # 这个变量只能在函数内生效,也就是局部变量(可以说这个函数就是这个变量的作用域)
    gender = "male"

    
change_name()        
print(name)            # 结果为zhangsan
print(gender)        # 这句会报错,因为它是局部变量,在外面调用不了
name = "zhangsan"       # 全局变量

def change_name():
    global name,gender     # 这句可以把name改为全局变量,但不建议这样用,如果多次调用函数,这样很容易混乱,容易与外部的变量冲突
    name = "lisi"
    gender = "male"
    print(name)

    
change_name()        # 这句结果为lisi,调用函数内部的print(name)得到的结果
print(name)            # 这句结果为lisi
print(gender)        # 可以调用gender变量了,能打印出结果

五.装饰器

定义一个简单的装饰器

'''
装饰器:就是把一个函数作为参数,返回一个加强版的函数,实质就是一个返回函数的函数

可用于修改一些函数的功能,但是不能修改原函数
'''

# example 1
def add(a, b):      # 只有求和的功能
    print(a+b)


def poweradd(func):     # poweradd为一个装饰器,返回一个新函数inner,新函数是在add函数的基础上加了新的功能
    def inner(a, b):
        print("hello world")
        add(a, b)
    return inner


f = poweradd(add)
print(type(f))    # <class 'function'>
f(3, 6)

输出结果
<class 'function'>
hello world
9

复杂一点的装饰器,使用@符号

def outer(func):
    def inner(name, age):
        if age < 0:
            age = 0
            func(name, age)     # 执行作为参数传过来的函数
    return inner


# 使用@符号作用于函数,相当于给函数加上装饰器
@outer      # 相当于 myprint = outer(myprint)
def myprint(name, age):
    print("{} is {} years old".format(name, age))

# myprint = outer(myprint)

myprint("xiaoming", -12)

输出结果
xiaoming is 0 years old

定义一个通用的装饰器,当传递多个参数时,也可以使用

def outer(func):
    def inner(*args, **kwargs):
        # 在这里添加新功能修饰传入的函数
        print("***********")

        return func(*args, **kwargs)    # 如果func函数有返回值则在这里返回
    return inner


@outer
def myprint(name, age, sex):
    print("{} is {} years old,and is a {}".format(name, age, sex))


myprint("xiaoming", 23, "man")

输出结果
***********
xiaoming is 23 years old,and is a man

 

posted @ 2019-05-05 08:34  sxlong_work  阅读(299)  评论(0编辑  收藏  举报