• 函数概念


    一、函数

    可以完成特定功能的代码块,函数就是存放代码块的容器

    1、定义函数的语法:

    函数四部分:(函数执行的本质:执行函数体,得到函数返回值)

    ①函数名 ②函数体 ③返回值 ④参数

    # 用def关键词来声明函数
    
    def  函数名(参数们)
          函数体
          return返回值
    
    def   fn(money):
           print('你付了%s元钱' % money)
           print('函数的一行代码')
           print('函数的二行代码')
           return '冰红茶'
    print(fn, id(fn))     # fn直接打印,只能看到函数存放代码的地址
           
    fn(10)
    msg = fn(10)
    print(msg)
    
    # 函数的返回值也称之为函数值,就是函数执行结束后的结果
    # 可以用变量接受 | 可以直接打印 | 可以直接使用

    2、如何使用函数(函数一定要先定义在调用)

    函数名:拿到函数的地址

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

    函数名(参数):执行函数并传入参数

    函数名():执行完毕后,会得到函数的返回值,返回值就跟普通变量一样,可以直接打印、使用、运算

    def fn(num):
        print("传入的num值:%s" % num)
        return '收到了'
    
    res = fn(10)
    
    # 控制台会打印:传入的num值:10
    # res的值为:'收到了'

    3、函数的分类

    ①按函数体进行分类

    # 空函数:项目之初,知道项目有哪些功能,但还没有明确功能体,可以用pass进行函数体填充
    def computed():
        pass
    
    # 非空函数:有函数体 def add(n1, n2): return n1 + n2 res = add(10, 20) # 结果为 30 print(res)

    ②按参数列表进行分类

    # 无参函数:函数体运行不需要外界提供参数
    def msg():
        print('hello')
    msg()
    
    
    # 有参函数:函数体运行需要外界提供参数
    def msg(p1, p2):
        print('欢迎%s和%s' % (p1, p2))
    p1 = input('输入一号领导名:')
    p2 = input('输入二号领导名:')
    msg(p1, p2)

    ③按返回值进行分类:return是用来结束函数的

    # 空返回
        没有return的函数
        空return
    
    # 值返回
        return一个值
        return多个值
    
    
    
    # 空返回
    def fn1():
        print('fn1 run')
    
    
    def fn2():
        print('fn2 run')
        return
        return None
    res = fn2()
    
    # 无return函数与空return函数的区别
    # 空return:可以根据具体情况主动退出函数(像break结束循环一样)
    
    
    
    
    # 值返回
    # 一个值的返回
    def add(n1, n2):
        return n1 + n2
    print(add(10, 15))
    
    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)
    
    
    # 多个值的返回: 本质就是返回装有多个值的元组
    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)
    
    res = computed(50, 25)  # 得到的是装有所有结果的元组
    print(res)

    4、函数的嵌套调用

    ①定义:在一个函数内调用另一个函数。在解释过程中,不执行函数体,在函数被调用时,函数体才被执行

    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
    
    print(max_2(200, 30))
    
    # 获取三个数的最大值
    def max_3(n1, n2, n3):
        if n1 > n2 and n1 > n3:
            return n1
        if n2 > n1 and n2 > n3:
            return n2
        return n3
    def max_3(n1, n2, n3):
        m2 = max_2(n1, n2)
        return max_2(m2, n3)
    
    print(max_3(300, 30, 30))
    
    # 四个数
    def max_4(n1, n2, n3, n4):
        m2 = max_2(n1, n2)
        return max_3(m2, n3, n4)
    print(max_4(10,30,20,0))

    5、指定文件名的文件复制

    def copy_file(source, target):
        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')

    6、偏函数:先给函数传一个值进去

    from functools import partial
    
    def test(x, y, z):
        return x + y + z
    
    test = partial(test, 1)
    print(test(2, 3))   # 6

    二、例子

    1、定义一个函数,该函数可以实现控制台输入,最终返回一个int类型的正整数

    def fn1():
        while True:
            num = input("num: ")
            if num.isdigit():
                return int(num)
    res = fn1()
    print(res)

    2、定义一个函数,该函数可以实现用户录入,最终返回一个int类型的负整数

    def fn2():
        while True:
            num = input("num: ")
            b1 = num.startswith('-')
            b2 = num.count('-') == 1
            if b1 and b2 and num.split('-')[1].isdigit():  # and短路
                return int(num)
    res = fn2()
    print(res)

    3、定义一个函数,实现传入一个数或是字符串,返回值是 是否 是可转换为整数类型的数据

    def fn3(num):
        if isinstance(num, (int, float)):
            return True
        elif isinstance(num, str):
            b1 = num.startswith('-')
            b2 = num.count('-') == 1
            if b1 and b2 and num.split('-')[1].isdigit():
                return True
            elif num.isdigit():
                return True
        return False
    print(fn3('-3'))

    4、定义一个函数,实现传入一个整型数字,判断并直接打印该数字是否是奇数还是偶数

    def fn4(num):
        if num % 2 == 0:
            print('偶数')
        else:
            print('奇数')
    print(fn4(10))

    5、定义一个函数,实现判断传入数据的类型,并直接打印其类型

    def fn5(any_arg):
        if isinstance(any_arg, bool):
            print('布尔')
            return
        if isinstance(any_arg, int):
            print('整型')
    fn5(True)

    6、定义一个函数,只要传入 "k1:v1,...,kn:vn" 格式的字符串,都可以将其转换为 {'k1':'v1',...,'kn':'vn'} 

    def fn7(string):
        dic = {}
        k_v_s = string.split(',')
        for k_v in k_v_s:
            k, v = k_v.split(':')
            dic[k] = v
        return dic
    print(fn7('k1:v1,k2:v2,kn:vn'))

    7、定义一个函数,实现列表与元组类型的反转功能

    def fn8(arg):
        if isinstance(arg, tuple):
            return list(arg)
        return tuple(arg)
    print(fn8([1, 2]))

    8、定义一个函数,可以完成对list、tuple、dict、set四种类型数据的循环变量打印, 不是这四种,则打印 "暂不支持该数据遍历"

    def fn9(arg):
        if isinstance(arg, (list, tuple, dict, set)):
            for v in arg:
                print(v)
        else:
            print("暂不支持该数据遍历")
    fn9({'a': 1})

    9、定义一个函数,实现对单列集合进行去重的功能 # 解析:单列集合有list、tuple、set

    传入list、tuple、set,返回去重后的list、tuple、set,考虑可变与不可变类型的不同处理

    def fn10(arg):
        if isinstance(arg, set):  # set直接返回
            return arg
        temp_list = []  # 去重列表
        for v in arg:
            if v not in temp_list:
                temp_list.append(v)
        if isinstance(arg, tuple):  # tuple就转换后返回
            return tuple(temp_list)
        return temp_list  # 就只剩list了

    10、定义一个函数,实现文件(不一定是文本文件)的跨文件夹的剪切

     解析:1.传入要读取的目标文件夹中的目标文件

    2.在被告知的目标文件夹下复制成同名文件

    3.调用os中删除文件的功能将原文件删除

    import os
    def fn11(file, folder):
        with open(file, 'rb') as r:
            # 文件名
            file_name = r.name
            path = r'%s\%s' % (folder, file_name)
            with open(path, 'wb') as w:
                for line in r:
                    w.write(line)
        os.remove(file)
    
    fn11('temp.txt', 'abc')
  • 相关阅读:
    Ubuntu12下未知驱动器处理
    Octopress博客设置
    Windows下搭建Octopress博客
    在Asp.Net中使用JQueryEasyUI
    SQL查询将列转换成字符串(for xml path)
    IIS7上传出现乱码问题解决
    SqlServer开发利器—SQL Prompt5
    读《打造FaceBook》
    在VS2010中使用Git【图文】
    怎样提高开发效率
  • 原文地址:https://www.cnblogs.com/zhangguosheng1121/p/10616078.html
Copyright © 2020-2023  润新知