python基础-函数

函数

什么是函数

函数是一种工具,可以重复调用

为什么要使用函数

防止代码冗余;不使用函数,代码的可读性差

如何使用函数

  • 函数的定义

    关键字(def) 函数名(index) 小括号():
    """函数描述:用于描述函数代码体的功能"""

    def index():
        """打印一句话
        :return:
        """
        print("这是一个函数")
    
  • 函数名的命名规范与变量是一样

  • 函数的种类

    • 无参函数

      def index():
          """打印一句话
          :return:
          """
          print("这是一个无参函数")
      
    • 空函数(只有函数名)

      def index():
          pass
      
    • 有参函数

      def login(username,password):
          print(username,password)
      
  • 函数的调用

    • 直接调用

      # 定义register 函数 
      def register():
          """打印姓名,年龄
          :return:
          """
          print("注册用户:\n姓名:dawn\n年龄:37\n")
      # 直接调用register 函数
      register()
      
    • 定义变量接收

      # 定义register 函数
      def register():
          """打印姓名,年龄
          :return:
          """
          print("注册用户:\n姓名:dawn\n年龄:37\n")
      # 定义变量res ,给res 赋值为register
      per = register
      # 使用res调用函数
      per()
      
    • 将函数当作参数使用

      # 定义max 函数
      def max(num1,nmu2):
          """
          比较两个数的大小,返回最大数
          :param num1:
          :param nmu2:
          :return: max
          """
          # 如果num1 > num2,那么返回num1,否则返回num2,再将结果赋值给max变量。相当于if…else…的缩写
          max = num1 if num1 > nmu2 else nmu2
          return max
      # 使用了函数嵌套,将max() 当作一个参数再次传入了max() 中
      print(max(187,max(89,233)))
      
  • 函数的返回值

    返回用关键字return表示。return是函数结束的标志,函数体代码只要执行到return,函数执行结束

    函数的返回值分为5种情况:

    • 不写return:也就是没有返回值,默认返回None

      def foo():
          """用于演示没有return的函数
          :return:
          """
          name = "dawn"
          age = 37
      
      print(foo())        # 打印结果:None
      
    • 只写return:只有结束函数体代码的效果,返回None

      def foo():
          """
          用于演示只写return
          :return: None
          """
          for i in range(2):
              while True:
                  i += 1
                  print(i)
                  if i == 1:
                      return
      
      print(foo())		# 打印结果:1和None 1是函数打印出来的记录
      
    • return None:这种情况跟只写return None的效果相同

      def foo():
          """
          用于演示return None
          :return: None
          """
          for i in range(3,0,-1):
              for j in range(i-1,-1,-1):
                  if j == 1:
                      return None
                  print(j)
      
      print(foo()) 		# 打印结果:2和None 2是函数打印出来的记录
      
    • return 单个值:可将返回的结果当作变量或赋值给变量使用

      def foo():
          """
          用于演示return 一个值
          :return: min
          """
          min = 0
          num1 = 123.04
          num2 = 233.333
          min = num1 if num1 < num2 else num2
          return min
      
      print(f"123.04和233.333之间,比较小的是{foo()}")
      
    • return 多个值:将返回的多个值,存入元组中返回(默认),也可自行指定返回的数据类型。存储在元组中,是不想返回值被修改

      # 默认返回元组
      def foo():
          """
          用于演示return 多个值时,默认将多个值存储在元组中返回
          :return: (name,age,hobby,animals)
          """
          name = "dawn"
          age = 37
          hobby = ["study","read","music"]
          animals = {"cat":"星期天","dog":"饭团"}
          return name,age,hobby,animals
      
      print(foo())			# 打印结果元组类型记录:('dawn', 37, ['study', 'read', 'music'], {'cat': '星期天', 'dog': '饭团'})
      
      # 自定义返回值为字典
      def foo1():
          """
          用于演示return 多个值时,设置以字典的形式返回多个值
          :return: {"name":name,"age":age,"hobby":hobby,"animals":animals}
          """
          name = "dawn"
          age = 37
          hobby = ["study", "read"]
          animals = {"cat": "星期天"}
          return {"name":name,"age":age,"hobby":hobby,"animals":animals}
      
      print(foo1())	# 打印结果字典类型:{'name': 'dawn', 'age': 37, 'hobby': ['study', 'read'], 'animals': {'cat': '星期天'}}
      
  • 函数的参数

    类型来讲,参数分为形参实参

    形参:函数定义阶段就规定的参数。相当于定义变量时的变量名

    实参:函数调用阶段传入的参数。相当于赋值给变量的变量值

    # 这里的username 和password 就是形参
    def get_xspar(username,password):
        """
          用于演示形参和实参
        :param username:姓名
          :param 和password:密码
        :return:
          """
        print(f"姓名:{username}\t密码:{password}")
        
    # 这里传入login 函数中的"dawn"和"123"就是实参
    get_xspar("dawn","123")
    

    传参方式来说,分为四种。分别是:位置参数、关键字参数、默认参数、可变长参数

    • 位置参数:在调用函数时,直接通过函数中参数列表顺序传参的参数

      def w_par(name,pwd):
              """
              用于演示位置参数
              :param name:姓名
              :param pwd:密码
              :return:
              """
              print(f"用户名:{name}\t登录密码:{pwd}")
          w_par("dawn","123")  # "dawn","123"根据参数列表依次传参,就是位置参数
      
    • 关键字参数:在调用函数时,指定参数名进行传参的参数

        def g_par(name,pwd,age):
          """
          用于关键字参数
          :param name:姓名
          :param pwd:密码
          :param age:年龄
          :return:
          """
          print(f"姓名:{name}\t密码:{pwd}\t年龄:{age}")
      g_par(age=18,name="dawn",pwd="123") # 将值传给指定参数的这种,就是关键字参数
      

      注意:

      位置参数和关键字参数可以混用位置参数一定要在关键字参数之前,混用的时候,不要对同一个形参重复赋值

      def g_par(name,pwd,age):
          """
          用于演示位置参数和关键字参数的混用
          :param name:姓名
          :param pwd:密码
          :param age:年龄
          :return:
          """
          print(f"姓名:{name}\t密码:{pwd}\t年龄:{age}")
          
      g_par(name="dawn","123",age=18)		# 错误示例,位置参数一定要在关键字参数之前
      g_par("123",name="dawn",age=18)		# 错误示例,程序运行时,默认将"123",name="dawn"都当作参数[name]的值
      g_par("dawn","123",age=18)			# 正确示例
      
    • 默认参数:在定义函数阶段,对形参进行赋值(也就是设置了参数值)的参数。在调用时,如果不对这个参数传值,系统会自动使用默认值;如果对这个参数,重新传了参数,默认值将会被修改请不要将可变类型当作参数传递

      def defult_par(name,age,gender="男"):
          """
          用于演示返回默认值参数
          :param name: 姓名
          :param age: 年龄
          :param gender: 性别,默认值为[男]
          :return:
          """
          print(f"姓名:{name},年龄:{age},性别:{gender}")
      
      defult_par("egon",73)       # 没有传入[gender]参数,打印结果:姓名:egon,年龄:73,性别:男
      defult_par("dawn",37,"女")   # 传了[gender]参数,打印结果:姓名:dawn,年龄:37,性别:女
      
    • 可变长参数:函数中参数列表数量可以不固定

      *args:接收所有溢出的位置参数,接收的值都被存入一个元组中。

      其实,*args 是官方认证的表示,***** 后面的名称可以修改,形参中只要有*就有可变长参数的效果

      def args_par(name,age,*args):
          """
          用于演示*args 的作用
          :param name:姓名
          :param age:年龄
          :param args:溢出参数
          :return:
          """
          print(f"姓名:{name},年龄:{age}。溢出的参数:{args}")
      
      args_par("egon",73)         # 正常输入参数,打印结果:姓名:egon,年龄:73。溢出的参数:()
      args_par("sean",18,"male","烫头")     # 多传了2个参数,打印结果:姓名:sean,年龄:18。溢出的参数:('male', '烫头')
      

      需要注意的是:

      *在形参中表示接收溢出参数,在实参中的表示将容器类型的数据打散。# 函数有几个参数,实参的长度就是几位,否则报错。字典传入的是key值

      def s_par(name,age,str):
          """
          用于演示在实参中,* 表示打算的意思
          :param str: 传入的容器类型数据,str,list,tuple,dict,set
          :return:
          """
          print(name,age,str)
      
      s_par(*"sea")       # 打印结果:s e a
      s_par(*['sean','18','male'])  # 打印结果:sean 18 male
      s_par(*('a',1,'c'))           # 打印结果:a 1 c
      s_par(*{"name":"sean","age":18,"gender":"male"}) # 字典传入的是key 打印结果:name age gender
      s_par(*{'1','a',233})         # 打印结果:a 233 1
      

      ** kwargs:接收所有溢出的关键字参数,接收的值都被存入一个字典中。输出时,直接使用kwargs;如果是 *kwargs,表示打算输出字典中的所有的key值

      def kwargs_par(name,age,**kwargs):
          """
          用于演示**kwargs 的作用
          :param name: 姓名
          :param age: 年龄
          :param kwargs: 溢出的关键字参数字典
          :return:
          """
          print(f"姓名:{name},年龄:{age},溢出的位置参数字典:{kwargs}")
          print(f"打散后的溢出位置参数:",end="")
          print(*kwargs)
          
      kwargs_par(age=18,gender="male",hobby="['study','read']",name="sean")
      # 打印结果:
      # 姓名:sean,年龄:18,溢出的位置参数字典:{'gender': 'male', 'hobby': "['study','read']"}
      # 打散后的溢出位置参数:gender hobby
      
posted @ 2019-11-10 13:48  格桑_哈哈  阅读(285)  评论(0编辑  收藏  举报