函数及嵌套函数调用

函数


'''
函数:
>>> 重复利用的工具
>>> 可以完成特定功能的代码块,函数就是存放代码块的容器
'''

定义函数的语法

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

  • 用def关键词来声明函数
def 函数名(参数们):
    函数体
    return '返回值'

如何使用函数


'''
函数名:拿到函数的地址
函数名(): 拿到函数的地址,并执行函数中存放的代码块(函数体)  *****
函数名(参数):执行函数并传入参数

函数名(): 执行完毕后,会得到函数的返回值,返回值就跟普通变量一样,可以直接打印、使用、运算
'''
def fn(num):
    print("传入的num值:%s" % num)
    return '收到了'

res = fn(10)

# 控制台会打印:传入的num值:10
# res的值为:'收到了'
def fn(money):
    print('你付了%s元钱' % money) #你付了10元钱
    print('函数的一行代码') #函数的一行代码
    print('函数的二行代码') #函数的二行代码
    return '冰红茶'
# fn直接打印,只能看到函数存放代码的地址
print(fn, id(fn))  # <function fn at 0x0000020E45B71F28> 2260322426664
print('--------------------------------------')
# 使用函数: 函数名()
fn(10) #冰红茶

print("把水喝了")
# 函数的返回值也称之为函数值,就是函数执行结束后的结果
# 可以用变量接受 | 可以直接打印 | 可以直接使用
msg = fn(10)
print(msg) #冰红茶

print('>>>>', fn(10) + '好喝') #>>>> 冰红茶好喝
# 函数执行的本质:执行函数体,得到函数返回值
# 注:函数一定要先定义在调用

函数的分类

根据函数体划分
  • 空函数:项目之初,知道项目有哪些功能,但还没有明确功能体,可以用pass进行函数体填充

    def computed():
        pass
    
  • 非空函数:用函数体

    def add_num(n1, n2):
        ''' 函数的注释
        :param n1: 第一个数
        :param n2: 第二个数
        :return: 两个数之和
        '''
        return n1 + n2
    
    # print(a)
    # a = 10
    
    computed()
    
    res = add_num(10, 20)
    print(res)
    
    a = 50
    b = 100
    print(add_num(a, b))
    
根据参数列表划分
  • 无参函数:不需外界资源
def start():
    print('系统启动')
start()
  • 有参函数:需要外键资源
def login(usr, pwd):
    if usr == 'owen' and pwd == '123':
        print('登录通过')
	else:
        print('登录失败')
        
 login('owen', '123')
根据返回值划分:return是用来结束函数的
  • 空返回:返回None
# 没有return的函数
def demo(x, y):
    print( x + y )
# 空return    
def demo(x, y):
    print( x + y )
    return  # 用来强行结束函数的(像break结束循环一样)
def fn1():
    print('fn1 run!!!')
    
res = fn1()
print('没有return关键字的返回值:%s' % res)  # None

def fn2():
    print('fn2 run!!!')
    return
    return None

res = fn2()
print('空return关键字的返回值:%s' % res)  # None

# 无return函数与空return函数的区别
# 空return:可以根据具体情况主动退出函数(像break结束循环一样)
def fn3(msg):
    print('fn3 第一行逻辑')

    # msg信息不正常:'' | None
    if msg == '' or msg is None:
        # 结束函数
        return

    print('msg信息正常: %s' % msg) # msg: 

msg = input('msg: ')
fn3(msg) # fn3 第一行逻辑
  • 一值返回
def demo(x, y):
    return x + y
# 案例
def add_num(n1, n2):
    return n1 + n2
print(add_num(10, 15)) # 25

def computed(n1, n2):
    # 返回四则运算的结果
    r1 = n1 + n2
    r2 = n1 - n2
    r3 = n1 / n2
    r4 = n1 * n2
    return [r1, r2, r3, r4]

a, b, c, d = computed(50, 25) # 利用交叉赋值
print(a, b, c, d #75 25 2.0 1250
  • 多值返回
def demo(x, y):
    return x + y, x - y, x * y, x / y # 本质就是返回装有多个值的元组
# 案例
def computed_sup(n1, n2):
    # 返回四则运算的结果
    r1 = n1 + n2
    r2 = n1 - n2
    r3 = n1 // n2
    r4 = n1 ** n2
    return r1, r2, r3, r4
# 单个值返回
a, b, c, d = computed_sup(50, 25)
print(a, b, c, d) # 75 25 2 2980232238769531250000000000000000000000000
# 多个值返回
res = computed_sup(50, 25)  # 得到的是装有所有结果的元组
print(res) # (75, 25, 2, 2980232238769531250000000000000000000000000)

函数的嵌套调用

# 函数的嵌套调用:在一个函数体中调用另一个函数

# 在解释过程中,不执行函数体,在函数被调用时,函数体才被执行
def fn1():
    print('fn1 run')
    fn2()

def fn2():
    print('fn2 run')
    fn3()

def fn3():
    print('fn3 run')

# 注:在fn1中调用了fn2,所以调用fn1的逻辑应该在fn2定义之后
fn1()

#案例
# 求两个数最大值
def max_2(n1, n2):
    if n1 > n2:
        return n1
    return n2

# 求三个
def max_3(n1, n2, n3):
    m2 = max_2(n1, n2)
    return max_2(m2, n3)

# 求四个
def max_4(n1, n2, n3, n4):
    m2 = max_2(n1, n2)
    return max_3(m2, n3, n4)

# 循环调用:在一个函数的内部调用另一个函数


指定文件名的文件复制
# 直接调用复制文件函数
def copy_img(target_img):
    with open('001.jpg', 'rb') as r, open(target_img, 'wb') as w:
        for line in r:
            w.write(line)
         
copy_img('888.jpg')
copy_img('999.jpg')

def copy_file(source, target):
    '''
    :param source: 被复制的文件
    :param target: 复制得到的文件
    :return:
    '''
    with open(source, 'rb') as r, open(target, 'wb') as w:
        for line in r:
            w.write(line)

copy_file('cmd.txt', 'aaa.txt')
copy_file('temp.txt', 'ttt.txt')
原文地址:https://www.cnblogs.com/fuwei8086/p/10615584.html