python 函数

简介

# 函数是一系列代码的集合,用来完成某项特定的功能

优点

1. 避免代码的冗余
2. 让程序代码结构更加清晰
3. 让代码具有复用性,便于维护

函数四部分

1. 函数名:使用该函数的依据
2. 函数体:完成功能的代码块
3. 返回值:功能完成的反馈结果
4. 参数:完成功能需要的条件信息

函数的定义与调用的完整语法

# 1、定义

# 1、定义
# def 是声明函数的关键字,后面跟着函数名,括号内是函数的参数
def 函数名(参数1,参数2,参数3,...): 
'''注释'''
函数体 # 函数体写具体的逻辑代码
return 返回的值 # retrun后面是函数的返回值,是函数体代码的运行成果

# 2、调用

注:
	-- 先定义再调用
	-- 函数名存放的是函数地址
	-- ()会触发函数体的执行
	-- 函数执行完毕得到的是函数的返回结果,通常称之为函数的返回值,也称函数值

函数详解

根据函数体划分

空函数:用来罗列功能
# 空函数指的是函数体用pass占位,pass代表什么也不做
def func():           
    pass 

# func():调用后什么是都不干
非空函数:正常可以完成某项功能

def func():           
    print('非空函数') 
    
# func():调用后执行函数体

根据参数列表划分

无参函数:不需外界资源
def start():
    print('系统启动')
start()

有参函数:需要外键资源
def login(usr, pwd):
    if usr == 'owen' and pwd == '123':
        print('登录通过')
	else:
        print('登录失败')
        
 login('owen', '123')

根据返回值划分:return是用来结束函数的

空返回:返回None
def demo(x, y):
    print( x + y )
    
def demo(x, y):
    print( x + y )
    return  # 用来强行结束函数的(像break结束循环一样)

一值返回
def demo(x, y):
    return x + y

多值返回

def demo(x, y):
    return x + y, x - y, x * y, x / y # 本质就是返回装有多个值的元组

形参与实参

def fn(形参们):
	pass
	
fn(实参们)
'''
# 形参:定义函数,在括号内声明的变量名,用来接受外界传来的值
# 实参:调用函数,在括号内传入的实际值,值可以为常量、变量、表达式或三者的组合

# 注:形参随着函数的调用而产生,随着调用结束而销毁(有特例)

实参分类

位置实参:必须按照顺序给形参传值
关键字实参:按照关键字给形参传值,所以顺序可以颠倒

# 注:位置实参、关键字实参共存是,关键字实参必须出现在所有位置实参之后

形参的分类

位置形参:位置实参与关键字实参都可以对其传参
默认形参:位置实参与关键字实参都可以对其传参,也可以不被传参
可变长位置形参:接收位置形参、默认形参没有接收完的所有位置实参
无初值关键字形参:只能由关键字实参传值
有初值关键字形参:只能由关键字实参传值,也可以不被传值
可变长关键字形参:接收两种关键字形参没有接收完的所有关键字实参

注:各种形参出现的先后
位置形参 - 默认形参 - 可变长位置形参 - 无|有初值关键字形参 - 可变长关键字参数
'''
def fn(a, b, c=10, *args, d, e=20, f, **kwargs):
    pass
# 位置形参:a、b
# 默认形参:c
# 可变长位置形参:args
# 无初值关键字形参:d、f
# 有初值关键字形参:e
# 可变长关键字参数:kwargs

可变参数的整体使用

# 1、可变位置形参以元组方式接收值
# 如:接收10,20,30三个数
def fn1(*args):
    print(args)  # (10, 20, 30)
    
# 第一种传参
fn1(10, 20, 30)

# 第二种传参
t = (10, 20, 30)  # 单列集合及字符串类型都可以
fn1(*t)


# 2、可变位置实参以字典方式接收值
def fn2(**kwargs):
    print(kwargs)  # {'name': 'Owen', 'age': 18}
# 第一种传参
fn2(name='Owen', age=18)

# 第二种传参
d = {'name': 'Owen', 'age': 18}  # 单列集合及字符串类型都可以
fn2(**d)

函数对象

# 函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象

# 函数对象的应用
# 1 可以直接被引用  fn = cp_fn
# 2 可以当作函数参数传递 computed(cp_fn, 100, 20)
# 3 可以作为函数的返回值  get_cp_fn(cmd): return add
# 4 可以作为容器类型的元素  method_map: 对应关系中的值


def add(a, b):
    return a + b
def low(a, b):
    return a - b
def jump(a, b):
    return a * b
def full(a, b):
    return a / b
def quyu(a, b):
    return a % b
def computed(fn, n1, n2):
    res = fn(n1, n2)
    return res
method_map = {
    'add': add,
    'low': low,
    'jump': jump,
    'full': full,
    'quyu': quyu,
}
# 根据指令获取计算方法
def get_cp_fn(cmd):
    if cmd in method_map:
        return method_map[cmd]
    return add  # 输入有误用默认方法处理


while True:
    cmd = input('cmd: ')
    if cmd == 'quit':
        break
    cp_fn = get_cp_fn(cmd)
    result = computed(cp_fn, 100, 20)
    print(result)

名称空间

# 名称空间:存放名字与内存空间地址对应关系的容器
# 作用:解决由于名字有限,导致名字重复发送冲突的问题

# 三种名称空间
# Built-in:内置名称空间;系统级,一个;随解释器执行而产生,解释器停止而销毁
# Global:全局名称空间;文件级,多个;随所属文件加载而产生,文件运行完毕而销毁
# Local:局部名称空间;函数级,多个;随所属函数执行而产生,函数执行完毕而销毁

# 注:
# del 名字:可以移除查找最近的名字与内存空间地址的对应关系
# 加载顺序:Built-in > Global > Local

函数的嵌套定义

# 将函数直接定义到另一个函数内部,就可以使用外部函数的中的名字
def outer():
    num = 20
    def inner():
        print(num)  # inner就可以直接使用outer中的名字
    inner()
outer()

global关键词

def fn()
	global num
    num = 20
    print(num)
# global关键词可以将Local的名字提升为Global的名字
# 一个文件中的Global名字就是一个,所以函数内部外部使用的名字都是一个
fn()  # 注:一定要调用函数,才能产生名字,并提升
print(num)

作用域

# 作用域:名字起作用的范围
# 作用:解决同名字可以共存问题

# 四种作用域
# Built-in:内置作用域,所有文件所有函数
# Global:全局作用域,当前文件所有函数
# Enclosing:嵌套作用域,当前函数与当前函数的内部函数
# Local:局部作用域,当前函数

# 注:
# 不同作用域之间名字不冲突,以达到名字的重用
# 查找顺序:Local > Enclosing > Global > Built-in

len = 10
def outer():
    len = 20  # 外层函数的局部变量:Enclosing - 嵌套作用域
    def inner():
        len = 30
        print('1:', len)  # 30, inner -> outer -> global -> built-in
    inner()
    print('2:', len)  # 20, outer -> global -> built-in
outer()
print('3:', len)  # 10, global -> built-in

del len
print('4:', len)  # len地址, built-in

闭包

# closure:被包裹的函数,称之为闭包

# 完整的闭包结构:1.将函数进行闭包处理;2.提升函数名的作用域

# 案例:延迟加载
def get_site(url): #url='https://www.baidu.com'
    def site():
        response=requests.get(url)
        if response.status_code == 200:
            print(response.text)

    return site
baidu=get_site('https://www.baidu.com')
python=get_site('https://www.python.org')
posted @ 2019-04-01 14:39  zack赵康  阅读(240)  评论(0)    收藏  举报