2022-4-24 函数基础

2022-4-24 函数基础

一、函数的定义

1. 函数的概念(什么是函数) - 机器

函数就是实现某一特定功能的代码的封装。
(函数就是把实现某一功能的代码达成一个包,以后再需要这段代码的功能的时候不需要再写这段代码,而是直接调用这段函数

2. 函数分类(根据函数是谁创建的)

2.1 系统函数(别人造好的机器) - python自带的函数,例如:print、input、type、max、min、sorter等
2.2 自定义函数(自己造的机器) - 由程序员自己创建的函数

3. 定义函数/创建函数 - 造机器

语法:
def 函数名(形参列表):
函数说明文档
函数体

说明:
def - 固定写法;关键字
函数名 - 由程序员自己命名,但是必须符合命名要求和规范
要求:是标识符;不能说关键字
规范:见名知义(看到函数名就大概知道这个函数对应的功能是什么);
字母都小写,多个单词用下划线隔开;
不使用系统的函数名、类名、模块名

(): - 固定写法

形参列表 - 以‘变量名1,变量名2,变量名3,… ’的形式存在,这里的变量名可以有也可以没有。
形参的作用:将函数外部的数据传递到函数里面
怎么确定的形参:看实现函数的功能需不需要额外的数据,需要几个(在 函数体中就把形参当做对应的数据来使用)

函数说明文档 - 本质就是一个多行注释,用来描述函数的功能和使用说法
函数体 - 结构上:和def保持一个缩进的一条或多条语句(至少一条)
逻辑上:函数体就是实现函数功能的代码

4.函数的调用 - 使用机器

4.1 定义函数不会执行函数体,调用函数才会执行函数体
4.2 怎么调用函数

语法:函数名(实参列表)

说明:
函数名: - 需要哪个函数的功能就调用哪个函数,就写哪个的函数的函数名
(注意:函数名必须是定义好的函数的函数名)
() - 固定写法

实参列表 - 以’数据1,数据2,数据3,…'的形式存在
实参就是通过形参从函数外部传递到函数内部具体的数据 (实参是用来给形参赋值的)

4.3 函数调用过程

当代码执行到函数调用语句的时候:
第一步:回到函数定义的位置
第二步:传参(用实参给形参赋值)
第三部:执行函数体
第四部:确定函数返回值
第五步:回到函数调用的位置接着往后执行

二、函数的返回值

1. 返回值

返回值就是从函数内部传递到函数外部的数据

1.1 怎么确定函数返回值(怎么将指定的数据作为函数返回值)
看执行函数体的时候有没有遇到return,如果遇到return,return后面的值就是函数的返回值;如果没有遇到return,返回值是None

1.2 怎么获取函数返回值
获取函数调用表达式的值就是获取函数的返回值
(每个函数调用表达式都是有结果,结果是返回值;所以函数的返回值能做的事,函数调用都可以做)
函数调用表达式:调用函数的语句

1.3 什么时候需要返回值
如果实现函数的功能产生了新的数据,我们就应该将新的数据返回

原因:每次调用函数的时候,系统会自动为这个函数创建一个临时的栈区域,用来保存在函数中产生的数据(形参也是保存在栈区域),
当函数调用结束的时候系统会自动释放这块内存(内存中的数据会被删除),只有返回值不会直接删除

2. return

return在函数中有两个作用:
2.1 返回返回值 - 谁在return的后面,谁就是返回值
2.2 提前结束函数 - 执行函数体的时候如果遇到return,函数直接结束

三、函数的参数

1. 位置参数和关键字参数 - 根据实参传递方式分类

1.1 位置参数:以’实参1,实参2,实参3,…'的形式存在,通过位置一一对应的方式来给形参赋值
1.2 关键字参数:以’形参1 = 实参2 , 形参2 = 实参2, …‘的形式存在,直接用=来确定实参和形参的对应函数

注意:位置参数和关键字参数可以混用,混用的时候位置参数必须在关键字参数的前面

2. 参数默认值

定义函数的时候,可以通过’形参名 = 值’的方式给参数赋默认值,如果一个形参有默认值,那么在调用函数的时候这个形参不用赋值。

注意:定义函数的时候,如果有的参数有默认值有的参数没有,那么没有默认值的参数必须放在有默认值参数的前面

3. 参数类型说明 - 定义函数的时候指定参数类型

参数类型说明即可以提示使用者在调用函数的时候该传什么类型的数据,也可以让参数在函数体中使用的时候有代码提示。

3.1 方法1-没有默认值的参数: 形参:类型
方法2-给参数赋默认值,默认值的类型就是参数的类型

4. 不定长参数

4.1 带*的不定长参数

定义函数的时候,如果在某个形参前面加星号,那么这个参数就变成了一个不定长参数,调用的时候这个形参可以接受若干个实参。

本质:如果形参有*,那么这个参数就会变成一个元组,它接收到的实参会作为这个元组的元素

注意:带的不定长参数在传参的时候只能用位置参数
定长参数和带
的不定长参数混用的时候,*前面的定长参数必须用位置参数传参,*后面的定长参数必须用关键字参数传参

4.2 带**的不定长参数

本质:如果形参前有**,那么这个参数就会自动变成一个字典,它接收到的所有实参就会变成这个字典的键值对

注意:传参的时候只能用关键字参数传参

作业

  1. 编写一个函数,交换指定字典的key和value。

      例如:dict1={'a':1, 'b':2, 'c':3}  -->  dict1={1:'a', 2:'b', 3:'c'}  
    def func1(dict1:dict):
        """
        交换指定字典的key和value
        :param dict1:输入的字典
        :return:交换key和value后的字典
        """
        dict2 = {dict1[x]: x for x in dict1}
        print(dict2)
        return dict2        
    
  2. 编写一个函数,提取指定字符串中所有的字母,然后拼接在一起产生一个新的字符串

       例如: 传入'12a&bc12d-+'   -->  'abcd'  
    def func2(str1:str):
        """
        将字符串中的字母字符拼接,形成新的字符串
        :param str1: 输入的字符串
        :return: 新形成的字符串
        """
        str2 = ''.join(x for x in str1 if 'a' <= x <= 'z' or 'A' <= x <= 'Z')
        print(str2)
        return str2        
    
  3. 写一个自己的capitalize函数,能够将指定字符串的首字母变成大写字母

      例如: 'abc' -> 'Abc'   '12asd'  --> '12asd'
    def func3(str1:str):
        """
        将字符串的首字母变成大写字母
        :param str1: 输入的字符串
        :return: 首字母变成大写字母后的字符串
        """
        if 'a' <= str1[0] <= 'z':
            str2 = str1[0].upper() + str1[1:]
            print(str2)
            return str2        
    
  4. 写一个自己的endswith函数,判断一个字符串是否已指定的字符串结束

       例如: 字符串1:'abc231ab' 字符串2:'ab' 函数结果为: True
            字符串1:'abc231ab' 字符串2:'ab1' 函数结果为: False
    def func4(str1:str,str2:str):
        """
        判断字符串1是否以字符串2结尾
        :param str1: 输入的字符串1
        :param str2: 输入的字符串2
        :return: 判断结果
        """
        l =  len(str2)
        if str1[-len(str2):] == str2:
            result = True
            print(result)
            return result
        else:
            result = False
            print(result)
            return result                    
    
  5. 写一个自己的isdigit函数,判断一个字符串是否是纯数字字符串

       例如: '1234921'  结果: True
             '23函数'   结果: False
             'a2390'    结果: False
    def func5(str1:str):
        for x in str1:
            if not '0' <= x <= '9':
                result = False
                print(result)
                return result
        else:
            result = True
            print(result)
            return result            
    
  6. 写一个自己的upper函数,将一个字符串中所有的小写字母变成大写字母

        例如: 'abH23好rp1'   结果: 'ABH23好RP1'  
    def func6(str1:str):
        """
        将字符串中的字母字符全部转换为大写字母
        :param str1:输入的字符
        :return:
        """
        str2 = str1.upper()
        print(str2)
        return str2            
    
  7. 写一个自己的rjust函数,创建一个字符串的长度是指定长度,原字符串在新字符串中右对齐,剩下的部分用指定的字符填充

       例如: 原字符:'abc'  宽度: 7  字符:'^'    结果: '^^^^abc'
            原字符:'你好吗'  宽度: 5  字符:'0'    结果: '00你好吗'
    def func7(str1:str,str2:str):
        """
        填充输入的字符串
        :param str1:输入的字符串1
        :param str2:输入的字符串2
        :return:填充后的字符串1和字符串2
        """
        str3 = str1.rjust(7,'^')
        str4 = str2.rjust(5,'0')
        print(str3,str4)
        return str3,str4                       
    
  8. 写一个自己的index函数,统计指定列表中指定元素的所有下标,如果列表中没有指定元素返回-1

       例如: 列表: [1, 2, 45, 'abc', 1, '你好', 1, 0]  元素: 1   结果: 0,4,6  
            列表: ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权']  元素: '赵云'   结果: 0,4
            列表: ['赵云', '郭嘉', '诸葛亮', '曹操', '赵云', '孙权']  元素: '关羽'   结果: -1    
    def func8(list1:list,item1):
        """
        查看元素在列表中出现的坐标
        :param list1: 输入的列表
        :param item1: 元素
        :return: 坐标值
        """
        for index,item in enumerate(list1):
            if list1[index] == item1:
                result = index
                print(result)
        return result                    
    
  9. 写一个自己的len函数,统计指定序列中元素的个数

        例如: 序列:[1, 3, 5, 6]    结果: 4
             序列:(1, 34, 'a', 45, 'bbb')  结果: 5  
             序列:'hello w'    结果: 7
    def func9(seq1):
        """
        求序列长度
        :param seq1: 输入的序列
        :return: 序列的长度
        """
        l = len(seq1)
        print(l)
        return l                
    
  10. 写一个自己的max函数,获取指定序列中元素的最大值。如果序列是字典,取字典值的最大值

      例如: 序列:[-7, -12, -1, -9]    结果: -1   
           序列:'abcdpzasdz'    结果: 'z'  
           序列:{'小明':90, '张三': 76, '路飞':30, '小花': 98}   结果: 98
    def func10(seq1):
       """
       找出序列中元素最大的值
       :param seq1: 输入的序列
       :return: 元素的最大值
       """
       if type(seq1) == dict:
           result = max(seq1.values())
           print(result)
           return result
       else:
           result = max(seq1)
           print(result)
           return result                
    
  11. 写一个函数实现自己in操作,判断指定序列中,指定的元素是否存在

        例如: 序列: (12, 90, 'abc')   元素: '90'     结果: False
             序列: [12, 90, 'abc']   元素: 90     结果: True 
    def func11(seq1,item1):
        if item1 in seq1:
            print(True)
        else:
            print(False)                    
    
  12. 写一个自己的replace函数,将指定字符串中指定的旧字符串转换成指定的新字符串

    例如: 原字符串: 'how are you? and you?'   旧字符串: 'you'  新字符串:'me'  结果: 'how are me? and me?'
def func12(str1:str,old_str:str,new_str:str):
    """
    用新的字符串替换指定字符串中的字符串
    :param str1: 指定字符串
    :param old_str: 被替换的字符串
    :param new_str: 替换的字符串
    :return: 替换后的字符串
    """
    str1 = str1.replace(old_str,new_str)
    print(str1)
    return str1

13.定义一个自己的update函数,将一个字典中所有的键值对添加到另外一个字典中.

def func13(dict1:dict,dict2:dict):
    """

    :param dict1: 提供键值对的字典
    :param dict2:被添加的字典
    :return:添加键值对后的字典
    """
    dict2.update(dict1)
    print(dict2)
    return dict2

你可能感兴趣的:(python)