Python函数详解(一)

一、函数的定义

1、函数概念

  • 函数是一种功能抽象,利用它可以将一个复杂的大问题分解成一系列简单的小问题,分而治之。函数可以在一个程序中多个位置使用,也可以用多个程序,当程序需要修改时,只需要在函数中修改一次,所有调用位置的功能都会随之更新。

2、函数创建

  • Python语言通过保留字 def 定义函数。

  • 语法结构:

    def <函数名>(<参数列表>):
    <函数体>
    return <返回值列表>

  • 函数名可以是任何有效的python标识符,参数列表是调用函数时传递给它的值。

    例:定义一个求一个数字的平方的函数f

    def f(x):
    	s=x**2
    	print(s)
    

    运行上面的代码,并不会输出任何内容,因为函数还未被调用

二、函数的调用

  • 函数的定义也叫做函数的声明,定义完函数并不能直接运行,而是需要通过“调用”才能运行,调用函数也是执行函数的一个过程。可以把函数的定义理解为创建一个固定用途的工具,调用函数则为使用这个工具。每次调用函数都会开辟新的内存空间,函数执行完后,空间就会被释放。函数的调用语法如下:

  • 语法结构:

    <函数名>(<实际赋值的参数列表>)
    例:

    #定义一个对整数x求平方值的函数f
     def f(x):
     	s=x**2
     	print(s)
    #调用函数f,对10求平方值
    f(10)
    
    #100
    

三、函数参数传递

1、形式参数和实际参数

  • 在调用函数时,大多数情况下,主调用函数和被调用函数之间有数据传递关系,这就是有参数的函数形式。函数参数的作用时传递给函数使用,函数利用接受到的数据进行具体的操作处理。

  • 形式参数和实际参数

    • 形式参数:在定义函数时,函数名后面括号中的参数。
    • 实际参数:在调用函数时,函数名后面括号中的参数。
    #定义函数时,这里的函数参数obj就是形式参数
    def demo(obj):
    	print(obj)
    
    a='你好世界'
    #调用已经定义好的demo函数,此时传入的函数参数a就是实际参数
    demo(a)
    

2、参数的值传递和引用传递

  • 函数参数传递机制问题在本质上是调用函数(过程)和被调用(过程)在调用发生时进行通信的方法问题。

  • 基本的参数传递机制有两种:值传递引用传递

  • 值传递就是将实际参数值的副本(复制品)传入函数,而实际参数本身不会受到任何影响。适用于实参类型为不可变类型(字符串、数字等)

  • 引用传递时,改变形式参数的值,实际参数也会发生同样的改变。适用于实参类型为可变类型(列表,字典等)。

  • 值传递示例代码:

    def demo(obj):
    	obj+=obj
    	print('形式参数:',obj)#第二行输出,输出形象的值
    a='你好世界'
    print('a的值为:',a)#第一行输出,输出a变量的初始值
    demo(a)
    print('实际参数为:',a)#第三次输出,输出实参的值
    
    #a的值为:你好世界
    #形式参数:你好世界你好世界
    #实际参数的值为:你好世界
    
  • 引用传递示例代码:

    def demo(obj):
        obj+=obj
        print('形式参数:',obj)#第二行输出,输出形参的值
    a=[1,2,3]
    print('a的值为:',a)#第一行输出,输出a变量的初始值
    demo(a)
    print('实际参数为:',a)#第三行输出,输出实参的值
    
    #a的值为: [1, 2, 3]
    #形式参数: [1, 2, 3, 1, 2, 3]
    #实际参数为: [1, 2, 3, 1, 2, 3]
    

3、位置参数

  • 位置参数也成为必备参数,是必须按照正确的顺序传递到函数中,即调用时的数量和位置必须和定义时是一样的。

  • 函数调用时,参数可以按照位置或名称方式(关键字参数)赋值。

  • 位置赋值示例代码:

    def ht(n,m):#共两个参数,第一个参数为n,第二个参数为m
        s=n**2//m
        print(s)
    ht(27,5)#调用函数时会按照参数位置直接赋值,和名称无关,即形参n=27、m=5
    
    #145
    
  • 在调用函数时,指定的实参位置要和形参保持一致,否则将产生以下两种情况:

    • 抛出TypeError异常
    • 产生效果与预期不符
  • 名称赋值示例代码:

    def ht(n,m):#共两个参数,第一个参数为n,第二个参数为m
        s=n**2//m
        print(s)
    ht(m=27,n=5)#调用函数时会按照名称直接赋值,和顺序无关,即形参m=27、n=5
    
    #0
    
  • 在调用函数时,指定的实际参数的数量和形式参数的数量一致,否则会抛出TypeError异常,提醒缺少必要的位置参数。

4、缺省参数

  • 调用函数时,如果没有指定某个参数将抛出异常,为了解决这个问题,函数定义时可以为某些参数指定默认值,构成缺省参数。这样在调用该函数时,当没有为此参数传值时,则直接使用定义函数时设置的默认值。定义缺省参数的函数语法格式如下:

  • 语法结构:
    def <函数名>(<非缺省参数>,<缺省参数=值>):

  • 注意:在定义函数时,缺省参数一定要写在非缺省参数的后面

    def div(n,m=1):#共n、m两个参数,其中n为非缺省参数,m为缺省参数
        a=n//m
        print(a)
    div(10)#调用只传入一个参数,即形参n为10,m默认为1
    div(10,2)#调用传入俩个个参数,即形参n为10,m为传入值2
    
    #10
    #5
    

    定义函数时,定义缺省函数设置默认值时要牢记一点,缺省参数的默认值必须指向不可变对象

  • 不定长参数

    • 在定义函数时,可以设计可变数量参数。可变参数也称为不定长参数,即传入参数的数量可以是任意多个。定义不定长参数时:一共有两种形式:*parameter 和 **parameter。

    • *parameter:

      def<函数名>(*参数名):

      这种形式表示接受任意多个实际参数并将其放到一共元组中。

      def address(*city):
          print('中国有:')
          for item in city:
              print(item)
      address('重庆','北京','广州','四川','上海')#直接以元组形式将多个参数传人
      
      #中国有:
      #重庆
      #北京
      #广州
      #四川
      #上海
      
    • 如果想要使用一个已经存在的列表作为函数的不定长参数,可以在参数的名称前加‘ * ’。

      def address(*city):
          print('中国有:')
          for item in city:
              print(item)
      li=['重庆','北京','广州','四川','上海']
      address(*li)
      
      #重庆
      #北京
      #广州
      #四川
      #上海
      
    • **parameter
      def <函数名>(**参数名):
      这种形式表示接受任意多个类型关键字参数一样的实际参数,并将其放到一个字典中。

      def address(**city):
          print('中国的城市有:')
          for key,value in city.items():
              print(key+'热门景点有:'+value)
      #直接以字典形式将多个参数传入
      address(重庆='解放碑',昆明='滇池',上海='迪士尼')
      
      #中国的城市有:
      #重庆热门景点有:解放碑
      #昆明热门景点有:滇池
      #上海热门景点有:迪士尼
      
    • 如果想要使用一个已经存在的字典作为函数的可变参数,可以在参数的名称前加‘ ** ’。

      def address(**city):
          print('中国的城市有:')
          for key,value in city.items():
              print(key+'热门景点有:'+value)
              
      dic={'重庆':'解放碑','昆明':'滇池','上海':'迪士尼'}
      address(**dic)
      
      #中国的城市有:
      #重庆热门景点有:解放碑
      #昆明热门景点有:滇池
      #上海热门景点有:迪士尼
      

四、返回值

  • 在Python中,可以在函数体内使用return语句为函数指定返回值,该返回值可以是任意类型并且无论return语句出现在函数的什么位置,只要得到执行,就会直接结束函数的执行

  • 语法结构
    def <函数名>(参数):
    函数体
    return < value >

  • 参数说明
    value:可选参数,用于指定要返回的值,可以返回一个值,也可以返回多个值。

    def fact(n,m=1):
        s=1
        for i in range(1,n+1):
            s*=i
        return s//m,n,m#可以返回多个值
    print(fact(10,5))
    
    #(725760, 10, 5) 元组类型
    

    注意:return语句在同一函数中可以出现多次,但是只要有一个得到执行,就会直接结束函数的执行,类似循环中的break。

    def fact(n):
        if n>0:
            return 1
        else:
            return 0
        print(2)#无论形参n值为多少,此行代码都不可达
    print(fact(2))
    print(fact(-2))
    
    #1
    #0
    
  • 返回值参数可以指定,也可以省略不写(将返回空值None)

    def fact(n):
    	n=n+1
    	return #未指定返回值参数
    print(fact(2))#输出参数为2时的函数返回值
    
    #None
    
	(1)return保留值用来传递返回值
	(2)函数可以有返回值,也可以没有,可以有return,也可以没有
	(3)return可以传递0个返回值,也可以传递任意多个返回值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值