当前位置: 首页 > article >正文

python学习笔记12 python中的函数(上)

上一篇记录中我们学习了python中的文件操作
这一篇我们来介绍python中的函数

函数
函数的定义

#使用python中的关键字 def

def 函数名(…):

​ 函数代码逻辑

函数使用特点
  • 函数不调用不执行
  • 定义函数必须在调用函数之前出现
函数的参数
  • 参数的种类

    • 形式参数:指的是函数定义时,小括号中定义的参数

    • 实际参数:指的是将来调用函数时,实际传入进去的具体的值

      def fun(a,b): #a b 是形式参数,名字自定义
          print(a+b)
      
      a1=int(input("请输入第一个数值:"))
      b1=int(input("请输入第二个数值:"))
      
      fun(a1,b1)
      
  • 参数的传值方式

    • 位置传参

      def show(a,b,c):
          print(f"a:{a},b:{b},c:{c}")
      
      show(1,2,3) #a:1,b:2,c:3
      
    • 关键字传参【通过形参的名字传参】

      def show(a,b,c):
          print(f"a:{a},b:{b},c:{c}")
      
      show(b=2,a=1,c=3) #a:1,b:2,c:3
      
    • 混合传参

      def show(a,b,c):
          print(f"a:{a},b:{b},c:{c}")
      
      show(1,c=3,b=2) #a:1,b:2,c:3
      

      特别注意:混合传参的时候,前面没有关键字的实参是会按照形参的位置来的,后面关键字传参可以顺序不一样。

    • 默认值传参

      练习题:调用一个函数,传入一个大字符串和一个小字符串,查找小字符串在大字符串中出现的次数,调用函数的时候,可以不传小字串,默认查找字符’a’在大字符串中的出现次数。

      def str_num(str1,str2):
          n=0
          list1=list(str1)
          for i in list1:
              if i ==str2:
                  n+=1
          print(n)
      
      str1=input("请输入字符串")
      str2=input("请输入要查找的字母")
      str_num(str1,str2)
      
      

      在这里插入图片描述

    • 动态传参

      未使用动态参数时,解决需求,比较麻烦,参数需要另外定义一个函数

      def sum1(*num):
      # 这里的num 是一个元组,接收若干个将来调用时传入的实参
          n = 0
          for i in num:
              n = n + i
          print(f"总和为:{n}")
      sum1(10, 20) # 30
      sum1(10, 20, 30) # 60
      sum1(10, 20, 30, 40) # 100
      

      特别注意:动态传参的内容,多个参数的类型可以是不一样的

      • 一个动态参数
      def sum1(*num):
          # 这里的num 是一个元组,接收若干个将来调用时传入的实参
          print(num, type(num))
      
      sum1(11) # (11,) <class 'tuple'>
      sum1(11, '小虎', [11, 22, 33]) # (11, '小虎', [11, 22, 33]) <class 'tuple'>
      sum1((11,22,33)) # ((11, 22, 33),) <class 'tuple'>
      
      • 两个动态参数
      def sum2(**num):
          print(num,type(num))
      sum2(id='20240001',name='伊一',age=18,) #{'id': '20240001', 'name': '伊一', 'age': 18} <class 'dict'>
      

      结论:

      * :表示传入的每一个单独的元素都被封装成一个元组
      ** :表示传入的是一个一个的键值对,所有的键值对会被封装成一个字典

      我们今后开发的时候,定义动态参数时,起名字是固定的,
      若一个*的动态参数,名字起为*args,若**的动态参数,名字起为**kwargs

函数的返回值

理论上,python中所有的函数都有返回值

python中提供了一个关键字return给我们在函数中使用,表示调用完后返回的值。

def sum1(a,b):
    c=a+b
    return c
res1=sum1(10,20)
print(res1)     #30
print(res1+20)  #50
  • 函数返回值的特点

    • 一个函数如果没有写return,默认情况下,这个函数最后一句话会有一个return None

    • return 和 print的区别?

      • return 是调用完函数时,可以返回一个值给调用者
      • print 就直接输出了,没有返回值
    • 一个函数中,如果遇到了return,那么这个函数就结束了,函数中的后续代码不执行。

      def sum1(a,b):
          c=a+b
          return c
          print("今天是自习日")  #不执行
      res1=sum1(10,20)
      print(res1) #30
      
    • 一个函数中只能有一个return

      def sum1(a,b):
          c=a+b
          return c
          print("今天是自习日") #不执行
          return 0 #无效代码
      res1=sum1(10,20)
      print(res1) #30
      
      def fun1():
          for i in range(1,11):
              return i
      res1=fun1()
      print(res1)  #1  是1不是10! ! !因为for循环里第一次执行return就结束了
      
    • 函数返回值return后面,要返回的类型可以是任意的类型

  • 函数参数和返回值的练习

    练习题:定义 两个函数,第一个函数用户循环输入要累加的数值,函数内部将用户输入的值封装成一个列表返回;第二个函数将第一个函数返回的列表当作参数传入,返回列表中所有数据之和的结果。

    def n_list(*args):
        list1=[]
        while True:
            n = input("请输入:")
            if n.strip().upper() == 'Q':
                print("输入结束")
                break
            else:
                list1.append(int(n))
        return list1
    
    def sum_list(list):
        sum=0
        for i in list:
            sum+=i
        return sum
    print('输入要累加的数值,按q或者Q结束输入')
    res1=n_list()
    print(res1,type(res1))
    res2=sum_list(res1)
    print(res2,type(res2))
    
    
    
    def get_list():
    list1 = []
    while True:
    n = int(input("请输入一个数值:"))
    if n == -1:
    break
    list1.append(n)
    return list1
    def sum_list(l2):
    n = 0
    for i in l2:
    n += i
    return n
    l1 = get_list()
    print(l1)
    res2 = sum_list(l1)
    print(res2)
    

    在这里插入图片描述

  • 函数返回值的一些进阶用法

    • 直接返回多个值,多个值之间使用英文逗号分隔,实际返回的内容是一个元组

      def show1():
          return 11,22,33
      res1=show1()
      print(res1,type(res1)) #(11, 22, 33) <class 'tuple'>
      
    • 分别接收每个返回元素的值

      def show1():
          return 11,22,33
      a1,a2,a3=show1()
      print(f"a1:{a1}")   #a1:11
      print(f"a2:{a2}")   #a2:22
      print(f"a3:{a3}")   #a3:33
      
      def show1():
          return 11, ['hello','world','python'], 33
      a1, a2, a3 = show1()
      print(f"a1:{a1}") # a1:11
      print(f"a2:{a2}") # a2:['hello', 'world', 'python']
      print(f"a3:{a3}") # a3:33
      
函数的分类
  • 无参无返回值

    def fun1()
    	print('hhh')
    
  • 无参有返回值

    def fun2()
    	return 0
    
  • 有参无返回值

    def sum1(a,b):
        print(a+b)
    sum1(10,20) #30
    
  • 有参有返回值

    def fun1(s1):
        return "伊一"+s1
    res1=fun1('welcome')
    print(res1) #伊一welcome
    
函数可以进行嵌套
  • 嵌套调用

    def fun1():
        print('hi,伊一')
    def fun2():
        return 0
    def fun3(a,b,c):
        fun1()
        res1=fun2()
        return a+b+c
    res2=fun3(1,2,3)
    print(res2)
    #hi,伊一
    #6
    
  • 嵌套定义

    def fun1():
        a=10
        def fun2():
            print("hi,伊一")
        print(a)
        fun2()
    fun1()  #10
            #伊一
    fun2()  #报错不执行
    

    练习题:定义一个函数,传入一个文本路径,和一个关键词,将文本中包含关键词的那一句话拿出来放在一个列表中返回该列表

    # @author:teacher
    import os
    def get_word_list(file_os, word):
        res_list = []
        if os.path.exists(file_os):
            f = open(file_os, 'r', encoding='UTF-8')
            line_list = f.readlines()
            for line in line_list:
                if word in line:
                    res_list.append(line.strip())
        else:
            print("该路径不存在!!")
        return res_list
    list1 = get_word_list('text.txt', '水')
    print(list1)
    
    
    
函数的传值问题
  • 不可变对象【str、int、float、bool】

    def fun1(x, y):
        print(f"x:{x}, y:{y}") # x:hi, y:伊一
        x = y
        x = x + x
        print(f"x:{x}, y:{y}") # x:伊一伊一, y:伊一
    s1 = "hi"
    s2 = "伊一"
    print(f"s1:{s1}, s2:{s2}") # s1:hi, s2:伊一
    fun1(s1,s2)
    print(f"s1:{s1}, s2:{s2}") # s1:hi, s2:伊一
    
  • 可变对象【list、tuple、dict、set、类】

    def fun1(x, y):
        print(f"x:{x}, y:{y}") # x:['hi'], y:['伊一']
        x = y
        x.append('python')
        print(f"x:{x}, y:{y}") # x:['伊一', 'python'], y:['伊一', 'python']
    s1 = ['hi']
    s2 = ['伊一']
    print(f"s1:{s1}, s2:{s2}") # s1:['hi'], s2:['伊一']
    fun1(s1,s2)
    print(f"s1:{s1}, s2:{s2}") # s1:['hi'], s2:['伊一', 'python']
    
作用域和变量

在python中,作用域分为两个区域

函数外是一个作用域

函数内部是一个作用域

  • 全局变量:将变量定义在函数外
  • 局部变量:将变量定义在函数内部

全局变量和局部变量使用特点

  • 局部作用域中可以使用到全局变量【可以使用函数外部定义的变量】

  • 函数与函数内部的作用域是相互独立的,不能互相调用函数内部创建的局部变量

python中提供了一个关键字global ,在函数内部定义一个全局变量,出了函数也是可以被访问到的。

特别注意:如果函数内部有变量被global修饰,需要先调用该函数,让内存中出现这个变量,后续才能去使用。

def fun1():
    global a
    a = 100
fun1()
print(a)    #100
进阶:函数名也可以当作一个变量使用
  • 用法场景1:赋值

    def fun1():
        print("好好学习,天天向上!")
    fun2 = fun1
    fun2()  #好好学习,天天向上!
    

    赋值的时候,注意有没有小括号,方法名直接赋值,相当于给函数另起了一个名字;如果加了小括号,相当于调用函数的结果赋值。

  • 用法场景2:变量可以存储在容器中,比如列表

    def fun1():
        print("鹅鹅鹅")
    def fun2():
        print("曲项向天歌")
    def fun3():
        print("白毛浮绿水")
    def fun4():
        print("红掌拨清波")
    fun_list = [fun1, fun2, fun3, fun4]
    flag = input("请输入开始:")
    for i in fun_list:
        i()
    

    在这里插入图片描述

  • 用法场景3:将函数作为返回值使用

    def fun1():
        print("鹅鹅鹅")
    def fun2():
        print("曲项向天歌")
    def fun3():
        print("白毛浮绿水")
    def fun4():
        print("红掌拨清波")
    fun_list = [fun1, fun2, fun3, fun4]
    def show1():
        for i in fun_list:
            i()
    def function1():
        return show1
    res1 = function1()
    res1()
    

    在这里插入图片描述

  • 用法场景4:

    def fun1():
        print("鹅鹅鹅")
    def fun2():
        print("曲项向天歌")
    def fun3():
        print("白毛浮绿水")
    def fun4():
        print("红掌拨清波")
    fun_list = [fun1, fun2, fun3, fun4]
    def show1():
        for i in fun_list:
            i()
    def function1(s):
        s()
    function1(show1)
    

    在这里插入图片描述
    下一篇我们来介绍一些python的内置函数和函数生成式。
    点赞收藏关注,一起打卡python学习吧


http://www.kler.cn/a/419757.html

相关文章:

  • java将word docx pdf转换为图片(不需要额外下载压缩包,直接导入maven坐标)
  • .NET 9 中 LINQ 新增功能实现过程
  • 是什么阻断了kafka与zk的链接?
  • 【人工智能-基础】SVM中的核函数到底是什么
  • vue2 虚拟DOM 和 真实DOM (概念、作用、Diff 算法)
  • 前端面试热门题(二)[html\css\js\node\vue)
  • 深度学习7 梯度下降优化、过拟合、手机价格预测
  • 机器学习——生成对抗网络(GANs):原理、进展与应用前景分析
  • The selected directory is not a valid home for Go SDK
  • PostgreSQL17.x创建数据库及数据库信息查看命令
  • 算法刷题Day7: 二叉树前中后遍历
  • 通义灵码 x 函数计算:构建高效开发流程,加速项目交付
  • 「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局
  • 后端 Java发送邮件 JavaMail 模版 20241128测试可用
  • 渗透测试--Linux上获取凭证
  • vue3+echarts柱状图点击加载数据及选中效果
  • C++入门基础知识156—【关于C++数据类型】
  • MATLAB数学建模之画图汇总
  • [计算机网络] HTTP/HTTPS
  • 怎么理解BeamSearch?
  • 畅游Diffusion数字人(9):Magic-Me: Identity-Specific Video Customized Diffusion
  • sheng的学习笔记-【中】【吴恩达课后测验】Course 5 -序列模型 - 第二周测验 - 自然语言处理与词嵌入
  • 【计网】自定义序列化反序列化(二) —— 实现网络版计算器【上】
  • 匹配 变量的类型
  • 前端API自动化构建工具:讲述 FlyHttp 设计思想
  • 微信小程序开发入门 笔记一 2024/11/29